<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tessa&apos;s Dev Blog</title><description>Tessa&apos;s Dev Blog</description><link>https://tessa1217.github.io/</link><language>ko</language><item><title>🐛 Nuxt SSR 환경에서 `useState`에 함수 저장 시 발생한 Serialization 오류</title><link>https://tessa1217.github.io/posts/ssr/use-state-troubleshooting/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/ssr/use-state-troubleshooting/</guid><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🐛 Nuxt SSR 환경에서 &lt;code&gt;useState&lt;/code&gt;에 함수 저장 시 발생한 Serialization 오류&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Nuxt 3 · SSR · &lt;code&gt;useState&lt;/code&gt; · Payload Serialization&lt;/p&gt;
&lt;p&gt;직접 진입과 SPA 네비게이션에서 동작이 갈리는 이유를 파헤친 기록&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#tldr&quot;&gt;TL;DR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EA%B0%9C%EC%9A%94&quot;&gt;개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%A6%9D%EC%83%81&quot;&gt;증상&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%9B%90%EC%9D%B8-%EB%B6%84%EC%84%9D&quot;&gt;원인 분석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EB%AC%B8%EC%A0%9C-%EB%B0%9C%EC%83%9D%EC%9D%98-%EB%B0%B0%EA%B2%BD&quot;&gt;문제 발생의 배경&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%ED%9A%8C%EA%B3%A0-%EB%B0%8F-%EB%8C%80%EC%95%88-%EA%B3%A0%EC%B0%B0&quot;&gt;회고 및 대안 고찰&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EB%B0%B0%EC%9A%B4-%EC%A0%90&quot;&gt;배운 점&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Nuxt 3의 &lt;code&gt;useState&lt;/code&gt;는 SSR → CSR 전달 과정에서 payload를 직렬화(serialize)하는데, 이때 함수(function) 타입은 직렬화가 불가능해 500 에러가 발생한다. &lt;code&gt;import.meta.server&lt;/code&gt; 가드로 서버 측 등록을 우회해 해결했지만, 근본적으로는 &lt;strong&gt;&quot;함수를 전역 상태에 담는&quot; 설계 자체&lt;/strong&gt;를 재고할 필요가 있었다. 대안으로는 Pinia setup store 내부에 핸들러를 보관하는 방식이 가장 자연스러워 보인다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 개요&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;환경&lt;/td&gt;
&lt;td&gt;Nuxt 3, Vue 3 (Composition API), SSR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;영향 범위&lt;/td&gt;
&lt;td&gt;새로고침 플로팅 버튼이 동작하는 모든 라우트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;발생 조건&lt;/td&gt;
&lt;td&gt;페이지 직접 진입(URL 입력) 또는 브라우저 새로고침 (= SSR 경로)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해결 방식&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import.meta.server&lt;/code&gt; 가드로 서버 측 registry 등록 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소요 시간&lt;/td&gt;
&lt;td&gt;(작성 시 채우기)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;🔥 증상&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;❌ 페이지를 &lt;strong&gt;직접 진입(브라우저 주소창에 URL 입력)&lt;/strong&gt; 또는 &lt;strong&gt;브라우저 새로고침&lt;/strong&gt; 시 → &lt;strong&gt;500 에러&lt;/strong&gt; 발생&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;탭/링크 클릭으로 SPA 네비게이션&lt;/strong&gt; 시에는 정상 동작&lt;/li&gt;
&lt;li&gt;즉, &lt;strong&gt;SSR이 동작하는 경로에서만 발생&lt;/strong&gt;, CSR 전환 경로에서는 미발생&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;이 패턴은 거의 항상 &quot;SSR에서만 깨지는 무언가&quot; — 윈도우 객체 접근, hydration mismatch, 또는 &lt;strong&gt;payload 직렬화 실패&lt;/strong&gt; — 셋 중 하나를 의심하게 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;🔍 원인 분석&lt;/h2&gt;
&lt;h3&gt;🧪 1차 시도 — 인터페이스/옵션 확인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;우선 호출되는 컴포저블의 타입과 인터페이스를 한 차례 점검&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useAsyncData&lt;/code&gt;의 &lt;code&gt;server: false&lt;/code&gt; 옵션을 적용해 &lt;strong&gt;SSR 시점에 API 호출을 우회&lt;/strong&gt;하면 정상 동작하는지 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결과:&lt;/strong&gt; 여전히 동일한 500 에러 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;의미:&lt;/strong&gt; API fetch 자체의 문제가 아님. SSR 렌더링 파이프라인의 더 앞단에서 깨지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🧪 2차 시도 — API 동작 순차 배제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;페이지에서 호출되는 API들을 하나씩 비활성화하며 어디서 터지는지 좁혀보려 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결과:&lt;/strong&gt; 모든 API가 SSR 시점에서 동일하게 실패함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;의미:&lt;/strong&gt; 특정 API의 문제가 아니라 &lt;strong&gt;SSR 렌더링 자체&lt;/strong&gt;가 망가져 있다. 페이로드 직렬화 단계를 의심해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🧪 3차 시도 — SSR 코드 / &lt;code&gt;useState&lt;/code&gt; 분석 → 🎯 원인 발견&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;최근 도입한 &lt;strong&gt;refresh registry 패턴&lt;/strong&gt;의 &lt;code&gt;useState&lt;/code&gt; 저장값을 점검&lt;/li&gt;
&lt;li&gt;registry에 각 컴포저블의 &lt;strong&gt;refresh 함수(function)&lt;/strong&gt; 가 그대로 등록되고 있었음&lt;/li&gt;
&lt;li&gt;Nuxt 3는 SSR 렌더링 후 클라이언트로 페이로드를 전달할 때 &lt;code&gt;devalue&lt;/code&gt;를 사용해 상태를 직렬화한다. &lt;strong&gt;함수는 직렬화 대상이 아니다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;따라서 SSR 렌더 도중 registry에 함수가 등록되는 순간, 응답 직전 payload serialization에서 깨지며 500을 반환한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// ❌ Before — 서버에서도 함수가 useState에 등록됨
const registry = useState&amp;lt;Record&amp;lt;string, () =&amp;gt; Promise&amp;lt;void&amp;gt;&amp;gt;&amp;gt;(
  &apos;refresh-registry&apos;,
  () =&amp;gt; ({})
)

export function useRegisterRefresh(key: string, fn: () =&amp;gt; Promise&amp;lt;void&amp;gt;) {
  registry.value[key] = fn // ← SSR 페이로드 직렬화 시 폭발
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// ✅ After — 서버에서는 등록 자체를 스킵
export function useRegisterRefresh(key: string, fn: () =&amp;gt; Promise&amp;lt;void&amp;gt;) {
  if (import.meta.server) return // 🛡️ SSR 가드
  registry.value[key] = fn
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;registry는 &lt;strong&gt;클라이언트에서만 의미 있는&lt;/strong&gt; 상태(사용자 인터랙션으로 트리거되는 새로고침 함수들의 모음)이므로, 서버에서 굳이 채울 필요가 없다. 가드를 두는 것이 자연스러운 결론.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;🌱 문제 발생의 배경&lt;/h2&gt;
&lt;p&gt;처음부터 registry 패턴이었던 것은 아니다. 요구사항이 한 단계씩 늘어나면서 점진적으로 구조가 커진 케이스다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;1차 구현&lt;/strong&gt; — 스크롤 시 노출되는 &quot;새로고침 플로팅 버튼&quot; 작업
&lt;ul&gt;
&lt;li&gt;단순히 &lt;code&gt;refreshTrigger&lt;/code&gt;를 자식 컴포넌트에 prop/provide로 내려주고, 각 컴포넌트에서 자체적으로 refresh를 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;요구사항 변경&lt;/strong&gt; — UI/UX에서 새로고침 시 &lt;strong&gt;전체 화면 loading indicator&lt;/strong&gt; 추가 요청
&lt;ul&gt;
&lt;li&gt;개별 컴포넌트들의 상태를 모아 &quot;전체가 새로고침 중인지&quot;를 알 필요가 생김&lt;/li&gt;
&lt;li&gt;→ &lt;code&gt;isRefreshing&lt;/code&gt; 전역 상태 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;구조 변경&lt;/strong&gt; — 일원화된 흐름을 위해 &lt;strong&gt;registry 패턴&lt;/strong&gt; 도입
&lt;ul&gt;
&lt;li&gt;각 컴포저블이 마운트 시점에 자신의 refresh 함수를 registry에 등록&lt;/li&gt;
&lt;li&gt;플로팅 버튼 클릭 → &lt;code&gt;refreshAll()&lt;/code&gt; → registry의 모든 함수를 &lt;code&gt;Promise.all&lt;/code&gt;로 실행 → &lt;code&gt;isRefreshing&lt;/code&gt; 토글&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;테스트 통과&lt;/strong&gt; — SPA 네비게이션 환경에서는 모든 flow가 정상 동작&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🔥 사건 발생&lt;/strong&gt; — 직접 진입/새로고침(=SSR 경로)에서 500&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;회고 포인트:&lt;/strong&gt; SPA 내부 동선만 테스트했기 때문에, registry에 함수가 등록되어 payload에 포함되는 시점이 &lt;strong&gt;클라이언트뿐&lt;/strong&gt;이었다. 직접 진입 케이스에서는 첫 페이지가 SSR로 그려지므로 등록 시점이 서버로 옮겨가 폭발했다. 향후 SSR 환경에서는 &lt;strong&gt;&quot;직접 진입/새로고침 경로&quot;를 반드시 회귀 테스트에 포함&lt;/strong&gt;해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;💭 회고 및 대안 고찰&lt;/h2&gt;
&lt;p&gt;이번 이슈는 단순히 가드 한 줄로 해결됐지만, 그보다 더 본질적인 질문은 &lt;strong&gt;&quot;애초에 함수를 전역 상태에 넣는 것이 옳은가?&quot;&lt;/strong&gt; 였다. 가능한 대안들을 정리해본다.&lt;/p&gt;
&lt;h3&gt;A. &lt;code&gt;useState&lt;/code&gt; 대신 &lt;code&gt;ref&lt;/code&gt;(모듈 스코프)로 관리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// composables/useRefreshRegistry.ts
const registry = ref&amp;lt;Record&amp;lt;string, () =&amp;gt; Promise&amp;lt;void&amp;gt;&amp;gt;&amp;gt;({}) // 모듈 스코프

export function useRefreshRegistry() {
  return { registry, register, refreshAll }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;모듈 스코프 ref는 SSR 페이로드 직렬화 대상이 아님&lt;/strong&gt; → 직렬화 오류는 발생하지 않는다.&lt;/li&gt;
&lt;li&gt;❌ 그러나 Nuxt SSR에서 &lt;strong&gt;모듈 스코프 변수는 요청 간 공유&lt;/strong&gt;되어 다른 사용자의 상태가 섞일 수 있다. (Nuxt 공식 문서가 &lt;code&gt;useState&lt;/code&gt;를 권장하는 이유이기도 함)&lt;/li&gt;
&lt;li&gt;❌ 실용적으로는 &quot;registry는 클라이언트에서만 의미 있으니 SSR 메모리 공유는 문제 안 됨&quot;이라고 합리화할 수 있지만, &lt;strong&gt;&quot;왜 SSR-safe한 &lt;code&gt;useState&lt;/code&gt;를 안 쓰지?&quot;&lt;/strong&gt; 라는 질문에 매번 답해야 한다는 점에서 코드 컨벤션상 깔끔하지 않다.&lt;/li&gt;
&lt;li&gt;→ 채택할 거라면 &lt;strong&gt;명시적인 주석/네이밍&lt;/strong&gt;(&lt;code&gt;_clientOnlyRegistry&lt;/code&gt; 등)이 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B. Event Bus (mitt 등) 도입&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// utils/refreshBus.ts
import mitt from &apos;mitt&apos;
export const refreshBus = mitt&amp;lt;{ refresh: void; refreshDone: string }&amp;gt;()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// 각 컴포저블에서
onMounted(() =&amp;gt; {
  refreshBus.on(&apos;refresh&apos;, handleRefresh)
})
onBeforeUnmount(() =&amp;gt; refreshBus.off(&apos;refresh&apos;, handleRefresh))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;함수를 상태에 담을 필요가 없어진다.&lt;/strong&gt; 각 컴포넌트는 자기 리스너만 등록하면 됨 → 직렬화 이슈 원천 차단.&lt;/li&gt;
&lt;li&gt;✅ 컴포넌트 마운트/언마운트 라이프사이클과 자연스럽게 묶여 cleanup이 명확하다.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;code&gt;isRefreshing&lt;/code&gt; 같은 &quot;전체 상태&quot;는 별도 관리 필요. (e.g., &lt;code&gt;refreshDone&lt;/code&gt; 이벤트를 모아 카운트하는 작은 store)&lt;/li&gt;
&lt;li&gt;⚠️ Event bus는 &lt;strong&gt;흐름이 코드 상에서 추적하기 어려워지는&lt;/strong&gt; 단점이 있다. 누가 발행하고 누가 구독하는지 IDE 레퍼런스만으로 보이지 않는다.&lt;/li&gt;
&lt;li&gt;→ 작은 규모에선 매우 깔끔하지만, 화면 수가 늘어나면 디버깅 난이도가 올라간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;C. Pinia Store + Action 직접 호출&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;export const useRefreshStore = defineStore(&apos;refresh&apos;, () =&amp;gt; {
  const handlers = new Map&amp;lt;string, () =&amp;gt; Promise&amp;lt;void&amp;gt;&amp;gt;() // store 인스턴스 내부 Map
  const isRefreshing = ref(false)

  function register(key: string, fn: () =&amp;gt; Promise&amp;lt;void&amp;gt;) {
    if (import.meta.server) return
    handlers.set(key, fn)
  }

  async function refreshAll() {
    isRefreshing.value = true
    try {
      await Promise.all([...handlers.values()].map(fn =&amp;gt; fn()))
    } finally {
      isRefreshing.value = false
    }
  }
  return { register, refreshAll, isRefreshing }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;✅ Pinia의 &lt;code&gt;state&lt;/code&gt;만 SSR 직렬화 대상이고, &lt;strong&gt;&lt;code&gt;setup store&lt;/code&gt; 내부의 일반 변수(&lt;code&gt;Map&lt;/code&gt;, 클로저 등)는 직렬화 대상이 아니다.&lt;/strong&gt; 함수도 store 내부에 안전하게 보관 가능.&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;isRefreshing&lt;/code&gt;만 reactive state로 두면 자연스럽게 SSR-safe.&lt;/li&gt;
&lt;li&gt;✅ 의존성과 흐름이 명시적 → 테스트/추적이 쉽다.&lt;/li&gt;
&lt;li&gt;⚠️ Pinia 의존을 새로 추가해야 한다면 비용. (이미 쓰고 있다면 사실상 베스트)&lt;/li&gt;
&lt;li&gt;→ 현재 코드베이스에 Pinia가 이미 있다면 &lt;strong&gt;이 방법이 가장 자연스럽고 안전&lt;/strong&gt;해 보인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;D. &lt;code&gt;provide&lt;/code&gt; / &lt;code&gt;inject&lt;/code&gt; (컴포넌트 트리 의존성 주입)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;부모(layout 또는 페이지)에서 registry를 만들고 자식에서 &lt;code&gt;inject&lt;/code&gt; 해서 등록&lt;/li&gt;
&lt;li&gt;✅ Vue 트리 안에 갇히므로 SSR 페이로드와 무관&lt;/li&gt;
&lt;li&gt;❌ 트리 외부(plugin, util 등)에서 호출 불가 → 활용 범위가 좁다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;📊 비교 정리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방식&lt;/th&gt;
&lt;th&gt;SSR 직렬화 안전&lt;/th&gt;
&lt;th&gt;흐름 추적 용이성&lt;/th&gt;
&lt;th&gt;도입 비용&lt;/th&gt;
&lt;th&gt;추천도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useState&lt;/code&gt; + 함수 등록 (현재)&lt;/td&gt;
&lt;td&gt;❌ (가드 필요)&lt;/td&gt;
&lt;td&gt;보통&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;△ (가드로 봉합)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모듈 스코프 &lt;code&gt;ref&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⚠️ (요청 간 공유 주의)&lt;/td&gt;
&lt;td&gt;보통&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event Bus&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ 약함&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;○ (소규모)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pinia Setup Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 강함&lt;/td&gt;
&lt;td&gt;낮음(이미 사용 중)&lt;/td&gt;
&lt;td&gt;◎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;provide&lt;/code&gt; / &lt;code&gt;inject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;보통&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;△ (범위 제약)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;잠정 결론:&lt;/strong&gt; 현재는 가드로 봉합했지만, 후속 리팩토링 시 &lt;strong&gt;Pinia setup store 내부 &lt;code&gt;Map&lt;/code&gt;으로 핸들러를 보관하고, &lt;code&gt;isRefreshing&lt;/code&gt;만 reactive state로 노출&lt;/strong&gt;하는 형태로 옮기는 것이 가장 깔끔할 듯하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;🧠 배운 점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSR과 CSR의 가장 큰 차이는 &quot;상태가 직렬화되어 네트워크를 건너간다&quot;는 점&lt;/strong&gt;이다. CSR 기반으로만 작업해온 패턴 — 특히 함수/클래스 인스턴스/Symbol 등을 전역 상태에 거리낌 없이 담는 패턴 — 은 SSR에서는 곧장 폭탄이 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;useState&lt;/code&gt;의 정체성&lt;/strong&gt;을 다시 확인했다. 단순한 &quot;전역 ref&quot;가 아니라, &lt;strong&gt;요청 단위로 격리되고 SSR → CSR로 페이로드를 통해 전달되는 상태&lt;/strong&gt;다. 그래서 직렬화 가능한 값(POJO, 원시값, 배열, 일반 객체)만 담아야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;테스트 동선&lt;/strong&gt;은 사용자가 페이지에 도달할 수 있는 모든 경로를 포함해야 한다. SPA 내부 네비게이션과 &lt;strong&gt;직접 진입/새로고침&lt;/strong&gt;은 SSR 관점에서 완전히 다른 코드 경로다.&lt;/li&gt;
&lt;li&gt;패턴 도입(여기서는 registry 패턴) 자체가 잘못된 것은 아니지만, &lt;strong&gt;&quot;이 자료구조가 어디서 살아야 하는가 — 서버? 클라이언트? 둘 다?&quot;&lt;/strong&gt; 를 먼저 묻고 들어갔으면 더 빨리 도달했을 결론이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nuxt.com/docs/api/composables/use-state&quot;&gt;Nuxt 3 &lt;code&gt;useState&lt;/code&gt; 공식 문서&lt;/a&gt; — payload serialization 관련 설명&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Rich-Harris/devalue&quot;&gt;devalue&lt;/a&gt; — Nuxt가 payload 직렬화에 사용하는 라이브러리, 지원/미지원 타입 확인&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nuxt.com/docs/api/advanced/hooks#nuxt-app-hooks-runtime&quot;&gt;Nuxt &lt;code&gt;import.meta&lt;/code&gt; 문서&lt;/a&gt; — &lt;code&gt;import.meta.server&lt;/code&gt; / &lt;code&gt;import.meta.client&lt;/code&gt; 가드 패턴&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pinia.vuejs.org/core-concepts/#setup-stores&quot;&gt;Pinia Setup Store&lt;/a&gt; — store 내부 비-reactive 변수 활용&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AWS 시험 회고</title><link>https://tessa1217.github.io/posts/aws/aws-test-retrospect/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-test-retrospect/</guid><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AWS 시험 회고 ☁️&lt;/h1&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%95%BD-1%EB%8B%AC-%EB%A7%8C%EC%97%90-%EC%93%B0%EB%8A%94-%EC%8B%9C%ED%97%98-%ED%9B%84%EA%B8%B0&quot;&gt;약 1달 만에 쓰는 시험 후기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8B%9C%ED%97%98-%EC%A4%80%EB%B9%84-%EB%B0%A9%EB%B2%95-&quot;&gt;시험 준비 방법 📚&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8B%9C%ED%97%98-%EC%9D%91%EC%8B%9C-%EF%B8%8F&quot;&gt;시험 응시 🖥️&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8B%9C%ED%97%98-%EA%B2%B0%EA%B3%BC-&quot;&gt;시험 결과 🏆&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8B%9C%ED%97%98%EC%9D%84-%EB%A7%88%EC%B9%98%EB%A9%B0-&quot;&gt;시험을 마치며 💬&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;약 1달 만에 쓰는 시험 후기&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/aws-certificate.png&quot; alt=&quot;aws certification&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026년 04월 03일&lt;/strong&gt;, &lt;code&gt;AWS SAA-C03 (AWS Certified Solutions Architect - Associate)&lt;/code&gt; 시험을 응시했다. 후기를 쓰는 지금으로부터 약 1달 전쯤의 일이다.&lt;/p&gt;
&lt;p&gt;이직 과정이 마무리되고, 새로 들어가는 회사 면접에서 클라우드 관련 질문을 받았는데 제대로 된 답변을 하지 못했던 기억이 난다. 네트워크, 인프라 관련 지식이 전체적으로 빈약했던 터라, 시간이 남는 김에 겸사겸사 준비를 시작해 한 3~4주 정도 준비 기간을 거쳤다.&lt;/p&gt;
&lt;p&gt;처음에는 방대한 문제 범위에 당황하기도 했다. 4지선다 형식이라 질문-답변을 그냥 외우는 방식일 거라 막연히 기대했는데, 어느 정도 사고가 필요한 유형이라 많이 당황했던 기억이... 😅 그래도 차근차근 문제를 풀고 개념을 익히며 준비했고, 걱정했던 것보다 높은 점수로 자격증을 취득할 수 있었다. 🎉&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;시험 준비 방법 📚&lt;/h2&gt;
&lt;h3&gt;1~2주차 — 강의 듣기&lt;/h3&gt;
&lt;p&gt;기본기도 없고 실무 활용 경험도 부족했기 때문에 개념부터 제대로 익혀야겠다는 생각에, 유명한 &lt;strong&gt;Stephane Maarek&lt;/strong&gt;의 강의를 신청해서 들었다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/aws-lecture.png&quot; alt=&quot;aws lecture&quot; /&gt;&lt;/p&gt;
&lt;p&gt;여러 블로그에서 경고하듯 강의 분량이 상당해서 시간적 여유가 없는 분들에게 선뜻 추천하기는 어렵지만, 내용이 비교적 상세하고 &lt;strong&gt;Hands-on 실습 과정&lt;/strong&gt;이 꽤 유용했다. 중간중간 시험 팁도 짚어주고, 무엇보다 &lt;strong&gt;서비스별 Use Case와 비용 비교&lt;/strong&gt; 파트가 문제 풀이 시에 정말 많은 도움이 됐다.&lt;/p&gt;
&lt;p&gt;평소 실무에서 접하는 서비스는 한정적인 경우가 많은 만큼, 낯선 서비스에 대한 기본 이론과 시험에서 주의해서 봐야 할 포인트를 강의로 익힌 뒤 Dump 문제 풀이로 넘어가는 흐름을 추천한다.&lt;/p&gt;
&lt;h3&gt;3주차 — Dump + 강의 노트 정리&lt;/h3&gt;
&lt;p&gt;Dump 문제 풀이는 오답 정리를 별도로 진행하지 않았다. 문제를 비교적 빠르게 푸는 편인데도 수백 문제를 한꺼번에 풀다 보면 정리할 시간이 나지 않기도 하고, 유사한 문제를 계속 틀리다 보면 결국 &lt;strong&gt;어떤 유형&lt;/strong&gt;(예를 들면 비용 효율적인 답을 고르는 문제)과 &lt;strong&gt;어떤 서비스&lt;/strong&gt;에서 자주 막히는지 감이 잡히기 때문이다. 오답 정리보다는 &lt;strong&gt;자주 등장하는 시나리오와 키워드&lt;/strong&gt;를 중심으로 강의 노트와 함께 정리해나갔다.&lt;/p&gt;
&lt;p&gt;총 약 &lt;strong&gt;400~500문제&lt;/strong&gt; 정도를 풀었고, 시간 날 때마다 틈틈이 진행했다. 여러 블로그에서 공유하는 Dump PDF를 다운로드받아 풀거나, 검색으로 나오는 시험 사이트들을 그때그때 활용했다. &lt;strong&gt;Examtopics&lt;/strong&gt;의 경우 일정 문제 수를 넘기면 유료로 전환되어서, 약 50문제 풀이 후에는 PDF 문제 중 헷갈리는 답변의 &lt;strong&gt;Discussion 확인 용도&lt;/strong&gt;로만 검색하고 별도 구매는 하지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/aws-cloudpass.png&quot; alt=&quot;aws cloudpass&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3주차 후반쯤에는 &lt;strong&gt;Cloud Pass&lt;/strong&gt; 앱으로 합격했다는 후기를 보고 앱을 다운로드해 문제를 풀었다. 개인적으로는 정말 강추한다. 수록 문제가 1,000개가 넘는데, 시간 관계상 다 풀지는 못했다. 유사하거나 동일한 문제도 꽤 있었으니, &lt;strong&gt;영역별로 집중해서 풀어보는 방식&lt;/strong&gt;을 추천한다. 많이 풀면 풀수록 어떤 부분이 약한지, 어떤 함정 옵션에 자주 넘어가는지 파악할 수 있고, 이를 기반으로 추가적인 학습 및 개념 정리를 할 수 있다.&lt;/p&gt;
&lt;h3&gt;4주차 — 키워드 위주 개념 정리 &amp;amp; 백서(White Paper) 읽기&lt;/h3&gt;
&lt;p&gt;어느 정도 문제를 풀고부터는 자주 틀리는 키워드 위주로 &lt;strong&gt;AWS 공식 Documentation&lt;/strong&gt;을 찾아보고 다시 문제를 푸는 방식으로, 헷갈리는 시나리오에 대한 나만의 정리를 해나갔다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;백서(White Paper)를 읽는 것도 꽤 도움이 됐다.&lt;/strong&gt; 예상 문제가 직접 나오는 건 아니지만, Best Practice를 설명해주기 때문에 해당 케이스와 부합하는 시나리오에서 선택지를 소거하고 최적의 답을 찾아내는 데 좋은 길라잡이가 되어 주었다. 특히 &lt;strong&gt;장애 복구(Disaster Recovery)&lt;/strong&gt; 관련 백서는 꼭 한 번 읽어보길 추천한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;시험 응시 🖥️&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;온라인 테스트&lt;/strong&gt;로 진행했다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/aws-online-test.png&quot; alt=&quot;aws online test&quot; /&gt;&lt;/p&gt;
&lt;p&gt;시험 일정을 예약하면 이메일을 받게 되는데, &lt;strong&gt;시험 환경 테스트는 사전에 꼭 진행&lt;/strong&gt;해야 한다. System test는 시험 환경이 조금이라도 달라지면 다시 진행하기를 권장하는데, 내 경우에는 Email을 받자마자 한 번, 시험날 약 1시간 전에 한 번 더 진행했다. 시험 환경 때문에 시험에 불이익을 받는 불상사를 받으면 굉장히 억울할테니, 여러 번 검증하는 걸 추천한다.&lt;/p&gt;
&lt;p&gt;실제 시험 Check-In을 하면 준비된 신분증 촬영, 주변 환경 촬영을 진행한다. 이 과정을 거친 후 매칭된 감독관과 채팅을 통해 시험 전 추가 검증 절차를 진행한다. 채팅을 통해 음성 통화도 진행할 수 있는데 이 과정에서 간단한 의사소통을 하고, 요구 사항에 대응해야 하기 때문에 기본적인 영어 의사소통을 할 수 있어야 한다. 주변 환경 체크를 꽤 꼼꼼히 진행하고, 웹캠으로 주변을 360도 촬영해 달라는 요청도 받았던 만큼 &lt;strong&gt;시험 전 주변 정리는 미리&lt;/strong&gt; 해두는 편이 좋다.&lt;/p&gt;
&lt;p&gt;모든 절차를 마무리하고 감독관의 승인이 떨어지면 바로 시험에 응시하면 된다.&lt;/p&gt;
&lt;p&gt;나의 경우 ESL 추가 시간은 별도로 신청하지 않았고, 영어로 문제를 푸는 게 더 익숙해서 영어로 응시했다. 문제 풀이를 빠르게 하는 편이라 시간은 넉넉했다. &lt;strong&gt;첫 번째 풀이에 약 60분&lt;/strong&gt;을 쓴 뒤, 나머지 시간은 Flag 표시해 둔 문제를 다시 검토하고 헷갈렸던 답변을 재확인하는 데 활용했다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;시험 결과 🏆&lt;/h2&gt;
&lt;p&gt;결과가 보통 5시간 이내에 나온다는 말에 계속 기다렸는데, 내 경우에는 그렇게 빠르지 않았다.&lt;/p&gt;
&lt;p&gt;시험 시작이 8시 30분이었고 완료하고 나니 거의 11시였는데, &lt;strong&gt;새벽 3시까지 뜬눈으로 기다렸지만&lt;/strong&gt; 결과가 오지 않았다. Credly에서 뱃지가 먼저 날아오는 경우가 많고, 먼저 안 날아오는 경우 그렇게 좋은 지표가 아니라는 말에 떨어졌나... 좌절하며 결국 포기하고 잠들었다가, 아침에 일어나니 &lt;strong&gt;자격증 배지 등록 관련 이메일&lt;/strong&gt;이 반갑게 도착해 있었다. 😄
&lt;img src=&quot;@/assets/posts/aws-credly-badge.png&quot; alt=&quot;aws credly badge&quot; /&gt;
&lt;s&gt;이 메일을 얼마나 기다렸는지...&lt;/s&gt;
&amp;lt;br&amp;gt;
&lt;s&gt;자기 전까지 안 오길래 다음 시험을 준비해야하나 무진장 마음고생했다...&lt;/s&gt;
&amp;lt;br&amp;gt;
&lt;s&gt;환율이 올라 20만원이 넘는 시험인지라...&lt;/s&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;시험을 마치며 💬&lt;/h2&gt;
&lt;p&gt;Dump 문제가 그대로 나온다는 후기도 있고, 예상치 못한 질문에 당황했다는 후기도 봤는데, 내 경우에는 Dump가 그대로 나오는 경우는 거의 없었다. 문제 자체를 많이 푼 편은 아니라 못 봤거나 잊어버린 문제가 출제되었을 수는 있지만, 전체적으로는 &lt;strong&gt;Dump만으로 완전히 대비할 수 있는 시험은 아니었다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;다만 여러 블로그에서 강조하듯, &lt;strong&gt;키워드와 시나리오 위주로 개념을 정리하는 것&lt;/strong&gt;은 확실히 효과가 있다. 수능의 킬러 문항처럼 의도적으로 까다롭게 낸 문제도 몇 개 있었지만, 그런 문제를 제외하면 대부분 정리해둔 개념 범위 안에서 출제됐다. 결국 &lt;strong&gt;얼마나 논리적인 사고로 최적의 답을 추론할 수 있는가&lt;/strong&gt;를 보는 시험이라는 느낌이었다. 대부분의 문제는 2개의 선택지를 소거하고, 남은 2개 중에서 고민하는 구조였고 — 그 안에서 나만의 답을 찾는 데 꽤 많은 시간을 쏟았다.&lt;/p&gt;
&lt;p&gt;조금은 충동적으로 응시한 시험이었지만, 나름대로 빡세게 준비했고 그만큼 좋은 결과를 얻을 수 있어 만족스럽다. 3년이 지나기 전에 &lt;strong&gt;Professional Level&lt;/strong&gt; 시험도 도전할 예정이다. 🚀&lt;/p&gt;
</content:encoded></item><item><title>aspect-ratio Troubleshooting on Safari</title><link>https://tessa1217.github.io/posts/browser/aspect-ratio-troubleshooting/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/browser/aspect-ratio-troubleshooting/</guid><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;aspect-ratio Troubleshooting on Safari&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — Safari에서 렌더링 중 레이아웃이 순간적으로 틀어졌다 복원되는 fluctuation 현상. 부모 div에 &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;가 &lt;strong&gt;둘 다&lt;/strong&gt; 명시된 상태에서 자식 &lt;code&gt;img&lt;/code&gt;에 &lt;code&gt;aspect-ratio&lt;/code&gt;를 주면, Safari가 이미지 로딩 중 사이즈를 잘못 계산해 인접 요소를 튕겨낸다. 해결책은 이미지 컴포넌트에서 &lt;code&gt;aspect-ratio&lt;/code&gt;를 제거하고 &lt;code&gt;object-fit: cover&lt;/code&gt;로 대체하는 것이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;배경&lt;/h2&gt;
&lt;p&gt;기능 개발 진행 후 확인하는 도중 Safari에서 요소의 높이가 shifting 되었다가 다시 원하는 형태로 복원되는 fluctuation 문제가 발생했다. 디자인 시스템의 공통 이미지 컴포넌트(ex - &lt;code&gt;ImageComponent&lt;/code&gt;)는 외부에서 &lt;code&gt;ratio&lt;/code&gt; prop을 받아 내부 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 태그에 CSS로 &lt;code&gt;aspect-ratio&lt;/code&gt;를 주입하는 구조였다. Chrome/Firefox에서는 정상 동작했으나, &lt;strong&gt;Safari에서만 렌더링 도중 레이아웃이 순간적으로 틀어졌다가 복원되는 현상&lt;/strong&gt;이 발견되었다.&lt;/p&gt;
&lt;p&gt;상위 컨테이너의 &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;가 고정되어 있어 렌더링이 완전히 끝나면 크기와 정렬은 맞춰진다. 그러나 렌더링 완료 이전, 이미지 처리 도중에 요소가 순간적으로 잘못된 크기를 갖고 이 과정에서 위아래 인접 요소들이 &lt;code&gt;padding&lt;/code&gt;이나 &lt;code&gt;margin&lt;/code&gt;이 갑자기 생긴 것처럼 튕겨나갔다가 다시 원래 자리로 돌아오는 증상이 반복되었다. 네트워크 속도가 느릴수록 이미지 수신 latency가 길어지면서 현상이 더 뚜렷하게 관측되었다.&lt;/p&gt;
&lt;p&gt;아래는 실제 증상을 재현한 애니메이션이다. 아이콘 이미지가 로딩되는 동안 일시적으로 세로로 늘어나 인접한 해시태그 chip들을 36px 아래로 밀어냈다가, 로딩 완료 후 원래 자리로 돌아오는 fluctuation 현상을 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/safari-fluctuation.svg&quot; alt=&quot;safari fluctuation 재현 애니메이션&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;컴포넌트 구조&lt;/h2&gt;
&lt;p&gt;문제가 발생한 DOM 구조를 대략적으로 표시하면 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flex-container
└── flex-container
      └── flex-container
            └── div.icon-wrapper        ← width: 40px; height: 40px; border-radius: 50%
                  └── ImageComponent    ← aspect-ratio: 1 prop 전달됨
                        └── &amp;lt;img&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;문제가 된 코드&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 사용처 --&amp;gt;
&amp;lt;IconWrapper&amp;gt;
  &amp;lt;ImageComponent :src=&quot;imgSrc&quot; aspect-ratio=&quot;1&quot; /&amp;gt;
&amp;lt;/IconWrapper&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/* IconWrapper */
.icon-wrapper {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  overflow: hidden;
}

/* ImageComponent 내부 — aspect-ratio를 prop으로 주입 */
img {
  aspect-ratio: v-bind(aspectRatio); /* → aspect-ratio: 1 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;엔진 처리 흐름 비교&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;width + height + aspect-ratio&lt;/code&gt;가 모두 설정된 요소를 두 엔진이 처리하는 방식을 나타낸 다이어그램이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
  shared[&quot;width + height + aspect-ratio&amp;lt;br/&amp;gt;(element has all three set)&quot;]

  shared --&amp;gt;|&quot;layout starts&quot;| wk1[&quot;RenderBox layout starts&quot;]
  shared --&amp;gt;|&quot;layout starts&quot;| bl1[&quot;LayoutNG build phase&quot;]

  wk1 --&amp;gt; wk2[&quot;shouldComputeLogicalHeight&amp;lt;br/&amp;gt;FromAspectRatio()&quot;]
  wk2 --&amp;gt;|&quot;height set → skip&quot;| wk3[&quot;computeLogicalHeight()&amp;lt;br/&amp;gt;aspect-ratio bypassed&quot;]
  wk3 --&amp;gt; wk4[&quot;❌ aspect-ratio 무시됨&amp;lt;br/&amp;gt;stretch 높이 그대로 적용&quot;]

  bl1 --&amp;gt; bl2[&quot;ComputeBlockSize()&amp;lt;br/&amp;gt;treats ratio as hint&quot;]
  bl2 --&amp;gt;|&quot;ratio overrides&quot;| bl3[&quot;height recomputed&amp;lt;br/&amp;gt;width ÷ aspect-ratio&quot;]
  bl3 --&amp;gt; bl4[&quot;✓ aspect-ratio 적용됨&amp;lt;br/&amp;gt;올바른 비율 렌더링&quot;]

  style shared fill:#CECBF6,color:#3C3489,stroke:#AFA9EC
  style wk2   fill:#FAC775,color:#854F0B,stroke:#EF9F27
  style bl2   fill:#FAC775,color:#854F0B,stroke:#EF9F27
  style wk4   fill:#F5C4B3,color:#993C1D,stroke:#F0997B
  style bl4   fill:#9FE1CB,color:#0F6E56,stroke:#5DCAA5
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;출처:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WebKit: &lt;a href=&quot;https://trac.webkit.org/changeset/271061/webkit&quot;&gt;&lt;code&gt;WebCore/rendering/RenderBox.cpp&lt;/code&gt; — &lt;code&gt;shouldComputeLogicalHeightFromAspectRatio()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Blink: &lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/layout/&quot;&gt;&lt;code&gt;blink/renderer/core/layout/&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;h3&gt;1. &lt;code&gt;aspect-ratio&lt;/code&gt;는 weak declaration이다&lt;/h3&gt;
&lt;p&gt;CSS 스펙상 &lt;code&gt;aspect-ratio&lt;/code&gt;는 &lt;strong&gt;약한 선언(weak declaration)&lt;/strong&gt; 이다. &lt;code&gt;width&lt;/code&gt;와 &lt;code&gt;height&lt;/code&gt;가 &lt;strong&gt;둘 다&lt;/strong&gt; 명시된 경우, 브라우저는 aspect-ratio를 무시하고 명시된 값을 우선한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* ❌ 이 상태에서 aspect-ratio는 무시된다 */
.icon-wrapper {
  width: 40px;
  height: 40px; /* height가 확정값으로 존재 */
}
img {
  aspect-ratio: 1; /* 무시됨 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 3단 중첩 flex의 &lt;code&gt;align-items: stretch&lt;/code&gt; 전파&lt;/h3&gt;
&lt;p&gt;Flexbox의 기본값은 &lt;code&gt;align-items: stretch&lt;/code&gt;다. 3단 중첩된 flex 컨테이너를 거치면서 이 stretch 값이 누적 전파되어, &lt;code&gt;.icon-wrapper&lt;/code&gt;의 높이가 flex 라인 높이에 맞게 강제로 늘어날 수 있다. 이렇게 늘어난 높이가 &lt;code&gt;img&lt;/code&gt;에 전달되면 &lt;code&gt;aspect-ratio&lt;/code&gt;와 충돌한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flex (stretch) → flex (stretch) → flex (stretch) → div height 결정
                                                           ↓
                                                   img가 이 height를 받음
                                                   → aspect-ratio 충돌
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Safari vs Chrome의 해석 차이&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chrome (Blink)&lt;/th&gt;
&lt;th&gt;Safari (WebKit)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;가 명시된 상태에서 &lt;code&gt;aspect-ratio&lt;/code&gt; 처리&lt;/td&gt;
&lt;td&gt;aspect-ratio를 &lt;strong&gt;힌트&lt;/strong&gt;로 사용해 재계산&lt;/td&gt;
&lt;td&gt;명시된 &lt;code&gt;height&lt;/code&gt;를 &lt;strong&gt;확정값&lt;/strong&gt;으로 간주, aspect-ratio 무시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stretch로 전파된 높이 처리&lt;/td&gt;
&lt;td&gt;aspect-ratio가 있으면 높이를 재계산&lt;/td&gt;
&lt;td&gt;전파된 height를 그대로 확정값으로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Chrome은 aspect-ratio가 있으면 height를 재계산하고, Safari는 height가 있으면 aspect-ratio를 무시한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CSS 스펙이 이 엣지 케이스를 명확하게 정의하지 않기 때문에 두 브라우저 모두 스펙 위반은 아니다. Safari가 스펙에 더 엄격하고, Chrome이 더 관대하게 해석한다고 볼 수 있다.&lt;/p&gt;
&lt;h3&gt;4. Safari + lazy loading → layout fluctuation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;loading=&quot;lazy&quot;&lt;/code&gt; 이미지는 로드 전에 intrinsic size를 알 수 없다. Safari에서는 이 상태에서 HTML &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; attribute 기반의 자동 비율 계산도 적용되지 않아 문제가 복합된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고: &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=224197&quot;&gt;WebKit Bugzilla #224197&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 두 가지가 결합되면 다음과 같은 순서로 fluctuation이 발생한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 이미지 로드 전
   → Safari가 aspect-ratio를 무시한 채 stretch 높이로 img 크기를 잡음
   → 잘못된 크기가 상위 flex에 전파 → 인접 요소 밀려남

2. 이미지 수신 완료
   → 컨테이너의 고정 width/height가 최종 기준이 되어 크기 복원
   → 인접 요소 다시 원래 자리로 돌아옴

3. 결과
   → 렌더링 완료 후에는 정상으로 보이지만
   → 네트워크 latency만큼 fluctuation이 지속되어 사용자에게 노출됨
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이는 Chrome이 &lt;code&gt;aspect-ratio&lt;/code&gt;를 힌트로 사용해 이미지 로드 전에도 올바른 크기를 미리 계산하는 것과 대비되는 동작이다. Chrome에서는 fluctuation 자체가 발생하지 않는다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;h3&gt;핵심 원칙&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;부모가 &lt;code&gt;width&lt;/code&gt; + &lt;code&gt;height&lt;/code&gt;를 둘 다 확정하고 있는 경우, 자식 &lt;code&gt;img&lt;/code&gt;의 &lt;code&gt;aspect-ratio&lt;/code&gt;는 무의미하거나 충돌을 유발한다.&lt;/strong&gt;&lt;br /&gt;
이 경우 &lt;code&gt;aspect-ratio&lt;/code&gt;의 역할은 &lt;code&gt;object-fit: cover&lt;/code&gt;로 대체해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;수정된 코드&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 사용처 — aspectRatio prop 전달 제거 --&amp;gt;
&amp;lt;IconWrapper&amp;gt;
  &amp;lt;ImageComponent :src=&quot;imgSrc&quot; /&amp;gt;
&amp;lt;/IconWrapper&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/* IconWrapper — 크기와 모양을 여기서 확정 */
.icon-wrapper {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  overflow: hidden;
  flex-shrink: 0; /* flex 환경에서 찌그러짐 방지 */
}

/* ImageComponent 내부 — 부모를 채우는 역할만 담당 */
img {
  width: 100%;
  height: 100%;
  object-fit: cover; /* 비율 유지하며 크롭, aspect-ratio 대체 */
  display: block;    /* inline 기본값의 baseline 공백 제거 */
  /* aspect-ratio 제거 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;aspectRatio prop이 반드시 필요한 경우&lt;/h3&gt;
&lt;p&gt;만약 컴포넌트 외부에서 비율을 제어해야 하는 요구사항이 있다면, &lt;strong&gt;&lt;code&gt;img&lt;/code&gt;가 아닌 wrapper &lt;code&gt;div&lt;/code&gt;에 &lt;code&gt;aspect-ratio&lt;/code&gt;를 적용하고 &lt;code&gt;height&lt;/code&gt;는 제거&lt;/strong&gt;한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* ✅ aspect-ratio는 wrapper에서 제어, height는 제거 */
.icon-wrapper {
  width: 40px;
  /* height 제거 */
  aspect-ratio: v-bind(aspectRatio); /* 1, 16/9 등 외부에서 주입 */
  border-radius: 50%;
  overflow: hidden;
  flex-shrink: 0;
}

img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;수정 전/후 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;수정 전&lt;/th&gt;
&lt;th&gt;수정 후&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비율 제어 위치&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt; (자식)&lt;/td&gt;
&lt;td&gt;제거 / wrapper로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari 증상&lt;/td&gt;
&lt;td&gt;렌더링 중 fluctuation → 인접 요소 튕김&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저속 네트워크&lt;/td&gt;
&lt;td&gt;증상 심화 (이미지 latency에 비례)&lt;/td&gt;
&lt;td&gt;무관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome/Firefox 동작&lt;/td&gt;
&lt;td&gt;정상 (관대한 해석)&lt;/td&gt;
&lt;td&gt;정상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이미지 크롭 방식&lt;/td&gt;
&lt;td&gt;미정의&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object-fit: cover&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;타 라이브러리의 설계 판단&lt;/h2&gt;
&lt;p&gt;같은 문제를 어떻게 회피했는지 주요 라이브러리를 비교하면, 이번 픽스 방향이 업계 표준과 일치함을 확인할 수 있다.&lt;/p&gt;
&lt;h3&gt;Chakra UI v3 &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;aspectRatio&lt;/code&gt; prop을 받지만, &lt;strong&gt;&lt;code&gt;img&lt;/code&gt; 자체에는 절대 &lt;code&gt;aspect-ratio&lt;/code&gt;를 주지 않는다.&lt;/strong&gt; 내부 구조는 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Chakra UI Image — aspectRatio prop 전달 시 내부 렌더링 구조
&amp;lt;Box
  position=&quot;relative&quot;
  aspectRatio={ratio}     // ← wrapper Box에만 aspect-ratio 적용
  overflow=&quot;hidden&quot;
&amp;gt;
  &amp;lt;img
    style={{
      position: &quot;absolute&quot;,
      inset: 0,             // top/right/bottom/left: 0
      width: &quot;100%&quot;,
      height: &quot;100%&quot;,
      objectFit: &quot;cover&quot;,
    }}
  /&amp;gt;
&amp;lt;/Box&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;img&lt;/code&gt;에 &lt;code&gt;position: absolute&lt;/code&gt;를 주는 것이 핵심이다. absolute 요소는 flex formatting context에서 이탈하기 때문에 부모 flex의 &lt;code&gt;align-items: stretch&lt;/code&gt; 전파 경로 자체가 끊어진다. wrapper Box는 &lt;code&gt;height&lt;/code&gt;를 명시하지 않은 채 &lt;code&gt;aspect-ratio&lt;/code&gt;만 갖기 때문에 Safari의 &lt;code&gt;shouldComputeLogicalHeightFromAspectRatio()&lt;/code&gt;가 &lt;code&gt;true&lt;/code&gt;를 반환해 비율 계산이 정상 작동한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고: &lt;a href=&quot;https://chakra-ui.com/docs/components/image&quot;&gt;Chakra UI Image 컴포넌트 문서&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Next.js &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;width&lt;/code&gt; + &lt;code&gt;height&lt;/code&gt; prop을 필수로 받아 크기를 미리 확정한다. &lt;code&gt;aspect-ratio&lt;/code&gt;는 사용하지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Next.js Image — 내부 렌더링
&amp;lt;span style={{ display: &quot;inline-block&quot;, width, height }}&amp;gt;
  &amp;lt;img style={{ width: &quot;100%&quot;, height: &quot;100%&quot;, objectFit: &quot;cover&quot; }} /&amp;gt;
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이미지 로드 전에도 공간이 pixel 단위로 확정되기 때문에 CLS(Cumulative Layout Shift)가 0이 된다.&lt;/p&gt;
&lt;h3&gt;세 접근 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;직접 &lt;code&gt;aspect-ratio&lt;/code&gt; (문제 케이스)&lt;/th&gt;
&lt;th&gt;Next.js &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Chakra UI &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비율 제어 위치&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt; 직접&lt;/td&gt;
&lt;td&gt;width + height 명시&lt;/td&gt;
&lt;td&gt;wrapper &lt;code&gt;Box&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt; position&lt;/td&gt;
&lt;td&gt;flex child (static)&lt;/td&gt;
&lt;td&gt;static / absolute&lt;/td&gt;
&lt;td&gt;&lt;code&gt;absolute&lt;/code&gt; (inset: 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;flex stretch 영향&lt;/td&gt;
&lt;td&gt;받음 (Safari 문제 원인)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari 안전성&lt;/td&gt;
&lt;td&gt;불안정&lt;/td&gt;
&lt;td&gt;안정&lt;/td&gt;
&lt;td&gt;안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공통 원칙&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt;에 &lt;code&gt;aspect-ratio&lt;/code&gt; 주지 않음&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt;에 &lt;code&gt;aspect-ratio&lt;/code&gt; 주지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;부록: flex &lt;code&gt;align-items: stretch&lt;/code&gt; 기본값 이해하기&lt;/h2&gt;
&lt;p&gt;Safari 버그의 근본 원인이 되는 &lt;code&gt;align-items: stretch&lt;/code&gt; 기본값의 동작을 세 단계로 정리한다.&lt;/p&gt;
&lt;h3&gt;1단계: stretch (기본값) — 버그 발생&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;align-items&lt;/code&gt;를 명시하지 않으면 &lt;code&gt;stretch&lt;/code&gt;가 적용된다. 가장 키가 큰 flex 자식의 높이로 모든 자식이 맞춰진다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flex-container (align-items: stretch — 기본값)
  ├── sibling (height: 96px — 가장 키 큰 자식)
  └── icon-wrapper (height: 96px ← stretch로 결정)
        └── img (height: 100% = 96px, aspect-ratio 무시됨)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.flex-container { display: flex; /* align-items 미지정 → stretch */ }
.icon-wrapper   { width: 44px; /* height 없음 → stretch로 결정 */ }
img             { aspect-ratio: 1; /* Safari에서 무시됨 */ }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2단계: flex-start 적용 — stretch 해제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;flex-container (align-items: flex-start)
  ├── sibling (height: 96px)
  └── icon-wrapper (height: 44px ← 자체 크기 유지)
        └── img (height: 100% = 44px, aspect-ratio 정상)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.flex-container { display: flex; align-items: flex-start; }
.icon-wrapper   { width: 44px; height: 44px; }
img             { width: 100%; height: 100%; object-fit: cover; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3단계: position: absolute 분리 — Chakra UI 방식&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;img&lt;/code&gt;를 &lt;code&gt;position: absolute&lt;/code&gt;로 꺼내면 flex formatting context를 완전히 이탈해 stretch 전파 경로 자체가 차단된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flex-container
  └── icon-wrapper (position: relative, aspect-ratio: 1, width: 44px)
                    → 높이: 44px (aspect-ratio로 결정)
        └── img (position: absolute, inset: 0)
                    → flex 자식 아님 → stretch 무관
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.icon-wrapper {
  width: 44px;
  aspect-ratio: 1;    /* wrapper에서 비율 제어 */
  position: relative;
  border-radius: 50%;
  overflow: hidden;
}
img {
  position: absolute; /* flex context 이탈 */
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;align-items: stretch가 중첩 flex에서 전파되는 과정&lt;/h3&gt;
&lt;p&gt;3단 중첩 flex에서는 이 효과가 누적된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flex-A (stretch) → flex-B (stretch) → flex-C (stretch) → icon-wrapper 최종 height 결정
                                                                 ↓
                                                   img가 이 height를 받음 → aspect-ratio 충돌
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 레벨을 통과할 때마다 stretch는 자식의 cross-axis 크기를 컨테이너에 맞게 확장한다. 중첩이 깊을수록 최종 img에 전달되는 height가 예상 밖의 값이 될 가능성이 높다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;관련 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&quot;&gt;MDN — aspect-ratio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.quirksmode.org/blog/archives/2021/05/aspectratio.html&quot;&gt;QuirksBlog — aspect-ratio in flex/grid context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.duvallj.pw/posts/2024-09-14-safari-css-bug.html&quot;&gt;Jack Duvall&apos;s Blog — A Safari aspect-ratio CSS Bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=224197&quot;&gt;WebKit Bugzilla #224197 — lazy loaded images aspect-ratio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.com/?search=aspect-ratio&quot;&gt;Can I use — aspect-ratio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chakra-ui.com/docs/components/image&quot;&gt;Chakra UI — Image 컴포넌트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/components/image&quot;&gt;Next.js — Image 컴포넌트&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>WebView Bridge 통신 Part 1</title><link>https://tessa1217.github.io/posts/browser/web-view-1/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/browser/web-view-1/</guid><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;WebView Bridge 통신 — Part 1: 개요 및 이론&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;웹뷰에서 네이티브 앱과 어떻게 대화하는가 — 프로토콜, 패턴, Bridge Pattern까지&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-webview%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;WebView란 무엇인가&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%EC%99%9C-%EC%9B%B9%EA%B3%BC-%EC%95%B1-%EA%B0%84-%ED%86%B5%EC%8B%A0%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80&quot;&gt;왜 웹과 앱 간 통신이 필요한가&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-webview-%ED%86%B5%EC%8B%A0-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot;&gt;WebView 통신 프로토콜&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EC%9E%90%EC%A3%BC-%EC%93%B0%EC%9D%B4%EB%8A%94-bridge-%ED%86%B5%EC%8B%A0-%ED%8C%A8%ED%84%B4&quot;&gt;자주 쓰이는 Bridge 통신 패턴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-bridge-pattern-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4&quot;&gt;Bridge Pattern (디자인 패턴)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. WebView란 무엇인가&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;WebView&lt;/strong&gt;는 네이티브 앱(iOS/Android) 안에 웹 콘텐츠를 렌더링하는 내장 브라우저 컴포넌트다. 사용자 입장에서는 앱처럼 보이지만, 실제로는 HTML/CSS/JavaScript로 만들어진 웹 페이지가 네이티브 껍데기 안에서 동작하고 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────┐
│        네이티브 앱 (iOS/Android) │
│  ┌───────────────────────────┐  │
│  │         WebView           │  │
│  │  ┌─────────────────────┐  │  │
│  │  │   HTML/CSS/JS (웹)  │  │  │
│  │  └─────────────────────┘  │  │
│  └───────────────────────────┘  │
└─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;플랫폼별 WebView 구현체&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;플랫폼&lt;/th&gt;
&lt;th&gt;컴포넌트&lt;/th&gt;
&lt;th&gt;내부 엔진&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WKWebView&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WebKit (Safari 엔진)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WebView&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chromium (Blink 엔진)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;WebView&amp;gt;&lt;/code&gt; 컴포넌트&lt;/td&gt;
&lt;td&gt;플랫폼 네이티브 WebView 래핑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;하이브리드 앱 아키텍처&lt;/h3&gt;
&lt;p&gt;WebView를 활용한 하이브리드 앱은 크게 두 가지 방식으로 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full WebView&lt;/strong&gt;: 앱 전체가 웹으로 구성. 네이티브는 껍데기 역할만 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial WebView&lt;/strong&gt;: 일부 화면(주문, 결제, 이벤트 등)만 웹으로 구성하고 나머지는 네이티브&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;후자가 실무에서 훨씬 흔하며, 이때 &lt;strong&gt;네이티브와 웹 간 통신&lt;/strong&gt;이 반드시 필요해진다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 왜 웹과 앱 간 통신이 필요한가&lt;/h2&gt;
&lt;p&gt;웹(WebView)과 네이티브 앱은 서로 다른 실행 환경에서 동작한다. 웹은 브라우저 샌드박스 안에 갇혀 있고, 네이티브 기능(카메라, 햅틱, 푸시 알림, 키체인 등)에 직접 접근할 수 없다.&lt;/p&gt;
&lt;h3&gt;통신이 필요한 대표적인 시나리오&lt;/h3&gt;
&lt;h4&gt;웹 → 네이티브 방향 (명령)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;네비게이션&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹 페이지에서 네이티브 뒤로가기 스택을 pop하거나 탭을 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;햅틱 피드백&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;버튼 탭, 찜하기 등 사용자 인터랙션에 촉각 피드백 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;카메라/갤러리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹에서 사진 촬영 또는 앨범 접근 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;생체 인증&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Face ID / 지문 인증 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;푸시 알림 권한&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;알림 권한 요청 다이얼로그 트리거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;소셜 공유&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네이티브 share sheet 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;결제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네이티브 결제 SDK 호출 (인앱결제, 카카오페이 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;네이티브 → 웹 방향 (데이터 전달)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인증 토큰&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네이티브 키체인/키스토어에 저장된 JWT를 웹으로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;유저 정보&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네이티브에서 관리하는 사용자 프로필 데이터 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;딥링크&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;외부에서 들어온 딥링크 정보를 웹에 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기기 정보&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OS 버전, 앱 버전, 디바이스 ID 등 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;네트워크 상태&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;오프라인 전환 이벤트 등 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 웹이 단독으로 처리할 수 없는 영역이 명확히 존재하기 때문에, 웹뷰 환경에서 &lt;strong&gt;양방향 통신 채널&lt;/strong&gt; — 즉 Bridge — 이 필수적이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. WebView 통신 프로토콜&lt;/h2&gt;
&lt;p&gt;플랫폼마다 웹과 네이티브가 통신하는 방식이 다르다.&lt;/p&gt;
&lt;h3&gt;3.1 iOS: WKWebView&lt;/h3&gt;
&lt;p&gt;iOS에서는 &lt;code&gt;WKWebView&lt;/code&gt;와 &lt;code&gt;WKScriptMessageHandler&lt;/code&gt;를 사용해 JavaScript ↔ Swift/Objective-C 통신을 구현한다.&lt;/p&gt;
&lt;h4&gt;웹 → 네이티브 (JavaScript → Swift)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript (웹)
window.webkit.messageHandlers.bridge.postMessage({
  type: &apos;HAPTIC_SELECTION&apos;
})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// Swift (네이티브)
class BridgeHandler: NSObject, WKScriptMessageHandler {
  func userContentController(
    _ userContentController: WKUserContentController,
    didReceive message: WKScriptMessage
  ) {
    guard let body = message.body as? [String: Any],
          let type = body[&quot;type&quot;] as? String else { return }

    switch type {
    case &quot;HAPTIC_SELECTION&quot;:
      let generator = UISelectionFeedbackGenerator()
      generator.selectionChanged()
    default: break
    }
  }
}

// WKWebView 설정
let config = WKWebViewConfiguration()
config.userContentController.add(bridgeHandler, name: &quot;bridge&quot;)
let webView = WKWebView(frame: .zero, configuration: config)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;네이티브 → 웹 (Swift → JavaScript)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Swift: 웹의 전역 함수를 직접 호출
webView.evaluateJavaScript(&quot;window.bridgeCallback(&apos;\(jsonString)&apos;)&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript (웹): 전역 함수로 수신
window.bridgeCallback = function(json) {
  const message = JSON.parse(json)
  // 메시지 처리
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;iOS의 특징: &lt;code&gt;postMessage()&lt;/code&gt;에 JavaScript 객체를 &lt;strong&gt;그대로&lt;/strong&gt; 전달할 수 있다. 내부적으로 직렬화가 처리된다.&lt;/p&gt;
&lt;h3&gt;3.2 Android: JavascriptInterface&lt;/h3&gt;
&lt;p&gt;Android에서는 &lt;code&gt;@JavascriptInterface&lt;/code&gt; 어노테이션으로 Kotlin/Java 메서드를 JavaScript에 노출한다.&lt;/p&gt;
&lt;h4&gt;웹 → 네이티브 (JavaScript → Kotlin)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript (웹) — Android는 문자열만 허용하므로 JSON 직렬화 필요
window.Android.postMessage(JSON.stringify({
  type: &apos;NAVIGATE_BACK&apos;
}))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// Kotlin (네이티브)
class AndroidBridge(private val activity: Activity) {
  @JavascriptInterface
  fun postMessage(json: String) {
    val message = JSONObject(json)
    when (message.getString(&quot;type&quot;)) {
      &quot;NAVIGATE_BACK&quot; -&amp;gt; activity.onBackPressed()
    }
  }
}

// WebView 설정
webView.settings.javaScriptEnabled = true
webView.addJavascriptInterface(AndroidBridge(this), &quot;Android&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;네이티브 → 웹 (Kotlin → JavaScript)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;webView.evaluateJavascript(&quot;window.bridgeCallback(&apos;$jsonString&apos;)&quot;, null)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Android의 특징: &lt;code&gt;@JavascriptInterface&lt;/code&gt; 메서드는 &lt;strong&gt;문자열 인자만&lt;/strong&gt; 받을 수 있다. 객체를 주고받으려면 반드시 JSON 직렬화/역직렬화가 필요하다.&lt;/p&gt;
&lt;h3&gt;3.3 React Native: WebView&lt;/h3&gt;
&lt;p&gt;React Native는 &lt;code&gt;react-native-webview&lt;/code&gt; 라이브러리를 통해 웹과 통신한다.&lt;/p&gt;
&lt;h4&gt;웹 → 네이티브&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript (웹뷰 내부) — 문자열만 허용
window.ReactNativeWebView.postMessage(JSON.stringify({
  type: &apos;HAPTIC_IMPACT&apos;,
  payload: { style: &apos;medium&apos; }
}))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// React Native
&amp;lt;WebView
  onMessage={(event) =&amp;gt; {
    const message = JSON.parse(event.nativeEvent.data)
    if (message.type === &apos;HAPTIC_IMPACT&apos;) {
      Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)
    }
  }}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;네이티브 → 웹&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// injectJavaScript로 JS 실행 (true 반환값 필요)
webViewRef.current.injectJavaScript(`
  window.bridgeCallback(&apos;${jsonString}&apos;); true;
`)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;플랫폼별 통신 방식 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;iOS (WKWebView)&lt;/th&gt;
&lt;th&gt;Android (WebView)&lt;/th&gt;
&lt;th&gt;React Native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;웹 → 네이티브&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;webkit.messageHandlers.{name}.postMessage(obj)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Android.{method}(str)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ReactNativeWebView.postMessage(str)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;네이티브 → 웹&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;evaluateJavaScript(js)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;evaluateJavascript(js, cb)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectJavaScript(js)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 타입 (웹→네이티브)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;객체 직접 전달 가능&lt;/td&gt;
&lt;td&gt;문자열만&lt;/td&gt;
&lt;td&gt;문자열만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전역 수신 창구&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;window.bridgeCallback&lt;/code&gt; (커스텀)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;window.bridgeCallback&lt;/code&gt; (커스텀)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;window.bridgeCallback&lt;/code&gt; (커스텀)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 자주 쓰이는 Bridge 통신 패턴&lt;/h2&gt;
&lt;h3&gt;4.1 단방향 Fire-and-Forget&lt;/h3&gt;
&lt;p&gt;가장 단순한 패턴. 웹이 명령만 보내고 응답을 기다리지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;웹 ──[NAVIGATE_BACK]──→ 네이티브
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;window.webkit.messageHandlers.bridge.postMessage({ type: &apos;NAVIGATE_BACK&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;: 네비게이션, 햅틱 피드백, 소셜 공유 트리거&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2 Request-Response (요청-응답)&lt;/h3&gt;
&lt;p&gt;웹이 요청을 보내고, 네이티브가 처리 후 콜백으로 응답한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;웹 ──[AUTH_TOKEN_REQUEST]──→ 네이티브
웹 ←──[AUTH_TOKEN_RECEIVE]── 네이티브
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// 1. 수신 핸들러 등록
window.bridgeCallback = function(json) {
  const message = JSON.parse(json)
  if (message.type === &apos;AUTH_TOKEN_RECEIVE&apos;) {
    useToken(message.payload.token)
  }
}

// 2. 요청 전송
window.ReactNativeWebView.postMessage(JSON.stringify({
  type: &apos;AUTH_TOKEN_REQUEST&apos;
}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;: 인증 토큰 조회, 기기 정보 조회, 권한 상태 확인&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.3 Event-Driven (이벤트 기반)&lt;/h3&gt;
&lt;p&gt;네이티브가 웹의 요청 없이 이벤트를 push한다. 수신 핸들러만 미리 등록해두면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;웹 ←──[AUTH_USER_RECEIVE]── 네이티브 (앱 초기화 시 자동 push)
웹 ←──[DEEP_LINK_RECEIVED]── 네이티브 (외부 딥링크 수신 시)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;: 딥링크 처리, 네트워크 상태 변화, 푸시 알림 수신&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.4 Promise-based Bridge&lt;/h3&gt;
&lt;p&gt;콜백 중첩을 피하기 위해 Bridge 호출을 Promise로 래핑한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function callBridge(requestType, responseType, timeout = 5000) {
  return new Promise((resolve, reject) =&amp;gt; {
    const timer = setTimeout(() =&amp;gt; reject(new Error(&apos;Bridge timeout&apos;)), timeout)

    window.bridgeCallback = (json) =&amp;gt; {
      const message = JSON.parse(json)
      if (message.type === responseType) {
        clearTimeout(timer)
        resolve(message.payload)
      }
    }

    window.ReactNativeWebView.postMessage(JSON.stringify({ type: requestType }))
  })
}

// 사용
const { token } = await callBridge(&apos;AUTH_TOKEN_REQUEST&apos;, &apos;AUTH_TOKEN_RECEIVE&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: async/await 문법으로 가독성 향상&lt;br /&gt;
&lt;strong&gt;주의&lt;/strong&gt;: 동시에 여러 요청이 발생하면 &lt;code&gt;bridgeCallback&lt;/code&gt; 충돌 가능 → &lt;code&gt;requestId&lt;/code&gt; 패턴으로 대응&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.5 Message Queue 패턴&lt;/h3&gt;
&lt;p&gt;WebView 로드 전에 도착하는 네이티브 메시지를 잃지 않기 위한 큐 패턴.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const messageQueue = []
let isReady = false

// 네이티브 메시지 수신 창구 (앱 초기화 즉시 설치)
window.bridgeCallback = function(json) {
  if (!isReady) {
    messageQueue.push(json)  // 준비 전 메시지는 큐에 보관
    return
  }
  processMessage(JSON.parse(json))
}

// 웹앱 초기화 완료 후 호출
function onAppReady() {
  isReady = true
  messageQueue.forEach(json =&amp;gt; processMessage(JSON.parse(json)))  // 밀린 메시지 처리
  messageQueue.length = 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;: 딥링크 처리, 앱 시작 시 유저 정보 push 등 타이밍 민감한 시나리오&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Bridge Pattern (디자인 패턴)&lt;/h2&gt;
&lt;p&gt;GoF(Gang of Four)의 &lt;strong&gt;Bridge Pattern&lt;/strong&gt;은 구조 패턴(Structural Pattern) 중 하나로, &lt;strong&gt;Abstraction(추상화)&lt;/strong&gt; 과 &lt;strong&gt;Implementation(구현)&lt;/strong&gt; 을 분리하여 둘 다 독립적으로 확장할 수 있게 한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Decouple an abstraction from its implementation so that the two can vary independently.&quot;
— GoF Design Patterns&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5.1 핵심 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Abstraction
  └─ impl: Implementor  ← 합성(composition)으로 주입
        ├─ ConcreteImplementorA
        └─ ConcreteImplementorB

RefinedAbstraction extends Abstraction
  └─ 도메인 특화 메서드 추가
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;: &quot;무엇을 할지&quot;를 정의. 실제 동작은 &lt;code&gt;impl&lt;/code&gt;에 위임&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementor&lt;/strong&gt;: 구현체의 인터페이스(계약)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ConcreteImplementor&lt;/strong&gt;: 실제 플랫폼/환경별 구현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RefinedAbstraction&lt;/strong&gt;: Abstraction을 상속해 도메인 특화 메서드 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 WebView Bridge에 Bridge Pattern이 적합한 이유&lt;/h3&gt;
&lt;p&gt;WebView 통신 구현의 핵심 문제는 &lt;strong&gt;환경 분기&lt;/strong&gt;다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;햅틱 피드백을 보내라&quot;는 명령이 있을 때...
  → 실제 앱(RN):   window.ReactNativeWebView.postMessage(JSON)
  → 실제 앱(iOS):  window.webkit.messageHandlers.bridge.postMessage(obj)
  → 실제 앱(AOS):  window.Android.postMessage(JSON)
  → 브라우저(개발): console.log로 시뮬레이션
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bridge Pattern 없이 구현하면 환경 분기 코드가 &lt;strong&gt;기능 메서드마다 반복&lt;/strong&gt;된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ❌ Bridge Pattern 없이 — 조건 분기가 기능마다 중복
function goBack() {
  if (window.ReactNativeWebView) {
    window.ReactNativeWebView.postMessage(JSON.stringify({ type: &apos;NAVIGATE_BACK&apos; }))
  } else if (window.webkit?.messageHandlers?.bridge) {
    window.webkit.messageHandlers.bridge.postMessage({ type: &apos;NAVIGATE_BACK&apos; })
  } else if (window.Android) {
    window.Android.postMessage(JSON.stringify({ type: &apos;NAVIGATE_BACK&apos; }))
  } else {
    console.log(&apos;[Dev] NAVIGATE_BACK&apos;)
  }
}

function hapticSelection() {
  // 위와 동일한 분기 코드가 또 반복...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bridge Pattern을 적용하면 &lt;strong&gt;환경 분기 로직을 구현체 한 곳에 격리&lt;/strong&gt;하고, 기능 메서드는 깔끔하게 유지된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ✅ Bridge Pattern 적용 후
class HapticBridge extends BridgeAbstraction {
  selection(): void {
    this.send({ type: &apos;HAPTIC_SELECTION&apos; })  // 플랫폼을 전혀 모름
  }
}

// 플랫폼 분기는 NativeBridge.send() 한 곳에만 존재
class NativeBridge implements IBridgeImpl {
  send(message): void {
    if (window.ReactNativeWebView) { ... }
    else if (window.webkit?.messageHandlers?.bridge) { ... }
    else if (window.Android) { ... }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 Bridge Pattern vs 유사 패턴 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;패턴&lt;/th&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;th&gt;차이&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bridge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstraction과 Implementation을 독립적으로 확장&lt;/td&gt;
&lt;td&gt;둘 다 계층 구조를 가질 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adapter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;호환되지 않는 인터페이스를 연결&lt;/td&gt;
&lt;td&gt;기존 코드를 변경 없이 사용하기 위한 사후 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Strategy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;알고리즘을 런타임에 교체&lt;/td&gt;
&lt;td&gt;단일 레벨의 알고리즘 교체, Abstraction 계층 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;복잡한 서브시스템에 단순한 인터페이스 제공&lt;/td&gt;
&lt;td&gt;계층 분리가 목적이 아님&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: &lt;a href=&quot;/posts/browser/web-view-2/&quot;&gt;실전 구현 — Nuxt 3 프로젝트의 Bridge 아키텍처&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;h3&gt;iOS / Apple 공식 문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WKScriptMessageHandler&lt;/strong&gt; — JavaScript 메시지를 수신하는 핸들러 프로토콜. &lt;code&gt;userContentController(_:didReceive:)&lt;/code&gt; 메서드 명세&lt;br /&gt;
https://developer.apple.com/documentation/webkit/wkscriptmessagehandler&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WKUserContentController.add(_:name:)&lt;/strong&gt; — &lt;code&gt;window.webkit.messageHandlers.{name}.postMessage()&lt;/code&gt; JavaScript 함수를 앱에 등록하는 메서드&lt;br /&gt;
https://developer.apple.com/documentation/webkit/wkusercontentcontroller/add(_:name:)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WKWebView.evaluateJavaScript(_:completionHandler:)&lt;/strong&gt; — Swift에서 JavaScript 문자열을 실행하는 메서드. 네이티브 → 웹 방향 통신에 사용&lt;br /&gt;
https://developer.apple.com/documentation/webkit/wkwebview/evaluatejavascript(_:completionhandler:)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Android 공식 문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WebView — Android Developer Guide&lt;/strong&gt; — &lt;code&gt;addJavascriptInterface&lt;/code&gt;, &lt;code&gt;evaluateJavascript&lt;/code&gt;, &lt;code&gt;settings.javaScriptEnabled&lt;/code&gt; 등 Android WebView 전반 가이드&lt;br /&gt;
https://developer.android.com/develop/ui/views/layout/webapps/webview&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;@JavascriptInterface annotation&lt;/strong&gt; — JavaScript에 노출할 Kotlin/Java 메서드를 지정하는 어노테이션 명세&lt;br /&gt;
https://developer.android.com/reference/android/webkit/JavascriptInterface&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;React Native WebView&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React Native WebView 통신 가이드&lt;/strong&gt; — &lt;code&gt;window.ReactNativeWebView.postMessage&lt;/code&gt;, &lt;code&gt;onMessage&lt;/code&gt; prop, &lt;code&gt;injectedJavaScript&lt;/code&gt;, &lt;code&gt;injectJavaScript&lt;/code&gt; 양방향 통신 상세 설명&lt;br /&gt;
https://github.com/react-native-webview/react-native-webview/blob/master/docs/Guide.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bridge Pattern (GoF)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bridge Pattern 개요&lt;/strong&gt; — Abstraction과 Implementation 분리 원칙, 적용 맥락, 유사 패턴(Adapter, Strategy, Facade)과의 비교&lt;br /&gt;
https://refactoring.guru/design-patterns/bridge&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bridge Pattern TypeScript 예제&lt;/strong&gt; — &lt;code&gt;Abstraction&lt;/code&gt;, &lt;code&gt;ExtendedAbstraction&lt;/code&gt;, &lt;code&gt;Implementation&lt;/code&gt;, &lt;code&gt;ConcreteImplementationA/B&lt;/code&gt; 구조의 전체 코드&lt;br /&gt;
https://refactoring.guru/design-patterns/bridge/typescript/example&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>WebView Bridge 통신 Part 2</title><link>https://tessa1217.github.io/posts/browser/web-view-2/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/browser/web-view-2/</guid><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;WebView Bridge 통신 - Part 2: 실전 구현&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;webview-study 프로젝트의 Bridge 아키텍처 — 설계 결정부터 컴포넌트 연동까지
&lt;strong&gt;Part 1&lt;/strong&gt;: &lt;a href=&quot;/posts/browser/web-view-1/&quot;&gt;개요 및 이론&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EC%A0%84%EC%B2%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EA%B0%9C%EC%9A%94&quot;&gt;전체 아키텍처 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%83%80%EC%9E%85-%EC%84%A4%EA%B3%84&quot;&gt;메시지 타입 설계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-core-%EB%A0%88%EC%9D%B4%EC%96%B4&quot;&gt;Core 레이어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-implementation-%EB%A0%88%EC%9D%B4%EC%96%B4&quot;&gt;Implementation 레이어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-feature-bridge-%EB%A0%88%EC%9D%B4%EC%96%B4&quot;&gt;Feature Bridge 레이어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%ED%99%98%EA%B2%BD-%EA%B0%90%EC%A7%80%EC%99%80-%EC%8B%B1%EA%B8%80%ED%84%B4&quot;&gt;환경 감지와 싱글턴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-nuxt-%ED%86%B5%ED%95%A9-plugin--composable&quot;&gt;Nuxt 통합: Plugin + Composable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%97%B0%EB%8F%99-%EC%98%88%EC%8B%9C&quot;&gt;컴포넌트 연동 예시&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-ssr-%ED%99%98%EA%B2%BD-%EA%B2%A9%EB%A6%AC-%EC%A0%84%EB%9E%B5&quot;&gt;SSR 환경 격리 전략&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%EC%A0%84%EC%B2%B4-%ED%9D%90%EB%A6%84-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8&quot;&gt;전체 흐름 다이어그램&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 전체 아키텍처 개요&lt;/h2&gt;
&lt;h3&gt;레이어 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Vue 컴포넌트 / 미들웨어
  └─ composable (useBridge)
       └─ Feature Bridge — Refined Abstraction
            ├─ NavigationBridge  goBack() / switchTab()
            ├─ HapticBridge      impact() / selection() / notification()
            └─ AuthBridge        requestToken() / onTokenReceived()
                  │
                  └─ BridgeAbstraction — Abstraction 베이스
                        └─ impl: IBridgeImpl
                              ├─ NativeBridge  (RN / iOS / Android)
                              └─ MockBridge    (브라우저 개발 환경)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;디렉토리 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;bridge/
  core/
    IBridgeImpl.ts          # Implementation 인터페이스 (계약)
    BridgeAbstraction.ts    # Abstraction 베이스 클래스
  features/
    NavigationBridge.ts     # Refined Abstraction: 네비게이션
    HapticBridge.ts         # Refined Abstraction: 햅틱
    AuthBridge.ts           # Refined Abstraction: 인증
  impl/
    NativeBridge.ts         # Concrete Implementation: 실제 네이티브
    MockBridge.ts           # Concrete Implementation: 브라우저 시뮬레이터
  index.ts                  # 환경 감지 + 싱글턴 export

types/
  bridge.ts                 # 메시지 타입 중앙 관리

composables/
  useBridge.ts              # Vue 컴포넌트용 composable

plugins/
  bridge.client.ts          # Nuxt client-only 플러그인 (SSR 격리)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;설계 원칙&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;원칙&lt;/th&gt;
&lt;th&gt;적용 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;환경 분기 격리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;플랫폼별 &lt;code&gt;postMessage&lt;/code&gt; 로직은 &lt;code&gt;NativeBridge.send()&lt;/code&gt; 한 곳에만 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메시지 타입 중앙 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;types/bridge.ts&lt;/code&gt;가 웹·네이티브 양쪽의 프로토콜 계약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;개발 환경 독립&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MockBridge&lt;/code&gt;로 네이티브 앱 없이 전체 기능 개발·테스트 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSR 안전&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bridge.client.ts&lt;/code&gt; 플러그인으로 &lt;code&gt;window&lt;/code&gt; 접근을 클라이언트 전용으로 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;싱글턴 공유&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모듈 레벨 싱글턴으로 앱 전체에서 동일 인스턴스 + 핸들러 상태 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 메시지 타입 설계&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;types/bridge.ts&lt;/code&gt;는 웹과 네이티브가 주고받는 모든 메시지의 형식을 정의한다. 이 파일 하나가 양쪽의 &lt;strong&gt;통신 프로토콜 계약&lt;/strong&gt;이 된다.&lt;/p&gt;
&lt;h3&gt;2.1 메시지 식별자&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// enum 대신 const object + as const 사용
// 이유: enum은 런타임에 실제 객체를 생성하지만, const object는 트리셰이킹에 유리
export const BridgeMessageType = {
  NAVIGATE_BACK: &apos;NAVIGATE_BACK&apos;,
  NAVIGATE_TAB: &apos;NAVIGATE_TAB&apos;,
  HAPTIC_IMPACT: &apos;HAPTIC_IMPACT&apos;,
  HAPTIC_SELECTION: &apos;HAPTIC_SELECTION&apos;,
  HAPTIC_NOTIFICATION: &apos;HAPTIC_NOTIFICATION&apos;,
  AUTH_TOKEN_REQUEST: &apos;AUTH_TOKEN_REQUEST&apos;,
  AUTH_TOKEN_RECEIVE: &apos;AUTH_TOKEN_RECEIVE&apos;,
  AUTH_USER_RECEIVE: &apos;AUTH_USER_RECEIVE&apos;,
} as const

// `typeof X[keyof typeof X]` 패턴으로 value union type 추출
export type BridgeMessageTypeValue = (typeof BridgeMessageType)[keyof typeof BridgeMessageType]
// → &apos;NAVIGATE_BACK&apos; | &apos;NAVIGATE_TAB&apos; | &apos;HAPTIC_IMPACT&apos; | ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 메시지 방향 분리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 웹 → 네이티브 (Outbound)
export type OutboundBridgeMessage =
  | NavigateBackMessage
  | NavigateTabMessage
  | HapticImpactMessage
  | HapticSelectionMessage
  | HapticNotificationMessage
  | AuthTokenRequestMessage

// 네이티브 → 웹 (Inbound)
export type InboundBridgeMessage =
  | AuthTokenReceiveMessage
  | AuthUserReceiveMessage

// 전체 (방향 무관)
export type BridgeMessage = OutboundBridgeMessage | InboundBridgeMessage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;방향을 타입으로 분리하면 &lt;strong&gt;잘못된 방향으로 메시지를 보내는 실수를 컴파일 타임에 방지&lt;/strong&gt;할 수 있다.&lt;/p&gt;
&lt;h3&gt;2.3 개별 메시지 타입&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 네비게이션
export type TabName = &apos;home&apos; | &apos;products&apos; | &apos;wishlist&apos; | &apos;mypage&apos;

export interface NavigateTabMessage {
  type: typeof BridgeMessageType.NAVIGATE_TAB
  payload: { tab: TabName }
}

// 햅틱 — iOS UIFeedbackGenerator 스펙 기준
export type HapticStyle = &apos;light&apos; | &apos;medium&apos; | &apos;heavy&apos;
export type HapticNotificationType = &apos;success&apos; | &apos;warning&apos; | &apos;error&apos;

export interface HapticImpactMessage {
  type: typeof BridgeMessageType.HAPTIC_IMPACT
  payload: { style: HapticStyle }
}

export interface HapticNotificationMessage {
  type: typeof BridgeMessageType.HAPTIC_NOTIFICATION
  payload: { notificationType: HapticNotificationType }
}

// 인증
export interface AuthTokenReceiveMessage {
  type: typeof BridgeMessageType.AUTH_TOKEN_RECEIVE
  payload: {
    token: string
    expiresAt: number  // Unix timestamp (ms)
  }
}

export interface AuthUser {
  id: string
  email: string
  name: string
  avatarUrl?: string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 공통 응답 타입 + 핸들러 타입&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 네이티브가 처리 결과를 돌려줄 때의 공통 형식
export interface BridgeResponse&amp;lt;T = unknown&amp;gt; {
  success: boolean
  data?: T
  error?: string
}

// receive()에 등록하는 콜백 타입
export type BridgeMessageHandler&amp;lt;T extends BridgeMessage = BridgeMessage&amp;gt; = (
  message: T,
) =&amp;gt; void
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Core 레이어&lt;/h2&gt;
&lt;h3&gt;3.1 IBridgeImpl — Implementation 인터페이스&lt;/h3&gt;
&lt;p&gt;모든 구현체가 반드시 따라야 하는 계약. &lt;code&gt;BridgeAbstraction&lt;/code&gt;은 이 인터페이스에만 의존하기 때문에, 구현체가 바뀌어도 Abstraction 코드는 전혀 수정할 필요가 없다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/core/IBridgeImpl.ts
export interface IBridgeImpl {
  /** 웹 → 네이티브 방향 메시지 전송 */
  send(message: BridgeMessage): void

  /** 네이티브 → 웹 방향 메시지 수신 핸들러 등록 */
  receive(type: BridgeMessageTypeValue, handler: BridgeMessageHandler): void

  /** 현재 환경에서 이 구현체를 사용할 수 있는지 여부 */
  isAvailable(): boolean
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;세 메서드만으로 Bridge의 전체 통신 계약이 완성된다.&lt;/p&gt;
&lt;h3&gt;3.2 BridgeAbstraction — Abstraction 베이스&lt;/h3&gt;
&lt;p&gt;Feature Bridge들의 공통 베이스 클래스. &quot;무엇을 할지&quot;만 정의하고 &quot;어떻게 할지&quot;는 &lt;code&gt;impl&lt;/code&gt;에 위임한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/core/BridgeAbstraction.ts
export abstract class BridgeAbstraction {
  // protected: 자식 클래스(Feature Bridge)에서만 접근 가능, 외부에서 직접 사용 불가
  protected readonly impl: IBridgeImpl

  constructor(impl: IBridgeImpl) {
    this.impl = impl
  }

  protected send(message: BridgeMessage): void {
    this.impl.send(message)
  }

  protected receive(type: BridgeMessageTypeValue, handler: BridgeMessageHandler): void {
    this.impl.receive(type, handler)
  }

  isAvailable(): boolean {
    return this.impl.isAvailable()
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;send()&lt;/code&gt;와 &lt;code&gt;receive()&lt;/code&gt;가 &lt;code&gt;protected&lt;/code&gt;인 이유: Feature Bridge의 도메인 메서드(&lt;code&gt;goBack()&lt;/code&gt;, &lt;code&gt;selection()&lt;/code&gt; 등)를 통해서만 통신하도록 강제하기 위함이다. 외부에서 raw 메시지를 직접 보내는 것을 막는다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Implementation 레이어&lt;/h2&gt;
&lt;h3&gt;4.1 NativeBridge — 실제 네이티브 구현체&lt;/h3&gt;
&lt;p&gt;플랫폼별 분기 로직이 여기에 집중된다. Feature Bridge는 이 내부를 전혀 알 필요가 없다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/impl/NativeBridge.ts
export class NativeBridge implements IBridgeImpl {
  private readonly handlers = new Map&amp;lt;BridgeMessageTypeValue, BridgeMessageHandler[]&amp;gt;()

  isAvailable(): boolean {
    return (
      !!window.ReactNativeWebView ||
      !!window.webkit?.messageHandlers?.bridge ||
      !!window.Android
    )
  }

  send(message: BridgeMessage): void {
    // 우선순위 체인: 처음 감지된 채널만 사용
    if (window.ReactNativeWebView) {
      // React Native: 문자열만 허용 → JSON 직렬화
      window.ReactNativeWebView.postMessage(JSON.stringify(message))
      return
    }
    if (window.webkit?.messageHandlers?.bridge) {
      // iOS WKWebView: 객체를 그대로 전달 가능
      window.webkit.messageHandlers.bridge.postMessage(message)
      return
    }
    if (window.Android) {
      // Android JavascriptInterface: 문자열만 허용 → JSON 직렬화
      window.Android.postMessage(JSON.stringify(message))
    }
  }

  receive(type: BridgeMessageTypeValue, handler: BridgeMessageHandler): void {
    const existing = this.handlers.get(type) ?? []
    this.handlers.set(type, [...existing, handler])

    // window.bridgeCallback을 전역 수신 창구로 설치 (중복 설치 방지)
    // 네이티브 앱은 `window.bridgeCallback(JSON.stringify(message))` 형태로 호출
    if (!window.bridgeCallback) {
      window.bridgeCallback = (json: string) =&amp;gt; this.dispatch(json)
    }
  }

  private dispatch(json: string): void {
    let message: BridgeMessage
    try {
      message = JSON.parse(json) as BridgeMessage
    } catch {
      console.error(&apos;[NativeBridge] 메시지 파싱 실패:&apos;, json)
      return
    }
    const handlers = this.handlers.get(message.type) ?? []
    handlers.forEach((handler) =&amp;gt; handler(message))
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;포인트&lt;/strong&gt;: &lt;code&gt;send()&lt;/code&gt;의 우선순위 체인 덕분에 하나의 구현체가 RN / iOS / Android 세 환경을 모두 처리한다.&lt;/p&gt;
&lt;h3&gt;4.2 MockBridge — 개발/테스트용 시뮬레이터&lt;/h3&gt;
&lt;p&gt;네이티브 앱 없이 브라우저에서도 Bridge 동작을 확인할 수 있다. &lt;code&gt;send()&lt;/code&gt;는 &lt;code&gt;console.log&lt;/code&gt;로 출력하고, &lt;code&gt;emit()&lt;/code&gt;으로 네이티브 응답을 시뮬레이션한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/impl/MockBridge.ts
export class MockBridge implements IBridgeImpl {
  private readonly handlers = new Map&amp;lt;BridgeMessageTypeValue, BridgeMessageHandler[]&amp;gt;()

  isAvailable(): boolean {
    return true  // 개발 fallback이므로 항상 사용 가능
  }

  send(message: BridgeMessage): void {
    // DevTools 콘솔에서 [MockBridge] 접두어로 확인
    console.log(`[MockBridge] → send:`, message.type, message)
  }

  receive(type: BridgeMessageTypeValue, handler: BridgeMessageHandler): void {
    const existing = this.handlers.get(type) ?? []
    this.handlers.set(type, [...existing, handler])
  }

  // 개발/테스트 전용: 네이티브 응답을 시뮬레이션
  // NativeBridge에서는 window.bridgeCallback이 이 역할을 담당
  emit(message: BridgeMessage): void {
    const handlers = this.handlers.get(message.type) ?? []
    handlers.forEach((handler) =&amp;gt; handler(message))
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;브라우저 DevTools 콘솔에서 직접 &lt;code&gt;emit()&lt;/code&gt;을 호출해 토큰 수신 등을 테스트할 수 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// DevTools 콘솔에서
import { authBridge } from &apos;/bridge/index.ts&apos;
authBridge.impl.emit({
  type: &apos;AUTH_TOKEN_RECEIVE&apos;,
  payload: { token: &apos;test-token&apos;, expiresAt: Date.now() + 3600000 }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Feature Bridge 레이어&lt;/h2&gt;
&lt;h3&gt;5.1 NavigationBridge&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// bridge/features/NavigationBridge.ts
export class NavigationBridge extends BridgeAbstraction {
  /** 네이티브 앱의 navigation stack을 pop한다 (웹의 history.back()과 다름) */
  goBack(): void {
    this.send({ type: BridgeMessageType.NAVIGATE_BACK })
  }

  /** 네이티브 BottomTabBar의 탭을 전환한다 */
  switchTab(tab: TabName): void {
    this.send({ type: BridgeMessageType.NAVIGATE_TAB, payload: { tab } })
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 HapticBridge&lt;/h3&gt;
&lt;p&gt;iOS &lt;code&gt;UIFeedbackGenerator&lt;/code&gt;의 세 가지 피드백 타입에 대응한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/features/HapticBridge.ts
export class HapticBridge extends BridgeAbstraction {
  /** 충격 피드백 — 버튼 탭, 스와이프 등 물리적 인터랙션 */
  impact(style: HapticStyle): void {
    this.send({ type: BridgeMessageType.HAPTIC_IMPACT, payload: { style } })
  }

  /** 선택 피드백 — 찜하기, 체크박스 토글 등 항목 선택 */
  selection(): void {
    this.send({ type: BridgeMessageType.HAPTIC_SELECTION })
  }

  /** 알림 피드백 — 작업 성공/실패/경고 결과를 촉각으로 전달 */
  notification(notificationType: HapticNotificationType): void {
    this.send({ type: BridgeMessageType.HAPTIC_NOTIFICATION, payload: { notificationType } })
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 AuthBridge&lt;/h3&gt;
&lt;p&gt;웹뷰는 네이티브 키체인/키스토어에 직접 접근할 수 없다. Bridge를 통해 토큰을 요청하고 응답을 핸들러로 받는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// bridge/features/AuthBridge.ts
export class AuthBridge extends BridgeAbstraction {
  /** 네이티브 앱에 JWT 토큰을 요청한다 */
  requestToken(): void {
    this.send({ type: BridgeMessageType.AUTH_TOKEN_REQUEST })
  }

  /** 토큰 수신 핸들러 등록 */
  onTokenReceived(handler: (token: string) =&amp;gt; void): void {
    // payload 추출 래핑 패턴:
    // 메시지 전체 객체가 아닌 token만 추출하여 호출자에게 전달
    // → 호출자가 Bridge 내부 메시지 구조를 알 필요가 없음
    this.receive(BridgeMessageType.AUTH_TOKEN_RECEIVE, (message) =&amp;gt; {
      const { payload } = message as AuthTokenReceiveMessage
      handler(payload.token)
    })
  }

  /** 유저 정보 수신 핸들러 등록 */
  onUserReceived(handler: (user: AuthUser) =&amp;gt; void): void {
    this.receive(BridgeMessageType.AUTH_USER_RECEIVE, (message) =&amp;gt; {
      const { payload } = message as AuthUserReceiveMessage
      handler(payload.user)
    })
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;payload 추출 래핑 패턴&lt;/strong&gt;: &lt;code&gt;receive()&lt;/code&gt;에 등록하는 내부 콜백에서 필요한 데이터만 추출해서 외부 핸들러를 호출한다. 덕분에 컴포넌트는 &lt;code&gt;BridgeMessage&lt;/code&gt; 구조를 몰라도 된다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 환경 감지와 싱글턴&lt;/h2&gt;
&lt;h3&gt;6.1 환경 감지&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// bridge/index.ts
export type BridgeEnvironment = &apos;react-native&apos; | &apos;ios&apos; | &apos;android&apos; | &apos;mock&apos;

export function detectEnvironment(): BridgeEnvironment {
  if (typeof window === &apos;undefined&apos;) return &apos;mock&apos;  // SSR 안전장치
  if (window.ReactNativeWebView) return &apos;react-native&apos;
  if (window.webkit?.messageHandlers?.bridge) return &apos;ios&apos;
  if (window.Android) return &apos;android&apos;
  return &apos;mock&apos;  // 브라우저/개발 환경 fallback
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선순위 체인:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. window.ReactNativeWebView  →  &apos;react-native&apos;
2. window.webkit.messageHandlers.bridge  →  &apos;ios&apos;
3. window.Android  →  &apos;android&apos;
4. (없으면)  →  &apos;mock&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.2 팩토리 함수 + 싱글턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 팩토리: 환경에 따라 구현체 결정
export function createBridgeImpl(env?: BridgeEnvironment): IBridgeImpl {
  const resolvedEnv = env ?? detectEnvironment()
  // RN / iOS / Android 세 환경은 모두 NativeBridge로 통합
  // 각 채널의 차이는 NativeBridge.send() 내부에서 처리
  if (resolvedEnv === &apos;mock&apos;) return new MockBridge()
  return new NativeBridge()
}

// 모듈 레벨 싱글턴 — 앱 전체에서 동일 인스턴스 + 핸들러 상태 공유
const impl = createBridgeImpl()

export const navigationBridge = new NavigationBridge(impl)
export const hapticBridge = new HapticBridge(impl)
export const authBridge = new AuthBridge(impl)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;싱글턴으로 관리하는 이유:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;핸들러 등록 상태를 앱 전체에서 일관되게 유지&lt;/li&gt;
&lt;li&gt;불필요한 객체 생성 방지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onTokenReceived()&lt;/code&gt; 등 이벤트 기반 핸들러가 의도치 않게 중복 등록되는 것을 막음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Nuxt 통합: Plugin + Composable&lt;/h2&gt;
&lt;h3&gt;7.1 Client-Only Plugin&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// plugins/bridge.client.ts

// .client.ts 접미사 → Nuxt가 서버에서 이 파일을 실행하지 않음
// window, ReactNativeWebView 등에 안전하게 접근 가능
import { navigationBridge, hapticBridge, authBridge } from &apos;@/bridge&apos;

export default defineNuxtPlugin((nuxtApp) =&amp;gt; {
  // provide(&apos;bridge&apos;, value) → 앱 전체에서 nuxtApp.$bridge로 접근 가능
  nuxtApp.provide(&apos;bridge&apos;, {
    navigation: navigationBridge,
    haptic: hapticBridge,
    auth: authBridge,
  })
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.2 Composable&lt;/h3&gt;
&lt;p&gt;Plugin의 &lt;code&gt;$bridge&lt;/code&gt;를 사용할 수도 있지만, 더 직관적인 composable을 제공한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// composables/useBridge.ts
import { navigationBridge, hapticBridge, authBridge } from &apos;@/bridge&apos;
import type { NavigationBridge } from &apos;@/bridge/features/NavigationBridge&apos;
import type { HapticBridge } from &apos;@/bridge/features/HapticBridge&apos;
import type { AuthBridge } from &apos;@/bridge/features/AuthBridge&apos;

export function useNavigationBridge(): NavigationBridge {
  return navigationBridge
}

export function useHapticBridge(): HapticBridge {
  return hapticBridge
}

export function useAuthBridge(): AuthBridge {
  return authBridge
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;composable이 싱글턴을 그대로 반환하는 이유: Bridge는 Vue 반응형 상태가 아니라 통신 채널이기 때문에 &lt;code&gt;ref&lt;/code&gt;로 감쌀 필요가 없다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 컴포넌트 연동 예시&lt;/h2&gt;
&lt;h3&gt;8.1 HapticBridge — 찜하기 버튼&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- components/ProductCard.vue --&amp;gt;
&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
import { useHapticBridge } from &apos;@/composables/useBridge&apos;

const hapticBridge = useHapticBridge()
const isWishlisted = ref(false)

function handleWishlist() {
  isWishlisted.value = !isWishlisted.value
  hapticBridge.selection()  // 찜하기 토글 시 선택 피드백
}
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;button
    :aria-pressed=&quot;String(isWishlisted)&quot;
    @click.prevent=&quot;handleWishlist&quot;
  &amp;gt;
    {{ isWishlisted ? &apos;찜 해제&apos; : &apos;찜하기&apos; }}
  &amp;lt;/button&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.2 NavigationBridge — 뒤로가기 (폴백 포함)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- components/AppHeader.vue --&amp;gt;
&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
import { useNavigationBridge } from &apos;@/composables/useBridge&apos;

const router = useRouter()
const navigationBridge = useNavigationBridge()

function handleBack() {
  if (navigationBridge.isAvailable()) {
    // 네이티브 환경: 네이티브 navigation stack pop
    navigationBridge.goBack()
  } else {
    // 브라우저 환경: 웹 히스토리 back 폴백
    router.back()
  }
}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;isAvailable()&lt;/code&gt; 체크 후 폴백을 두는 패턴은 &lt;strong&gt;웹뷰와 브라우저 모두에서 동일한 컴포넌트를 사용&lt;/strong&gt;할 수 있게 해준다.&lt;/p&gt;
&lt;h3&gt;8.3 AuthBridge — 토큰 요청 + 수신&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// middleware/auth.ts (개념 코드)
import { authBridge } from &apos;@/bridge&apos;

export default defineNuxtRouteMiddleware(() =&amp;gt; {
  // 1. 수신 핸들러 먼저 등록
  authBridge.onTokenReceived((token) =&amp;gt; {
    // 토큰을 받으면 Pinia store나 cookie에 저장
    useAuthStore().setToken(token)
  })

  // 2. 토큰 요청 전송
  authBridge.requestToken()
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;onTokenReceived()&lt;/code&gt; → &lt;code&gt;requestToken()&lt;/code&gt; 순서가 중요하다. 핸들러를 먼저 등록하지 않으면 토큰이 도착했을 때 받을 수단이 없다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. SSR 환경 격리 전략&lt;/h2&gt;
&lt;p&gt;Nuxt 3은 기본적으로 SSR을 사용한다. 서버에는 &lt;code&gt;window&lt;/code&gt;가 없으므로 Bridge 코드를 서버에서 실행하면 오류가 발생한다.&lt;/p&gt;
&lt;h3&gt;위험 상황&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// ❌ 서버에서 import하면 즉시 오류
import { navigationBridge } from &apos;@/bridge&apos;  // window 접근 발생
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;대응 방법&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;.client.ts&lt;/code&gt; 플러그인으로 격리&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugins/
  bridge.client.ts  ← 서버에서 절대 실행되지 않음
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bridge 싱글턴은 이 플러그인이 import할 때 초기화된다. 서버는 이 파일을 실행하지 않으므로 &lt;code&gt;window&lt;/code&gt; 접근이 발생하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;detectEnvironment()&lt;/code&gt;의 안전장치&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export function detectEnvironment(): BridgeEnvironment {
  if (typeof window === &apos;undefined&apos;) return &apos;mock&apos;  // SSR → 즉시 mock 반환
  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. 컴포넌트에서 직접 import할 때&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ✅ onMounted 또는 import.meta.client 가드 사용
onMounted(() =&amp;gt; {
  const { authBridge } = await import(&apos;@/bridge&apos;)
  authBridge.requestToken()
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;위험 수준별 정리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;위험 수준&lt;/th&gt;
&lt;th&gt;대응&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSR에서 &lt;code&gt;window&lt;/code&gt; 접근&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.client.ts&lt;/code&gt; 플러그인으로 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;window&lt;/code&gt; 타입 미정의&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;&lt;code&gt;types/global.d.ts&lt;/code&gt;에 Window 인터페이스 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AuthBridge 핸들러 타이밍&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;핸들러 먼저 등록, 요청은 나중에&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;네이티브 앱 없는 테스트&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;MockBridge + &lt;code&gt;emit()&lt;/code&gt;으로 시뮬레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 전체 흐름 다이어그램&lt;/h2&gt;
&lt;h3&gt;웹 → 네이티브 (찜하기 햅틱 피드백)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[사용자 찜하기 클릭]
        │
        ▼
ProductCard.vue — handleWishlist()
  hapticBridge.selection()
        │
        ▼
HapticBridge.selection()         Refined Abstraction
  this.send({ type: &apos;HAPTIC_SELECTION&apos; })
        │
        ▼
BridgeAbstraction.send()         Abstraction
  this.impl.send(message)
        │
        ├── [네이티브 환경] ──▶ NativeBridge.send()
        │                         ├─ RN:  ReactNativeWebView.postMessage(JSON)
        │                         ├─ iOS: webkit.messageHandlers.bridge.postMessage(obj)
        │                         └─ AOS: Android.postMessage(JSON)
        │
        └── [브라우저 환경] ──▶ MockBridge.send()
                                  console.log(&apos;[MockBridge] → send: HAPTIC_SELECTION&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;네이티브 → 웹 (인증 토큰 수신)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[네이티브 앱이 토큰 전송]
        │
        ▼
window.bridgeCallback(&apos;{&quot;type&quot;:&quot;AUTH_TOKEN_RECEIVE&quot;,&quot;payload&quot;:{&quot;token&quot;:&quot;...&quot;}}&apos;)
        │
        ▼
NativeBridge.dispatch(json)
  JSON.parse(json) → message
  handlers.get(&apos;AUTH_TOKEN_RECEIVE&apos;) → [wrappedHandler]
  wrappedHandler(message)
        │
        ▼
AuthBridge.onTokenReceived 내부 래퍼
  const { payload } = message as AuthTokenReceiveMessage
  handler(payload.token)           payload에서 token만 추출
        │
        ▼
컴포넌트/미들웨어의 콜백
  (token: string) =&amp;gt; { ... }       깔끔한 인터페이스로 수신
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;레이어별 책임 요약&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────┐
│               Vue 컴포넌트 / Nuxt 미들웨어                  │
│  hapticBridge.selection()  |  authBridge.requestToken()    │
└──────────────────────────┬─────────────────────────────────┘
                           │ composable (useBridge)
┌──────────────────────────▼─────────────────────────────────┐
│              Feature Bridge  (Refined Abstraction)          │
│    NavigationBridge | HapticBridge | AuthBridge            │
│    도메인 특화 메서드, send()/receive() 호출                 │
└──────────────────────────┬─────────────────────────────────┘
                           │ extends
┌──────────────────────────▼─────────────────────────────────┐
│              BridgeAbstraction  (Abstraction)               │
│    impl.send() / impl.receive() 위임                        │
└──────────────────────────┬─────────────────────────────────┘
                           │ IBridgeImpl (의존성 주입)
┌─────────────────┬────────▼────────────────────────────────┐
│   NativeBridge  │              MockBridge                  │
│  (실제 네이티브) │           (브라우저/테스트)               │
│  RN/iOS/Android │        console.log + emit()             │
│  postMessage    │                                         │
└─────────────────┴─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;마치며&lt;/h2&gt;
&lt;p&gt;이 프로젝트에서 WebView Bridge를 구현하며 배운 핵심:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;타입이 프로토콜이다&lt;/strong&gt; — &lt;code&gt;types/bridge.ts&lt;/code&gt;의 메시지 타입이 웹-네이티브 계약이 된다. 타입이 맞지 않으면 컴파일 단계에서 잡힌다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;환경 분기는 한 곳에&lt;/strong&gt; — &lt;code&gt;NativeBridge.send()&lt;/code&gt; 밖에서는 플랫폼 분기가 없다. Feature Bridge는 iOS인지 Android인지 전혀 모른다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;개발 환경을 먼저 설계하라&lt;/strong&gt; — &lt;code&gt;MockBridge&lt;/code&gt;와 &lt;code&gt;emit()&lt;/code&gt;이 없었다면 네이티브 앱 없이 Bridge 관련 기능을 개발하거나 테스트하는 것이 불가능했을 것이다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSR은 항상 고려대상으로 두어야 한다&lt;/strong&gt; — &lt;code&gt;window&lt;/code&gt;에 접근하는 코드는 반드시 &lt;code&gt;.client.ts&lt;/code&gt;로 격리하거나 &lt;code&gt;typeof window === &apos;undefined&apos;&lt;/code&gt; 가드를 달아야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bridge Pattern의 진짜 가치&lt;/strong&gt; — Feature Bridge가 플랫폼을 몰라도 된다는 것은 단순한 코드 정리가 아니다. 나중에 새 플랫폼(예: 데스크톱 WebView)이 추가되거나, MockBridge를 테스트용 Spy로 교체할 때 &lt;strong&gt;Feature Bridge 코드는 손댈 필요가 없다&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Part 1로 돌아가기&lt;/em&gt;: &lt;a href=&quot;/posts/browser/web-view-1/&quot;&gt;개요 및 이론 — WebView란, 프로토콜, 통신 패턴, Bridge Pattern&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;h3&gt;프로젝트 소스 파일&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;이 문서의 모든 코드 예시는 아래 실제 구현 파일에서 발췌했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;파일&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge_plan.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;전체 구현 계획, MVP 체크리스트, Phase별 설계 결정 사항&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;types/bridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BridgeMessageType&lt;/code&gt;, &lt;code&gt;BridgeMessage&lt;/code&gt; union, &lt;code&gt;BridgeResponse&lt;/code&gt;, &lt;code&gt;BridgeMessageHandler&lt;/code&gt; 타입 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/core/IBridgeImpl.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;send()&lt;/code&gt; / &lt;code&gt;receive()&lt;/code&gt; / &lt;code&gt;isAvailable()&lt;/code&gt; 3개 메서드로 구성된 Implementation 인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/core/BridgeAbstraction.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;protected send()&lt;/code&gt; / &lt;code&gt;receive()&lt;/code&gt; 위임 메서드를 갖는 abstract Abstraction 베이스 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/impl/NativeBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ReactNativeWebView → webkit → Android 우선순위 체인, &lt;code&gt;window.bridgeCallback&lt;/code&gt; 전역 수신 창구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/impl/MockBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Map&lt;/code&gt; 기반 이벤트 에미터, &lt;code&gt;emit()&lt;/code&gt; 네이티브 시뮬레이션 메서드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/features/NavigationBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;goBack()&lt;/code&gt;, &lt;code&gt;switchTab()&lt;/code&gt; Refined Abstraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/features/HapticBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;impact()&lt;/code&gt;, &lt;code&gt;selection()&lt;/code&gt;, &lt;code&gt;notification()&lt;/code&gt; Refined Abstraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/features/AuthBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;requestToken()&lt;/code&gt;, &lt;code&gt;onTokenReceived()&lt;/code&gt; payload 추출 래핑 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bridge/index.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;detectEnvironment()&lt;/code&gt;, &lt;code&gt;createBridgeImpl()&lt;/code&gt; 팩토리, 모듈 레벨 싱글턴 export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plugins/bridge.client.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nuxt client-only 플러그인 — &lt;code&gt;defineNuxtPlugin&lt;/code&gt; + &lt;code&gt;nuxtApp.provide()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;composables/useBridge.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;useNavigationBridge()&lt;/code&gt;, &lt;code&gt;useHapticBridge()&lt;/code&gt;, &lt;code&gt;useAuthBridge()&lt;/code&gt; composable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Nuxt 3 공식 문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nuxt 3 Plugins&lt;/strong&gt; — &lt;code&gt;defineNuxtPlugin&lt;/code&gt;, &lt;code&gt;.client.ts&lt;/code&gt; 네이밍 컨벤션, &lt;code&gt;nuxtApp.provide()&lt;/code&gt; 사용법. &lt;code&gt;bridge.client.ts&lt;/code&gt; 구현의 직접 근거&lt;br /&gt;
https://nuxt.com/docs/guide/directory-structure/plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nuxt 3 Composables&lt;/strong&gt; — &lt;code&gt;useNuxtApp()&lt;/code&gt;을 통한 plugin injection 접근 패턴. &lt;code&gt;useBridge.ts&lt;/code&gt; composable 설계 근거&lt;br /&gt;
https://nuxt.com/docs/guide/directory-structure/composables&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nuxt App 인스턴스&lt;/strong&gt; — runtime nuxt app instance 접근 방법, &lt;code&gt;$injected&lt;/code&gt; 프로퍼티 네이밍 규칙&lt;br /&gt;
https://nuxt.com/docs/guide/going-further/nuxt-app&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;iOS Haptics — Apple 공식 문서&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;HapticStyle&lt;/code&gt; (&lt;code&gt;light&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;heavy&lt;/code&gt;) 과 &lt;code&gt;HapticNotificationType&lt;/code&gt; (&lt;code&gt;success&lt;/code&gt; / &lt;code&gt;warning&lt;/code&gt; / &lt;code&gt;error&lt;/code&gt;) 타입이 아래 iOS 스펙을 기준으로 설계됐다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UIImpactFeedbackGenerator&lt;/strong&gt; — &lt;code&gt;light&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;heavy&lt;/code&gt; 강도 충격 피드백. &lt;code&gt;HapticBridge.impact(style:)&lt;/code&gt; 의 근거&lt;br /&gt;
https://developer.apple.com/documentation/uikit/uiimpactfeedbackgenerator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UISelectionFeedbackGenerator&lt;/strong&gt; — 항목 선택 시 피드백. &lt;code&gt;HapticBridge.selection()&lt;/code&gt; 의 근거&lt;br /&gt;
https://developer.apple.com/documentation/uikit/uiselectionfeedbackgenerator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UINotificationFeedbackGenerator&lt;/strong&gt; — &lt;code&gt;success&lt;/code&gt; / &lt;code&gt;warning&lt;/code&gt; / &lt;code&gt;error&lt;/code&gt; 알림 피드백. &lt;code&gt;HapticBridge.notification(type:)&lt;/code&gt; 의 근거&lt;br /&gt;
https://developer.apple.com/documentation/uikit/uinotificationfeedbackgenerator&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>📘 AWS DB 백서 (Whitepaper Summary)</title><link>https://tessa1217.github.io/posts/aws/aws-db-whitepaper/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-db-whitepaper/</guid><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;📘 AWS DB 백서 (Whitepaper Summary)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;출처:&lt;/strong&gt; Building Modern Applications Using AWS Databases (AWS 공식 백서, 2024)
&lt;strong&gt;목적:&lt;/strong&gt; SAA-C03 시험 대비 핵심 개념 정리
&lt;strong&gt;최종 업데이트:&lt;/strong&gt; 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-purpose-built-database-%EC%84%A0%ED%83%9D-%EC%A0%84%EB%9E%B5&quot;&gt;Purpose-Built Database 선택 전략&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%EC%8A%A4%EC%BC%80%EC%9D%BC%EB%A7%81-%EC%A0%84%EB%9E%B5&quot;&gt;스케일링 전략&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-in-memory-elasticache-vs-memorydb&quot;&gt;In-Memory: ElastiCache vs MemoryDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1--%EC%9A%B4%EC%98%81-%EC%95%88%EC%A0%95%EC%84%B1&quot;&gt;고가용성 &amp;amp; 운영 안정성&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-multi-region-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5&quot;&gt;Multi-Region 배포 전략&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-zero-etl&quot;&gt;Zero-ETL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-vector-search--generative-ai&quot;&gt;Vector Search &amp;amp; Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98&quot;&gt;데이터 마이그레이션&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-db-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A0%ED%83%9D-%EB%A7%A4%ED%8A%B8%EB%A6%AD%EC%8A%A4&quot;&gt;DB 서비스 선택 매트릭스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EB%8B%A8%EA%B3%A8-%ED%8C%A8%ED%84%B4-%EC%9A%94%EC%95%BD&quot;&gt;🎯 시험 단골 패턴 요약&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Purpose-Built Database 선택 전략&lt;/h2&gt;
&lt;h3&gt;핵심 원칙&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;단일 관계형 DB로는 현대 애플리케이션의 모든 요구사항을 충족할 수 없다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;소셜, IoT, 모바일, 글로벌 서비스는 각기 다른 데이터 모델이 필요&lt;/li&gt;
&lt;li&gt;마이크로서비스 아키텍처에서 각 팀은 &lt;strong&gt;워크로드에 최적화된 DB를 독립적으로 선택&lt;/strong&gt;해야 함&lt;/li&gt;
&lt;li&gt;AWS는 15종 이상의 Purpose-built DB 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AWS DB 포트폴리오&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relational&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Aurora, Amazon RDS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key-Value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Document&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon DocumentDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In-Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon ElastiCache, Amazon MemoryDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Neptune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wide-Column&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Keyspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time-Series&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Timestream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon OpenSearch Service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;🛒 E-Commerce 아키텍처 예시 (시험 단골 출제)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;선택 DB&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;상품 검색&lt;/td&gt;
&lt;td&gt;Amazon OpenSearch&lt;/td&gt;
&lt;td&gt;인덱스 최적화 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장바구니 / 결제&lt;/td&gt;
&lt;td&gt;Amazon Aurora&lt;/td&gt;
&lt;td&gt;트랜잭션 무결성 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;고객 리뷰 (별점)&lt;/td&gt;
&lt;td&gt;Amazon DynamoDB&lt;/td&gt;
&lt;td&gt;단순 Key-Value 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상품 추천&lt;/td&gt;
&lt;td&gt;Amazon Neptune&lt;/td&gt;
&lt;td&gt;그래프 기반 관계 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Managed vs Self-Managed&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AWS 완전 관리형이 처리하는 것:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로비저닝, HA 구성, 자동 패치/업그레이드&lt;/li&gt;
&lt;li&gt;자동 백업, 장애조치(Failover)&lt;/li&gt;
&lt;li&gt;Self-healing 스토리지, 자동 스케일링&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;개발자/DBA가 집중할 수 있는 것:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스키마 설계, 쿼리 최적화, 접근 제어, 신규 기능 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
&quot;관리 부담 최소화&quot;, &quot;운영 오버헤드 감소&quot; → &lt;strong&gt;완전 관리형(Managed) 서비스 선택&lt;/strong&gt;이 정답 패턴
:::&lt;/h2&gt;
&lt;h2&gt;2. 스케일링 전략&lt;/h2&gt;
&lt;h3&gt;2-1. Serverless 자동 스케일링&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구현 방식&lt;/th&gt;
&lt;th&gt;지원 서비스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vertical Auto Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aurora, Neptune, Timestream for LiveAnalytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;완전 서버리스&lt;/strong&gt; (compute + storage 모두 자동)&lt;/td&gt;
&lt;td&gt;Aurora DSQL, DynamoDB, ElastiCache, Keyspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
피크 기준 프로비저닝 대비 &lt;strong&gt;최대 90% 비용 절감&lt;/strong&gt;, 사용량 기반 과금
→ &quot;가변 트래픽 + 비용 최적화 + 관리 Zero&quot; = &lt;strong&gt;Serverless 계열&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h3&gt;2-2. Vertical vs Horizontal Scaling&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Vertical Scaling   → 인스턴스 크기 증가 (CPU / RAM / Network)
                     운영 중단 없이 실시간 동적 조정 가능

Horizontal Scaling → 노드 추가로 분산 처리
                     방법: 읽기 레플리카 추가 / 파티셔닝 / 샤딩
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;읽기 성능 개선&lt;/strong&gt; → Read Replica 추가 (Horizontal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단일 인스턴스 성능 향상&lt;/strong&gt; → Vertical Scaling
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2-3. Data Partitioning&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;테이블을 컬럼 값 기준으로 &lt;strong&gt;서브셋(파티션)&lt;/strong&gt; 으로 분할&lt;/li&gt;
&lt;li&gt;파티션 방식: &lt;strong&gt;Range / List / Hash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;샤딩과의 차이: 파티션은 &lt;strong&gt;같은 DB 인스턴스 내&lt;/strong&gt; 분할 (다른 노드 불필요)&lt;/li&gt;
&lt;li&gt;앱에 투명하게(Transparent) 동작 — 코드 변경 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aurora DSQL&lt;/strong&gt;이 자동 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
파티셔닝 ≠ 샤딩. 파티셔닝은 단일 인스턴스 내 분할
:::&lt;/h2&gt;
&lt;h3&gt;2-4. Sharding (Aurora PostgreSQL Limitless)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 &lt;strong&gt;여러 독립 노드&lt;/strong&gt;에 분산 (Shared-Nothing 아키텍처)&lt;/li&gt;
&lt;li&gt;각 샤드는 독립적인 데이터 서브셋 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aurora PostgreSQL Limitless Database:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;완전 관리형 샤딩 — 수동 라우팅 로직 불필요&lt;/li&gt;
&lt;li&gt;초당 수백만 트랜잭션 커밋 지원&lt;/li&gt;
&lt;li&gt;페타바이트급 확장&lt;/li&gt;
&lt;li&gt;샤드 추가/제거 시 &lt;strong&gt;자동 리밸런싱&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
초대규모 OLTP 쓰기 확장 → &lt;strong&gt;Aurora PostgreSQL Limitless&lt;/strong&gt;
직접 샤딩 구현 없이 AWS가 라우팅 관리 = &quot;개발 오버헤드 최소화&quot;
:::&lt;/h2&gt;
&lt;h2&gt;3. In-Memory: ElastiCache vs MemoryDB&lt;/h2&gt;
&lt;h3&gt;비교표&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;ElastiCache&lt;/th&gt;
&lt;th&gt;MemoryDB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;분류&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;캐시 (Non-durable)&lt;/td&gt;
&lt;td&gt;완전 내구성 In-Memory DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;엔진&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Valkey, Memcached, Redis OSS&lt;/td&gt;
&lt;td&gt;Valkey, Redis OSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;읽기 레이턴시&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;마이크로초&lt;/td&gt;
&lt;td&gt;마이크로초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;쓰기 레이턴시&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;마이크로초&lt;/td&gt;
&lt;td&gt;수 밀리초 (Multi-AZ 동기 쓰기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 내구성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;소량 손실 가능&lt;/td&gt;
&lt;td&gt;Zero 손실&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;99.999%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티리전&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Active-Active 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;ElastiCache 상세&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단일 노드: &lt;strong&gt;초당 100만 req 처리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;클러스터: &lt;strong&gt;초당 5억 req 처리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Primary 장애 시 복제본 자동 승격 → 미복제 데이터만 손실&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valkey&lt;/strong&gt; = Redis OSS 대체 (Redis가 2024년 3월 BSD 3-Clause 라이선스 변경 후 Linux Foundation 주관)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MemoryDB 상세&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;쓰기 시 &lt;strong&gt;Multi-AZ 트랜잭션 로그에 동기 기록&lt;/strong&gt; 후 응답&lt;/li&gt;
&lt;li&gt;읽기는 마이크로초 유지&lt;/li&gt;
&lt;li&gt;가용성 &lt;strong&gt;99.999%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;선택 기준&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;데이터 손실 허용 가능 + 원본 DB 별도 존재 → ElastiCache (캐시 레이어)
데이터 손실 절대 불허 + DB 자체가 In-Memory  → MemoryDB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;캐시 vs 내구성 인메모리 DB&quot; 선택 문제&lt;/strong&gt; 자주 출제&lt;/li&gt;
&lt;li&gt;분기점 = &lt;strong&gt;데이터 손실 허용 여부&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;마이크로서비스에서 Network Latency 시 상쇄용 캐시 사용 = &lt;strong&gt;Best Practice&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 고가용성 &amp;amp; 운영 안정성&lt;/h2&gt;
&lt;h3&gt;4-1. Multi-AZ 구성 패턴&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Aurora Multi-AZ:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3개 AZ에 데이터 자동 복제, 비용은 1개분만 과금&lt;/li&gt;
&lt;li&gt;Writer 장애 시 → Reader로 &lt;strong&gt;자동 Failover&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Read Replica를 다른 AZ에 분산 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RDS Multi-AZ:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standby에 &lt;strong&gt;동기 복제&lt;/strong&gt; → Failover 자동&lt;/li&gt;
&lt;li&gt;Standby는 읽기 불가 (Single Standby 기준)&lt;/li&gt;
&lt;li&gt;Multi-AZ with 2 Readable Standbys: 읽기 가능 + 1초 미만 다운타임&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DynamoDB Multi-AZ:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3개 AZ에 자동 파티셔닝·복제·동기화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failover 불필요&lt;/strong&gt; — Multi-active 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;4-2. 가용성 SLA 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;가용성&lt;/th&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;99.999%&lt;/strong&gt; (5 nines)&lt;/td&gt;
&lt;td&gt;Aurora DSQL, DynamoDB, Keyspaces, MemoryDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;99.99%&lt;/strong&gt; (4 nines)&lt;/td&gt;
&lt;td&gt;RDS, ElastiCache, DocumentDB, Timestream&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
미션 크리티컬 + 최고 가용성 요구 → &lt;strong&gt;Aurora DSQL 또는 DynamoDB&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h3&gt;4-3. Blue/Green Deployments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;대상:&lt;/strong&gt; Amazon RDS 및 Aurora 모두 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;원리:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Blue = 현재 프로덕션&lt;/li&gt;
&lt;li&gt;Green = AWS가 자동 생성하는 완전 관리형 스테이징&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;장점:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;전환 소요 시간: &lt;strong&gt;1분 미만&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;데이터 손실: &lt;strong&gt;Zero&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;메이저 버전 업그레이드, 스키마 변경 시 다운타임 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS Multi-AZ (2 Readable Standbys) + RDS Proxy:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;마이너 버전 업그레이드 다운타임: &lt;strong&gt;1초 미만&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;다운타임 없는 메이저 업그레이드&quot; → &lt;strong&gt;Blue/Green Deployments&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;1초 미만 다운타임&quot; → &lt;strong&gt;RDS Proxy&lt;/strong&gt; 함께 언급
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Multi-Region 배포 전략&lt;/h2&gt;
&lt;h3&gt;3가지 전략 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;쓰기 가능 리전&lt;/th&gt;
&lt;th&gt;일관성&lt;/th&gt;
&lt;th&gt;주요 서비스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Read Replica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Primary 1개&lt;/td&gt;
&lt;td&gt;비동기(Eventually)&lt;/td&gt;
&lt;td&gt;RDS, Aurora Global DB, DocumentDB, Neptune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active-Active + Eventual&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 리전&lt;/td&gt;
&lt;td&gt;Eventual (보통 1초 이내)&lt;/td&gt;
&lt;td&gt;DynamoDB Global Tables, MemoryDB Multi-Region, Keyspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active-Active + Strong&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 리전&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Strong Consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aurora DSQL, DynamoDB Global Tables (강한 일관성 모드)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;5-1. Multi-Region 읽기 복제본&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;변경사항 &lt;strong&gt;비동기 복제&lt;/strong&gt; → 읽기를 로컬 리전에서 처리&lt;/li&gt;
&lt;li&gt;쓰기는 Primary 리전으로만&lt;/li&gt;
&lt;li&gt;용도: 글로벌 읽기 성능 향상 + DR(재해복구)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
글로벌 읽기 성능 + 쓰기는 단일 리전 허용 → &lt;strong&gt;Multi-Region Read Replica&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h3&gt;5-2. Active-Active + Eventual Consistency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;DynamoDB Global Tables:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 리전에서 읽기 + 쓰기 동시 가능&lt;/li&gt;
&lt;li&gt;비동기 복제 (보통 1초 이내)&lt;/li&gt;
&lt;li&gt;충돌 해결: &lt;strong&gt;Last Writer Wins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;리전 장애 시 → 다른 리전으로 즉시 전환, &lt;strong&gt;DB Failover 불필요&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;MemoryDB Multi-Region:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비동기 복제, 마이크로초 읽기, 99.999%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Keyspaces:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apache Cassandra 호환, Active-Active, 99.999%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전 세계 사용자 쓰기 + 약간의 일관성 지연 허용 → &lt;strong&gt;DynamoDB Global Tables (Eventual)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;충돌 해결 = &lt;strong&gt;Last Writer Wins&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;5-3. Active-Active + Strong Consistency ⭐&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Aurora DSQL:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서버리스 분산 SQL (PostgreSQL 호환)&lt;/li&gt;
&lt;li&gt;멀티리전에서 &lt;strong&gt;강한 일관성&lt;/strong&gt; 보장&lt;/li&gt;
&lt;li&gt;Failover 없이 항상 최신 데이터 접근&lt;/li&gt;
&lt;li&gt;인프라 관리 Zero, 읽기·쓰기 독립 스케일링&lt;/li&gt;
&lt;li&gt;SLA: &lt;strong&gt;99.999%&lt;/strong&gt; (멀티리전)&lt;/li&gt;
&lt;li&gt;쓰기 처리량: 분산 SQL DB 중 가장 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DynamoDB Global Tables (Strong Consistency 신규):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최소 &lt;strong&gt;2개 리전에 동기 쓰기&lt;/strong&gt; 후 응답&lt;/li&gt;
&lt;li&gt;강한 일관성 + Multi-active + 무한 확장&lt;/li&gt;
&lt;li&gt;리전 장애 시 다른 리전으로 트래픽 전환 → 항상 최신 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;멀티리전 + &lt;strong&gt;Strong Consistency&lt;/strong&gt; = &lt;strong&gt;Aurora DSQL&lt;/strong&gt; 또는 &lt;strong&gt;DynamoDB Global Tables (강한 일관성)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;리전 장애 시 Failover 없이 자동 전환&quot; = 이 두 서비스의 핵심 강점&lt;/li&gt;
&lt;li&gt;Aurora DSQL ≠ Aurora. 별개 서비스임을 명심
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Zero-ETL&lt;/h2&gt;
&lt;h3&gt;기존 ETL의 문제점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;직접 코드 작성·테스트·유지보수 필요&lt;/li&gt;
&lt;li&gt;테이블/필드 변경 시 파이프라인 전체 수정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;복잡하고 취약하며 확장 한계&lt;/strong&gt; 존재&lt;/li&gt;
&lt;li&gt;데이터 이동 지연(lag) → 실시간 분석 불가&lt;/li&gt;
&lt;li&gt;적합하지 않은 케이스: 사기 탐지, 광고 최적화, 공급망 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;AWS Zero-ETL 통합 구성&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Sources (운영 DB)                   Targets (분석/검색)
─────────────────                   ───────────────────
Aurora                      →→→     Amazon Redshift
DocumentDB                  →→→     OpenSearch Service
RDS for MySQL               →→→     SageMaker Lakehouse
DynamoDB                    →→→     S3, Glue
RDS, CloudWatch             →→→
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;특징:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드 없이 클릭 몇 번으로 설정 완료&lt;/li&gt;
&lt;li&gt;페타바이트 규모 운영 데이터 &lt;strong&gt;Near-Real-Time&lt;/strong&gt; 분석/검색&lt;/li&gt;
&lt;li&gt;여러 Aurora 인스턴스 → 단일 Redshift로 통합 → 전사 인사이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;ETL 파이프라인 없이 + 실시간 분석&quot; → &lt;strong&gt;Zero-ETL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 Aurora 인스턴스 → 단일 Redshift 통합 패턴&lt;/strong&gt; 암기&lt;/li&gt;
&lt;li&gt;Redshift의 Materialized Views, Data Sharing, Federated Access 함께 활용 가능
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Vector Search &amp;amp; Generative AI&lt;/h2&gt;
&lt;h3&gt;FM/LLM의 두 가지 한계&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Knowledge Cut-off&lt;/strong&gt; — 훈련 데이터 기준일 이후 정보 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;도메인 특화 지식 부재&lt;/strong&gt; — 사내 데이터, 전용 지식 없음&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;→ &lt;strong&gt;해결책: RAG (Retrieval Augmented Generation)&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;RAG 워크플로우&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Ingestion 단계]
소스 데이터 (S3 등)
    ↓ 청킹 (Context Window 크기로 분할)
임베딩 모델 (Embedding Model)
    ↓ 벡터 생성
벡터 DB 저장

[Agency 단계]
사용자 쿼리
    ↓ 임베딩 변환
벡터 유사도 검색 (ANN 알고리즘: HNSW, IVFFlat)
    ↓ 관련 청크 검색
FM에 컨텍스트로 주입
    ↓
응답 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ANN 알고리즘: &lt;strong&gt;HNSW&lt;/strong&gt;, &lt;strong&gt;IVFFlat&lt;/strong&gt; 이름 기억&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bedrock Knowledge Bases&lt;/strong&gt; = Ingestion + Agency 워크플로우 &lt;strong&gt;완전 자동화&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;벡터 지원 AWS DB (기존 DB에 벡터 내장)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;벡터 지원 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aurora PostgreSQL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pgvector&lt;/strong&gt; 익스텐션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS for PostgreSQL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pgvector&lt;/strong&gt; 익스텐션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;Zero-ETL → OpenSearch 연동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Neptune&lt;/td&gt;
&lt;td&gt;GraphRAG 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemoryDB&lt;/td&gt;
&lt;td&gt;인메모리 벡터 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DocumentDB&lt;/td&gt;
&lt;td&gt;벡터 검색 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenSearch Service&lt;/td&gt;
&lt;td&gt;Vector Engine (Serverless 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;핵심 이점:&lt;/strong&gt; 기존 운영 DB에 벡터 기능 내장
→ 별도 전용 벡터 DB 불필요 = &lt;strong&gt;데이터 마이그레이션·중복·추가 비용·운영 복잡도 모두 제거&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;GraphRAG (Amazon Neptune 기반)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Neptune이 여러 소스(텍스트·이미지·영상·오디오 등 &lt;strong&gt;비정형&lt;/strong&gt; 포함) 자동 그래프화&lt;/li&gt;
&lt;li&gt;검색 시 그래프 탐색 → 더 포괄적·정확한 LLM 응답&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조직 데이터의 80% 이상이 비정형&lt;/strong&gt; → GraphRAG의 강점&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bedrock Knowledge Bases에 Neptune 통합 내장&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비정형 데이터 + 관계 중심 검색 + RAG = &lt;strong&gt;GraphRAG + Neptune&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;S3 비정형 데이터 자동 그래프 생성 가능
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 데이터 마이그레이션&lt;/h2&gt;
&lt;h3&gt;AWS DMS (Database Migration Service)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;온프레미스 / 타 클라우드 DB → AWS DB 마이그레이션&lt;/li&gt;
&lt;li&gt;지원 유형:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Homogeneous (동종):&lt;/strong&gt; MySQL → Aurora MySQL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heterogeneous (이종):&lt;/strong&gt; Oracle → Aurora PostgreSQL (SCT 필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCT (Schema Conversion Tool):&lt;/strong&gt; 이기종 DB 스키마 자동 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
마이그레이션 + 운영 중단 최소화 → &lt;strong&gt;DMS&lt;/strong&gt;. 이기종 변환 → &lt;strong&gt;SCT + DMS&lt;/strong&gt; 조합
:::&lt;/h2&gt;
&lt;h3&gt;마이그레이션 지원 프로그램&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로그램&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Professional Services&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전문가 마이그레이션 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Migration Accelerator (DMA)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;고정 비용, DB+앱 변환 AWS 팀 대행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Freedom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자격 고객 대상 전문 조언 + 마이그레이션 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS DMS Partners&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;파트너 생태계 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
레거시 상용 DB(Oracle 등) 탈피 + 비용 절감 = &lt;strong&gt;Database Freedom&lt;/strong&gt; 프로그램
:::&lt;/h2&gt;
&lt;h2&gt;9. DB 서비스 선택 매트릭스&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;th&gt;HA SLA&lt;/th&gt;
&lt;th&gt;스케일링&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Aurora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational (MySQL/PG)&lt;/td&gt;
&lt;td&gt;OLTP, 금융, 이커머스&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;Read Replica + Serverless v2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora DSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distributed SQL (PG)&lt;/td&gt;
&lt;td&gt;멀티리전 OLTP + Strong Consistency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.999%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;완전 서버리스, 자동 수평&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon RDS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational (6개 엔진)&lt;/td&gt;
&lt;td&gt;일반 관계형&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;Read Replica + Multi-AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Key-Value / Document&lt;/td&gt;
&lt;td&gt;고처리량 OLTP, 세션, 카탈로그&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.999%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;완전 서버리스, Global Tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ElastiCache&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-Memory Cache&lt;/td&gt;
&lt;td&gt;DB 캐시, 세션 스토어&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;클러스터 5억 req/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MemoryDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-Memory DB (Durable)&lt;/td&gt;
&lt;td&gt;인메모리 성능 + 내구성&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.999%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;멀티리전 Active-Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neptune&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graph DB&lt;/td&gt;
&lt;td&gt;소셜 그래프, 추천, GraphRAG&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;Serverless 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenSearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search / Analytics&lt;/td&gt;
&lt;td&gt;전문 검색, 로그 분석, 벡터&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Serverless Vector Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Keyspaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wide-Column (Cassandra)&lt;/td&gt;
&lt;td&gt;IoT, 타임스탬프 데이터&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.999%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;완전 서버리스, 멀티리전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DocumentDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Document (MongoDB)&lt;/td&gt;
&lt;td&gt;JSON 문서, 콘텐츠 관리&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;읽기 복제본&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timestream&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Time-Series&lt;/td&gt;
&lt;td&gt;IoT 센서, 모니터링 메트릭&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;Serverless (LiveAnalytics)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;🎯 시험 단골 패턴 요약&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;정답&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가변 트래픽 + 비용 최적화 (unpredictable traffic/pattern + cost-effective)&lt;/td&gt;
&lt;td&gt;Serverless 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;읽기 성능 향상 (read heavy)&lt;/td&gt;
&lt;td&gt;Read Replica 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 손실 허용 캐시 (data loss allowed)&lt;/td&gt;
&lt;td&gt;ElastiCache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 손실 불허 인메모리 (data loss not allowed)&lt;/td&gt;
&lt;td&gt;MemoryDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;멀티리전 Eventually Consistent&lt;/td&gt;
&lt;td&gt;DynamoDB Global Tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;멀티리전 Strong Consistency&lt;/td&gt;
&lt;td&gt;Aurora DSQL 또는 DynamoDB Global Tables (Strong)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다운타임 없는 메이저 업그레이드 (major upgrade without downtime)&lt;/td&gt;
&lt;td&gt;Blue/Green Deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETL 없는 실시간 분석&lt;/td&gt;
&lt;td&gt;Zero-ETL (→ Redshift / OpenSearch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG 자동화&lt;/td&gt;
&lt;td&gt;Bedrock Knowledge Bases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그래프 기반 추천/관계 탐색&lt;/td&gt;
&lt;td&gt;Amazon Neptune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이기종 DB 마이그레이션&lt;/td&gt;
&lt;td&gt;DMS + SCT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초대규모 OLTP 쓰기 확장&lt;/td&gt;
&lt;td&gt;Aurora PostgreSQL Limitless&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>🔐 IAM Security Best Practices</title><link>https://tessa1217.github.io/posts/aws/aws-security-best-practice/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-security-best-practice/</guid><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🔐 IAM Security Best Practices&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;출처:&lt;/strong&gt; AWS IAM 공식 문서 — Security best practices in IAM&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;목적:&lt;/strong&gt; SAA-C03 시험 대비 핵심 개념 정리&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-identity-%EA%B4%80%EB%A6%AC-%EC%9B%90%EC%B9%99&quot;&gt;1. Identity 관리 원칙&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-credential-%EB%B3%B4%EC%95%88-%EA%B4%80%EB%A6%AC&quot;&gt;2. Credential 보안 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EC%B5%9C%EC%86%8C-%EA%B6%8C%ED%95%9C-%EC%9B%90%EC%B9%99-least-privilege&quot;&gt;3. 최소 권한 원칙 (Least Privilege)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-mfa-%EB%8B%A4%EC%A4%91-%EC%9D%B8%EC%A6%9D&quot;&gt;4. MFA (다중 인증)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-iam-policy-%EA%B5%AC%EC%84%B1-%EC%A0%84%EB%9E%B5&quot;&gt;5. IAM Policy 구성 전략&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%ED%81%AC%EB%A1%9C%EC%8A%A4-%EA%B3%84%EC%A0%95--%EC%99%B8%EB%B6%80-%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4&quot;&gt;6. 크로스 계정 &amp;amp; 외부 접근 제어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81--%EA%B0%90%EC%82%AC&quot;&gt;7. 모니터링 &amp;amp; 감사&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EB%A3%A8%ED%8A%B8-%EA%B3%84%EC%A0%95-%EB%B3%B4%ED%98%B8&quot;&gt;8. 루트 계정 보호&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%EC%8B%9C%ED%97%98-%EB%8B%A8%EA%B3%A8-%ED%8C%A8%ED%84%B4-%EC%9A%94%EC%95%BD&quot;&gt;9. 시험 단골 패턴 요약&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Identity 관리 원칙&lt;/h2&gt;
&lt;h3&gt;핵심 원칙: 임시 자격증명 사용&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;장기 자격증명(Long-term credentials) 대신 임시 자격증명(Temporary credentials)을 사용하라.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Long-term credentials  = IAM User Access Key  → 보안 리스크 높음
Temporary credentials  = IAM Role (STS)        → 권장 방식
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1-1. 휴먼 사용자 — Federation + IdP 사용&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;권장 방식:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;휴먼 사용자(개발자, 관리자, 운영자)에게 개별 IAM User 생성 &lt;strong&gt;금지&lt;/strong&gt; 권고&lt;/li&gt;
&lt;li&gt;대신 &lt;strong&gt;외부 IdP(Identity Provider)와 페더레이션&lt;/strong&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;구현 방법:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;권장 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;다중 계정 중앙 관리 (권장)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS IAM Identity Center (SSO)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단일 계정 소규모&lt;/td&gt;
&lt;td&gt;IAM + SAML 2.0 또는 OIDC 직접 페더레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모바일/웹앱 사용자&lt;/td&gt;
&lt;td&gt;Amazon Cognito Identity Pools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;지원 프로토콜:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SAML 2.0:&lt;/strong&gt; Active Directory Federation Services(ADFS), Shibboleth 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OIDC:&lt;/strong&gt; GitHub Actions 등 AWS 외부에서 실행되는 워크플로우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;이점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사내 디렉토리(AD 등)와 통합 → 별도 IAM User 관리 불필요&lt;/li&gt;
&lt;li&gt;장기 Access Key 배포/관리 불필요&lt;/li&gt;
&lt;li&gt;계정 탈퇴 시 IdP에서 비활성화만 하면 AWS 접근 자동 차단
:::tip&lt;/li&gt;
&lt;li&gt;&quot;사내 AD 기반 SSO로 AWS 접근&quot; → &lt;strong&gt;IAM Identity Center + SAML&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;GitHub Actions가 AWS 리소스에 접근&quot; → &lt;strong&gt;OIDC 페더레이션&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;중앙 집중식 다중 계정 접근 관리 → &lt;strong&gt;IAM Identity Center&lt;/strong&gt; (구 AWS SSO)
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;1-2. 워크로드 — IAM Role 사용&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;원칙:&lt;/strong&gt; EC2, Lambda 등 AWS 리소스는 &lt;strong&gt;IAM Role&lt;/strong&gt; 사용 (Access Key 절대 금지)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EC2 인스턴스     → Instance Profile (IAM Role)
Lambda 함수      → Execution Role (IAM Role)
ECS 태스크       → Task Role (IAM Role)
GitHub Actions   → OIDC → IAM Role AssumeRole
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;왜 Role인가?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STS(Security Token Service)가 &lt;strong&gt;임시 자격증명&lt;/strong&gt; 자동 발급·갱신&lt;/li&gt;
&lt;li&gt;Access Key가 코드/환경변수에 하드코딩되는 리스크 제거&lt;/li&gt;
&lt;li&gt;AWS SDK가 Instance Profile / 환경 체이닝으로 &lt;strong&gt;자동&lt;/strong&gt; 자격증명 획득
:::tip&lt;/li&gt;
&lt;li&gt;&quot;EC2에서 S3 접근&quot; → EC2에 IAM Role 부여 (Access Key 코드 내 설정 X)&lt;/li&gt;
&lt;li&gt;IAM User가 필요한 예외 케이스: IAM Role을 지원하지 않는 레거시 시스템
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Credential 보안 관리&lt;/h2&gt;
&lt;h3&gt;2-1. Access Key 관리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;원칙&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;장기 키 최소화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가능한 IAM Role로 대체. 불가피할 경우만 IAM User Access Key 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;정기 로테이션&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;필요한 경우 주기적으로 갱신. AWS Config 룰로 90일 미사용 키 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;미사용 키 제거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45일 이상 미사용 → 비활성화 또는 삭제 (CIS Benchmark 권고)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;하드코딩 금지&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;코드, 환경변수, Git 저장소에 Access Key 절대 포함 금지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;감지 도구:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IAM Credential Report:&lt;/strong&gt; 계정 전체 자격증명 현황 보고서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM Last Accessed Information:&lt;/strong&gt; 마지막 서비스/액션 사용 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Config Rules:&lt;/strong&gt; 특정 일수 이상 미사용 키 자동 탐지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2-2. Secrets 관리 Best Practice&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;DB 패스워드, API Key 등 시크릿 → AWS Secrets Manager
                                   (자동 로테이션 지원)

단순 설정값, 비시크릿 파라미터  → SSM Parameter Store Standard
                                   (무료)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
RDS 패스워드 자동 로테이션 → &lt;strong&gt;Secrets Manager&lt;/strong&gt;
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 최소 권한 원칙 (Least Privilege)&lt;/h2&gt;
&lt;h3&gt;원칙 정의&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;작업 수행에 필요한 최소한의 권한만 부여하라.&lt;/strong&gt; 초과 권한은 의도치 않은 동작 및 보안 사고의 원인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;구현 단계&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1단계: AWS Managed Policy로 시작 (빠른 설정)
          ↓
2단계: 실제 사용 패턴 파악 (CloudTrail 로그 분석)
          ↓
3단계: IAM Access Analyzer로 최소 권한 Policy 자동 생성
          ↓
4단계: Customer Managed Policy로 세밀한 권한 적용
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;IAM Access Analyzer 활용&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy Generation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudTrail 로그 기반으로 실제 사용 권한만 추출한 Policy 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100개 이상의 정책 검사. 과도하게 허용적인 권한에 보안 경고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External Access Findings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;외부(다른 계정/인터넷)에서 접근 가능한 리소스 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;CloudTrail 기반으로 최소 권한 자동 생성&quot; → &lt;strong&gt;IAM Access Analyzer Policy Generation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;외부 접근 가능 리소스 탐지&quot; → &lt;strong&gt;IAM Access Analyzer External Access&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;흔한 실수: 와일드카드 권한&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// ❌ 절대 금지 — Full Admin 권한
{
  &quot;Effect&quot;: &quot;Allow&quot;,
  &quot;Action&quot;: &quot;*&quot;,
  &quot;Resource&quot;: &quot;*&quot;
}

// ✅ 올바른 방식 — 특정 서비스·리소스·조건 명시
{
  &quot;Effect&quot;: &quot;Allow&quot;,
  &quot;Action&quot;: [&quot;s3:GetObject&quot;, &quot;s3:PutObject&quot;],
  &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;,
  &quot;Condition&quot;: {
    &quot;Bool&quot;: {&quot;aws:SecureTransport&quot;: &quot;true&quot;}
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
&lt;code&gt;&quot;Action&quot;: &quot;*&quot;&lt;/code&gt; + &lt;code&gt;&quot;Resource&quot;: &quot;*&quot;&lt;/code&gt; = &lt;strong&gt;보안 위반&lt;/strong&gt;. 제거 또는 세분화 필요
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Permission Boundary (권한 경계)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IAM Identity/Role에 설정 가능한 &lt;strong&gt;최대 허용 권한 상한선&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;개발자가 자신보다 높은 권한의 Role/User 생성하는 &lt;strong&gt;권한 상승(Privilege Escalation) 방지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Permission Boundary를 벗어난 권한은 실제 Policy에 있어도 거부됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Permission Boundary = 울타리
Identity-based Policy = 울타리 안에서의 실제 권한

→ 두 Policy의 교집합만 유효
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
개발자에게 IAM 관리 권한 위임 + 권한 상승 방지 → &lt;strong&gt;Permission Boundary&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h2&gt;4. MFA (다중 인증)&lt;/h2&gt;
&lt;h3&gt;MFA 적용 원칙&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;대상&lt;/th&gt;
&lt;th&gt;요구 수준&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;루트 계정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hardware MFA 강력 권고 (YubiKey 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;특권 IAM User&lt;/strong&gt; (관리자)&lt;/td&gt;
&lt;td&gt;MFA 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;일반 IAM User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MFA 강력 권고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Console 로그인&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MFA 조건 Policy로 강제 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;MFA 강제 Policy 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;Effect&quot;: &quot;Deny&quot;,
  &quot;Action&quot;: &quot;*&quot;,
  &quot;Resource&quot;: &quot;*&quot;,
  &quot;Condition&quot;: {
    &quot;BoolIfExists&quot;: {
      &quot;aws:MultiFactorAuthPresent&quot;: &quot;false&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;→ MFA 없이 로그인 시 모든 작업 거부&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MFA 기기 유형:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual MFA:&lt;/strong&gt; Google Authenticator, Authy (소프트웨어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware MFA:&lt;/strong&gt; YubiKey, Gemalto (물리 장치) — 루트 계정 권장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIDO Security Key:&lt;/strong&gt; FIDO2/WebAuthn 지원 하드웨어 키&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;루트 계정 + 강력 보안 → &lt;strong&gt;Hardware MFA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MFA 없이 API 접근 차단 → &lt;code&gt;aws:MultiFactorAuthPresent: false&lt;/code&gt; 조건으로 Deny
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. IAM Policy 구성 전략&lt;/h2&gt;
&lt;h3&gt;5-1. Policy 평가 로직 (시험 핵심)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1. Explicit Deny       → 있으면 즉시 거부 (최우선)
2. Organizations SCP   → OU/계정 단위 guardrail
3. Resource-based Policy (+ Identity-based Policy)
4. Permission Boundary → 최대 허용 상한
5. Session Policy      → AssumeRole 시 추가 제한
6. Identity-based Policy
                        ↓
결론: Default = Implicit Deny
      모든 레이어 통과 + Explicit Allow 있을 때만 허용
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
&quot;Explicit Deny는 어떤 Allow보다 우선&quot; — 평가 순서 암기 필수
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5-2. Policy 유형 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;부착 대상&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User, Group, Role&lt;/td&gt;
&lt;td&gt;가장 일반적. 인프라 권한 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3, SQS, KMS 등 리소스&lt;/td&gt;
&lt;td&gt;크로스 계정 접근 허용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission Boundary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User, Role&lt;/td&gt;
&lt;td&gt;최대 허용 권한 상한 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OU, 계정 (Organizations)&lt;/td&gt;
&lt;td&gt;Guardrail. Allow 부여 안 함. 허용 범위만 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AssumeRole 호출 시&lt;/td&gt;
&lt;td&gt;임시 세션의 권한 추가 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;5-3. User vs Group vs Role 운영 Best Practice&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;IAM User   → 원칙적으로 사람에게 생성 지양 (Federation 우선)
              불가피하면 최소 권한 + 주기적 자격증명 감사

IAM Group  → 다수 User에 동일 Policy 일괄 적용
              User에게 직접 Policy 부착 금지 → Group을 통해 관리

IAM Role   → AWS 리소스, 크로스 계정 접근, 페더레이션 사용자
              임시 자격증명 자동 발급 (STS AssumeRole)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Policy를 &lt;strong&gt;직접 User에 부착하지 않고 Group 통해 관리&lt;/strong&gt; = 운영 복잡도 감소 Best Practice&lt;/li&gt;
&lt;li&gt;계정 수 증가 → Group/Role 기반 관리가 필수
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 크로스 계정 &amp;amp; 외부 접근 제어&lt;/h2&gt;
&lt;h3&gt;6-1. SCP (Service Control Policies)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Organizations&lt;/strong&gt;에서 OU 또는 계정 단위로 적용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow를 부여하지 않음&lt;/strong&gt; — 최대 허용 범위(Guardrail)만 설정&lt;/li&gt;
&lt;li&gt;루트 계정도 SCP를 벗어날 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;활용 예시:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;프로덕션 OU → SCP: us-east-1, ap-northeast-2 리전만 허용
개발 OU     → SCP: 고비용 GPU 인스턴스 유형 차단
전체 ORG    → SCP: 특정 서비스(Redshift 등) 생성 금지
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특정 리전 차단 + 조직 전체 → &lt;strong&gt;SCP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SCP는 Allow 부여 안 함. 기존 Allow 권한의 허용 범위를 &lt;strong&gt;제한&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;6-2. IAM Identity Center (AWS SSO)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다중 계정 접근을 &lt;strong&gt;중앙에서 단일 포털&lt;/strong&gt;로 관리&lt;/li&gt;
&lt;li&gt;Identity Source: 내장 디렉토리 / 외부 SAML IdP / Active Directory&lt;/li&gt;
&lt;li&gt;Permission Set = 계정별 권한 집합 정의&lt;/li&gt;
&lt;li&gt;장점: 각 계정에 별도 IAM User 생성 불필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;6-3. 외부 접근 감사&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IAM Access Analyzer:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3 버킷, IAM Role, KMS Key, Lambda 등의 &lt;strong&gt;외부 접근 가능 여부&lt;/strong&gt; 자동 탐지&lt;/li&gt;
&lt;li&gt;의도치 않은 퍼블릭/크로스 계정 공개 즉시 발견
:::tip
&quot;외부에서 접근 가능한 리소스 자동 탐지&quot; → &lt;strong&gt;IAM Access Analyzer&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7. 모니터링 &amp;amp; 감사&lt;/h2&gt;
&lt;h3&gt;7-1. AWS CloudTrail&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모든 AWS API 호출&lt;/strong&gt; 기록 (누가 / 언제 / 무엇을 / 어디서)&lt;/li&gt;
&lt;li&gt;S3 버킷에 로그 저장 → &lt;strong&gt;Log File Validation&lt;/strong&gt; 활성화 (무결성 검증)&lt;/li&gt;
&lt;li&gt;IAM 보안 감사의 기본 기반
:::tip
&quot;누가 리소스를 변경했는가&quot; → &lt;strong&gt;CloudTrail&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;7-2. 불필요한 자격증명 정기 정리&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;정리 대상:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;미사용 IAM User, Role, Group&lt;/li&gt;
&lt;li&gt;만료된 Policy 및 권한&lt;/li&gt;
&lt;li&gt;90일 이상 미사용 Access Key&lt;/li&gt;
&lt;li&gt;45일 이상 미사용 패스워드/Access Key (CIS 기준)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;도구:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IAM Credential Report:&lt;/strong&gt; 계정 전체 자격증명 현황 CSV 다운로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM Last Accessed:&lt;/strong&gt; 서비스/액션별 마지막 사용 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Config Rules:&lt;/strong&gt; 자동 탐지 및 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip
&quot;미사용 권한 자동 탐지 + 최소 권한 정책 생성&quot; → &lt;strong&gt;IAM Access Analyzer + Last Accessed 정보 조합&lt;/strong&gt;
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7-3. AWS Config&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;리소스 구성 변경 이력&lt;/strong&gt; 추적&lt;/li&gt;
&lt;li&gt;Compliance Rules:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iam-user-no-policies-check&lt;/code&gt;: User에 직접 Policy 부착 여부&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iam-root-access-key-check&lt;/code&gt;: 루트 Access Key 존재 여부&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mfa-enabled-for-iam-console-access&lt;/code&gt;: MFA 미설정 User 탐지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-remediation:&lt;/strong&gt; 비준수 시 Lambda 통해 자동 수정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 루트 계정 보호&lt;/h2&gt;
&lt;h3&gt;루트 계정 보안 수칙&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;권고 사항&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;일상 사용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;절대 금지 — 루트 전용 작업 외 사용 금지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;생성하지 말 것. 기존 것 즉시 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MFA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hardware MFA 필수 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;이메일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;루트 계정 이메일 보안 강화 (2FA 적용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비밀번호&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;복잡한 비밀번호 + 안전한 저장소 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;루트 계정만 할 수 있는 작업:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;계정 해지&lt;/li&gt;
&lt;li&gt;결제 정보 변경&lt;/li&gt;
&lt;li&gt;Support 플랜 변경&lt;/li&gt;
&lt;li&gt;IAM Identity Center 활성화 (조직 관리 계정)&lt;/li&gt;
&lt;li&gt;S3 버킷 정책이 모든 요청을 차단할 때 버킷 정책 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Centralized Root Access (Organizations)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS Organizations 관리 계정에서 멤버 계정의 &lt;strong&gt;루트 자격증명 중앙 제어&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;멤버 계정의 장기 루트 자격증명 제거 및 복구 방지&lt;/li&gt;
&lt;li&gt;필요 시 임시 특권 세션(Break Glass)으로만 루트 수준 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;루트 Access Key = &lt;strong&gt;즉시 삭제&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;루트 계정 모니터링&quot; → &lt;strong&gt;CloudTrail + CloudWatch 알람&lt;/strong&gt; 연동&lt;/li&gt;
&lt;li&gt;AWS Config Rule: &lt;code&gt;iam-root-access-key-check&lt;/code&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 시험 단골 패턴 요약&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;정답 키워드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사내 AD로 AWS 접근&lt;/td&gt;
&lt;td&gt;IAM Identity Center + SAML 2.0 페더레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions → AWS 접근&lt;/td&gt;
&lt;td&gt;OIDC + IAM Role AssumeRole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2에서 S3 접근&lt;/td&gt;
&lt;td&gt;IAM Role (Instance Profile) — Access Key 절대 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다중 계정 권한 중앙 관리&lt;/td&gt;
&lt;td&gt;IAM Identity Center (Permission Set)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OU 단위 서비스 사용 차단&lt;/td&gt;
&lt;td&gt;SCP (Service Control Policy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발자 권한 위임 + 상승 방지&lt;/td&gt;
&lt;td&gt;Permission Boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;미사용 권한 자동 탐지&lt;/td&gt;
&lt;td&gt;IAM Access Analyzer + Last Accessed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최소 권한 Policy 자동 생성&lt;/td&gt;
&lt;td&gt;IAM Access Analyzer Policy Generation (CloudTrail 기반)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외부 접근 가능 리소스 탐지&lt;/td&gt;
&lt;td&gt;IAM Access Analyzer External Access Findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA 없이 API 접근 차단&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aws:MultiFactorAuthPresent: false&lt;/code&gt; Deny Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 호출 감사 로그&lt;/td&gt;
&lt;td&gt;CloudTrail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리소스 구성 변경 자동 탐지&lt;/td&gt;
&lt;td&gt;AWS Config Rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;루트 계정 Access Key&lt;/td&gt;
&lt;td&gt;즉시 삭제 (생성 자체 금지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB 자격증명 자동 로테이션&lt;/td&gt;
&lt;td&gt;AWS Secrets Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단순 설정값 저장&lt;/td&gt;
&lt;td&gt;SSM Parameter Store (무료)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>🚨 AWS Disaster Recovery — Whitepaper Summary</title><link>https://tessa1217.github.io/posts/aws/aws-disaster-recovery/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-disaster-recovery/</guid><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🚨 AWS Disaster Recovery — Whitepaper Summary&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;출처: &lt;a href=&quot;https://docs.aws.amazon.com/whitepapers/latest/disaster-recovery-workloads-on-aws/disaster-recovery-workloads-on-aws.html&quot;&gt;Disaster Recovery of Workloads on AWS: Recovery in the Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Publication: February 12, 2021 | AWS Well-Architected Framework&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EC%A0%95%EC%9D%98&quot;&gt;핵심 개념 정의&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-business-continuity-plan-bcp&quot;&gt;Business Continuity Plan (BCP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-data-plane-vs-control-plane&quot;&gt;Data Plane vs. Control Plane&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-dr-%EC%A0%84%EB%9E%B5-4%EA%B0%80%EC%A7%80&quot;&gt;DR 전략 4가지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-activepassive-vs-activeactive&quot;&gt;Active/Passive vs. Active/Active&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-failover-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%9D%BC%EC%9A%B0%ED%8C%85-%EC%84%9C%EB%B9%84%EC%8A%A4&quot;&gt;Failover 트래픽 라우팅 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-aws-%ED%95%B5%EC%8B%AC-dr-%EC%84%9C%EB%B9%84%EC%8A%A4&quot;&gt;AWS 핵심 DR 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-dr-%ED%85%8C%EC%8A%A4%ED%8C%85-testing-disaster-recovery&quot;&gt;DR 테스팅 (Testing Disaster Recovery)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%EC%A0%84%EB%9E%B5-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;전략 선택 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%EB%B9%84%EC%9A%A9-%EC%B5%9C%EC%A0%81%ED%99%94-%EA%B4%80%EC%A0%90&quot;&gt;비용 최적화 관점&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;📌 시험 자주 출제 포인트 총정리&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 핵심 개념 정의&lt;/h2&gt;
&lt;h3&gt;Disaster (재해)란?&lt;/h3&gt;
&lt;p&gt;워크로드 또는 시스템이 &lt;strong&gt;Primary 배포 위치에서 비즈니스 목표를 달성하지 못하도록 방해하는 이벤트&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;자연재해, 기술 장애, 인위적 실수 모두 포함.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;RTO &amp;amp; RPO&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;정의&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTO&lt;/strong&gt; (Recovery Time Objective)&lt;/td&gt;
&lt;td&gt;서비스 중단 후 &lt;strong&gt;복구까지 허용 가능한 최대 시간&lt;/strong&gt; (&quot;얼마나 빨리 돌아올 수 있는가?&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RPO&lt;/strong&gt; (Recovery Point Objective)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;마지막 데이터 복구 시점부터 허용 가능한 최대 시간&lt;/strong&gt; (&quot;얼마만큼의 데이터 손실을 허용하는가?&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;재해 발생
    │
    ├─── RPO ───→ (마지막 백업 시점)
    │                   데이터 손실 범위
    │
    └─── RTO ───→ (서비스 복구 시점)
                    서비스 다운타임 범위
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;RTO, RPO가 낮을수록 비용과 복잡도 증가&lt;/strong&gt; — 비즈니스 요구사항에 맞는 수준 선택 필수&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Resiliency vs. DR vs. High Availability&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;개념&lt;/th&gt;
&lt;th&gt;정의&lt;/th&gt;
&lt;th&gt;범위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resiliency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인프라/서비스 장애 복구 능력&lt;/td&gt;
&lt;td&gt;광범위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High Availability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;단일 구성요소 장애&lt;/strong&gt; 시에도 서비스 지속&lt;/td&gt;
&lt;td&gt;AZ 레벨 단일 장애&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disaster Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;일회성 재난 이벤트&lt;/strong&gt; 발생 시 복구&lt;/td&gt;
&lt;td&gt;데이터 센터/리전 레벨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;DR은 HA와 별개이며, HA가 완벽해도 DR 전략은 별도로 필요함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Business Continuity Plan (BCP)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DR 전략은 &lt;strong&gt;BCP(비즈니스 연속성 계획)의 하위 집합&lt;/strong&gt;이어야 함 (독립적인 문서 아님)&lt;/li&gt;
&lt;li&gt;비즈니스 영향 분석 (Business Impact Analysis)으로 워크로드 중단의 비즈니스 영향 정량화&lt;/li&gt;
&lt;li&gt;DR 목표는 비즈니스 요구사항, 우선순위, 맥락에 기반해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;: 지진으로 물류가 차단되면 eCommerce 앱 DR이 완벽해도 BCP가 물류를 해결 못하면 비즈니스 목표 달성 불가.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Data Plane vs. Control Plane&lt;/h2&gt;
&lt;p&gt;DR 전략 설계 시 핵심 구분:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;가용성 목표&lt;/th&gt;
&lt;th&gt;Failover 시 사용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Plane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;실시간 서비스 제공&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;높음&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control Plane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;환경 설정/관리&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;❌ 지양&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::important
Failover 작업에는 &lt;strong&gt;Data Plane 작업만 사용&lt;/strong&gt; — Control Plane 작업(예: AWS Backup 복원)은 재해 시 접근 불가능할 수 있음.
:::
:::tip
백업에서 데이터 복원은 Control Plane 작업 → &lt;strong&gt;정기적 주기 복원(Scheduled Periodic Restore)을 미리 설정&lt;/strong&gt;하여 복원된 데이터스토어를 항상 보유해야 함.
:::&lt;/h2&gt;
&lt;h2&gt;4. DR 전략 4가지&lt;/h2&gt;
&lt;h3&gt;전략 비교 한눈에 보기&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;RPO&lt;/th&gt;
&lt;th&gt;RTO&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;th&gt;복잡도&lt;/th&gt;
&lt;th&gt;트래픽 유형&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup &amp;amp; Restore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시간 단위&lt;/td&gt;
&lt;td&gt;시간 단위&lt;/td&gt;
&lt;td&gt;최저 💲&lt;/td&gt;
&lt;td&gt;최저&lt;/td&gt;
&lt;td&gt;Active/Passive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pilot Light&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;분 단위&lt;/td&gt;
&lt;td&gt;수십 분&lt;/td&gt;
&lt;td&gt;중간 💲💲&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;Active/Passive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Warm Standby&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;초 단위&lt;/td&gt;
&lt;td&gt;분 단위&lt;/td&gt;
&lt;td&gt;높음 💲💲💲&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;Active/Passive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Site Active/Active&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;td&gt;최고 💲💲💲💲&lt;/td&gt;
&lt;td&gt;최고&lt;/td&gt;
&lt;td&gt;Active/Active&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;비용/복잡도 (낮음 → 높음):
Backup &amp;amp; Restore → Pilot Light → Warm Standby → Multi-Site Active/Active

RTO/RPO (높음 → 낮음, 즉 복구 시간 길어짐):
Multi-Site Active/Active → Warm Standby → Pilot Light → Backup &amp;amp; Restore
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;전략 1: Backup &amp;amp; Restore (백업 및 복원)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;개념&lt;/strong&gt;: 데이터를 정기적으로 백업 → 재해 발생 시 복원&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Primary Region]                    [Recovery Region]
EC2 / RDS / EBS 등
    │
    ├── 스냅샷 생성 (같은 리전)
    └── 스냅샷 복사 ─────────────────→ S3 / Glacier 저장
                                         (재해 시 복원)
                                         인프라도 IaC로 재배포
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;특성:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가장 단순하고 가장 저렴한 전략&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery 시 인프라 배포 + 코드 배포 + 데이터 복원 모두 필요&lt;/strong&gt; → 높은 RTO&lt;/li&gt;
&lt;li&gt;PITR(Point-in-Time Recovery) 활용 시 RPO를 약 &lt;strong&gt;5분&lt;/strong&gt;까지 낮출 수 있음&lt;/li&gt;
&lt;li&gt;모든 워크로드에 기본 적용 (다른 전략과 함께 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AWS 서비스:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Backup&lt;/strong&gt;: EC2, EBS, RDS, DynamoDB, EFS, FSx 등 중앙 집중 백업 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 + S3 Glacier&lt;/strong&gt;: 백업 저장 (Glacier: 수시간 복원)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudFormation / CDK&lt;/strong&gt;: 인프라 코드(IaC)로 복원 시간 단축&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon EventBridge + Lambda&lt;/strong&gt;: 감지 자동화 → RTO 단축&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;적합한 경우:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비즈니스 크리티컬하지 않은 워크로드&lt;/li&gt;
&lt;li&gt;단일 AZ/데이터 센터 장애 수준의 재해만 고려할 때&lt;/li&gt;
&lt;li&gt;비용 절감이 최우선일 때 (&lt;code&gt;cost-effective&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;전략 2: Pilot Light (파일럿 라이트)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;개념&lt;/strong&gt;: 데이터는 항상 복제 유지 → 핵심 인프라만 Recovery Region에 배포 → &lt;strong&gt;컴퓨팅(EC2 등)은 꺼진(Shut-off) 상태&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Primary Region]               [Recovery Region]
앱 서버 (Active)               앱 서버 = 0개 (배포 안 됨)
RDS Primary ─── Async 복제 ──→ RDS Replica (항상 실행)
ELB / ASG                      ELB / ASG (배포됨, 트래픽 없음)
    │                               │
    │       재해 발생               │
    └───────────────────────────────→
                    AMI에서 EC2 인스턴스 배포 + 스케일 아웃
                    DNS/Global Accelerator로 트래픽 전환
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;특성:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터는 항상 라이브 복제 (DB는 항상 켜짐)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컴퓨팅 리소스는 재해 시 비로소 배포&lt;/strong&gt; → 배포 시간 포함 = RTO 수십 분&lt;/li&gt;
&lt;li&gt;Warm Standby 대비 비용 절감 (컴퓨팅 비용 없음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilot Light vs Warm Standby 핵심 차이&lt;/strong&gt;: Pilot Light는 컴퓨팅 없음 → 재해 시 &quot;Turn on&quot;(배포) 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AWS Elastic Disaster Recovery (DRS):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pilot Light 전략&lt;/strong&gt;을 기반으로 구현&lt;/li&gt;
&lt;li&gt;에이전트 기반 &lt;strong&gt;블록 레벨 연속 복제&lt;/strong&gt; (Block-level replication)&lt;/li&gt;
&lt;li&gt;On-premises/EC2 → AWS로 복제 가능 (단, RDS 제외 — EC2 기반 DB만)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPO: 초 단위 / RTO: 분 단위&lt;/strong&gt; 달성 가능&lt;/li&gt;
&lt;li&gt;Staging Area에 복제본 유지 (저비용 스토리지 + 최소 컴퓨팅)&lt;/li&gt;
&lt;li&gt;비파괴적(Non-disruptive) 테스트 드릴 지원&lt;/li&gt;
&lt;li&gt;Failover/Failback 모두 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AWS 서비스:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aurora Global Database (복제)&lt;/li&gt;
&lt;li&gt;Amazon S3 + CloudFormation (백업 + IaC)&lt;/li&gt;
&lt;li&gt;Route 53 / Global Accelerator (트래픽 전환)&lt;/li&gt;
&lt;li&gt;AWS Elastic Disaster Recovery&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;전략 3: Warm Standby (웜 스탠바이)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;개념&lt;/strong&gt;: Recovery Region에 &lt;strong&gt;축소된(Scaled-down) 완전한 기능의 환경&lt;/strong&gt; 항상 실행 → 재해 시 &lt;strong&gt;스케일 업(Scale up)만&lt;/strong&gt; 하면 됨&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Primary Region]               [Recovery Region]
앱 서버 × N개 (Full)          앱 서버 × 1개 (Minimum) ← 항상 실행
RDS Primary ─── 복제 ───────→ RDS Replica (항상 실행)
ELB / ASG (Full)               ELB / ASG (Minimum)
    │                               │
    │       재해 발생               │
    └───────────────────────────────→
                    Scale Out만 하면 됨 (배포 불필요)
                    DNS/Global Accelerator로 트래픽 전환
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;특성:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;항상 최소한의 프로덕션 환경이 실행 중 → &lt;strong&gt;즉시 일부 트래픽 처리 가능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;재해 시 스케일 업만 필요 → Pilot Light보다 &lt;strong&gt;낮은 RTO&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pilot Light와 비교: &lt;strong&gt;코드와 인프라가 이미 실행 중&lt;/strong&gt;인 것이 차이&lt;/li&gt;
&lt;li&gt;Full Scale = &quot;Hot Standby&quot;라고도 불림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pilot Light vs Warm Standby 차이 요약:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Pilot Light&lt;/th&gt;
&lt;th&gt;Warm Standby&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;컴퓨팅 상태&lt;/td&gt;
&lt;td&gt;배포 안 됨 (꺼짐)&lt;/td&gt;
&lt;td&gt;최소 규모로 실행 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;재해 시 행동&lt;/td&gt;
&lt;td&gt;배포 + 스케일 아웃&lt;/td&gt;
&lt;td&gt;스케일 아웃만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTO&lt;/td&gt;
&lt;td&gt;더 높음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;더 낮음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;더 낮음&lt;/td&gt;
&lt;td&gt;더 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;즉시 트래픽 처리&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (축소된 용량)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;AWS 서비스:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aurora Global Database / RDS Multi-Region Replica&lt;/li&gt;
&lt;li&gt;EC2 Auto Scaling (스케일 업)&lt;/li&gt;
&lt;li&gt;Route 53 / Global Accelerator (Failover 라우팅)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;전략 4: Multi-Site Active/Active (멀티 사이트 액티브/액티브)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;개념&lt;/strong&gt;: 2개 이상의 AWS Region에서 &lt;strong&gt;동시에 트래픽 처리&lt;/strong&gt; → 한 리전 장애 시 트래픽만 재라우팅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Region A: Active]             [Region B: Active]
앱 서버 (Full)                 앱 서버 (Full)
RDS ←──── 양방향 복제 ─────→  RDS (Aurora Global)
    ↑                              ↑
    └──── Route 53 / Global Accelerator ────┘
              (두 리전 모두 트래픽 수신)

재해 발생 시: 트래픽을 장애 리전에서 빼는 것만으로 복구
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;특성:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RPO: Near-zero / RTO: Near-zero 또는 Zero&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;비동기 데이터 복제로 Near-zero RPO 달성&lt;/li&gt;
&lt;li&gt;가장 높은 비용과 복잡도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;쓰기 충돌(Write Conflict)&lt;/strong&gt; 관리 필요 (두 리전에 동시 Write 가능)&lt;/li&gt;
&lt;li&gt;데이터 복제는 일부 재해로부터만 보호 → &lt;strong&gt;PITR(Point-in-Time Recovery)도 함께 필요&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;트래픽 라우팅:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Route 53&lt;/strong&gt;: 지역별 라우팅 정책 (Geoproximity, Latency 등), 비율 기반 가중치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Accelerator&lt;/strong&gt;: AWS Edge Network 활용 → 낮은 지연 시간, DNS 캐시 문제 없음, Traffic Dial로 리전별 비율 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Active/Passive vs. Active/Active&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Active/Passive&lt;/th&gt;
&lt;th&gt;Active/Active&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;해당 전략&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Restore, Pilot Light, Warm Standby&lt;/td&gt;
&lt;td&gt;Multi-Site Active/Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동작&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Primary에서 트래픽 처리, DR은 Standby&lt;/td&gt;
&lt;td&gt;모든 리전에서 트래픽 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failover 방법&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS/Global Accelerator로 트래픽 전환&lt;/td&gt;
&lt;td&gt;장애 리전에서 트래픽 빼기만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 충돌&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;쓰기 충돌 관리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Failover 트래픽 라우팅 서비스&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;Active/Active 지원&lt;/th&gt;
&lt;th&gt;DNS 캐시 문제&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Route 53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS 기반, 다양한 라우팅 정책 지원&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Global Accelerator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anycast IP, AWS Edge 네트워크 직접 진입&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon CloudFront&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Origin Failover (요청 단위), 이후 요청은 Primary로&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
&lt;strong&gt;Global Accelerator&lt;/strong&gt;: DNS 캐시 문제 없음, 낮은 지연 시간 → Active/Active, Pilot Light, Warm Standby 모두 적합
:::&lt;/h2&gt;
&lt;h2&gt;7. AWS 핵심 DR 서비스&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;주요 전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2, EBS, RDS, DynamoDB 등 중앙 집중 백업&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Elastic Disaster Recovery (DRS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;블록 레벨 연속 복제, Failover/Failback&lt;/td&gt;
&lt;td&gt;Pilot Light&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora Global Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;리전 간 복제 &amp;lt; 1초, 최대 5개 Secondary&lt;/td&gt;
&lt;td&gt;Pilot Light, Warm Standby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RDS Read Replica (Cross-Region)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;비동기 복제&lt;/td&gt;
&lt;td&gt;Pilot Light, Warm Standby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Cross-Region Replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;객체 복제&lt;/td&gt;
&lt;td&gt;모든 전략&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudFormation / CDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IaC로 DR 리전 인프라 신속 배포&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Resilience Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RTO/RPO 목표 달성 여부 지속 검증 및 추적&lt;/td&gt;
&lt;td&gt;모든 전략&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Route 53 / Global Accelerator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Failover 트래픽 라우팅&lt;/td&gt;
&lt;td&gt;모든 전략&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EventBridge + Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;재해 감지 자동화, RTO 단축&lt;/td&gt;
&lt;td&gt;모든 전략&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;8. DR 테스팅 (Testing Disaster Recovery)&lt;/h2&gt;
&lt;p&gt;:::warning
⚠️ &lt;strong&gt;DR 전략은 정기적으로 테스트하지 않으면 실제 재해 시 작동 보장 불가&lt;/strong&gt;
:::&lt;/p&gt;
&lt;h3&gt;핵심 원칙&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DR 구현을 검증&lt;/strong&gt;하고 &lt;strong&gt;DR 리전으로의 Failover를 정기 테스트&lt;/strong&gt;하여 RTO/RPO 달성 여부 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;거의 실행되지 않는 복구 경로&quot; 패턴 피하기&lt;/strong&gt;: 드물게 테스트된 경로는 실제 장애 시 실패 위험&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;테스트해야 하는 이유 (실제 사례):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;가정: Secondary DB가 Read-only 쿼리를 담당
     Primary 장애 시 Secondary로 Write 가능하다고 생각

현실: 오랫동안 Failover 테스트를 안 했다면
     → Secondary 용량이 부족하거나
     → 서비스 쿼터가 충족 안 될 수 있음
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DR 테스트 방법&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup 테스트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;백업 복원 정기 실행 (단순히 백업 생성으로 충분 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failover 드릴&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실제 DR 리전으로 Failover 시연&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chaos Engineering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;의도적 장애 주입으로 복구 능력 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DR 드릴&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isolated Subnet에서 실행 → 프로덕션 미간섭&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
💡 &lt;strong&gt;AWS Resilience Hub&lt;/strong&gt;: RTO/RPO 목표 달성 여부를 지속적으로 검증하는 서비스
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 전략 선택 가이드&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;단순한 데이터 센터 장애 수준 + 비용 최소화
                    ↓
            Backup &amp;amp; Restore

데이터 센터 장애 수준 + RPO/RTO 수십 분 + 비용 절감
                    ↓
               Pilot Light
               (또는 AWS Elastic Disaster Recovery)

리전 레벨 장애 + RPO/RTO 분 단위 + 비즈니스 크리티컬
                    ↓
             Warm Standby

리전 레벨 장애 + Near-zero RPO/RTO + 미션 크리티컬
                    ↓
         Multi-Site Active/Active
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;규제 요건:&lt;/strong&gt; 데이터 레지던시 요구사항이 있어 단일 리전만 사용 가능한 경우 → &lt;strong&gt;AZ를 Region 대신 DR 사이트로 활용&lt;/strong&gt; 가능&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 비용 최적화 관점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS는 물리적 Backup Data Center의 &lt;strong&gt;고정 자본 비용(CapEx)&lt;/strong&gt; → **실제 사용량 기반 운영 비용(OpEx)**으로 전환&lt;/li&gt;
&lt;li&gt;온프레미스 DR은 항상 2번째 데이터 센터 풀 운영 비용 → AWS에서는 Pilot Light/Warm Standby로 최소 비용만 유지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Glacier / Glacier Deep Archive&lt;/strong&gt;: 백업 저장 비용 대폭 절감 (아카이브 데이터)&lt;/li&gt;
&lt;li&gt;필요 이상으로 엄격한 전략 선택 금지 → 불필요한 비용 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트 총정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTO 정의&lt;/td&gt;
&lt;td&gt;서비스 중단 후 &lt;strong&gt;복구까지 허용 최대 시간&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPO 정의&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;마지막 데이터 복구 시점 이후 허용 최대 시간&lt;/strong&gt; (데이터 손실 허용 범위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTO/RPO 낮을수록&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비용과 복잡도 증가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Plane vs Control Plane&lt;/td&gt;
&lt;td&gt;Failover에는 &lt;strong&gt;Data Plane 작업만&lt;/strong&gt; 사용 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup &amp;amp; Restore RTO/RPO&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;가장 높음&lt;/strong&gt; (시간 단위) / 비용 최저&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot Light 특징&lt;/td&gt;
&lt;td&gt;데이터 라이브 복제, &lt;strong&gt;컴퓨팅 배포 없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot Light vs Warm Standby&lt;/td&gt;
&lt;td&gt;Pilot: 재해 시 &quot;Turn on&quot;(배포) / Warm: 재해 시 &quot;Scale up&quot;만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm Standby 특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최소 규모 환경 항상 실행&lt;/strong&gt;, 즉시 일부 트래픽 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Site Active/Active&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Near-zero RPO/RTO&lt;/strong&gt;, 모든 리전 Active, 쓰기 충돌 관리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active/Passive 해당 전략&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Restore, Pilot Light, Warm Standby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active/Active 해당 전략&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Multi-Site Active/Active&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Elastic DRS 전략&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pilot Light&lt;/strong&gt; 기반, 블록 레벨 연속 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Elastic DRS 대상&lt;/td&gt;
&lt;td&gt;On-premises 또는 &lt;strong&gt;EC2 기반 앱/DB&lt;/strong&gt; (RDS 제외)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Accelerator 장점&lt;/td&gt;
&lt;td&gt;DNS 캐시 문제 없음, Edge 네트워크 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DR 테스팅 필수 이유&lt;/td&gt;
&lt;td&gt;드물게 실행되는 복구 경로는 &lt;strong&gt;실제 장애 시 실패 가능&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup에서 자동 복원&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS SDK로 AWS Backup API 호출&lt;/strong&gt; (자동 복원 기본 미지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DR 목표 지속 추적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Resilience Hub&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단일 리전 규제 환경 DR&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AZ를 Recovery Site로 활용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>🌐 AWS Networking — VPC</title><link>https://tessa1217.github.io/posts/aws/aws-networking/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-networking/</guid><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🌐 AWS Networking — VPC&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;CIDR · VPC · Subnet · IGW · NAT · NACL · Security Group&lt;/p&gt;
&lt;p&gt;VPC Peering · Endpoints · VPN · Direct Connect · Transit Gateway · Network Firewall&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#cidr--ipv4-%EC%A3%BC%EC%86%8C-%EC%B2%B4%EA%B3%84&quot;&gt;CIDR — IPv4 주소 체계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-virtual-private-cloud&quot;&gt;VPC (Virtual Private Cloud)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#subnet-%EC%84%9C%EB%B8%8C%EB%84%B7&quot;&gt;Subnet (서브넷)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#internet-gateway-igw&quot;&gt;Internet Gateway (IGW)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bastion-host&quot;&gt;Bastion Host&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#nat-gateway-vs-nat-instance&quot;&gt;NAT Gateway vs. NAT Instance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#security-groups-vs-nacls&quot;&gt;Security Groups vs. NACLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-flow-logs&quot;&gt;VPC Flow Logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-peering&quot;&gt;VPC Peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-endpoints-aws-privatelink&quot;&gt;VPC Endpoints (AWS PrivateLink)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#site-to-site-vpn&quot;&gt;Site-to-Site VPN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-direct-connect-dx&quot;&gt;AWS Direct Connect (DX)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#transit-gateway&quot;&gt;Transit Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-traffic-mirroring&quot;&gt;VPC Traffic Mirroring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ipv6--egress-only-internet-gateway&quot;&gt;IPv6 &amp;amp; Egress-only Internet Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-network-firewall&quot;&gt;AWS Network Firewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-%EB%B9%84%EC%9A%A9-networking-costs&quot;&gt;네트워킹 비용 (Networking Costs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a&gt;AWS 네트워크 보안 계층&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#vpc-%EC%A0%84%EC%B2%B4-%EC%9A%94%EC%95%BD&quot;&gt;VPC 전체 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;CIDR — IPv4 주소 체계&lt;/h2&gt;
&lt;h3&gt;CIDR (Classless Inter-Domain Routing)&lt;/h3&gt;
&lt;p&gt;IP 주소 범위를 정의하는 방법. Security Group 규칙 및 AWS 네트워킹 전반에 사용.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WW.XX.YY.ZZ/32   → 단 1개의 IP
0.0.0.0/0        → 모든 IP
192.168.0.0/26   → 192.168.0.0 ~ 192.168.0.63 (64개 IP)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Subnet Mask 빠른 계산:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CIDR&lt;/th&gt;
&lt;th&gt;사용 가능 IP 수&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/32&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;255.255.255.255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/31&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/30&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/24&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/16&lt;/td&gt;
&lt;td&gt;65,536&lt;/td&gt;
&lt;td&gt;255.255.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/8&lt;/td&gt;
&lt;td&gt;16,777,216&lt;/td&gt;
&lt;td&gt;255.0.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;공식&lt;/strong&gt;: 사용 가능 IP 수 = 2^(32 - mask 숫자)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Private IP 범위 (IANA 지정)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;범위&lt;/th&gt;
&lt;th&gt;CIDR&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10.0.0.0 ~ 10.255.255.255&lt;/td&gt;
&lt;td&gt;10.0.0.0**/8**&lt;/td&gt;
&lt;td&gt;대규모 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;172.16.0.0 ~ 172.31.255.255&lt;/td&gt;
&lt;td&gt;172.16.0.0**/12**&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Default VPC 범위&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;192.168.0.0 ~ 192.168.255.255&lt;/td&gt;
&lt;td&gt;192.168.0.0**/16**&lt;/td&gt;
&lt;td&gt;홈 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;나머지 IP는 모두 Public IP.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC (Virtual Private Cloud)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;리전당 최대 VPC 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5개&lt;/strong&gt; (Soft limit, 증가 요청 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC당 최대 CIDR 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CIDR 최소 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/28&lt;/strong&gt; (16 IP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CIDR 최대 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;/16&lt;/strong&gt; (65,536 IP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;허용 IP 범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Private IP 범위만 (10.x, 172.16-31.x, 192.168.x)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::warning
⚠️ &lt;strong&gt;VPC CIDR은 기업 네트워크와 겹치면 안 됨&lt;/strong&gt; (VPN/Direct Connect 연결 시 라우팅 충돌)
:::&lt;/p&gt;
&lt;h3&gt;Default VPC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;모든 신규 AWS 계정에 자동 생성&lt;/li&gt;
&lt;li&gt;EC2 인스턴스 생성 시 Subnet 미지정 시 Default VPC에 배치&lt;/li&gt;
&lt;li&gt;기본적으로 Internet Connectivity + Public IPv4 주소 부여&lt;/li&gt;
&lt;li&gt;Public/Private IPv4 DNS 이름 모두 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Subnet (서브넷)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VPC 내 IPv4 주소의 하위 범위, &lt;strong&gt;특정 AZ에 종속&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AWS는 각 Subnet에서 &lt;strong&gt;5개의 IP를 예약&lt;/strong&gt; (사용 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시: 10.0.0.0/24 Subnet&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;주소&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network Address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC Router용 (AWS 예약)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon-provided DNS용 (AWS 예약)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;미래 용도 (AWS 예약)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.255&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network Broadcast Address (AWS는 VPC에서 Broadcast 미지원, 예약)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
29개의 IP가 필요하다면 &lt;code&gt;/27&lt;/code&gt; (32 IP - 5 = 27 &amp;lt; 29) 불가 → &lt;code&gt;/26&lt;/code&gt; (64 - 5 = 59) 필요
:::&lt;/h2&gt;
&lt;h2&gt;Internet Gateway (IGW)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VPC 내 리소스가 &lt;strong&gt;인터넷에 연결&lt;/strong&gt;되도록 하는 게이트웨이&lt;/li&gt;
&lt;li&gt;수평 확장, 고가용성, 이중화 지원&lt;/li&gt;
&lt;li&gt;VPC와 별도로 생성 후 연결 (1 VPC : 1 IGW)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IGW 자체만으로는 인터넷 접근 불가&lt;/strong&gt; → &lt;strong&gt;Route Table 수정 필수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[EC2] → Route Table → Router → IGW → Internet
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Bastion Host&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public Subnet에 위치한 EC2 인스턴스&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Private Subnet의 EC2 인스턴스에 SSH 접근하기 위한 Jump Server 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;보안 설정:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bastion Host Security Group:
  Inbound: Port 22 허용 — 회사 공인 IP(CIDR)에서만

Private EC2 Security Group:
  Inbound: Port 22 허용 — Bastion Host의 Security Group 또는 Private IP에서만
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;NAT Gateway vs. NAT Instance&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;목적&lt;/strong&gt;: Private Subnet의 EC2가 인터넷(외부)에 접근 가능하도록 (반대 방향은 차단)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;NAT Gateway&lt;/th&gt;
&lt;th&gt;NAT Instance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS 완전 관리형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 관리 (OS 패치 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;가용성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AZ 내 고가용성&lt;/td&gt;
&lt;td&gt;스크립트로 Failover 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;대역폭&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대 100 Gbps&lt;/strong&gt; (5 Gbps 기본, 자동 확장)&lt;/td&gt;
&lt;td&gt;EC2 Instance Type에 따름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보안 그룹&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 불필요&lt;/td&gt;
&lt;td&gt;✅ 직접 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bastion Host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 불가&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시간당 + 전송량&lt;/td&gt;
&lt;td&gt;EC2 비용 + 네트워크 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;상태&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;현재 권장&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;구식 (2020년 지원 종료)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;NAT Instance 필수 설정:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public Subnet에 배치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source/Destination Check 비활성화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Elastic IP 연결&lt;/li&gt;
&lt;li&gt;Route Table에서 Private Subnet → NAT Instance로 라우팅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;NAT Gateway 고가용성 구성&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[AZ1: Private Subnet] → [NAT-GW-1 (AZ1)] → IGW → Internet
[AZ2: Private Subnet] → [NAT-GW-2 (AZ2)] → IGW → Internet
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;NAT GW는 단일 AZ 내에서만 고가용성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-AZ 구성&lt;/strong&gt;: AZ별로 별도 NAT GW 생성 (AZ 장애 시 크로스 AZ Failover 불필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Security Groups vs. NACLs&lt;/h2&gt;
&lt;h3&gt;트래픽 흐름&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Inbound:  Internet → [NACL Inbound] → [Security Group Inbound] → EC2
Outbound: EC2 → [Security Group Outbound] → [NACL Outbound] → Internet
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Security Group&lt;/th&gt;
&lt;th&gt;NACL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;적용 레벨&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2 인스턴스 레벨&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;서브넷 레벨&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;규칙 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Allow만&lt;/td&gt;
&lt;td&gt;Allow + &lt;strong&gt;Deny 모두&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;상태&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Stateful&lt;/strong&gt; (Inbound 허용 시 Outbound 자동 허용)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Stateless&lt;/strong&gt; (Inbound/Outbound 각각 명시 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;규칙 평가&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 규칙 평가 후 결정&lt;/td&gt;
&lt;td&gt;낮은 번호부터 &lt;strong&gt;순서대로 평가, 첫 매칭 적용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;자동 적용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;명시적으로 지정해야 함&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;서브넷 내 모든 EC2에 자동 적용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;NACL 규칙 특성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;규칙 번호: &lt;strong&gt;1 ~ 32766&lt;/strong&gt; (낮은 번호가 높은 우선순위)&lt;/li&gt;
&lt;li&gt;마지막 규칙:  (asterisk) — 일치하는 규칙 없으면 Deny&lt;/li&gt;
&lt;li&gt;새로 생성된 NACL: &lt;strong&gt;모든 트래픽 Deny&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default NACL&lt;/strong&gt;: 모든 Inbound/Outbound 허용 → 수정 금지, Custom NACL 사용 권장&lt;/li&gt;
&lt;li&gt;특정 IP 차단에 적합 (Security Group은 Deny 불가)&lt;/li&gt;
&lt;li&gt;규칙 추가 시 &lt;strong&gt;100 단위 증분&lt;/strong&gt; 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ephemeral Ports (임시 포트)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 서버에 연결할 때 &lt;strong&gt;응답을 받을 임시 포트를 무작위로 할당&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;운영체제별 임시 포트 범위:
&lt;ul&gt;
&lt;li&gt;IANA/Windows 10: &lt;strong&gt;49152 ~ 65535&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Linux Kernel: &lt;strong&gt;32768 ~ 60999&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NACL에서 Ephemeral Port 고려 예시 (Web → DB 통신):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Web-NACL Outbound:  TCP 3306 → DB Subnet CIDR 허용
DB-NACL Inbound:    TCP 3306 ← Web Subnet CIDR 허용
DB-NACL Outbound:   TCP 1024-65535 → Web Subnet CIDR 허용  ← 임시 포트!
Web-NACL Inbound:   TCP 1024-65535 ← DB Subnet CIDR 허용   ← 임시 포트!
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;VPC Flow Logs로 SG/NACL 트러블슈팅&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flow Log Action&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inbound REJECT&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NACL&lt;/strong&gt; 또는 &lt;strong&gt;Security Group&lt;/strong&gt; 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound ACCEPT + Outbound REJECT&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NACL&lt;/strong&gt; 차단 (Stateless)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Security Group은 Stateful이므로 Inbound ACCEPT 시 Outbound는 자동 허용됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC Flow Logs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VPC / Subnet / ENI 레벨에서 &lt;strong&gt;IP 트래픽 정보 캡처&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AWS 관리형 인터페이스(ELB, RDS, ElastiCache, NAT GW 등)도 캡처 가능&lt;/li&gt;
&lt;li&gt;대상: &lt;strong&gt;S3, CloudWatch Logs, Kinesis Data Firehose&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Flow Log 필드:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;분석 아키텍처:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;VPC Flow Logs → CloudWatch Logs → Contributor Insights → Top-10 IP
VPC Flow Logs → CloudWatch Logs → Metric Filter → Alarm → SNS
VPC Flow Logs → S3 → Athena → QuickSight
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
⚠️ CloudWatch Logs로 전송 시 IAM Role에 &lt;code&gt;logs:CreateLogGroup&lt;/code&gt;, &lt;code&gt;logs:CreateLogStream&lt;/code&gt;, &lt;code&gt;logs:PutLogEvents&lt;/code&gt; 권한 필요
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC Peering&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS 내부 네트워크로 두 VPC를 프라이빗 연결&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;같은 네트워크처럼 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;제약 조건:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CIDR 범위 &lt;strong&gt;겹치면 안 됨&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-transitive&lt;/strong&gt;: A-B, B-C 피어링이 있어도 A-C 직접 연결 안 됨 → A-C 피어링 별도 생성 필요&lt;/li&gt;
&lt;li&gt;연결 후 &lt;strong&gt;양쪽 VPC의 Route Table 모두 업데이트&lt;/strong&gt; 필요&lt;/li&gt;
&lt;li&gt;서로 다른 계정/리전 간 VPC Peering 가능&lt;/li&gt;
&lt;li&gt;피어링된 VPC의 Security Group 참조 가능 (같은 리전, 다른 계정 간)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;VPC-A ←→ VPC-B ←→ VPC-C
A와 C가 통신하려면 별도 A-C 피어링 필요 (B를 통한 전이 없음)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC Endpoints (AWS PrivateLink)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Public Internet을 거치지 않고 &lt;strong&gt;AWS 내부 네트워크로 AWS 서비스에 접근&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IGW, NAT GW 없이 AWS 서비스 접근 가능&lt;/li&gt;
&lt;li&gt;수평 확장, 이중화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Endpoint 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Interface Endpoint&lt;/th&gt;
&lt;th&gt;Gateway Endpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;구현&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ENI (Private IP) 생성&lt;/td&gt;
&lt;td&gt;Route Table에 Gateway 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 필요&lt;/td&gt;
&lt;td&gt;❌ 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 서비스&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대부분의 AWS 서비스&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3, DynamoDB만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시간당 + GB당&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;확장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ENI 기반&lt;/td&gt;
&lt;td&gt;Route Table 기반 (자동 확장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;S3 Endpoint 선택 기준:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;일반적으로 → Gateway Endpoint 권장 (무료, Route Table만 수정)
On-premises (VPN/Direct Connect), 다른 VPC, 다른 리전에서 접근
                                  → Interface Endpoint 필요
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Site-to-Site VPN&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On-premises ↔ AWS VPC 간 &lt;strong&gt;암호화된 VPN 터널 (공용 인터넷 경유)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;구성 요소:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성요소&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VGW (Virtual Private Gateway)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS 측 VPN Concentrator, VPC에 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CGW (Customer Gateway)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;고객 측 소프트웨어 앱 또는 물리 장비&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;설정 필수 사항:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CGW 디바이스의 &lt;strong&gt;공인 IP&lt;/strong&gt; 사용 (NAT 뒤에 있으면 NAT의 Public IP)&lt;/li&gt;
&lt;li&gt;서브넷 Route Table에서 &lt;strong&gt;VGW Route Propagation 활성화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;On-premises → EC2 Ping 필요 시 Security Group에 &lt;strong&gt;ICMP 프로토콜&lt;/strong&gt; Inbound 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AWS VPN CloudHub&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;여러 Site와 VPN 연결을 하나의 VGW에 연결 → &lt;strong&gt;Hub-and-Spoke&lt;/strong&gt; 구성&lt;/li&gt;
&lt;li&gt;각 Site 간 보안 통신 (저비용)&lt;/li&gt;
&lt;li&gt;공용 인터넷 경유 (암호화됨)&lt;/li&gt;
&lt;li&gt;동적 라우팅 + Route Table 설정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Direct Connect (DX)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On-premises ↔ AWS 간 &lt;strong&gt;전용 물리 Private 연결&lt;/strong&gt; (인터넷 미경유)&lt;/li&gt;
&lt;li&gt;DC → AWS Direct Connect Location → VGW → VPC&lt;/li&gt;
&lt;li&gt;IPv4, IPv6 모두 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대용량 데이터셋 처리 (높은 대역폭, 낮은 비용)&lt;/li&gt;
&lt;li&gt;실시간 데이터 피드 (일관된 네트워크 성능)&lt;/li&gt;
&lt;li&gt;Hybrid 환경 (온프레미스 + 클라우드)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Direct Connect 연결 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;용량&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated Connections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1/10/100 Gbps&lt;/td&gt;
&lt;td&gt;물리적 Ethernet 포트 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hosted Connections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50 Mbps ~ 10 Gbps&lt;/td&gt;
&lt;td&gt;AWS Direct Connect Partner 통해 요청, 온디맨드 용량 조정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::important
⚠️ 신규 연결 구축 리드 타임: 보통 &lt;strong&gt;1개월 이상&lt;/strong&gt;
:::&lt;/p&gt;
&lt;h3&gt;Direct Connect 암호화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터 전송 중 암호화 &lt;strong&gt;기본 없음&lt;/strong&gt; (Private 연결이지만 비암호화)&lt;/li&gt;
&lt;li&gt;암호화 필요 시: &lt;strong&gt;Direct Connect + Site-to-Site VPN&lt;/strong&gt; 조합 → IPsec 암호화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Direct Connect Gateway&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;여러 리전의 여러 VPC에 Direct Connect를 연결할 때 사용&lt;/li&gt;
&lt;li&gt;단일 Direct Connect로 &lt;strong&gt;여러 리전의 VPC에 접근&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Direct Connect 이중화 (Resiliency)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;수준&lt;/th&gt;
&lt;th&gt;구성&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High Resiliency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;여러 위치(Location)에 각 1개 DX 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maximum Resiliency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;여러 위치에서 각각 별도 디바이스에 2개 이상 DX 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Direct Connect 장애 시 Backup&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DX 장애 대비 &lt;strong&gt;Backup으로 Site-to-Site VPN&lt;/strong&gt; 연결 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Transit Gateway&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;수천 개의 VPC + On-premises를 &lt;strong&gt;Hub-and-Spoke(Star) 방식으로 연결&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VPC Peering의 Non-transitive 문제 해결 (Transit GW는 Transitive)&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;연결 가능 대상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC, Direct Connect Gateway, VPN Connection (CGW)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Regional Resource (크로스 리전 지원, 리전 간 TGW Peering)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;계정 공유&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Resource Access Manager (RAM)&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Route Tables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC 간 통신 제어 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;특이 기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP Multicast&lt;/strong&gt; 지원 (다른 AWS 서비스 미지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Transit Gateway — ECMP (Equal-Cost Multi-Path)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECMP&lt;/strong&gt;: 여러 최적 경로로 패킷 전달하는 라우팅 전략&lt;/li&gt;
&lt;li&gt;VPN → Transit Gateway 연결 시 여러 Site-to-Site VPN으로 &lt;strong&gt;대역폭 배가&lt;/strong&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연결 방식&lt;/th&gt;
&lt;th&gt;최대 처리량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VPN → Virtual Private Gateway&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.25 Gbps&lt;/strong&gt; (2개 터널)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN → Transit Gateway (ECMP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.5 Gbps&lt;/strong&gt; (2 터널 사용) → VPN 추가로 배가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Direct Connect를 여러 계정과 공유할 때도 Transit Gateway + RAM 조합 사용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC Traffic Mirroring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VPC 내 네트워크 트래픽을 &lt;strong&gt;캡처하여 분석&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;소스: ENI / 대상: ENI 또는 NLB&lt;/li&gt;
&lt;li&gt;같은 VPC 또는 VPC Peering된 다른 VPC 간에도 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;: 콘텐츠 검사, 위협 모니터링, 네트워크 트러블슈팅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;IPv6 &amp;amp; Egress-only Internet Gateway&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS의 모든 IPv6 주소는 &lt;strong&gt;Public + 인터넷 라우팅 가능&lt;/strong&gt; (사설 IPv6 범위 없음)&lt;/li&gt;
&lt;li&gt;VPC에서 IPv4는 &lt;strong&gt;비활성화 불가&lt;/strong&gt;, IPv6는 선택적 활성화 (Dual-Stack)&lt;/li&gt;
&lt;li&gt;EC2는 Private IPv4 + Public IPv6 모두 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Egress-only Internet Gateway:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv6 전용 NAT Gateway 역할&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VPC 인스턴스의 IPv6 아웃바운드 허용, 인터넷에서의 IPv6 인바운드 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방향&lt;/th&gt;
&lt;th&gt;IPv4&lt;/th&gt;
&lt;th&gt;IPv6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Private → Internet&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NAT Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Egress-only IGW&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet → Private&lt;/td&gt;
&lt;td&gt;차단&lt;/td&gt;
&lt;td&gt;차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::note
📌 EC2 인스턴스 시작 실패 시 — IPv6 주소 공간은 매우 넓으므로 고갈 아님. &lt;strong&gt;IPv4 주소 고갈&lt;/strong&gt;이 원인 → Subnet에 새 IPv4 CIDR 추가
:::&lt;/h2&gt;
&lt;h2&gt;AWS Network Firewall&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC 전체&lt;/strong&gt;를 Layer 3 ~ Layer 7까지 보호&lt;/li&gt;
&lt;li&gt;내부적으로 &lt;strong&gt;AWS Gateway Load Balancer&lt;/strong&gt; 사용&lt;/li&gt;
&lt;li&gt;AWS Firewall Manager로 &lt;strong&gt;Cross-Account 중앙 관리&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;검사 가능한 트래픽:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPC ↔ VPC&lt;/li&gt;
&lt;li&gt;인터넷 Inbound/Outbound&lt;/li&gt;
&lt;li&gt;Direct Connect &amp;amp; Site-to-Site VPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;세밀한 제어 (Fine-grained Controls):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP/Port 기반 규칙&lt;/li&gt;
&lt;li&gt;Protocol 기반&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateful Domain List&lt;/strong&gt;: &lt;code&gt;.mycorp.com&lt;/code&gt; 등 도메인 허용/차단&lt;/li&gt;
&lt;li&gt;Regex 패턴 매칭&lt;/li&gt;
&lt;li&gt;Active Flow Inspection (침입 방지, IPS 기능)&lt;/li&gt;
&lt;li&gt;로그 전송: S3, CloudWatch Logs, Kinesis Data Firehose&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;네트워킹 비용 (Networking Costs)&lt;/h2&gt;
&lt;h3&gt;EC2 인스턴스 간 트래픽 비용&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;경로&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 인바운드 트래픽&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;같은 AZ&lt;/strong&gt; 내 EC2 간 (Private IP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;다른 AZ&lt;/strong&gt; 간 EC2 (Public/Elastic IP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.02/GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;다른 AZ&lt;/strong&gt; 간 EC2 (Private IP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.01/GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리전 간 (Inter-Region)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.02/GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Private IP 사용 권장&lt;/strong&gt; (Public IP 대비 절반 비용 + 더 나은 성능)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;S3 데이터 전송 비용&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;경로&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 Ingress (업로드)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 → 인터넷&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.09/GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Transfer Acceleration&lt;/td&gt;
&lt;td&gt;+$0.04 ~ $0.08/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 → CloudFront&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront → 인터넷&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.085/GB&lt;/strong&gt; (S3 직접보다 저렴 + 캐싱)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Cross-Region Replication&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.02/GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;NAT Gateway vs. Gateway VPC Endpoint (S3 접근 비용)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT Gateway → IGW → S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NAT GW 시간당 $0.045 + 처리 GB당 $0.045 + S3 데이터 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gateway VPC Endpoint → S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gateway Endpoint 사용 무료&lt;/strong&gt; ($0.01 In/Out 동일 리전)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Private Subnet에서 S3 접근 시 Gateway VPC Endpoint가 훨씬 저렴&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS 네트워크 보안 계층&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;L3-4 네트워크 보호:  NACLs, Security Groups
L3-7 완전 보호:      AWS Network Firewall (Gateway LB 내부 사용)
DDoS 보호:           AWS Shield (Standard/Advanced)
악성 HTTP 요청 차단:  AWS WAF
멀티 계정 관리:       AWS Firewall Manager
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;VPC 전체 요약&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;CIDR              : IP 범위 정의
VPC               : 리전 내 격리된 가상 네트워크 (최대 5개/리전)
Subnet            : AZ에 종속된 IP 범위 (5개 IP AWS 예약)
IGW               : VPC → Internet (Route Table 수정 필요)
Bastion Host      : Public EC2 → Private EC2 SSH Jump 서버
NAT Instance      : 구식, Source/Dest Check 비활성화 필요
NAT Gateway       : AWS 관리형, Private → Internet (IPv4)
NACL              : Stateless, Subnet 레벨, Allow + Deny
Security Group    : Stateful, EC2 레벨, Allow만
VPC Peering       : Non-transitive, CIDR 비중복 필수, Route Table 업데이트
VPC Endpoints     : Gateway(S3/DynamoDB, 무료) / Interface(PrivateLink, 유료)
VPC Flow Logs     : IP 트래픽 캡처 → S3/CloudWatch/Firehose
Site-to-Site VPN  : VGW + CGW, 공용 인터넷 경유 암호화
VPN CloudHub      : Hub-and-Spoke 다중 Site VPN
Direct Connect    : 전용 물리 연결 (Private, 암호화 없음)
DX Gateway        : 단일 DX로 여러 리전 VPC 접근
Transit Gateway   : 수천 VPC/VPN/DX Hub-and-Spoke, IP Multicast
Traffic Mirroring : ENI 트래픽 캡처 분석
Egress-only IGW   : IPv6 전용 NAT GW
Network Firewall  : L3-7 완전 VPC 보호
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subnet 예약 IP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5개&lt;/strong&gt; (첫 4개 + 마지막 1개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC당 최대 CIDR&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CIDR 최소/최대&lt;/td&gt;
&lt;td&gt;/28 (16개) ~ /16 (65,536개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IGW만으로 인터넷 접근&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Route Table 수정 필요&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT Instance Source/Dest Check&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;반드시 비활성화&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT GW 최대 대역폭&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100 Gbps&lt;/strong&gt; (자동 확장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT GW Security Group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;없음&lt;/strong&gt; (불필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT GW Multi-AZ HA&lt;/td&gt;
&lt;td&gt;AZ마다 &lt;strong&gt;별도 NAT GW&lt;/strong&gt; 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NACL vs SG 상태&lt;/td&gt;
&lt;td&gt;NACL: &lt;strong&gt;Stateless&lt;/strong&gt; / SG: &lt;strong&gt;Stateful&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NACL 규칙 평가&lt;/td&gt;
&lt;td&gt;낮은 번호부터 순서대로, &lt;strong&gt;첫 매칭 적용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default NACL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;모든 트래픽 허용&lt;/strong&gt; (수정 금지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 IP 차단&lt;/td&gt;
&lt;td&gt;NACL의 &lt;strong&gt;Deny 규칙&lt;/strong&gt; 사용 (SG는 Deny 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC Peering Transitive&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;없음&lt;/strong&gt; → 각 VPC 쌍마다 별도 Peering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway Endpoint 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3, DynamoDB만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway Endpoint 비용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface Endpoint + On-premises&lt;/td&gt;
&lt;td&gt;Site-to-Site VPN/DX 경유 접근 시 &lt;strong&gt;Interface Endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct Connect 암호화&lt;/td&gt;
&lt;td&gt;기본 없음 → &lt;strong&gt;DX + VPN으로 IPsec 추가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct Connect 연결 리드 타임&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1개월 이상&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX Gateway&lt;/td&gt;
&lt;td&gt;단일 DX로 &lt;strong&gt;여러 리전&lt;/strong&gt; VPC 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transit Gateway 특이점&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP Multicast&lt;/strong&gt; 지원 (AWS 유일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transit GW 계정 공유&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Resource Access Manager (RAM)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN → TGW 대역폭&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.5 Gbps&lt;/strong&gt; (ECMP), VPN 추가 시 배가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN → VGW 대역폭&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.25 Gbps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 시작 실패 이유&lt;/td&gt;
&lt;td&gt;IPv6 주소 고갈 아님 → &lt;strong&gt;IPv4 주소 고갈&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress-only IGW 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IPv6&lt;/strong&gt; 아웃바운드만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private → S3 최저 비용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gateway VPC Endpoint&lt;/strong&gt; (무료)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow Log Action REJECT (Inbound)&lt;/td&gt;
&lt;td&gt;NACL 또는 SG 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow Log Action ACCEPT+REJECT&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NACL&lt;/strong&gt; (Stateless) 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html&quot;&gt;VPC 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html&quot;&gt;NAT Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html&quot;&gt;AWS Direct Connect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html&quot;&gt;Transit Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html&quot;&gt;AWS Network Firewall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🌐 AWS CloudFront &amp; Global Accelerator</title><link>https://tessa1217.github.io/posts/aws/aws-cdn/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-cdn/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🌐 AWS CloudFront &amp;amp; Global Accelerator&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;CDN을 통한 콘텐츠 가속과 네트워크 레벨 애플리케이션 가속의 핵심 서비스&lt;/p&gt;
&lt;p&gt;두 서비스 모두 AWS Global Edge Network를 활용하지만 목적과 동작 방식이 다름&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-%EA%B0%9C%EC%9A%94&quot;&gt;CloudFront 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-origins-%EC%BD%98%ED%85%90%EC%B8%A0-%EC%9B%90%EB%B3%B8&quot;&gt;CloudFront Origins (콘텐츠 원본)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-vs-s3-cross-region-replication&quot;&gt;CloudFront vs. S3 Cross-Region Replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-%EC%BA%90%EC%8B%9C-%EB%8F%99%EC%9E%91-caching&quot;&gt;CloudFront 캐시 동작 (Caching)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-geo-restriction-%EC%A7%80%EC%97%AD-%EC%A0%9C%ED%95%9C&quot;&gt;CloudFront Geo Restriction (지역 제한)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront--s3-%EB%B3%B4%EC%95%88-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-oac&quot;&gt;CloudFront + S3 보안 아키텍처 (OAC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-global-accelerator&quot;&gt;AWS Global Accelerator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-vs-global-accelerator-%EB%B9%84%EA%B5%90&quot;&gt;CloudFront vs. Global Accelerator 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;시험 자주 출제 포인트 총정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront 개요&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt;: 콘텐츠를 Edge Location에 캐시하여 사용자에게 낮은 지연시간으로 제공&lt;/li&gt;
&lt;li&gt;전 세계 수백 개의 **Edge Locations (Points of Presence)**에서 콘텐츠 캐시&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DDoS 보호&lt;/strong&gt;: AWS Shield + AWS WAF(Web Application Firewall)와 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront Origins (콘텐츠 원본)&lt;/h2&gt;
&lt;p&gt;CloudFront가 콘텐츠를 가져오는 원본 서버는 크게 세 가지로 나뉜다.&lt;/p&gt;
&lt;h3&gt;1. S3 Bucket&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일 배포 및 Edge Location에 캐시&lt;/li&gt;
&lt;li&gt;CloudFront를 통한 S3 업로드 (Ingress) 지원&lt;/li&gt;
&lt;li&gt;*OAC (Origin Access Control)**로 S3 Bucket 보안 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[사용자]  →  [CloudFront Edge]  →  [S3 Bucket]
                                      ↑
                              OAC로 보호
                              (S3 Public 비활성화 유지)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
S3 Bucket을 CloudFront Origin으로 사용할 때는 &lt;strong&gt;OAC&lt;/strong&gt; 사용. 구세대 방식인 OAI(Origin Access Identity)는 deprecated 예정.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. VPC Origin&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC Private Subnet&lt;/strong&gt;에 호스팅된 애플리케이션에서 콘텐츠 제공&lt;/li&gt;
&lt;li&gt;인터넷에 노출하지 않고 Private 리소스에서 직접 트래픽 수신:
&lt;ul&gt;
&lt;li&gt;Private ALB (Application Load Balancer)&lt;/li&gt;
&lt;li&gt;Private NLB (Network Load Balancer)&lt;/li&gt;
&lt;li&gt;Private EC2 Instances&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기존 방식(Public Network)의 경우 Edge Location의 Public IP를 Security Group에 허용해야 했으나, &lt;strong&gt;VPC Origin 방식은 이 불편함을 해소&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[사용자]
    │
    ▼
[CloudFront Edge]
    │  (VPC Origin 방식 — 인터넷 미경유)
    ▼
[Private ALB / NLB / EC2]  ← 인터넷에 노출 불필요
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Custom Origin (HTTP)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 Static Website (S3 정적 웹사이트 엔드포인트)&lt;/li&gt;
&lt;li&gt;모든 Public HTTP Backend (온프레미스 서버, 다른 클라우드 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront vs. S3 Cross-Region Replication&lt;/h2&gt;
&lt;p&gt;시험에서 두 서비스를 비교하는 문제가 자주 출제됨.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudFront&lt;/th&gt;
&lt;th&gt;S3 Cross-Region Replication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전 세계 모든 Edge Location 자동 적용&lt;/td&gt;
&lt;td&gt;복제할 리전을 각각 직접 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;업데이트 반영&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TTL 만료 시 반영 (캐시 기간 동안 지연)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Near real-time&lt;/strong&gt; 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;접근 방향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;읽기/쓰기 가능 (Ingress 지원)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;읽기 전용 (Read only)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;적합한 콘텐츠&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전 세계에서 접근하는 &lt;strong&gt;Static 콘텐츠&lt;/strong&gt; (이미지, 영상 등)&lt;/td&gt;
&lt;td&gt;소수 리전에서 &lt;strong&gt;낮은 지연시간으로 Dynamic 콘텐츠&lt;/strong&gt; 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 복사&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;복사 없음 (캐시만)&lt;/td&gt;
&lt;td&gt;실제 객체를 다른 리전으로 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront 캐시 동작 (Caching)&lt;/h2&gt;
&lt;h3&gt;TTL (Time To Live)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudFront는 TTL 동안 캐시된 콘텐츠를 사용자에게 제공&lt;/li&gt;
&lt;li&gt;TTL 동안은 Origin에 요청하지 않음 → Origin 부하 감소&lt;/li&gt;
&lt;li&gt;TTL은 Cache-Control, Expires Header로 제어 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cache Invalidation (캐시 무효화)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Origin 콘텐츠를 업데이트해도 &lt;strong&gt;TTL이 만료되기 전까지 CloudFront는 변경을 모름&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudFront Invalidation&lt;/strong&gt;을 직접 실행하면 TTL 무시하고 캐시 강제 갱신&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Invalidation 경로 예시:
/**          → 전체 캐시 무효화
/images/**   → /images/ 하위 전체 무효화
/index.html  → 특정 파일만 무효화
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip[Deployment Tip]
콘텐츠 파일명에 버전/해시를 포함시키면 (예: &lt;code&gt;app.v2.js&lt;/code&gt;) Invalidation 없이도 새 버전 즉시 제공 가능.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront Geo Restriction (지역 제한)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;특정 국가 사용자의 콘텐츠 접근을 제어&lt;/li&gt;
&lt;li&gt;국가 판별: &lt;strong&gt;3rd Party Geo-IP Database&lt;/strong&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allowlist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;승인된 국가 목록의 사용자만 접근 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blocklist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;차단된 국가 목록의 사용자는 접근 거부&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 저작권법(Copyright Laws)에 따른 콘텐츠 배포 제한&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront + S3 보안 아키텍처 (OAC)&lt;/h2&gt;
&lt;p&gt;CloudFront를 통해서만 S3에 접근하고 직접 접근은 차단하는 패턴.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[사용자]
    │
    ▼
[CloudFront Distribution]
    │  OAC로 인증된 요청만
    ▼
[S3 Bucket] ← Block Public Access 활성화 유지
              Bucket Policy: CloudFront Service Principal만 허용
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bucket Policy 예시 (OAC):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Effect&quot;: &quot;Allow&quot;,
    &quot;Principal&quot;: {
        &quot;Service&quot;: &quot;cloudfront.amazonaws.com&quot;
    },
    &quot;Action&quot;: &quot;s3:GetObject&quot;,
    &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;,
    &quot;Condition&quot;: {
        &quot;StringEquals&quot;: {
            &quot;AWS:SourceArn&quot;: &quot;arn:aws:cloudfront::ACCOUNT:distribution/DISTRIBUTION_ID&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudFront Signed URL / Signed Cookies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private 콘텐츠&lt;/strong&gt;에 대한 접근 제어 — S3 Pre-signed URL과 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudFront Signed URL&lt;/th&gt;
&lt;th&gt;CloudFront Signed Cookie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;접근 범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;파일 &lt;strong&gt;1개&lt;/strong&gt;에 대한 접근&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;여러 파일&lt;/strong&gt; 또는 전체 경로 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 시나리오&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;개별 파일 다운로드 링크&lt;/td&gt;
&lt;td&gt;프리미엄 멤버십 전체 콘텐츠 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;S3 Pre-signed URL과의 차이점:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;S3 Pre-signed URL&lt;/th&gt;
&lt;th&gt;CloudFront Signed URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;경유 서버&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3 직접 접근&lt;/td&gt;
&lt;td&gt;CloudFront Edge → S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;권한 범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;생성자의 IAM 권한 상속&lt;/td&gt;
&lt;td&gt;CloudFront Key Pair 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;캐시 활용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ S3 직접 접근&lt;/td&gt;
&lt;td&gt;✅ CloudFront 캐시 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP 제한&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불가&lt;/td&gt;
&lt;td&gt;가능 (정책에 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
&lt;strong&gt;CDN을 통해 Private 콘텐츠를 제공할 때는 CloudFront Signed URL/Cookie 사용&lt;/strong&gt;. S3 Pre-signed URL은 S3 직접 접근이므로 CDN 캐시 혜택 없음.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudFront Price Classes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudFront Edge Location은 지역별로 데이터 전송 비용이 다름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price Class&lt;/strong&gt;로 사용할 Edge Location 범위를 제한하여 비용 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Price Class&lt;/th&gt;
&lt;th&gt;포함 지역&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price Class All&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전체 Edge Location&lt;/td&gt;
&lt;td&gt;가장 비쌈, 최고 성능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price Class 200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대부분 지역 (비용 높은 일부 제외)&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price Class 100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가장 저렴한 지역만 (북미, 유럽 등)&lt;/td&gt;
&lt;td&gt;가장 저렴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudFront Origin Groups (Failover)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary Origin&lt;/strong&gt;이 실패하면 &lt;strong&gt;Secondary Origin&lt;/strong&gt;으로 자동 Failover&lt;/li&gt;
&lt;li&gt;High Availability 구성에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[CloudFront Distribution]
    │
    ├── Primary Origin (us-east-1 S3)  ← 정상 시 사용
    └── Secondary Origin (us-west-2 S3) ← Primary 실패 시 자동 전환
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda@Edge / CloudFront Functions&lt;/h3&gt;
&lt;p&gt;Edge Location에서 코드를 실행하여 요청/응답을 동적으로 처리.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudFront Functions&lt;/th&gt;
&lt;th&gt;Lambda@Edge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;런타임&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Node.js, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실행 트리거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Viewer Request/Response&lt;/td&gt;
&lt;td&gt;Viewer/Origin Request/Response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실행 위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudFront Edge (경량)&lt;/td&gt;
&lt;td&gt;리전 Edge Location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 실행 시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1ms&lt;/td&gt;
&lt;td&gt;5~10초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;요청 수/초&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수백만 req/s&lt;/td&gt;
&lt;td&gt;수천 req/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Header 조작, URL 리다이렉트, A/B 테스트&lt;/td&gt;
&lt;td&gt;복잡한 로직, 외부 API 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Global Accelerator&lt;/h2&gt;
&lt;h3&gt;문제 정의&lt;/h3&gt;
&lt;p&gt;글로벌 사용자가 특정 리전에 배포된 애플리케이션에 접근할 때, Public Internet을 통한 **다수의 Hop(경유지)**으로 인해 지연 시간과 패킷 손실 발생.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[일본 사용자]  →  Public Internet  →  [us-east-1 ALB]
               (수많은 라우터 경유 → 높은 지연, 불안정)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;해결: AWS 내부 네트워크 활용&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[일본 사용자]  →  [도쿄 Edge Location]  →  AWS 전용 백본망  →  [us-east-1 ALB]
               (짧은 Public Internet 구간)    (고속, 안정)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Anycast IP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Global Accelerator는 애플리케이션에 &lt;strong&gt;2개의 Anycast IP&lt;/strong&gt; 할당&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unicast IP&lt;/strong&gt;: 하나의 서버가 하나의 IP를 보유&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anycast IP&lt;/strong&gt;: 여러 서버가 &lt;strong&gt;같은 IP&lt;/strong&gt;를 보유, 클라이언트는 자동으로 &lt;strong&gt;가장 가까운 서버로 라우팅&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Anycast IP: 1.2.3.4  ← 전 세계 어디서 요청해도 같은 IP
    │
    ├── 도쿄 Edge → 도쿄 사용자 처리
    ├── 런던 Edge → 유럽 사용자 처리
    └── 버지니아 Edge → 미국 사용자 처리
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Global Accelerator 주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;고정 IP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2개의 Anycast IP&lt;/strong&gt; (변경 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 리소스&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Elastic IP, EC2, ALB, NLB (Public/Private 모두)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Health Check&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;애플리케이션 헬스 체크, 비정상 시 &lt;strong&gt;1분 이내 Failover&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보안&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;외부에 노출되는 IP가 &lt;strong&gt;단 2개&lt;/strong&gt; → 화이트리스트 관리 용이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDoS 보호&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS Shield 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;클라이언트 캐시 이슈&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP가 변경되지 않으므로 &lt;strong&gt;DNS 캐시 문제 없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront vs. Global Accelerator 비교&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험에서 가장 자주 출제되는 비교 — 반드시 구분&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudFront&lt;/th&gt;
&lt;th&gt;Global Accelerator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;콘텐츠 &lt;strong&gt;캐싱 및 배포&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네트워크 레벨 &lt;strong&gt;트래픽 가속&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;캐싱&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Edge Location에 콘텐츠 캐시&lt;/td&gt;
&lt;td&gt;❌ 캐시 없음 (프록시만)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;콘텐츠 처리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edge에서 &lt;strong&gt;콘텐츠 직접 제공&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edge에서 &lt;strong&gt;패킷을 원본 서버로 전달&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;프로토콜&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HTTP/HTTPS&lt;/strong&gt; 전용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TCP, UDP&lt;/strong&gt; 모두 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP 주소&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동적 IP (DNS로 접근)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;고정 Anycast IP 2개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;느림 (DNS TTL 영향)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1분 이내&lt;/strong&gt; 빠른 Failover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;적합한 Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static/Dynamic &lt;strong&gt;HTTP 콘텐츠&lt;/strong&gt; 가속&lt;/td&gt;
&lt;td&gt;게임(UDP), IoT(MQTT), VoIP, 고정 IP 필요, 빠른 Regional Failover&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;간단 선택 기준:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP 콘텐츠를 전 세계에 빠르게 배포 → CloudFront
캐시와 무관한 TCP/UDP 애플리케이션 가속 → Global Accelerator
고정 IP 2개로 방화벽 화이트리스팅 필요 → Global Accelerator
HTTP 요청이지만 Static IP 또는 빠른 Failover 필요 → Global Accelerator
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트 총정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront 보안 통합&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Shield + WAF&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Origin 보안&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;OAC (Origin Access Control)&lt;/strong&gt; (구: OAI deprecated 예정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC Origin&lt;/td&gt;
&lt;td&gt;Private ALB/NLB/EC2를 인터넷 노출 없이 Origin으로 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache Invalidation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/**&lt;/code&gt; 또는 &lt;code&gt;/path/**&lt;/code&gt; 로 TTL 무시 강제 갱신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geo Restriction 판별&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3rd Party Geo-IP Database&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront vs S3 CRR&lt;/td&gt;
&lt;td&gt;정적 전세계 배포 → CloudFront / 소수 리전 동적 콘텐츠 → S3 CRR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signed URL&lt;/td&gt;
&lt;td&gt;파일 &lt;strong&gt;1개&lt;/strong&gt; 접근 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signed Cookie&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;여러 파일&lt;/strong&gt; 또는 경로 전체 접근 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront Signed URL vs S3 Pre-signed URL&lt;/td&gt;
&lt;td&gt;CloudFront: Edge 캐시 활용, IP 제한 가능 / S3: S3 직접 접근, IAM 권한 상속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price Class 100&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;가장 저렴한 지역만&lt;/strong&gt; (북미, 유럽 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origin Failover&lt;/td&gt;
&lt;td&gt;Primary 실패 시 Secondary로 자동 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront Functions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;경량 JS&lt;/strong&gt;, 1ms, Viewer Request/Response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda@Edge&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;복잡한 로직&lt;/strong&gt;, 5~10초, Viewer + Origin 트리거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Accelerator IP 수&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2개의 Anycast IP&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Accelerator Failover&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1분 이내&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anycast IP 개념&lt;/td&gt;
&lt;td&gt;여러 서버가 &lt;strong&gt;같은 IP&lt;/strong&gt; 공유, 클라이언트는 가장 가까운 서버로 라우팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Accelerator 지원 프로토콜&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TCP + UDP&lt;/strong&gt; (CloudFront는 HTTP만)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;고정 IP 화이트리스팅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Global Accelerator&lt;/strong&gt; (IP 2개만 노출)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-HTTP 가속 (UDP, MQTT, VoIP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Global Accelerator&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html&quot;&gt;CloudFront 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html&quot;&gt;CloudFront Origin Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html&quot;&gt;CloudFront Signed URLs and Cookies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html&quot;&gt;Lambda@Edge 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/global-accelerator/latest/dg/what-is-global-accelerator.html&quot;&gt;Global Accelerator 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🐳 AWS Container Services</title><link>https://tessa1217.github.io/posts/aws/aws-container/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-container/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🐳 AWS Container Services&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Docker · ECS · ECR · EKS · App Runner · App2Container&lt;/p&gt;
&lt;p&gt;컨테이너 기반 애플리케이션 배포 및 관리의 전체 스택&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#docker-%EA%B8%B0%EC%B4%88&quot;&gt;Docker 기초&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws%EC%97%90%EC%84%9C%EC%9D%98-container-%EA%B4%80%EB%A6%AC-%EC%84%9C%EB%B9%84%EC%8A%A4&quot;&gt;AWS에서의 Container 관리 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-ecs-elastic-container-service&quot;&gt;Amazon ECS (Elastic Container Service)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-ecr-elastic-container-registry&quot;&gt;Amazon ECR (Elastic Container Registry)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-eks-elastic-kubernetes-service&quot;&gt;Amazon EKS (Elastic Kubernetes Service)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-app-runner&quot;&gt;AWS App Runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-app2container-a2c&quot;&gt;AWS App2Container (A2C)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#container-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;Container 서비스 선택 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;📌 시험 자주 출제 포인트 총정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Docker 기초&lt;/h2&gt;
&lt;h3&gt;개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션을 &lt;strong&gt;Container&lt;/strong&gt;로 패키징하여 어떤 OS, 어떤 환경에서도 동일하게 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;Works on my machine&quot; 문제 해결&lt;/strong&gt;: 개발/테스트/운영 환경 불일치 제거&lt;/li&gt;
&lt;li&gt;Use Cases: 마이크로서비스(Microservices), 온프레미스 앱의 AWS Lift-and-Shift&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Image 저장소&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;저장소&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public 저장소, OS/기술별 Base Image 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon ECR (Private)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS 관리형 Private 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon ECR Public Gallery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public Image 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Docker vs. Virtual Machine&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Virtual Machine:
  [Hardware] → [Hypervisor] → [Guest OS 1] → [App A]
                           → [Guest OS 2] → [App B]

Docker:
  [Hardware] → [Host OS] → [Docker Engine] → [Container A: App A]
                                           → [Container B: App B]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Docker: Host OS 커널 공유 → &lt;strong&gt;가볍고 빠름&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VM: 각각 완전한 OS 포함 → &lt;strong&gt;무겁지만 강한 격리&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS에서의 Container 관리 서비스&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;인프라 관리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon ECS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS 자체 컨테이너 플랫폼&lt;/td&gt;
&lt;td&gt;EC2(직접) 또는 Fargate(관리형)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;관리형 Kubernetes&lt;/td&gt;
&lt;td&gt;EC2(직접) 또는 Fargate(관리형)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Fargate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless 컨테이너 플랫폼&lt;/td&gt;
&lt;td&gt;인프라 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon ECR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container Image 저장소&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS App Runner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;완전 관리형 웹앱/API 배포&lt;/td&gt;
&lt;td&gt;완전 자동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon ECS (Elastic Container Service)&lt;/h2&gt;
&lt;h3&gt;EC2 Launch Type&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ECS Cluster 위에 &lt;strong&gt;직접 EC2 Instance를 프로비저닝/관리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;각 EC2 Instance에 &lt;strong&gt;ECS Agent&lt;/strong&gt; 설치 필수 → ECS Cluster에 등록&lt;/li&gt;
&lt;li&gt;AWS는 Container의 시작/중지만 담당&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[ECS Cluster]
  ├── EC2 Instance 1 (ECS Agent 실행)
  │     ├── Container A
  │     └── Container B
  └── EC2 Instance 2 (ECS Agent 실행)
        └── Container C
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Fargate Launch Type&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EC2 Instance 없이 &lt;strong&gt;완전 Serverless&lt;/strong&gt;로 컨테이너 실행&lt;/li&gt;
&lt;li&gt;Task Definition만 생성하면 AWS가 알아서 컨테이너 실행&lt;/li&gt;
&lt;li&gt;스케일링: Task 수만 늘리면 됨 — EC2 Instance 관리 불필요&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[ECS Cluster]
  └── Fargate Task A  ← AWS가 인프라 자동 관리
  └── Fargate Task B
  └── Fargate Task C
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;EC2 Launch Type vs. Fargate 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;EC2 Launch Type&lt;/th&gt;
&lt;th&gt;Fargate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인프라 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 EC2 프로비저닝/패치&lt;/td&gt;
&lt;td&gt;❌ 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2 비용 (장기 사용 시 유리)&lt;/td&gt;
&lt;td&gt;Task별 CPU/RAM 사용량 과금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링 복잡도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2 + Task 두 레벨 관리&lt;/td&gt;
&lt;td&gt;Task만 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot Instance 활용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;✅ Fargate Spot 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;맞춤 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;높음 (EC2 직접 제어)&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;ECS IAM Roles&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;두 가지 Role을 명확히 구분&lt;/strong&gt; — 시험 빈출&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;사용 주체&lt;/th&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2 Instance Profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECS Agent (EC2 Launch Type만 해당)&lt;/td&gt;
&lt;td&gt;ECS 서비스 API 호출, CloudWatch 로그 전송, ECR 이미지 Pull, Secrets Manager/SSM 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECS Task Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;각 ECS Task&lt;/td&gt;
&lt;td&gt;Task별로 다른 AWS 서비스 접근 권한 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;EC2 Instance
  └── ECS Agent (EC2 Instance Profile 사용)
        └── ECS Task A (Task Role A: S3 Read 권한)
        └── ECS Task B (Task Role B: DynamoDB Write 권한)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
Task Role은 &lt;strong&gt;Task Definition에서 정의&lt;/strong&gt;. EC2 Instance Profile과 독립적으로 동작.
:::&lt;/h2&gt;
&lt;h3&gt;ECS Load Balancer 통합&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Load Balancer&lt;/th&gt;
&lt;th&gt;지원 여부&lt;/th&gt;
&lt;th&gt;권장 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ALB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;대부분의 Use Case (권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;고처리량/고성능, AWS Private Link 연계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (비권장)&lt;/td&gt;
&lt;td&gt;고급 기능 없음, Fargate 미지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;ECS - Data Volumes (EFS 연동)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ECS Task에 &lt;strong&gt;EFS 파일 시스템 마운트&lt;/strong&gt; 가능&lt;/li&gt;
&lt;li&gt;EC2 및 Fargate Launch Type 모두 지원&lt;/li&gt;
&lt;li&gt;어떤 AZ에서 실행되든 동일한 EFS 데이터 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Fargate + EFS = 완전 Serverless 영구 스토리지
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::important
Amazon S3는 ECS Task에 &lt;strong&gt;파일 시스템으로 마운트 불가&lt;/strong&gt; (S3는 Object Storage).
:::&lt;/h2&gt;
&lt;h3&gt;ECS Service Auto Scaling&lt;/h3&gt;
&lt;p&gt;ECS Service(Task 레벨) Auto Scaling과 EC2 Instance Auto Scaling은 &lt;strong&gt;별개&lt;/strong&gt;임.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ECS Service Auto Scaling 정책:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;정책&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Tracking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 CloudWatch 지표의 목표값 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Step Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudWatch Alarm 기반 단계별 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scheduled Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 일시에 미리 스케일링&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;스케일링 지표:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ECS Service Average CPU Utilization&lt;/li&gt;
&lt;li&gt;ECS Service Average Memory Utilization&lt;/li&gt;
&lt;li&gt;ALB Request Count Per Target&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;EC2 Launch Type — Auto Scaling EC2 Instances&lt;/h3&gt;
&lt;p&gt;ECS Service가 스케일 아웃되면 EC2 인스턴스도 함께 늘어야 함.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Scaling Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU Utilization 기반 EC2 Scale Out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECS Cluster Capacity Provider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Task 실행에 필요한 용량 부족 시 자동으로 EC2 추가 (ASG와 연동)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
&lt;strong&gt;Capacity Provider가 권장됨&lt;/strong&gt;: Task 수요에 따라 EC2를 자동 프로비저닝.
:::&lt;/h2&gt;
&lt;h3&gt;ECS 이벤트 기반 아키텍처&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pattern 1: S3 → EventBridge → ECS Task (On-demand)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[사용자] → S3 Upload
              │
              ▼ EventBridge Rule
         [ECS Task 실행] → S3에서 파일 가져오기 → DynamoDB 저장
         (ECS Task Role: S3 + DynamoDB 권한)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pattern 2: EventBridge Schedule → ECS Task (Batch)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[EventBridge: 매 1시간] → ECS Task 실행 → S3 Batch Processing
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon ECR (Elastic Container Registry)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;저장소 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Private Repository / Public Repository (ECR Public Gallery)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;통합&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECS와 완전 통합, 백엔드는 Amazon S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;접근 제어&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM 기반 (권한 오류 → IAM Policy 확인)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;부가 기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;이미지 취약점 스캔(Vulnerability Scanning), 버저닝, Image Tags, Lifecycle 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;[Docker Build] → [docker push] → [ECR] → [ECS Pull] → [Container 실행]
                                     ↑
                              IAM 권한 필요
                              (Pull 시 ECR에 대한 읽기 권한)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon EKS (Elastic Kubernetes Service)&lt;/h2&gt;
&lt;h3&gt;개요&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;완전 관리형 Kubernetes Cluster&lt;/strong&gt; 서비스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;: 컨테이너 자동 배포, 스케일링, 관리를 위한 오픈소스 시스템&lt;/li&gt;
&lt;li&gt;ECS와 유사한 목적이지만 &lt;strong&gt;다른 API&lt;/strong&gt; (Kubernetes API)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud-agnostic&lt;/strong&gt; → 다른 클라우드/온프레미스의 Kubernetes와 호환&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;선택 기준&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;이미 Kubernetes를 사용 중이거나 멀티 클라우드 전략 → &lt;strong&gt;EKS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;AWS에서 새로 시작 → &lt;strong&gt;ECS&lt;/strong&gt;가 더 단순.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;EKS Node Types&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;관리 주체&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed Node Groups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EKS가 EC2 Node 생성 및 관리, ASG 자동 관리&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-Managed Nodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용자가 EC2 생성 후 EKS Cluster에 등록&lt;/td&gt;
&lt;td&gt;사용자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Fargate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless, Node 관리 불필요&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Managed/Self-Managed: On-Demand 또는 &lt;strong&gt;Spot Instance&lt;/strong&gt; 모두 지원&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;EKS Data Volumes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EKS Cluster에 &lt;strong&gt;StorageClass Manifest&lt;/strong&gt; 지정 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSI (Container Storage Interface)&lt;/strong&gt; 드라이버 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스토리지&lt;/th&gt;
&lt;th&gt;Fargate 지원&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EBS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for Lustre&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for NetApp ONTAP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS App Runner&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;소스 코드 또는 Container Image로부터 &lt;strong&gt;웹앱/API를 완전 자동으로 배포&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;인프라 경험 불필요 — 빌드, 배포, 스케일링, 로드 밸런싱, 암호화 모두 자동&lt;/li&gt;
&lt;li&gt;VPC 접근 지원 → DB, Cache, 메시지 큐 연결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Source Code 또는 Container Image]
          │
          ▼
   [App Runner]
   ├── 자동 빌드
   ├── 자동 배포
   ├── 자동 스케일링
   ├── 로드 밸런서
   └── HTTPS 자동 설정
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt; 웹앱, API, 마이크로서비스, 빠른 프로덕션 배포&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS App2Container (A2C)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java / .NET 웹 애플리케이션&lt;/strong&gt;을 Docker Container로 변환하는 &lt;strong&gt;CLI 도구&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;온프레미스(베어 메탈, VM) 또는 다른 클라우드에서 실행 중인 앱을 AWS로 Lift-and-Shift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 변경 없이&lt;/strong&gt; 레거시 앱 현대화(Modernization) 가속&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A2C 프로세스&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1. Discover &amp;amp; Analyze
   앱 인벤토리 생성 + 런타임 의존성 분석

2. Extract &amp;amp; Containerize
   앱 + 의존성 추출 → Docker Image 생성

3. Create Deployment Artifacts
   ECS Task Definition / EKS Pod Definition 생성
   CloudFormation Template (인프라: 컴퓨팅, 네트워크) 생성
   CI/CD Pipeline 생성

4. Deploy to AWS
   Docker Image → ECR 등록
   → ECS / EKS / App Runner 배포
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Container 서비스 선택 가이드&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;컨테이너 이미지 저장이 필요한가?
└── 예 → Amazon ECR

어떤 컨테이너 오케스트레이터를 사용할 것인가?
├── AWS Native, 간단한 설정 원함 → Amazon ECS
│     ├── 서버 관리 직접 하고 싶음 → EC2 Launch Type
│     └── Serverless 원함          → Fargate Launch Type
│
└── Kubernetes 사용 중 or 멀티 클라우드 → Amazon EKS
      ├── 서버 관리 직접 하고 싶음 → Managed/Self-Managed Nodes
      └── Serverless 원함          → Fargate

코드만 있고 인프라는 전혀 신경 쓰기 싫음 → App Runner

기존 Java/.NET 앱을 컨테이너로 이전 → App2Container
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트 총정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 Instance Profile vs Task Role&lt;/td&gt;
&lt;td&gt;Instance Profile: ECS Agent용 / Task Role: 각 Task용, &lt;strong&gt;Task Definition에서 정의&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS + EFS&lt;/td&gt;
&lt;td&gt;멀티 AZ 공유 영구 스토리지, Fargate와 함께 &lt;strong&gt;Serverless 영구 스토리지&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 ECS Task 마운트&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;불가&lt;/strong&gt; (Object Storage는 파일 시스템 마운트 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS Capacity Provider&lt;/td&gt;
&lt;td&gt;Task 수요에 따라 &lt;strong&gt;EC2 자동 프로비저닝&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECR 권한 오류&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IAM Policy&lt;/strong&gt; 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECR 백엔드&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS Kubernetes 특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cloud-agnostic&lt;/strong&gt;, 오픈소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS Fargate EFS 지원&lt;/td&gt;
&lt;td&gt;✅ (EBS는 Fargate에서 미지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Runner&lt;/td&gt;
&lt;td&gt;소스코드/Container Image → &lt;strong&gt;인프라 없이 자동 배포&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App2Container 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Java, .NET&lt;/strong&gt; 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App2Container 결과물&lt;/td&gt;
&lt;td&gt;Docker Image(ECR) + Task/Pod Definition + &lt;strong&gt;CloudFormation Template&lt;/strong&gt; + CI/CD Pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fargate Auto Scaling&lt;/td&gt;
&lt;td&gt;EC2 관리 불필요, &lt;strong&gt;Task 수만 조절&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALB vs NLB (ECS)&lt;/td&gt;
&lt;td&gt;대부분 &lt;strong&gt;ALB&lt;/strong&gt; / 초고성능 또는 Private Link → &lt;strong&gt;NLB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLB + Fargate&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;미지원&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS Spot Instance&lt;/td&gt;
&lt;td&gt;Managed/Self-Managed Node에서 &lt;strong&gt;지원&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ecs/&quot;&gt;Amazon ECS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eks/&quot;&gt;Amazon EKS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ecr/&quot;&gt;Amazon ECR 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html&quot;&gt;AWS Fargate 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/apprunner/&quot;&gt;AWS App Runner 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/app2container/&quot;&gt;AWS App2Container 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>📊 AWS Database &amp; Data Analytics</title><link>https://tessa1217.github.io/posts/aws/aws-database-analytics/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-database-analytics/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;📊 AWS Database &amp;amp; Data Analytics&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;RDS · Aurora · ElastiCache · DynamoDB · DocumentDB · Neptune · Keyspaces · Timestream&lt;/p&gt;
&lt;p&gt;Athena · Redshift · OpenSearch · EMR · QuickSight · Glue · Lake Formation · Flink · MSK&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#db-%EC%9C%A0%ED%98%95-%EC%A0%84%EC%B2%B4-%EB%B9%84%EA%B5%90&quot;&gt;DB 유형 전체 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rds-%EC%9A%94%EC%95%BD&quot;&gt;RDS (요약)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aurora-%EC%9A%94%EC%95%BD&quot;&gt;Aurora (요약)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#elasticache-%EC%9A%94%EC%95%BD&quot;&gt;ElastiCache (요약)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#documentdb&quot;&gt;DocumentDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-neptune&quot;&gt;Amazon Neptune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-keyspaces-for-apache-cassandra&quot;&gt;Amazon Keyspaces (for Apache Cassandra)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-timestream&quot;&gt;Amazon Timestream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-athena&quot;&gt;Amazon Athena&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-redshift&quot;&gt;Amazon Redshift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-opensearch-service&quot;&gt;Amazon OpenSearch Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-emr-elastic-mapreduce&quot;&gt;Amazon EMR (Elastic MapReduce)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-quicksight&quot;&gt;Amazon QuickSight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-glue&quot;&gt;AWS Glue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-lake-formation&quot;&gt;AWS Lake Formation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-managed-service-for-apache-flink&quot;&gt;Amazon Managed Service for Apache Flink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-msk-managed-streaming-for-apache-kafka&quot;&gt;Amazon MSK (Managed Streaming for Apache Kafka)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot;&gt;빅데이터 수집 파이프라인 아키텍처&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;DB 유형 전체 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RDBMS (OLTP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RDS, Aurora&lt;/td&gt;
&lt;td&gt;SQL, JOIN 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NoSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DynamoDB, ElastiCache, Neptune, DocumentDB, Keyspaces&lt;/td&gt;
&lt;td&gt;JOIN/SQL 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Object Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3, S3 Glacier&lt;/td&gt;
&lt;td&gt;대용량 객체, 아카이브&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Warehouse (OLAP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redshift, Athena, EMR&lt;/td&gt;
&lt;td&gt;SQL 분석, BI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenSearch&lt;/td&gt;
&lt;td&gt;전체 텍스트 검색, 비정형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Neptune&lt;/td&gt;
&lt;td&gt;관계 데이터 시각화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ledger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QLDB (Quantum Ledger DB)&lt;/td&gt;
&lt;td&gt;변경 불가 트랜잭션 이력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time Series&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timestream&lt;/td&gt;
&lt;td&gt;시계열 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;RDS (요약)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Managed: PostgreSQL / MySQL / Oracle / SQL Server / DB2 / MariaDB / Custom&lt;/li&gt;
&lt;li&gt;Provisioned Instance Size + EBS Volume&lt;/li&gt;
&lt;li&gt;Read Replicas, Multi-AZ, Storage Auto Scaling&lt;/li&gt;
&lt;li&gt;IAM, Security Groups, KMS(rest), SSL(transit)&lt;/li&gt;
&lt;li&gt;PITR 최대 35일, Manual Snapshot 무제한&lt;/li&gt;
&lt;li&gt;RDS Custom: Oracle/SQL Server 전용, OS 및 DB 직접 접근 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: RDBMS/OLTP, SQL 쿼리, 트랜잭션&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Aurora (요약)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL/MySQL API 호환, &lt;strong&gt;스토리지와 컴퓨팅 분리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;스토리지: &lt;strong&gt;3 AZ × 2 = 6개 복사본&lt;/strong&gt;, Self-healing, Auto Scaling&lt;/li&gt;
&lt;li&gt;컴퓨팅: Multi-AZ DB Cluster, Read Replica Auto Scaling&lt;/li&gt;
&lt;li&gt;Aurora Serverless: 예측 불가/간헐적 워크로드&lt;/li&gt;
&lt;li&gt;Aurora Global: 리전당 최대 16 Read Instance, 리전 간 복제 &lt;strong&gt;&amp;lt; 1초&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Aurora ML: SageMaker/Comprehend 통합&lt;/li&gt;
&lt;li&gt;Aurora Cloning: 기존 클러스터에서 빠르게 새 클러스터 생성 (스테이징 DB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: RDS와 동일 + 더 높은 성능, 가용성, 유연성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;ElastiCache (요약)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Managed Redis / Memcached, &lt;strong&gt;Sub-millisecond&lt;/strong&gt; 지연&lt;/li&gt;
&lt;li&gt;Redis: Multi-AZ, Read Replicas, Backup, AOF 영속성&lt;/li&gt;
&lt;li&gt;Memcached: Sharding, 비영속, 멀티스레드&lt;/li&gt;
&lt;li&gt;보안: IAM, Security Groups, KMS, Redis AUTH&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 코드 변경 필요&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Key/Value 캐시, 세션 스토어, DB 쿼리 결과 캐시&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;DocumentDB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aurora의 AWS 구현처럼, DocumentDB는 &lt;strong&gt;MongoDB&lt;/strong&gt;의 AWS 구현&lt;/li&gt;
&lt;li&gt;JSON 데이터 저장/쿼리/인덱싱&lt;/li&gt;
&lt;li&gt;Aurora와 유사한 배포 개념: Fully Managed, 3 AZ 고가용성&lt;/li&gt;
&lt;li&gt;스토리지 자동 증가 (10 GB 단위)&lt;/li&gt;
&lt;li&gt;초당 수백만 req로 자동 확장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: MongoDB 워크로드를 AWS로 이전&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Neptune&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;완전 관리형 Graph Database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;수십억 개 관계 저장, &lt;strong&gt;Millisecond&lt;/strong&gt; 단위 쿼리&lt;/li&gt;
&lt;li&gt;3 AZ 고가용성, 최대 15 Read Replicas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;: 소셜 네트워크, 지식 그래프(Wikipedia), 사기 탐지, 추천 엔진&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Neptune Streams&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Graph 데이터 변경의 &lt;strong&gt;실시간 순서 보장 스트림&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;HTTP REST API로 접근&lt;/li&gt;
&lt;li&gt;Use Cases: 변경 알림, OpenSearch/ElastiCache 동기화, 리전 간 복제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Keyspaces (for Apache Cassandra)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache Cassandra&lt;/strong&gt; 호환 완전 관리형 DB&lt;/li&gt;
&lt;li&gt;Serverless, Scalable, Multi-AZ (3 AZ 복제)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cassandra Query Language (CQL)&lt;/strong&gt; 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-digit millisecond&lt;/strong&gt; 지연, 초당 수천 req&lt;/li&gt;
&lt;li&gt;On-Demand 또는 Provisioned with Auto-scaling&lt;/li&gt;
&lt;li&gt;PITR 최대 35일&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;: IoT 디바이스 데이터, 시계열 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Timestream&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;완전 관리형 &lt;strong&gt;Time Series Database&lt;/strong&gt;, Serverless&lt;/li&gt;
&lt;li&gt;하루 수조 개 이벤트 처리, 관계형 DB 대비 &lt;strong&gt;100배 빠름, 1/10 비용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;스토리지 티어링: 최근 데이터 → 메모리 / 과거 데이터 → 저비용 스토리지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내장 시계열 분석 함수&lt;/strong&gt; (Near real-time 패턴 식별)&lt;/li&gt;
&lt;li&gt;SQL 호환, 암호화(transit/rest)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;: IoT, 운영 모니터링, 실시간 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Athena&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3에 저장된 데이터를 Serverless SQL로 분석&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Presto 기반, Standard SQL 사용&lt;/li&gt;
&lt;li&gt;지원 포맷: CSV, JSON, ORC, Avro, Parquet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격: 스캔된 데이터 TB당 $5.00&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Amazon QuickSight와 연동하여 BI 대시보드 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;성능 최적화 (비용 절감):&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;효과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Columnar 포맷&lt;/strong&gt; (Parquet, ORC)&lt;/td&gt;
&lt;td&gt;스캔 데이터 감소 → &lt;strong&gt;비용 대폭 절감&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glue로 변환&lt;/td&gt;
&lt;td&gt;CSV → Parquet/ORC 자동 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 압축&lt;/td&gt;
&lt;td&gt;bzip2, gzip, snappy 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Partitioning&lt;/td&gt;
&lt;td&gt;가상 컬럼 기반 파티셔닝으로 스캔 범위 축소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;큰 파일 사용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;gt; 128 MB&lt;/strong&gt; 권장 (소형 파일 오버헤드 제거)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Federated Query:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관계형/비관계형/S3 등 다양한 소스를 SQL로 통합 쿼리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda 기반 Data Source Connector&lt;/strong&gt; 사용 (CloudWatch Logs, DynamoDB, RDS 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 Tip&lt;/strong&gt;: &quot;S3 데이터를 Serverless SQL로 분석&quot; → &lt;strong&gt;Athena&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Redshift&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL 기반이지만 &lt;strong&gt;OLAP (데이터 웨어하우스)&lt;/strong&gt;, OLTP 아님&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Columnar Storage + 병렬 쿼리 엔진&lt;/strong&gt; → Petabyte 규모 분석&lt;/li&gt;
&lt;li&gt;Athena보다 &lt;strong&gt;Index 덕분에 더 빠른 Join/집계&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;BI 도구 (QuickSight, Tableau) 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;클러스터 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Leader Node]   : 쿼리 계획 + 결과 집계
[Compute Nodes] : 실제 쿼리 실행 (N개)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 가지 모드: &lt;strong&gt;Provisioned Cluster&lt;/strong&gt; / &lt;strong&gt;Serverless Cluster&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Snapshots &amp;amp; DR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;일부 클러스터에 &lt;strong&gt;Multi-AZ&lt;/strong&gt; 모드 지원&lt;/li&gt;
&lt;li&gt;Snapshot = 클러스터의 PITR 백업 (S3 내부 저장, Incremental)&lt;/li&gt;
&lt;li&gt;자동 백업: 8시간마다 / 5 GB마다 / 스케줄 기반&lt;/li&gt;
&lt;li&gt;수동 백업: 명시적 삭제 전까지 유지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다른 리전으로 Snapshot 자동 복사&lt;/strong&gt; 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;데이터 로딩 방법&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Firehose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Firehose → S3 → COPY로 Redshift 적재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 COPY 명령&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Role로 S3에서 직접 COPY (VPC 라우팅 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2 + JDBC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;배치로 데이터 전송 (대량 Insert가 유리)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Redshift Spectrum&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3 데이터를 Redshift에 로딩하지 않고 직접 쿼리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Redshift Cluster가 있어야 함 (쿼리는 수천 개 Spectrum 노드에서 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon OpenSearch Service&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Amazon ElasticSearch의 후속 서비스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;어떤 필드든 전체 텍스트 검색 가능&lt;/strong&gt; (DynamoDB는 Primary Key/Index만)&lt;/li&gt;
&lt;li&gt;다른 DB의 &lt;strong&gt;보완재&lt;/strong&gt;로 일반적으로 사용&lt;/li&gt;
&lt;li&gt;Managed Cluster 또는 Serverless 모드&lt;/li&gt;
&lt;li&gt;기본 SQL 미지원 (플러그인으로 활성화 가능)&lt;/li&gt;
&lt;li&gt;데이터 수집: Kinesis Data Firehose, IoT, CloudWatch Logs&lt;/li&gt;
&lt;li&gt;보안: Cognito, IAM, KMS, TLS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSearch Dashboards&lt;/strong&gt; (시각화) 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;OpenSearch 통합 패턴&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;DynamoDB + OpenSearch:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[앱 CRUD] → [DynamoDB] → [DynamoDB Stream] → [Lambda] → [OpenSearch]
[앱 검색] → OpenSearch API → 검색 결과 → DynamoDB에서 상세 조회
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CloudWatch Logs:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CloudWatch Logs → Subscription Filter → Lambda → OpenSearch (Real-time)
CloudWatch Logs → Subscription Filter → Firehose → OpenSearch (Near real-time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kinesis:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KDS → Firehose → OpenSearch (Near real-time)
KDS → Lambda   → OpenSearch (Real-time)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon EMR (Elastic MapReduce)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hadoop 클러스터&lt;/strong&gt; 기반 빅데이터 분석 플랫폼&lt;/li&gt;
&lt;li&gt;수백 개의 EC2 인스턴스로 구성된 클러스터&lt;/li&gt;
&lt;li&gt;Apache Spark, HBase, Presto, Flink 번들 포함&lt;/li&gt;
&lt;li&gt;프로비저닝/설정 자동화, Auto Scaling, Spot Instance 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;노드 유형 및 구매 옵션&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;노드 유형&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;특성&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Master Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;클러스터 관리, 상태 조율&lt;/td&gt;
&lt;td&gt;Long-running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작업 실행 + 데이터 저장&lt;/td&gt;
&lt;td&gt;Long-running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Task Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작업 실행만&lt;/td&gt;
&lt;td&gt;일반적으로 &lt;strong&gt;Spot Instance&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구매 방식&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-Demand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;안정적, 종료 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reserved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;비용 절감 (가용 시 EMR 자동 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저렴하지만 종료 가능, 덜 안정적&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon QuickSight&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Serverless ML 기반 BI(Business Intelligence) 서비스&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;인터랙티브 대시보드 생성, 자동 확장, Session 단위 과금&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPICE 엔진&lt;/strong&gt;: 데이터 Import 시 In-memory 계산&lt;/li&gt;
&lt;li&gt;Enterprise 버전: &lt;strong&gt;Column-Level Security (CLS)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;통합 데이터 소스:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDS, Aurora, Redshift, Athena, S3, OpenSearch, Timestream&lt;/li&gt;
&lt;li&gt;Salesforce, Jira, Teradata, 온프레미스 DB (JDBC)&lt;/li&gt;
&lt;li&gt;파일: xlsx, csv, json, tsv, elf/clf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대시보드 공유:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users (Standard) / Groups (Enterprise) — QuickSight 내부 개념 (IAM과 별개)&lt;/li&gt;
&lt;li&gt;대시보드 공유 전 반드시 &lt;strong&gt;Publish&lt;/strong&gt; 필요&lt;/li&gt;
&lt;li&gt;대시보드를 보는 사용자는 &lt;strong&gt;기저 데이터도 볼 수 있음&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Glue&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;완전 관리형 ETL (Extract, Transform, Load) 서비스&lt;/strong&gt;, Serverless&lt;/li&gt;
&lt;li&gt;S3 또는 RDS 데이터 → Glue ETL(변환) → Redshift 로드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Glue Data Catalog&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3, RDS, DynamoDB, JDBC → &lt;strong&gt;Glue Data Crawler&lt;/strong&gt; → &lt;strong&gt;Glue Data Catalog&lt;/strong&gt; (메타데이터)&lt;/li&gt;
&lt;li&gt;Athena, Redshift Spectrum, EMR이 Catalog를 통해 데이터 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Glue 주요 기능&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Job Bookmarks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;이미 처리한 데이터 재처리 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DataBrew&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;코드 없는 사전 빌드 변환으로 데이터 정제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Studio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ETL Job 생성/실행/모니터링 GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streaming ETL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kinesis Data Streams, Kafka, MSK 기반 스트리밍 ETL (Spark Structured Streaming)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;CSV → Parquet 변환 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[S3 Input] ─(Put)─→ Glue ETL (CSV → Parquet 변환) → [S3 Output]
                              ↑ Lambda/EventBridge 트리거 가능
→ Athena가 Parquet 파일로 훨씬 적은 비용으로 쿼리 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Lake Formation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Lake&lt;/strong&gt; = 분석용 중앙 데이터 저장소&lt;/li&gt;
&lt;li&gt;복잡한 수동 단계(수집, 정제, 이동, 카탈로그) 자동화&lt;/li&gt;
&lt;li&gt;정형/비정형 데이터 결합&lt;/li&gt;
&lt;li&gt;Source Blueprints: S3, RDS, 관계형/NoSQL DB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row-level / Column-level Fine-grained Access Control&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Glue 위에 구축&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;중앙 권한 관리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Athena] ─→ [QuickSight]
[Lake Formation] ← Column-level 접근 제어 설정
→ Athena, QuickSight가 Lake Formation의 권한을 따름
→ 각 서비스별로 별도 접근 제어 불필요 → 중앙 집중식 보안
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Managed Service for Apache Flink&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;이전 이름: &lt;strong&gt;Kinesis Data Analytics for Apache Flink&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Java, Scala, SQL로 데이터 스트림 처리&lt;/li&gt;
&lt;li&gt;소스: &lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; 또는 &lt;strong&gt;Amazon MSK&lt;/strong&gt; (Kafka)&lt;/li&gt;
&lt;li&gt;완전 관리형: 프로비저닝, 병렬 처리, 자동 스케일링, 백업(Checkpoint/Snapshot)&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Amazon Data Firehose에서 직접 읽기 불가&lt;/strong&gt; (Data Streams에서만)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon MSK (Managed Streaming for Apache Kafka)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kinesis의 대안&lt;/strong&gt;: AWS에서 완전 관리형 Kafka&lt;/li&gt;
&lt;li&gt;Kafka Broker Node + Zookeeper 노드 자동 관리&lt;/li&gt;
&lt;li&gt;VPC 내 배포, Multi-AZ (최대 3 AZ)&lt;/li&gt;
&lt;li&gt;데이터를 &lt;strong&gt;EBS에 원하는 기간만큼 저장&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MSK Serverless&lt;/strong&gt;: 용량 관리 없이 Kafka 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Kinesis Data Streams vs. Amazon MSK&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Kinesis Data Streams&lt;/th&gt;
&lt;th&gt;Amazon MSK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메시지 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 MB 제한&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 1 MB, &lt;strong&gt;최대 10 MB&lt;/strong&gt; 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;구조&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shards&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kafka Topics with Partitions&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;확장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard 분할/병합 가능&lt;/td&gt;
&lt;td&gt;파티션 &lt;strong&gt;추가만&lt;/strong&gt; 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;암호화 (in-flight)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TLS&lt;/td&gt;
&lt;td&gt;PLAINTEXT 또는 TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;암호화 (at-rest)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;MSK Consumers&lt;/strong&gt;: Apache Flink, Glue (Streaming ETL), Lambda, EC2/ECS/EKS 앱&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;빅데이터 수집 파이프라인 아키텍처&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;[IoT Devices]
      │
      ▼
[Kinesis Data Streams]  ← 실시간 수집
      │
      ▼
[Kinesis Data Firehose] ← Near real-time 전달
      │
      ▼
[S3 (Ingestion Bucket)] ← Raw 데이터 저장
      │         │
      │         ▼ (선택)
      │    [SQS → Lambda] ← 이벤트 기반 처리
      │
      ▼
[Amazon Athena]         ← Serverless SQL 분석
      │
      ▼
[S3 (Reporting Bucket)] ← 분석 결과 저장
      │
      ├──→ [QuickSight]  ← BI 대시보드
      └──→ [Redshift]    ← 데이터 웨어하우스
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DocumentDB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MongoDB&lt;/strong&gt; 호환 AWS 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neptune Use Case&lt;/td&gt;
&lt;td&gt;소셜 그래프, 사기 탐지, 추천 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyspaces&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Apache Cassandra&lt;/strong&gt; 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timestream&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;시계열 DB&lt;/strong&gt;, IoT/운영 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena 가격&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;스캔된 TB당 $5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena 비용 절감&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parquet/ORC&lt;/strong&gt; 포맷 + Partitioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena Federated Query&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lambda Data Source Connector&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena vs Redshift&lt;/td&gt;
&lt;td&gt;간단 S3 쿼리 → Athena / 복잡 Join/집계 → &lt;strong&gt;Redshift&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redshift Spectrum&lt;/td&gt;
&lt;td&gt;S3 데이터를 &lt;strong&gt;Redshift에 로딩 없이&lt;/strong&gt; 쿼리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redshift 리전 간 Snapshot&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;자동 복사&lt;/strong&gt; 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenSearch 특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;어떤 필드든&lt;/strong&gt; 검색 가능 (DynamoDB와 차이)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glue Catalog&lt;/td&gt;
&lt;td&gt;Athena/Redshift Spectrum/EMR이 사용하는 메타데이터 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lake Formation 특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Row/Column 레벨&lt;/strong&gt; 세밀한 접근 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flink 소스&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Streams 또는 MSK&lt;/strong&gt; (Firehose 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSK vs Kinesis&lt;/td&gt;
&lt;td&gt;MSK: 메시지 크기 최대 &lt;strong&gt;10 MB&lt;/strong&gt;, 파티션 추가만 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QuickSight SPICE&lt;/td&gt;
&lt;td&gt;In-memory 계산 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QuickSight Users/Groups&lt;/td&gt;
&lt;td&gt;QuickSight 내부 개념 (&lt;strong&gt;IAM과 별개&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMR Task Node&lt;/td&gt;
&lt;td&gt;주로 &lt;strong&gt;Spot Instance&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>🏛️ AWS Identity &amp; Access Management — Advanced</title><link>https://tessa1217.github.io/posts/aws/aws-iam-2/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-iam-2/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🏛️ AWS Identity &amp;amp; Access Management — Advanced&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS Organizations · IAM Conditions · Permission Boundaries&lt;/p&gt;
&lt;p&gt;IAM Identity Center · Directory Services · Control Tower&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#aws-organizations&quot;&gt;AWS Organizations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#iam-conditions-%EC%A0%95%EC%B1%85-%EC%A1%B0%EA%B1%B4&quot;&gt;IAM Conditions (정책 조건)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#iam-roles-vs-resource-based-policies&quot;&gt;IAM Roles vs. Resource-Based Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#iam-permission-boundaries-%EA%B6%8C%ED%95%9C-%EA%B2%BD%EA%B3%84&quot;&gt;IAM Permission Boundaries (권한 경계)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-iam-identity-center-%EA%B5%AC-aws-sso&quot;&gt;AWS IAM Identity Center (구: AWS SSO)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#microsoft-active-directory-ad--aws-directory-services&quot;&gt;Microsoft Active Directory (AD) &amp;amp; AWS Directory Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-control-tower&quot;&gt;AWS Control Tower&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%A0%84%EC%B2%B4-identity-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;전체 Identity 서비스 선택 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Organizations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global Service&lt;/strong&gt; — 여러 AWS 계정을 중앙 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Management Account&lt;/strong&gt;: 최상위 계정 (결제 권한 보유)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Member Accounts&lt;/strong&gt;: 하나의 Organization에만 소속 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;주요 장점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consolidated Billing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 계정 비용을 단일 결제 수단으로 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Volume Discount&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용량 합산으로 EC2, S3 등 볼륨 할인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reserved Instance 공유&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;미사용 RI를 다른 계정에서 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API 자동화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API로 계정 자동 생성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;OU (Organizational Units)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Root
├── Management Account
├── OU: Production
│     ├── Account A
│     └── Account B
├── OU: Development
│     └── Account C
└── OU: Security
      └── Account D (Log/Audit)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;SCP (Service Control Policies)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OU 또는 계정에 적용하는 &lt;strong&gt;IAM Policy 형태의 최대 권한 상한선&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Management Account에는 적용되지 않음&lt;/strong&gt; (항상 Full Admin)&lt;/li&gt;
&lt;li&gt;Allow/Deny 모두 명시 가능 — &lt;strong&gt;기본적으로 아무것도 허용하지 않음 (IAM과 동일)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Root에서 각 OU를 거쳐 Target Account까지 &lt;strong&gt;명시적 Allow가 있어야&lt;/strong&gt; 효과 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;실제 유효 권한 =
  SCP(Org 레벨) AND SCP(OU 레벨) AND IAM Identity Policy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Use Case&lt;/strong&gt;: 특정 리전 잠금, 특정 서비스 사용 금지, 루트 계정 작업 제한&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Tag Policies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Organization 전체에서 &lt;strong&gt;태그 표준화&lt;/strong&gt; 강제&lt;/li&gt;
&lt;li&gt;특정 서비스/리소스에 비준수 태깅 작업 방지&lt;/li&gt;
&lt;li&gt;태그가 없는 리소스에는 영향 없음&lt;/li&gt;
&lt;li&gt;AWS Cost Allocation Tags + ABAC(Attribute-based Access Control)와 연계&lt;/li&gt;
&lt;li&gt;비준수 리소스 리포트 생성 + EventBridge로 비준수 태그 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;IAM Conditions (정책 조건)&lt;/h2&gt;
&lt;p&gt;주요 조건 키:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;조건 키&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aws:SourceIp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API 호출 출처 IP 제한&lt;/td&gt;
&lt;td&gt;회사 IP에서만 접근 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aws:RequestedRegion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API 호출 대상 리전 제한&lt;/td&gt;
&lt;td&gt;ap-northeast-2만 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ec2:ResourceTag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;태그 기반 접근 제한&lt;/td&gt;
&lt;td&gt;Environment=prod 인스턴스만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aws:MultiFactorAuthPresent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MFA 적용 여부&lt;/td&gt;
&lt;td&gt;MFA 없으면 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;S3 버킷 vs. 객체 권한 레벨&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Bucket 레벨: arn:aws:s3:::test
  → s3:ListBucket 적용

Object 레벨: arn:aws:s3:::test/*
  → s3:GetObject, s3:PutObject, s3:DeleteObject 적용
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;aws:PrincipalOrgId&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;모든 &lt;strong&gt;Resource Policy&lt;/strong&gt;에서 사용 가능&lt;/li&gt;
&lt;li&gt;AWS Organization의 멤버 계정에서 오는 요청만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&quot;Condition&quot;: {
    &quot;StringEquals&quot;: {
        &quot;aws:PrincipalOrgID&quot;: &quot;o-xxxxxxxxxx&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;IAM Roles vs. Resource-Based Policies&lt;/h2&gt;
&lt;h3&gt;Cross-Account 접근 시 두 가지 방법&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM Role Assume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Role을 Assume하면 &lt;strong&gt;원래 권한을 포기&lt;/strong&gt;하고 Role 권한만 가짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Principal이 &lt;strong&gt;원래 권한을 유지&lt;/strong&gt;하면서 리소스에 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;중요한 시나리오:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Account A의 User가 Account A의 DynamoDB를 스캔하고
Account B의 S3에 결과를 저장해야 할 때:

→ IAM Role Assume 불가 (Account A DynamoDB 권한 포기해야 해서)
→ Account B S3에 Resource-based Policy로 Account A User 직접 허용 ← 정답
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;EventBridge — 서비스별 권한 방식&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;필요한 권한 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda, SNS, SQS, S3, API Gateway&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis Stream, EC2 ASG, SSM Run Command, ECS Task&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IAM Role&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;IAM Permission Boundaries (권한 경계)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User와 Role&lt;/strong&gt;에만 적용 (Groups에는 불가)&lt;/li&gt;
&lt;li&gt;Managed Policy로 IAM 엔티티가 가질 수 있는 &lt;strong&gt;최대 권한 상한선&lt;/strong&gt; 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;실제 유효 권한 =
  Permission Boundary AND Identity-based Policy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Organizations SCP와 함께 사용 시:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;유효 권한 = Organizations SCP AND Permission Boundary AND IAM Policy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Permission Boundary Use Cases&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비관리자에게 권한 위임&lt;/td&gt;
&lt;td&gt;새 IAM User를 만들 수 있되 Permission Boundary 내에서만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발자 Self-service&lt;/td&gt;
&lt;td&gt;자신의 정책을 직접 관리 가능, 단 권한 에스컬레이션(관리자 권한 획득) 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 User만 제한&lt;/td&gt;
&lt;td&gt;Organizations/SCP 대신 단일 User에게만 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS IAM Identity Center (구: AWS SSO)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single Sign-On&lt;/strong&gt;: 한 번 로그인으로 모든 것에 접근&lt;/li&gt;
&lt;li&gt;지원 대상:
&lt;ul&gt;
&lt;li&gt;AWS Organizations의 모든 계정&lt;/li&gt;
&lt;li&gt;비즈니스 클라우드 앱 (Salesforce, Box, Microsoft 365)&lt;/li&gt;
&lt;li&gt;SAML 2.0 지원 앱&lt;/li&gt;
&lt;li&gt;EC2 Windows Instance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Identity Providers (IdP)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Built-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Identity Center 내장 Identity Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3rd Party&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Active Directory (AD), Okta 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Fine-grained 권한 및 할당&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Multi-Account Permissions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permission Sets&lt;/strong&gt;: IAM Policy 컬렉션 → 사용자/그룹에 할당 → AWS 계정 접근 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Application Assignments:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;많은 SAML 2.0 비즈니스 앱에 SSO 접근&lt;/li&gt;
&lt;li&gt;URL, 인증서, 메타데이터 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ABAC (Attribute-Based Access Control):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자 속성(부서, 직책, 로케일) 기반 세밀한 권한&lt;/li&gt;
&lt;li&gt;권한을 한 번 정의 → 속성 변경으로 AWS 접근 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Microsoft Active Directory (AD) &amp;amp; AWS Directory Services&lt;/h2&gt;
&lt;h3&gt;Active Directory 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server에서 운영, AD Domain Services 포함&lt;/li&gt;
&lt;li&gt;사용자 계정, 컴퓨터, 프린터, 파일 공유, 보안 그룹의 중앙 관리 DB&lt;/li&gt;
&lt;li&gt;객체(Object)는 Tree로 구성, Tree 그룹 = Forest&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AWS Directory Services 3가지&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;On-premises AD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Managed Microsoft AD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS에서 자체 AD 운영, MFA 지원&lt;/td&gt;
&lt;td&gt;Trust 연결 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AD Connector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On-premises AD로 요청 프록시 (Gateway 역할)&lt;/td&gt;
&lt;td&gt;사용자는 On-premises에서 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simple AD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AD 호환 관리형 디렉터리&lt;/td&gt;
&lt;td&gt;On-premises AD와 연결 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;IAM Identity Center + AD 통합 방법&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;방법 1: AWS Managed Microsoft AD 사용 (바로 통합)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[IAM Identity Center] ↔ [AWS Managed Microsoft AD]
→ Out-of-the-box 통합
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;방법 2: Self-Managed (On-premises) AD 사용&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;방법 A: Two-way Trust
[IAM Identity Center] ↔ [AWS Managed AD] ↔(Trust)↔ [On-premises AD]

방법 B: AD Connector (더 높은 Latency)
[IAM Identity Center] ↔ [AD Connector] ↔(Proxy)↔ [On-premises AD]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Control Tower&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;보안/규정 준수 Multi-Account AWS 환경을 &lt;strong&gt;빠르게 설정 및 관리&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Organizations를 사용&lt;/strong&gt;하여 계정 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;주요 장점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;자동화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;환경 설정 클릭 몇 번으로 자동 완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Guardrail로 지속적 정책 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;규정 준수 모니터링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인터랙티브 대시보드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위반 자동 수정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;정책 위반 감지 및 remediation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Guardrails&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;수단&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Preventive (예방)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 리전 외 리소스 생성 금지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detective (탐지)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;태그 없는 리소스 식별&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;전체 Identity 서비스 선택 가이드&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;AWS 계정 다수 관리         → AWS Organizations + SCP
한 번 로그인으로 전체 접근  → IAM Identity Center (SSO)
외부 사용자 앱 인증         → Amazon Cognito User Pools
AWS 리소스 직접 접근 권한   → Amazon Cognito Identity Pools
Windows AD 마이그레이션     → AWS Managed Microsoft AD
On-premises AD 연동 프록시  → AD Connector
AD 없는 단순 호환 디렉터리  → Simple AD
Multi-Account 거버넌스       → AWS Control Tower
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SCP 적용 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Management Account 제외&lt;/strong&gt; 모든 계정/OU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCP 기본 동작&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;아무것도 허용하지 않음&lt;/strong&gt; (명시적 Allow 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tag Policy 영향&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;태그 없는 리소스에는 영향 없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Boundary 적용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;User와 Role만&lt;/strong&gt; (Groups 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효 권한 공식&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SCP AND Boundary AND IAM Policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Account: Role vs Resource Policy&lt;/td&gt;
&lt;td&gt;Role: 원래 권한 포기 / Resource Policy: &lt;strong&gt;원래 권한 유지&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge Lambda/SNS/SQS 권한&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge Kinesis/ECS 권한&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IAM Role&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM Identity Center 구 이름&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Single Sign-On (SSO)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM Identity Center + AD 바로 통합&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Managed Microsoft AD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AD Connector 역할&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;프록시&lt;/strong&gt; (사용자는 On-premises에서 관리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple AD 제한&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;On-premises AD와 연결 불가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control Tower 계정 생성 방법&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Organizations&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preventive Guardrail 수단&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SCP&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detective Guardrail 수단&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS Config&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws:PrincipalOrgID 조건&lt;/td&gt;
&lt;td&gt;Organization 멤버 계정에서 오는 요청만 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>📨 AWS Integration &amp; Messaging</title><link>https://tessa1217.github.io/posts/aws/aws-integration-messaging/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-integration-messaging/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;📨 AWS Integration &amp;amp; Messaging&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;SQS · SNS · Kinesis · Amazon MQ&lt;/p&gt;
&lt;p&gt;애플리케이션 간 결합(Coupling)을 제거하고 독립적인 확장을 가능하게 하는 핵심 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%A9%94%EC%8B%9C%EC%A7%95-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EC%9A%94&quot;&gt;메시징 서비스 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-sqs-simple-queue-service&quot;&gt;Amazon SQS (Simple Queue Service)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-sqs---fifo-queue&quot;&gt;Amazon SQS - FIFO Queue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-sns-simple-notification-service&quot;&gt;Amazon SNS (Simple Notification Service)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-kinesis&quot;&gt;Amazon Kinesis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sqs-vs-sns-vs-kinesis--%EC%B5%9C%EC%A2%85-%EB%B9%84%EA%B5%90&quot;&gt;SQS vs. SNS vs. Kinesis — 최종 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-mq&quot;&gt;Amazon MQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;📌 시험 자주 출제 포인트 총정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;메시징 서비스 개요&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;패턴&lt;/th&gt;
&lt;th&gt;핵심 특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queue (Pull)&lt;/td&gt;
&lt;td&gt;메시지 큐, Consumer가 직접 Pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pub/Sub (Push)&lt;/td&gt;
&lt;td&gt;하나의 메시지를 다수 Subscriber에게 Push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time Streaming&lt;/td&gt;
&lt;td&gt;실시간 대용량 데이터 스트리밍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon MQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;오픈 프로토콜 브로커&lt;/td&gt;
&lt;td&gt;MQTT, AMQP 등 기존 온프레미스 프로토콜 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Decoupling의 이유:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Synchronous 통신:  [앱 A] ─직접 호출─→ [앱 B]   ← 한쪽 장애 시 전체 영향
Asynchronous 통신: [앱 A] → [Queue/Topic] → [앱 B] ← 독립적 확장 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon SQS (Simple Queue Service)&lt;/h2&gt;
&lt;h3&gt;Standard Queue&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;무제한 (Unlimited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메시지 보존 기간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 &lt;strong&gt;4일&lt;/strong&gt;, 최대 &lt;strong&gt;14일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메시지 최대 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지연 시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 10ms (Publish/Receive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전달 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;At-least-once delivery (중복 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;순서 보장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best-effort ordering (순서 미보장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;SQS 메시지 흐름&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Producer] ─ SendMessage API ─→ [SQS Queue] ─ Poll ─→ [Consumer]
                                                          │
                                                   처리 완료 후
                                                   DeleteMessage API
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Consumer는 한 번에 최대 &lt;strong&gt;10개&lt;/strong&gt; 메시지 수신 (Receive)&lt;/li&gt;
&lt;li&gt;메시지는 Consumer가 DeleteMessage API를 호출하기 전까지 Queue에 유지&lt;/li&gt;
&lt;li&gt;Consumer는 EC2, Lambda, 온프레미스 서버 등 어디서든 실행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Message Visibility Timeout (메시지 가시성 타임아웃)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Consumer가 메시지를 Poll
    │
    ▼
메시지가 다른 Consumer에게 &quot;비가시(Invisible)&quot; 상태로 전환
    │
    ▼
기본 30초 내에 처리 + DeleteMessage 완료 → 메시지 영구 삭제
처리 실패 / 시간 초과 → 메시지가 다시 Queue에 &quot;가시(Visible)&quot; 상태로 복귀
                          → 다른 Consumer가 재처리 (중복 처리 가능)
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기본값&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30초&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;타임아웃 연장 방법&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ChangeMessageVisibility API&lt;/strong&gt; 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;너무 낮으면&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;처리 시간 초과로 중복 메시지 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;너무 높으면&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consumer 크래시 시 재처리까지 오랜 대기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Long Polling (롱 폴링)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Consumer가 Queue에 메시지가 없을 때 **일정 시간 대기(Wait)**하여 메시지 도착 시 즉시 수신&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short Polling&lt;/strong&gt; (기본): 메시지 없으면 즉시 빈 응답 → API 호출 낭비&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long Polling 장점&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;SQS에 대한 API 호출 수 감소 → &lt;strong&gt;비용 절감&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;지연 시간(Latency) 감소&lt;/li&gt;
&lt;li&gt;애플리케이션 효율 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대기 시간: &lt;strong&gt;1초 ~ 20초&lt;/strong&gt; (20초 권장)&lt;/li&gt;
&lt;li&gt;설정: Queue 레벨 또는 API 레벨 (&lt;code&gt;WaitTimeSeconds&lt;/code&gt; 파라미터)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Long Polling이 Short Polling보다 항상 권장됨&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;SQS 보안&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In-flight 암호화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;At-rest 암호화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS KMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client-side 암호화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;클라이언트 직접 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;접근 제어&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQS Access Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3 Bucket Policy 형태 — Cross-Account 접근, SNS/S3 등 다른 서비스의 쓰기 허용 시 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;SQS + Auto Scaling Group (ASG) 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[요청]
  │
  ▼
[Frontend App (ASG)] ─ SendMessage ─→ [SQS Queue]
                                           │
                                     CloudWatch Metric
                                     (ApproximateNumberOfMessages)
                                           │ Queue 길이 임계값 초과
                                           ▼
                                     [CloudWatch Alarm]
                                           │
                                           ▼
                                     [Backend ASG Scale Out]
                                           │
                                     ReceiveMessage ─→ DB Insert
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;활용 시나리오:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frontend와 Backend를 &lt;strong&gt;완전히 분리(Decouple)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Backend 처리 속도보다 요청이 빠를 때 &lt;strong&gt;SQS를 Buffer&lt;/strong&gt;로 활용 → 데이터 유실 없음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ApproximateNumberOfMessages&lt;/code&gt; CloudWatch Metric → ASG Scaling 트리거&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon SQS - FIFO Queue&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Standard Queue&lt;/th&gt;
&lt;th&gt;FIFO Queue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;순서&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best-effort (미보장)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;엄격한 FIFO 보장&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;중복&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가능 (at-least-once)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;정확히 1회 전송 (Exactly-once)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;무제한&lt;/td&gt;
&lt;td&gt;배치 없음: &lt;strong&gt;300 msg/s&lt;/strong&gt; / 배치: &lt;strong&gt;3,000 msg/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;중복 제거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deduplication ID&lt;/strong&gt; 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;순서 그룹&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Message Group ID&lt;/strong&gt; (필수 파라미터)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Message Group ID&lt;/strong&gt;: 같은 Group ID 내 메시지는 순서 보장. 서로 다른 Group은 병렬 처리 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon SNS (Simple Notification Service)&lt;/h2&gt;
&lt;h3&gt;Pub/Sub 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Event Producer]
      │
      ▼
[SNS Topic]  ← 메시지 1회 발행
   │  │  │
   ▼  ▼  ▼
[Sub1] [Sub2] [Sub3] ...  ← 모든 Subscriber가 메시지 수신
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscriber 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;토픽당 최대 &lt;strong&gt;12,500,000&lt;/strong&gt;개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Topic 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;계정당 최대 &lt;strong&gt;100,000&lt;/strong&gt;개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 지속성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 전달 실패 시 메시지 소멸&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;지원 Subscriber 유형:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQS, Lambda, Kinesis Data Firehose, HTTP/HTTPS Endpoint&lt;/li&gt;
&lt;li&gt;Email, SMS, Mobile Push Notification&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;SNS 보안&lt;/h3&gt;
&lt;p&gt;SQS와 동일한 구조:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In-flight: HTTPS / At-rest: KMS / Client-side: 고객 직접 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM Policies&lt;/strong&gt; + &lt;strong&gt;SNS Access Policy&lt;/strong&gt; (Cross-Account, S3 등 서비스가 SNS에 쓰기 허용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;SNS Message Filtering (메시지 필터링)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSON Policy로 각 Subscription이 수신할 메시지를 필터링&lt;/li&gt;
&lt;li&gt;필터가 없는 Subscription → &lt;strong&gt;모든 메시지 수신&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[SNS Topic: 주문 이벤트]
      │
      ├── [SQS: 주문완료 큐]    ← Filter: {&quot;state&quot;: [&quot;placed&quot;]}
      ├── [SQS: 취소 큐]       ← Filter: {&quot;state&quot;: [&quot;cancelled&quot;]}
      └── [Lambda: 전체 처리]   ← Filter 없음 (모든 메시지 수신)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;SNS + SQS Fan-Out 패턴&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;문제&lt;/strong&gt;: S3 Event는 하나의 Rule에 하나의 대상만 설정 가능
&lt;strong&gt;해결&lt;/strong&gt;: SNS Topic을 중간에 두고 여러 SQS Queue로 Fan-Out&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[S3 Event] ─→ [SNS Topic] ─→ [SQS Queue A] → 썸네일 생성
                          ─→ [SQS Queue B] → 메타데이터 저장
                          ─→ [SQS Queue C] → 감사 로그
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fan-Out 장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;완전한 Decoupling, 데이터 유실 없음&lt;/li&gt;
&lt;li&gt;SQS: 데이터 영속성, 지연 처리, 재시도 가능&lt;/li&gt;
&lt;li&gt;나중에 Subscriber 추가 가능 (기존 아키텍처 변경 없이)&lt;/li&gt;
&lt;li&gt;Cross-Region Delivery 지원 (다른 리전의 SQS Queue에 전달 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;SNS → Kinesis Data Firehose → S3 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[서비스] → [SNS Topic] → [Kinesis Data Firehose] → [S3 / Redshift / OpenSearch]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SNS가 직접 지원하지 않는 대상(S3 등)에 데이터를 전달할 때 Firehose를 중간 단계로 활용.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;SNS FIFO Topic&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQS FIFO와 유사한 기능:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Message Group ID&lt;/strong&gt; 기반 순서 보장&lt;/li&gt;
&lt;li&gt;Deduplication ID 또는 Content-Based Deduplication으로 중복 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Subscriber: SQS Standard 또는 SQS FIFO Queue&lt;/li&gt;
&lt;li&gt;제한된 Throughput&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SNS FIFO + SQS FIFO = Fan-Out + Ordering + Deduplication&lt;/strong&gt; 동시 달성&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Kinesis&lt;/h2&gt;
&lt;h3&gt;Kinesis 서비스 구성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Streams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실시간 스트리밍 데이터 수집 및 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Data Firehose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스트리밍 데이터를 S3/Redshift/OpenSearch 등으로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL로 스트리밍 데이터 실시간 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Kinesis Data Streams&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;데이터 흐름:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Producers: App, IoT, Click Stream] → [Kinesis Data Streams] → [Consumers: Lambda, ECS, App]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 보존&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 24시간, 최대 &lt;strong&gt;365일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 데이터 재처리(Replay) 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;삭제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 만료 전 삭제 불가 (Immutable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메시지 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최대 &lt;strong&gt;10 MiB&lt;/strong&gt; (일반적으로 소규모 실시간 데이터)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;순서 보장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동일 &lt;strong&gt;Partition ID&lt;/strong&gt; 내에서 순서 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;암호화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;At-rest: KMS / In-flight: HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Kinesis Data Streams - Capacity Modes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;Provisioned&lt;/th&gt;
&lt;th&gt;On-Demand&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard 수 직접 지정&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;입력 처리량&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard당 &lt;strong&gt;1 MB/s&lt;/strong&gt; (or 1,000 records/s)&lt;/td&gt;
&lt;td&gt;기본 &lt;strong&gt;4 MB/s&lt;/strong&gt; (or 4,000 records/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;출력 처리량&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard당 &lt;strong&gt;2 MB/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수동&lt;/td&gt;
&lt;td&gt;최근 30일 피크 기반 자동 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;과금&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard 시간당&lt;/td&gt;
&lt;td&gt;시간당 + 데이터 GB당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Amazon Data Firehose (구: Kinesis Data Firehose)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;완전 관리형, Serverless, 자동 스케일링&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Near Real-Time&lt;/strong&gt; 전달 (버퍼링으로 인한 약간의 지연)&lt;/li&gt;
&lt;li&gt;사용한 만큼 과금 (Pay for what you use)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;지원 대상 (Destinations):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AWS: Amazon S3, Amazon Redshift, Amazon OpenSearch Service
3rd Party: Splunk, MongoDB, Datadog, NewRelic
Custom: HTTP Endpoint
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;데이터 변환:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lambda로 Custom 변환 (예: CSV → JSON)&lt;/li&gt;
&lt;li&gt;Parquet/ORC 변환, gzip/snappy 압축&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Kinesis Data Streams vs. Amazon Data Firehose&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Kinesis Data Streams&lt;/th&gt;
&lt;th&gt;Amazon Data Firehose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스트리밍 데이터 &lt;strong&gt;수집/저장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스트리밍 데이터 &lt;strong&gt;전달/로드&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실시간성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Real-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Near Real-time&lt;/strong&gt; (버퍼링)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer/Consumer 코드 직접 작성&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;완전 관리형&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provisioned 또는 On-Demand&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;자동 스케일링&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 저장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 최대 365일&lt;/td&gt;
&lt;td&gt;❌ 저장 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;❌ 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;SQS vs. SNS vs. Kinesis — 최종 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;SQS&lt;/th&gt;
&lt;th&gt;SNS&lt;/th&gt;
&lt;th&gt;Kinesis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pull&lt;/strong&gt; (Consumer가 가져감)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Push&lt;/strong&gt; (Subscriber에게 전달)&lt;/td&gt;
&lt;td&gt;Pull / Enhanced Fan-Out (Push)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 지속성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (소비 후 삭제)&lt;/td&gt;
&lt;td&gt;❌ (미전달 시 소멸)&lt;/td&gt;
&lt;td&gt;✅ (최대 365일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumer/Subscriber 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Worker 수 제한 없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12,500,000 Subscribers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shard별 분배&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;순서 보장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FIFO Queue만&lt;/td&gt;
&lt;td&gt;SNS FIFO Topic만&lt;/td&gt;
&lt;td&gt;Partition ID별&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;처리량 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불필요 (자동)&lt;/td&gt;
&lt;td&gt;불필요 (자동)&lt;/td&gt;
&lt;td&gt;Shard 직접 관리 (Provisioned) 또는 On-Demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작업 큐, 비동기 처리&lt;/td&gt;
&lt;td&gt;이벤트 알림, Fan-Out&lt;/td&gt;
&lt;td&gt;실시간 대용량 스트리밍, 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon MQ&lt;/h2&gt;
&lt;h3&gt;왜 Amazon MQ인가?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQS/SNS는 &lt;strong&gt;AWS 독점(Cloud-Native) 프로토콜&lt;/strong&gt; 사용&lt;/li&gt;
&lt;li&gt;기존 온프레미스 애플리케이션은 &lt;strong&gt;오픈 표준 프로토콜&lt;/strong&gt; 사용:
&lt;ul&gt;
&lt;li&gt;MQTT, AMQP, STOMP, OpenWire, WSS 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클라우드 이전 시 애플리케이션 재설계 없이 기존 프로토콜 그대로 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Amazon MQ 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 브로커&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RabbitMQ, ActiveMQ&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQS/SNS만큼 확장되지 않음 (서버 기반)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;고가용성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Multi-AZ with Failover&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queue 기능(~SQS) + Topic 기능(~SNS) 동시 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;선택 기준&lt;/strong&gt;: 새로운 애플리케이션 → &lt;strong&gt;SQS/SNS&lt;/strong&gt; 사용. 기존 온프레미스 Message Broker 마이그레이션 → &lt;strong&gt;Amazon MQ&lt;/strong&gt; 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트 총정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQS 메시지 최대 크기&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS 기본 보존 기간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4일&lt;/strong&gt;, 최대 &lt;strong&gt;14일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS 한 번에 수신 최대 메시지 수&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility Timeout 기본값&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30초&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility Timeout 연장 방법&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ChangeMessageVisibility API&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long Polling 대기 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1~20초&lt;/strong&gt; (20초 권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIFO Throughput&lt;/td&gt;
&lt;td&gt;배치 없음: &lt;strong&gt;300 msg/s&lt;/strong&gt;, 배치: &lt;strong&gt;3,000 msg/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIFO 중복 제거&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deduplication ID&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIFO 순서 그룹&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Message Group ID&lt;/strong&gt; (필수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS 최대 Subscriber 수&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12,500,000개/토픽&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS 데이터 지속성&lt;/td&gt;
&lt;td&gt;❌ 미전달 시 &lt;strong&gt;소멸&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS Filter Policy 없으면&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;모든 메시지 수신&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fan-Out 패턴&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SNS → 여러 SQS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Event → 여러 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SNS Fan-Out&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis 데이터 보존&lt;/td&gt;
&lt;td&gt;기본 24h, 최대 &lt;strong&gt;365일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis 메시지 삭제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;불가&lt;/strong&gt; (만료 시까지 유지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis 순서 보장 단위&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Partition ID&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioned Mode 입력&lt;/td&gt;
&lt;td&gt;Shard당 &lt;strong&gt;1 MB/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioned Mode 출력&lt;/td&gt;
&lt;td&gt;Shard당 &lt;strong&gt;2 MB/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis Replay&lt;/td&gt;
&lt;td&gt;✅ 가능 (SQS/SNS는 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Firehose 실시간성&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Near Real-time&lt;/strong&gt; (버퍼링)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Firehose Replay&lt;/td&gt;
&lt;td&gt;❌ 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon MQ 지원 브로커&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RabbitMQ, ActiveMQ&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon MQ 선택 기준&lt;/td&gt;
&lt;td&gt;기존 오픈 프로토콜(MQTT, AMQP 등) &lt;strong&gt;마이그레이션&lt;/strong&gt; 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS ASG 트리거 지표&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ApproximateNumberOfMessages&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/sqs/&quot;&gt;Amazon SQS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/sns/&quot;&gt;Amazon SNS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&quot;&gt;Amazon Kinesis Data Streams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html&quot;&gt;Amazon Data Firehose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/amazon-mq/&quot;&gt;Amazon MQ 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🔍 AWS Monitoring, Troubleshooting &amp; Audit</title><link>https://tessa1217.github.io/posts/aws/aws-monitoring/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-monitoring/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🔍 AWS Monitoring, Troubleshooting &amp;amp; Audit&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;CloudWatch · EventBridge · CloudTrail · AWS Config&lt;/p&gt;
&lt;p&gt;리소스 상태 모니터링, API 감사, 규정 준수 관리의 3대 축&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%84%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%95%9C%EB%88%88%EC%97%90-%EB%B9%84%EA%B5%90&quot;&gt;세 서비스 한눈에 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-cloudwatch&quot;&gt;Amazon CloudWatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-eventbridge-%EA%B5%AC-cloudwatch-events&quot;&gt;Amazon EventBridge (구: CloudWatch Events)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-cloudtrail&quot;&gt;AWS CloudTrail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-config&quot;&gt;AWS Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudwatch-vs-cloudtrail-vs-config-%EB%B9%84%EA%B5%90&quot;&gt;CloudWatch vs. CloudTrail vs. Config 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;세 서비스 한눈에 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;핵심 역할&lt;/th&gt;
&lt;th&gt;주요 질문&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;성능 모니터링 + 로그 + 알람&lt;/td&gt;
&lt;td&gt;&quot;지금 CPU가 얼마나 되나?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API 호출 감사 기록&lt;/td&gt;
&lt;td&gt;&quot;누가 언제 어떤 API를 호출했나?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;설정 변경 기록 + 규정 준수 평가&lt;/td&gt;
&lt;td&gt;&quot;리소스 설정이 어떻게 바뀌었나? 규정 준수하나?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;리소스 삭제 원인 조사 → CloudTrail 먼저 확인&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon CloudWatch&lt;/h2&gt;
&lt;h3&gt;CloudWatch Metrics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 모든 서비스에서 지표(Metric) 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespace&lt;/strong&gt; 단위로 지표 그룹화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimension&lt;/strong&gt;: 지표의 속성 (Instance ID, 환경 등), 지표당 최대 &lt;strong&gt;30개 Dimension&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;지표에 Timestamp 포함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Metrics&lt;/strong&gt; 생성 가능 (예: RAM 사용률 — 기본 제공 안 됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudWatch Metric Streams&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudWatch Metrics를 &lt;strong&gt;Near real-time&lt;/strong&gt;으로 대상에 지속 스트리밍&lt;/li&gt;
&lt;li&gt;대상: &lt;strong&gt;Kinesis Data Firehose&lt;/strong&gt; (→ S3, Redshift 등)&lt;/li&gt;
&lt;li&gt;3rd party: Datadog, Dynatrace, New Relic, Splunk, Sumo Logic&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudWatch Logs&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;임의 이름, 보통 애플리케이션 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log Stream&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인스턴스/로그파일/컨테이너 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;만료 정책&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;영구 보존 ~ 1일~10년 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기본 암호화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;활성화됨 (KMS 커스텀 키 설정 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;CloudWatch Logs 전송 대상:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon S3 (Export)&lt;/li&gt;
&lt;li&gt;Kinesis Data Streams&lt;/li&gt;
&lt;li&gt;Kinesis Data Firehose&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;OpenSearch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주요 Log Sources:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SDK, CloudWatch Logs Agent, CloudWatch Unified Agent&lt;/li&gt;
&lt;li&gt;Elastic Beanstalk, ECS, Lambda, VPC Flow Logs, API Gateway, CloudTrail, Route 53&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudWatch Logs Agent vs. Unified Agent&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudWatch Logs Agent&lt;/th&gt;
&lt;th&gt;CloudWatch Unified Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;버전&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;구버전&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;신버전 (권장)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;로그 전송&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudWatch Logs만&lt;/td&gt;
&lt;td&gt;CloudWatch Logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;시스템 지표&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (RAM, Process 등 추가 수집)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;설정 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SSM Parameter Store&lt;/strong&gt; 중앙 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Unified Agent 수집 지표:&lt;/strong&gt;
CPU, Disk metrics/IO, RAM, Netstat, Processes, Swap Space
→ EC2 기본 Out-of-the-box Metrics(Disk, CPU, Network)보다 &lt;strong&gt;상세한 수준&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;CloudWatch Logs Insights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudWatch Logs에서 &lt;strong&gt;SQL 유사 쿼리로 로그 분석&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AWS 서비스 및 JSON 로그에서 필드 자동 검색&lt;/li&gt;
&lt;li&gt;여러 Log Group, 여러 계정 동시 쿼리 가능&lt;/li&gt;
&lt;li&gt;쿼리 저장 및 Dashboard 추가 가능&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Query Engine&lt;/strong&gt; — 실시간 엔진 아님 (과거 데이터만 조회)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudWatch Logs S3 Export&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;로그 데이터를 S3로 내보내기 (API: &lt;code&gt;CreateExportTask&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;데이터 가용까지 &lt;strong&gt;최대 12시간&lt;/strong&gt; 소요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Near real-time 또는 실시간 아님&lt;/strong&gt; → 실시간이 필요하면 &lt;strong&gt;Subscriptions Filter&lt;/strong&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudWatch Logs Subscriptions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;실시간 로그 이벤트 처리 및 분석용&lt;/li&gt;
&lt;li&gt;대상: &lt;strong&gt;Kinesis Data Streams, Kinesis Data Firehose, Lambda&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscription Filter&lt;/strong&gt;: 특정 조건의 로그만 대상으로 전달&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-Account Subscription&lt;/strong&gt;: 다른 계정의 KDS/KDF로 전달 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudWatch Alarms&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Alarm States:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OK&lt;/code&gt; / &lt;code&gt;INSUFFICIENT_DATA&lt;/code&gt; / &lt;code&gt;ALARM&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Alarm Targets:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2 Instance: 중지/종료/재부팅/복구&lt;/li&gt;
&lt;li&gt;Auto Scaling Action 트리거&lt;/li&gt;
&lt;li&gt;SNS Topic 알림 → 이를 통해 사실상 모든 것 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Composite Alarms:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 알람 상태를 AND/OR 조건으로 조합&lt;/li&gt;
&lt;li&gt;&quot;알람 노이즈(Alarm Noise)&quot; 감소에 효과적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;EC2 Instance Recovery:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;StatusCheckFailed_System&lt;/code&gt; Alarm → 복구 실행&lt;/li&gt;
&lt;li&gt;복구 후: &lt;strong&gt;Private/Public/Elastic IP, Metadata, Placement Group 동일 유지&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;알람 테스트 (CLI):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aws cloudwatch set-alarm-state \
  --alarm-name &quot;myalarm&quot; \
  --state-value ALARM \
  --state-reason &quot;testing purposes&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudWatch 특화 Insights 서비스&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;대상&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECS, EKS, EC2 Kubernetes, Fargate&lt;/td&gt;
&lt;td&gt;컨테이너 메트릭 + 로그 수집 (EKS: 컨테이너화된 CW Agent 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lambda Insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda (Lambda Layer 형태)&lt;/td&gt;
&lt;td&gt;Cold Start, 시스템 메트릭, 진단 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contributor Insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC Flow Logs, DNS 등 모든 CW Logs&lt;/td&gt;
&lt;td&gt;Top-N 기여자 파악 (예: 상위 IP, 최다 오류 URL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Application Insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2 기반 앱 (Java, .NET 등) + AWS 서비스&lt;/td&gt;
&lt;td&gt;문제 자동 감지 대시보드, SageMaker 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;CloudWatch Network Synthetic Monitor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On-premises ↔ AWS 애플리케이션 간 &lt;strong&gt;네트워크 성능 문제 감지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Agent 설치 불필요&lt;/li&gt;
&lt;li&gt;ICMP/TCP 트래픽 테스트 (Direct Connect 또는 Site-to-Site VPN 경유)&lt;/li&gt;
&lt;li&gt;패킷 손실, 지연, Jitter 측정 → CloudWatch Metrics로 발행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon EventBridge (구: CloudWatch Events)&lt;/h2&gt;
&lt;h3&gt;핵심 기능&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cron Jobs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 시간/주기 기반 스케줄 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Event Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 이벤트 발생 시 규칙 트리거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;대상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda, SQS, SNS, KDS, Step Functions, ECS Task, API Gateway, Batch 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Event Bus 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default Event Bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS 서비스 이벤트 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Partner Event Bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SaaS 파트너 이벤트 (Zendesk, Datadog 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Event Bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;커스텀 앱 이벤트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Event Bus는 &lt;strong&gt;Resource-based Policy&lt;/strong&gt;로 다른 계정에 공유 가능&lt;/li&gt;
&lt;li&gt;이벤트 &lt;strong&gt;아카이브(Archive)&lt;/strong&gt; + &lt;strong&gt;Replay&lt;/strong&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Schema Registry&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EventBridge가 Event Bus의 이벤트 스키마를 자동 분석/추론&lt;/li&gt;
&lt;li&gt;스키마 기반 애플리케이션 코드 자동 생성 (이벤트 구조 사전 파악)&lt;/li&gt;
&lt;li&gt;스키마 버저닝 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EventBridge Resource-based Policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;특정 Event Bus의 권한 관리&lt;/li&gt;
&lt;li&gt;다른 계정/리전의 이벤트 허용/거부&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: AWS Organization 전체 이벤트를 단일 계정/리전으로 집계&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EventBridge 보안 (Target 별 권한)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target 유형&lt;/th&gt;
&lt;th&gt;권한 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda, SNS, SQS, S3, API Gateway&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis Streams, EC2 ASG, SSM Run Command, ECS Task&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IAM Role&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS CloudTrail&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS 계정 내 &lt;strong&gt;모든 API 호출 기록&lt;/strong&gt; (기본 활성화)&lt;/li&gt;
&lt;li&gt;콘솔, SDK, CLI, AWS 서비스를 통한 호출 포함&lt;/li&gt;
&lt;li&gt;로그 대상: CloudWatch Logs 또는 S3&lt;/li&gt;
&lt;li&gt;Trail은 &lt;strong&gt;모든 리전&lt;/strong&gt; 또는 &lt;strong&gt;단일 리전&lt;/strong&gt; 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudTrail 이벤트 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;기본 기록&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Management Events&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;리소스 작업 (IAM, EC2 서브넷 생성, 로깅 설정 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Events&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ (고볼륨)&lt;/td&gt;
&lt;td&gt;S3 Object 레벨 작업 (GetObject, DeleteObject 등), Lambda 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail Insights Events&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;별도 활성화&lt;/td&gt;
&lt;td&gt;비정상적인 활동 자동 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;CloudTrail Insights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비정상 활동 감지:
&lt;ul&gt;
&lt;li&gt;부정확한 리소스 프로비저닝&lt;/li&gt;
&lt;li&gt;서비스 한도 도달&lt;/li&gt;
&lt;li&gt;IAM 작업 급증&lt;/li&gt;
&lt;li&gt;주기적 유지보수 누락&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정상 Management Event로 &lt;strong&gt;Baseline 생성&lt;/strong&gt; → Write Event 지속 분석&lt;/li&gt;
&lt;li&gt;이상 탐지 결과: CloudTrail 콘솔 + S3 이벤트 + &lt;strong&gt;EventBridge 이벤트&lt;/strong&gt; 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudTrail 이벤트 보존&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기본 보존: &lt;strong&gt;90일&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;90일 이상 보존: &lt;strong&gt;S3 로그 저장 + Athena 분석&lt;/strong&gt; 조합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CloudTrail + EventBridge 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[사용자 API 호출]
      │
      ▼
[CloudTrail 기록]
      │
      ▼
[EventBridge 이벤트]
      │
      ▼
[SNS 알림 또는 자동화]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예시:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DeleteTable&lt;/code&gt; (DynamoDB) → CloudTrail → EventBridge → SNS 경보&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AssumeRole&lt;/code&gt; (IAM) → CloudTrail → EventBridge → SNS 경보&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AuthorizeSecurityGroupIngress&lt;/code&gt; (EC2) → CloudTrail → EventBridge → SNS 경보&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Config&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;리소스 설정 변경 기록 및 &lt;strong&gt;규정 준수(Compliance) 평가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;리전별 서비스 (리전 간 집계 가능)&lt;/li&gt;
&lt;li&gt;설정 데이터를 S3에 저장 → Athena로 분석 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;답할 수 있는 질문들:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH가 제한 없이 열려 있는 Security Group이 있나?&lt;/li&gt;
&lt;li&gt;Public Access가 열린 S3 Bucket이 있나?&lt;/li&gt;
&lt;li&gt;ALB 설정이 시간에 따라 어떻게 바뀌었나?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Config Rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS Managed Rules&lt;/strong&gt;: 75개 이상 기본 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Rules&lt;/strong&gt;: Lambda 기반 커스텀 평가 로직&lt;/li&gt;
&lt;li&gt;트리거: &lt;strong&gt;설정 변경 시&lt;/strong&gt; 또는 &lt;strong&gt;주기적 평가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;⚠️ Config Rules는 &lt;strong&gt;예방(Deny) 기능 없음&lt;/strong&gt; — 규정 준수 평가만&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;가격&lt;/strong&gt;: Free Tier 없음, 리전당 설정 항목 $0.003, 규칙 평가 $0.001&lt;/p&gt;
&lt;h3&gt;Config 리소스 뷰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;특정 리소스의 &lt;strong&gt;규정 준수 변화 타임라인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;특정 리소스의 &lt;strong&gt;설정 변경 타임라인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;특정 리소스 관련 &lt;strong&gt;CloudTrail API 호출 타임라인&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Config Rules — Remediations (자동 수정)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비준수 리소스를 &lt;strong&gt;SSM Automation Document&lt;/strong&gt;로 자동 수정&lt;/li&gt;
&lt;li&gt;AWS Managed Automation Document 또는 Custom Document (Lambda 호출 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remediation Retry&lt;/strong&gt; 설정 가능 (자동 수정 후에도 비준수 시)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예시:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IAM Access Key 만료 (NON_COMPLIANT)
    → Auto Remediation: AWSConfigRemediation-RevokeUnusedIAMUserCredentials
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Config Rules — Notifications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EventBridge&lt;/strong&gt;: 비준수 리소스 발생 시 트리거 → 자동화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SNS&lt;/strong&gt;: 설정 변경 + 규정 준수 상태 알림 (SNS Filtering 또는 클라이언트 측 필터 활용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudWatch vs. CloudTrail vs. Config 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudWatch&lt;/th&gt;
&lt;th&gt;CloudTrail&lt;/th&gt;
&lt;th&gt;Config&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;성능 모니터링 + 알람 + 로그&lt;/td&gt;
&lt;td&gt;API 호출 감사 기록&lt;/td&gt;
&lt;td&gt;설정 변경 기록 + 규정 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;질문&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&quot;CPU가 높은가?&quot;&lt;/td&gt;
&lt;td&gt;&quot;누가 API를 호출했는가?&quot;&lt;/td&gt;
&lt;td&gt;&quot;설정이 바뀌었는가? 규정에 맞는가?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;범위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;리전 (글로벌 집계 가능)&lt;/td&gt;
&lt;td&gt;글로벌 서비스&lt;/td&gt;
&lt;td&gt;리전 (집계 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;ELB 관점에서 세 서비스 역할&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;ELB에서의 역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incoming Connection 모니터링, 에러 코드 비율 시각화, 성능 대시보드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security Group 규칙 추적, 설정 변경 이력, SSL 인증서 상시 부착 여부 규정 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API 호출 추적 (누가 LB 설정을 변경했는가?)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 기본 미제공 지표&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt; (Unified Agent로 추가 수집 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Metric&lt;/td&gt;
&lt;td&gt;RAM, 프로세스 등 &lt;strong&gt;직접 푸시&lt;/strong&gt; 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CW Logs → S3 Export&lt;/td&gt;
&lt;td&gt;API: CreateExportTask, &lt;strong&gt;최대 12시간 소요&lt;/strong&gt; (Near real-time 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CW Logs 실시간 전송&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Subscription Filter → KDS/KDF/Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Account Logs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cross-Account Subscription&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CW Alarm 테스트&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set-alarm-state&lt;/code&gt; CLI 명령으로 강제 ALARM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Composite Alarm&lt;/td&gt;
&lt;td&gt;AND/OR 조건 조합, 알람 노이즈 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 Recovery&lt;/td&gt;
&lt;td&gt;동일 &lt;strong&gt;Private/Public/Elastic IP, Metadata, Placement Group&lt;/strong&gt; 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container Insights + EKS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;컨테이너화된 CW Agent&lt;/strong&gt; 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda Insights 배포&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lambda Layer&lt;/strong&gt; 형태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contributor Insights&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Top-N&lt;/strong&gt; 기여자 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge Target 권한&lt;/td&gt;
&lt;td&gt;Lambda/SNS/SQS: &lt;strong&gt;Resource-based Policy&lt;/strong&gt; / Kinesis/ECS: &lt;strong&gt;IAM Role&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge Replay&lt;/td&gt;
&lt;td&gt;✅ 아카이브된 이벤트 재생 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudTrail 기본 보존&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90일 이상 CloudTrail 보존&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3 + Athena&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudTrail Data Events&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;기본 비활성화&lt;/strong&gt; (고볼륨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudTrail Insights&lt;/td&gt;
&lt;td&gt;비정상 활동 → CloudTrail 콘솔 + &lt;strong&gt;S3 + EventBridge&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리소스 삭제 원인 조사&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail 먼저&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config Rules 기능&lt;/td&gt;
&lt;td&gt;규정 준수 &lt;strong&gt;평가만&lt;/strong&gt; (Deny/차단 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config Auto Remediation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SSM Automation Document&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config 서비스 범위&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;리전별&lt;/strong&gt; (리전 간 집계 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>⚡ AWS Serverless</title><link>https://tessa1217.github.io/posts/aws/aws-serverless/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-serverless/</guid><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;⚡ AWS Serverless&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Lambda · API Gateway · DynamoDB · Step Functions · Cognito&lt;/p&gt;
&lt;p&gt;서버를 프로비저닝하지 않고 코드와 함수만 배포하는 패러다임&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#serverless-%EA%B0%9C%EC%9A%94&quot;&gt;Serverless 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-lambda&quot;&gt;AWS Lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cloudfront-functions-vs-lambdaedge&quot;&gt;CloudFront Functions vs. Lambda@Edge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-dynamodb&quot;&gt;Amazon DynamoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-api-gateway&quot;&gt;Amazon API Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-step-functions&quot;&gt;AWS Step Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-cognito&quot;&gt;Amazon Cognito&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Serverless 개요&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Serverless ≠ 서버가 없음&lt;/strong&gt; — 서버를 관리/프로비저닝하지 않는 것&lt;/p&gt;
&lt;h3&gt;AWS Serverless 서비스&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS Lambda, DynamoDB, Amazon Cognito, API Gateway&lt;/p&gt;
&lt;p&gt;Amazon S3, SNS, SQS, Kinesis Data Firehose&lt;/p&gt;
&lt;p&gt;Aurora Serverless, Step Functions, Fargate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Lambda&lt;/h2&gt;
&lt;h3&gt;EC2 vs. Lambda&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;EC2&lt;/th&gt;
&lt;th&gt;Lambda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;서버&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 프로비저닝&lt;/td&gt;
&lt;td&gt;관리 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실행 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;항상 실행 중&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;On-demand&lt;/strong&gt; (요청 시 실행)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;시간 제한&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대 15분 (900초)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수동 또는 ASG&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;자동&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;과금&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실행 여부 무관&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;요청 수 + 실행 시간&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda 제한 (Limits) — per Region&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 시험 빈출 수치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;실행 (Execution):&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;제한&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;128 MB ~ 10 GB&lt;/strong&gt; (1 MB 단위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Execution Time&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;900초 (15분)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment Variables&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tmp 디스크&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;512 MB ~ 10 GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent Executions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,000&lt;/strong&gt; (증가 요청 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;배포 (Deployment):&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;제한&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;압축 .zip 크기&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비압축 코드 + 의존성&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;250 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment Variables&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 RAM을 늘리면 CPU와 네트워크 성능도 함께 향상됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda 지원 런타임&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Node.js, Python, Java, C#/PowerShell, Ruby&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Runtime API&lt;/strong&gt;: Rust, Golang 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda Container Image&lt;/strong&gt;: Lambda Runtime API를 구현한 컨테이너 이미지 사용 가능
&lt;ul&gt;
&lt;li&gt;임의의 Docker Image는 &lt;strong&gt;ECS/Fargate 권장&lt;/strong&gt; (Lambda Container Image와 다름)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda 가격&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;과금 항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;요청 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;첫 &lt;strong&gt;1,000,000 req&lt;/strong&gt; 무료 / 이후 $0.20 / 100만 req&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실행 시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;월 &lt;strong&gt;400,000 GB-seconds&lt;/strong&gt; 무료 / 이후 $1.00 / 600,000 GB-sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;400,000 GB-sec = 1GB RAM → 400,000초 / 128MB RAM → 3,200,000초&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda Concurrency &amp;amp; Throttling (동시 실행 및 조절)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;계정당 기본 동시 실행 한도: 1,000개
        │
        ▼
Throttle 발생 시:
  ├── Synchronous 호출 → 429 ThrottleError 즉시 반환
  └── Asynchronous 호출 → 자동 재시도 (최대 6시간, 지수 백오프)
                          → 최종 실패 시 DLQ(Dead Letter Queue)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Reserved Concurrency (예약 동시 실행):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특정 함수에 동시 실행 상한을 예약 설정&lt;/li&gt;
&lt;li&gt;다른 함수가 한도를 다 쓰지 못하도록 보호&lt;/li&gt;
&lt;li&gt;여러 Lambda가 같은 계정 한도를 공유하므로 &lt;strong&gt;한 함수가 폭발적 요청 시 다른 함수 Throttle 가능&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Cold Start &amp;amp; Provisioned Concurrency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cold Start 문제:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;새 인스턴스 시작 → 코드 로드 + Init 코드 실행 (handler 외부)
→ 첫 요청의 지연 시간 높음 (대형 패키지/SDK 사용 시 더 심각)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Provisioned Concurrency:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;함수 호출 전에 미리 인스턴스를 워밍업 → Cold Start 없음&lt;/li&gt;
&lt;li&gt;Application Auto Scaling으로 스케줄 또는 목표 활용률 기반 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda SnapStart (Java / Python / .NET)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최대 10배 성능 향상&lt;/strong&gt; (추가 비용 없음)&lt;/li&gt;
&lt;li&gt;새 버전 배포 시 Lambda가 함수를 초기화하고 메모리/디스크 &lt;strong&gt;Snapshot 저장&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이후 호출은 저장된 Snapshot에서 즉시 시작 → Init 과정 생략&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SnapStart 비활성화: invoke → [Init → invoke → shutdown]
SnapStart 활성화:   invoke → [snapshot에서 복원 → invoke → shutdown]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda Networking (VPC 연동)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;기본 동작 (Default):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Lambda는 AWS 소유 VPC에서 실행
→ 고객 VPC의 RDS, ElastiCache, 내부 ELB에 접근 불가
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Lambda in VPC:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Lambda → ENI(Elastic Network Interface) 생성 → 지정 Subnet에 연결
→ VPC 내 리소스(RDS, ElastiCache 등) 접근 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;VPC ID, Subnet, Security Group 지정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Lambda + RDS Proxy:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[많은 Lambda 호출] → [RDS Proxy] → [RDS/Aurora]
(직접 연결 시 DB Connection 과다)  (Connection Pooling으로 보호)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;RDS Proxy는 Public 접근 불가 → &lt;strong&gt;Lambda도 반드시 VPC 내 배포 필요&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IAM 인증 강제 + Secrets Manager 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Lambda에서 RDS/Aurora 호출 (Invoke Lambda from DB)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RDS for PostgreSQL, Aurora MySQL에서 &lt;strong&gt;DB 내 이벤트 기반 Lambda 호출&lt;/strong&gt; 가능&lt;/li&gt;
&lt;li&gt;예: 신규 사용자 INSERT → Lambda → SES로 환영 이메일 발송&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DB 인스턴스가 Lambda에 아웃바운드 접근 권한 필요&lt;/strong&gt; (Public / NAT GW / VPC Endpoint 중 하나)&lt;/li&gt;
&lt;li&gt;DB Instance에 Lambda 호출 권한 필요 (Lambda Resource-based Policy + IAM Policy)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;RDS Event Notifications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DB 인스턴스 &lt;strong&gt;자체의 이벤트&lt;/strong&gt; 알림 (데이터 변경 아님)&lt;/li&gt;
&lt;li&gt;이벤트 카테고리: DB Instance, Snapshot, Parameter Group, Security Group, RDS Proxy, Custom Engine Version&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Near real-time&lt;/strong&gt; (최대 5분 지연)&lt;/li&gt;
&lt;li&gt;SNS 또는 EventBridge로 알림 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;CloudFront Functions vs. Lambda@Edge&lt;/h2&gt;
&lt;p&gt;Edge에서 코드를 실행하여 CloudFront 요청/응답을 동적으로 처리.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;CloudFront Functions&lt;/th&gt;
&lt;th&gt;Lambda@Edge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;런타임&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JavaScript만&lt;/td&gt;
&lt;td&gt;Node.js, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;처리량&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;수백만 req/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수천 req/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 실행 시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; 1ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5~10초&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메모리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 MB&lt;/td&gt;
&lt;td&gt;128 MB ~ 10 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;패키지 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 KB&lt;/td&gt;
&lt;td&gt;1 MB ~ 50 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;트리거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Viewer Req/Res&lt;/td&gt;
&lt;td&gt;Viewer/Origin Req/Res (4가지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;네트워크/파일 접근&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;요청 Body 접근&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;가격&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;더 저렴 (Free Tier 있음)&lt;/td&gt;
&lt;td&gt;Free Tier 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;코드 작성 위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudFront 내&lt;/td&gt;
&lt;td&gt;us-east-1 리전&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;CloudFront Functions Use Cases:&lt;/strong&gt; Cache Key 정규화, Header 조작, URL 리다이렉트, JWT 인증
&lt;strong&gt;Lambda@Edge Use Cases:&lt;/strong&gt; 복잡한 로직, 외부 API 호출, 파일시스템 접근, 3rd Party 라이브러리&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon DynamoDB&lt;/h2&gt;
&lt;h3&gt;특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NoSQL&lt;/strong&gt;, &lt;strong&gt;Serverless&lt;/strong&gt;, &lt;strong&gt;완전 관리형&lt;/strong&gt;, Multi-AZ 복제&lt;/li&gt;
&lt;li&gt;초당 수백만 req, 수조 개 행, 수백 TB 스토리지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-digit millisecond&lt;/strong&gt; 지연 시간&lt;/li&gt;
&lt;li&gt;IAM 통합 보안, 자동 스케일링&lt;/li&gt;
&lt;li&gt;Standard / Infrequent Access (IA) Table Class&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;기본 구조&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;생성 시 결정 (변경 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Item 최대 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attribute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;언제든 추가 가능, null 허용 → &lt;strong&gt;Schema 유연성&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 타입&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scalar(String, Number, Binary, Boolean, Null), Document(List, Map), Set&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Read/Write Capacity Modes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Provisioned Mode&lt;/th&gt;
&lt;th&gt;On-Demand Mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RCU/WCU 미리 지정&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-scaling 가능&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로비저닝 용량 과금&lt;/td&gt;
&lt;td&gt;실제 사용량 과금 (더 비쌈)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;적합 워크로드&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;예측 가능한 트래픽&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;예측 불가, 급격한 Spike&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;DynamoDB Accelerator (DAX)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDB를 위한 &lt;strong&gt;완전 관리형 인메모리 캐시&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsecond&lt;/strong&gt; 지연 시간 (캐시된 데이터)&lt;/li&gt;
&lt;li&gt;기존 DynamoDB API와 호환 → &lt;strong&gt;애플리케이션 코드 변경 불필요&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기본 TTL: &lt;strong&gt;5분&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DAX vs. ElastiCache:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DAX&lt;/th&gt;
&lt;th&gt;ElastiCache&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개별 Object, Query/Scan 캐시&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;집계 결과(Aggregation) 캐시&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB 전용&lt;/td&gt;
&lt;td&gt;범용 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;DynamoDB Streams&lt;/h3&gt;
&lt;p&gt;DynamoDB 테이블의 Item 변경(CUD) 이벤트 스트림.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;DynamoDB Streams&lt;/th&gt;
&lt;th&gt;Kinesis Data Streams&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보존 기간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대 365일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumer 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;많음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;처리 방법&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda Triggers, KCL Adapter&lt;/td&gt;
&lt;td&gt;Lambda, Firehose, Analytics, EMR 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt; 실시간 반응, 크로스 리전 복제, Lambda 트리거&lt;/p&gt;
&lt;h3&gt;DynamoDB Global Tables&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Active-Active&lt;/strong&gt; 복제 (모든 리전에서 Read/Write 가능)&lt;/li&gt;
&lt;li&gt;다중 리전에서 &lt;strong&gt;저지연&lt;/strong&gt; 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB Streams 활성화 필수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DynamoDB TTL (Time To Live)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;만료 Timestamp 기반 자동 Item 삭제&lt;/li&gt;
&lt;li&gt;Use Cases: 세션 데이터, 규정 준수, 오래된 데이터 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DynamoDB 백업&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방식&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PITR (자동 백업)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최대 &lt;strong&gt;35일&lt;/strong&gt;, 복원 시 새 테이블 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-Demand Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;명시적 삭제 전까지 유지, 성능 영향 없음, AWS Backup으로 Cross-Region 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;DynamoDB ↔ S3 연동&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Export to S3&lt;/th&gt;
&lt;th&gt;Import from S3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전제 조건&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PITR 활성화 필수&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;포맷&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DynamoDB JSON / ION&lt;/td&gt;
&lt;td&gt;CSV / DynamoDB JSON / ION&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량 소비&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read Capacity 미사용&lt;/td&gt;
&lt;td&gt;Write Capacity 미사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;결과&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기존 테이블 유지&lt;/td&gt;
&lt;td&gt;새 테이블 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon API Gateway&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인프라 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불필요 (Lambda + API Gateway = 완전 Serverless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API 버저닝, 환경 관리(dev/prod), 인증/인가, Rate Limiting, API Key, 캐싱, SDK 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 프로토콜&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;REST, HTTP, WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;API Gateway Endpoint Types&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Edge-Optimized&lt;/strong&gt; (기본)&lt;/td&gt;
&lt;td&gt;CloudFront Edge Location 경유&lt;/td&gt;
&lt;td&gt;글로벌 클라이언트, API는 단일 리전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동일 리전 클라이언트용&lt;/td&gt;
&lt;td&gt;수동으로 CloudFront 결합 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC 내부에서만 접근&lt;/td&gt;
&lt;td&gt;Interface VPC Endpoint (ENI) + Resource Policy 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;API Gateway 인증&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM Roles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;내부 애플리케이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cognito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;외부 사용자 (모바일 앱 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Authorizer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자체 인증 로직 (Lambda 기반)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;ACM (AWS Certificate Manager) 연동:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edge-Optimized: 인증서는 &lt;strong&gt;us-east-1&lt;/strong&gt;에 있어야 함&lt;/li&gt;
&lt;li&gt;Regional: 인증서는 &lt;strong&gt;API Gateway와 같은 리전&lt;/strong&gt;에 있어야 함&lt;/li&gt;
&lt;li&gt;Route 53에 &lt;strong&gt;CNAME 또는 A-alias 레코드&lt;/strong&gt; 설정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Step Functions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lambda 함수들을 &lt;strong&gt;시각적 워크플로우&lt;/strong&gt;로 오케스트레이션&lt;/li&gt;
&lt;li&gt;기능: 순차/병렬 실행, 조건 분기, 타임아웃, 에러 핸들링&lt;/li&gt;
&lt;li&gt;EC2, ECS, 온프레미스, API Gateway, SQS, DynamoDB 등과 통합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Human Approval&lt;/strong&gt; (사람의 승인 단계) 구현 가능&lt;/li&gt;
&lt;li&gt;Use Cases: 주문 처리, 데이터 파이프라인, 웹 애플리케이션 워크플로우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon Cognito&lt;/h2&gt;
&lt;h3&gt;목적&lt;/h3&gt;
&lt;p&gt;외부 사용자(웹/모바일 앱 사용자)에게 &lt;strong&gt;AWS 리소스에 대한 Identity 부여&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Cognito vs. IAM&lt;/strong&gt;: 수백 명의 외부 사용자, 모바일 사용자, SAML 인증 → &lt;strong&gt;Cognito&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Cognito User Pools (CUP)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;앱 사용자를 위한 &lt;strong&gt;Serverless 사용자 DB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기능: 이메일/비밀번호 로그인, 비밀번호 재설정, 이메일/전화 인증, MFA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Federated Identity&lt;/strong&gt;: Facebook, Google, SAML 계정으로 로그인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Gateway 및 ALB와 통합&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cognito Identity Pools (Federated Identities)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;사용자에게 &lt;strong&gt;임시 AWS 자격증명(Temporary AWS Credentials)&lt;/strong&gt; 발급&lt;/li&gt;
&lt;li&gt;AWS 서비스에 직접 접근 가능 (S3, DynamoDB 등)&lt;/li&gt;
&lt;li&gt;사용자 소스: Cognito User Pools, 3rd party 로그인&lt;/li&gt;
&lt;li&gt;IAM Policy를 Cognito에서 정의 (user_id 기반 세밀한 권한 제어 가능)&lt;/li&gt;
&lt;li&gt;인증/미인증 사용자별 기본 IAM Role 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CUP vs. Identity Pools&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;User Pools&lt;/th&gt;
&lt;th&gt;Identity Pools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;로그인/인증&lt;/td&gt;
&lt;td&gt;AWS 리소스 접근 권한 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;결과물&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JWT Token&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;임시 AWS 자격증명&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;통합&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API Gateway, ALB&lt;/td&gt;
&lt;td&gt;S3, DynamoDB 직접 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda 최대 실행 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15분 (900초)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda 메모리 범위&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;128 MB ~ 10 GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda 기본 동시 실행 한도&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,000개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throttle (Sync)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;429 ThrottleError&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throttle (Async)&lt;/td&gt;
&lt;td&gt;자동 재시도 최대 &lt;strong&gt;6시간&lt;/strong&gt;, 지수 백오프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold Start 해결&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Provisioned Concurrency&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SnapStart 지원 런타임&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Java, Python, .NET&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda + RDS Proxy&lt;/td&gt;
&lt;td&gt;Lambda는 &lt;strong&gt;VPC 내 배포 필수&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront Functions 실행 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; 1ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda@Edge 실행 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5~10초&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront Functions 트리거&lt;/td&gt;
&lt;td&gt;Viewer &lt;strong&gt;Req/Res만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda@Edge 트리거&lt;/td&gt;
&lt;td&gt;Viewer/Origin &lt;strong&gt;Req/Res (4가지)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB Item 최대 크기&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAX 지연 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Microsecond&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAX 기본 TTL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5분&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAX vs ElastiCache&lt;/td&gt;
&lt;td&gt;DAX: 개별 Object / ElastiCache: &lt;strong&gt;집계 결과&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB Streams 보존&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24시간&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Tables 전제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB Streams 활성화&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Tables 방식&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Active-Active&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB PITR 최대&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export to S3 전제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PITR 활성화&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import from S3 결과&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;새 테이블 생성&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway Edge-Optimized ACM&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;us-east-1&lt;/strong&gt; 인증서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito User Pools 통합&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;API Gateway + ALB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito Identity Pools 결과물&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;임시 AWS 자격증명&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>🗄️ AWS Storage — Extended Services</title><link>https://tessa1217.github.io/posts/aws/aws-storage-extended/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-storage-extended/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🗄️ AWS Storage — Extended Services&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Snow Family · FSx · Storage Gateway · Transfer Family · DataSync&lt;/p&gt;
&lt;p&gt;Hybrid Cloud, Data Migration, High-Performance File Systems의 핵심 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#aws-snow-family&quot;&gt;AWS Snow Family&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#amazon-fsx&quot;&gt;Amazon FSx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-storage-gateway&quot;&gt;AWS Storage Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-transfer-family&quot;&gt;AWS Transfer Family&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#aws-datasync&quot;&gt;AWS DataSync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%A0%84%EC%B2%B4-storage-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%B9%84%EA%B5%90-storage-comparison&quot;&gt;전체 Storage 서비스 비교 (Storage Comparison)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;시험 자주 출제 포인트 총정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Snow Family&lt;/h2&gt;
&lt;h3&gt;⚠️ 중요: 단종(Discontinuation) 공지&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Effective November 12, 2024&lt;/strong&gt;: 구세대 Snowball Edge 모델 3종 단종&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snowball Edge Storage Optimized 80TB&lt;/li&gt;
&lt;li&gt;Snowball Edge Compute Optimized (52 vCPUs)&lt;/li&gt;
&lt;li&gt;Snowball Edge Compute Optimized with GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대부분의 Data Migration 워크로드에서 AWS DataSync를 대안으로 사용 권장&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Snow Family 개요&lt;/h3&gt;
&lt;p&gt;인터넷/네트워크를 통한 전송이 어렵거나 느린 경우 &lt;strong&gt;물리적 장치(Physical Device)를 통해 데이터를 오프라인으로 이전&lt;/strong&gt;하는 서비스.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;네트워크 전송의 문제점:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Limited connectivity      → 오지, 선박, 원격지에서 인터넷 없음
Limited bandwidth         → 대용량 데이터 전송에 수주~수개월 소요
High network cost         → 대역폭 비용 과다
Shared bandwidth          → 업무 트래픽과 경합
Connection instability    → 전송 중 연결 끊김 위험
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Rule of Thumb&lt;/strong&gt;: 네트워크로 전송 시 &lt;strong&gt;1주 이상&lt;/strong&gt; 걸린다면 → Snow Family 검토&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Snowball Edge&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Optimized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스토리지 중심, 최대 수백 TB&lt;/td&gt;
&lt;td&gt;Petabyte 규모 Data Migration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute Optimized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2, Lambda 실행 가능&lt;/td&gt;
&lt;td&gt;Edge Computing + Data Migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Edge Computing (엣지 컴퓨팅)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인터넷 연결이 제한되거나 없는 **현장(Edge Location)**에서 데이터 처리&lt;/li&gt;
&lt;li&gt;Snowball Edge를 현장에 배치하여 On-site Computing Power 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Edge Computing Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;현장 예시: 도로 위 트럭, 바다 위 선박, 지하 광산
사용 목적:
  - EC2 Instance 또는 Lambda 실행
  - 데이터 전처리 (Preprocessing)
  - Machine Learning Inference
  - 미디어 트랜스코딩 (Media Transcoding)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Snowball → S3 → Glacier 아키텍처&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 포인트&lt;/strong&gt;: Snowball로 Glacier에 &lt;strong&gt;직접 import 불가&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[Snowball 장치] → Import → [Amazon S3] → Lifecycle Policy → [Amazon Glacier]
                                          (자동 전환)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Snowball로 데이터를 S3로 먼저 import한 뒤, &lt;strong&gt;S3 Lifecycle Policy&lt;/strong&gt;를 이용해 Glacier로 전환해야 함.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Snow Family 서비스 선택 가이드&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;용량&lt;/th&gt;
&lt;th&gt;형태&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Snowball Edge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수십~수백 TB&lt;/td&gt;
&lt;td&gt;가방 크기 장치&lt;/td&gt;
&lt;td&gt;Petabyte 이하 Migration, Edge Computing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Snowmobile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최대 100 PB (Exabyte)&lt;/td&gt;
&lt;td&gt;45피트 트럭 컨테이너&lt;/td&gt;
&lt;td&gt;Data Center 전체 이전&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Snowmobile: 10 PB 이상의 대규모 Migration에 Snowball보다 효율적&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Amazon FSx&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS에서 &lt;strong&gt;3rd-party High-Performance File System&lt;/strong&gt;을 완전 관리형으로 제공&lt;/li&gt;
&lt;li&gt;NFS, SMB, Lustre 등 기존 프로토콜 그대로 사용 가능 → On-premises 워크로드를 클라우드로 Lift-and-Shift&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx for Windows File Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows 환경을 위한 완전 관리형 공유 파일 시스템&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;핵심 지원 기능:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SMB Protocol&lt;/strong&gt; + &lt;strong&gt;Windows NTFS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Active Directory&lt;/strong&gt; 통합, ACL, 사용자 쿼터(User Quotas)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DFS (Distributed File System) Namespaces&lt;/strong&gt;: 여러 파일 시스템을 하나로 묶어 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량/성능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수십 GB/s, 수백만 IOPS, 수백 PB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux 지원&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Linux EC2 Instance에서도 마운트 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-premises 접근&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ VPN 또는 Direct Connect 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High Availability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-AZ 구성 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;백업&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;일별 S3 자동 백업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Storage Options:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저지연, 고IOPS&lt;/td&gt;
&lt;td&gt;DB, 미디어 처리, 데이터 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HDD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저비용, 높은 처리량&lt;/td&gt;
&lt;td&gt;홈 디렉터리, CMS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx for Lustre&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux 기반 병렬 분산 파일 시스템 (Parallel Distributed File System)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이름 유래: &lt;strong&gt;&quot;Linux&quot;&lt;/strong&gt; + &lt;strong&gt;&quot;cluster&quot;&lt;/strong&gt; = &lt;strong&gt;Lustre&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;*HPC(High Performance Computing)**를 위한 최고 성능 파일 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수백 GB/s, 수백만 IOPS, Sub-millisecond Latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 통합&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3를 파일 시스템처럼 Read 가능, 연산 결과를 S3로 Write 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-premises 접근&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ VPN 또는 Direct Connect 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Storage Options:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저지연, 랜덤 I/O&lt;/td&gt;
&lt;td&gt;소규모 랜덤 파일 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HDD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;고처리량, 순차 I/O&lt;/td&gt;
&lt;td&gt;대규모 순차 파일 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Primary Use Cases:&lt;/strong&gt; Machine Learning, HPC, Video Processing, Financial Modeling, Electronic Design Automation (EDA)&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx for Lustre — File System Deployment Options&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 포인트&lt;/strong&gt;: Scratch vs Persistent 차이를 명확히 구분&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Scratch File System&lt;/th&gt;
&lt;th&gt;Persistent File System&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;임시 저장소&lt;/td&gt;
&lt;td&gt;장기 저장소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 복제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 없음 (서버 장애 시 데이터 소실)&lt;/td&gt;
&lt;td&gt;✅ 동일 AZ 내 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;장애 복구&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;분 단위 자동 복구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6x 더 빠름 (200 MBps/TiB Burst)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;표준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;단기 처리, 비용 최적화&lt;/td&gt;
&lt;td&gt;장기 처리, 민감 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx for NetApp ONTAP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NetApp ONTAP을 AWS에서 완전 관리형으로 제공&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기존 ONTAP 또는 NAS(Network-Attached Storage) 환경 워크로드를 AWS로 이전 시 최적&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 프로토콜&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NFS, SMB, iSCSI&lt;/strong&gt; (3종 동시 지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS 호환성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux, Windows, macOS, VMware Cloud on AWS, EC2, ECS, EKS 등 폭넓게 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스토리지 자동 축소/확장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snapshots, Replication, 압축(Compression), 중복 제거(Deduplication)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;클로닝&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Point-in-time Instantaneous Cloning&lt;/strong&gt; (새 워크로드 테스트에 유용)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx for OpenZFS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenZFS 파일 시스템을 AWS에서 완전 관리형으로 제공&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기존 ZFS 기반 워크로드를 AWS로 이전 시 최적&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지원 프로토콜&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NFS&lt;/strong&gt; (v3, v4, v4.1, v4.2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최대 &lt;strong&gt;1,000,000 IOPS&lt;/strong&gt;, &lt;strong&gt;0.5ms 미만&lt;/strong&gt; Latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snapshots, 압축(Compression), &lt;strong&gt;Point-in-time Instantaneous Cloning&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;FSx 선택 가이드&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Windows 파일 서버 필요 (SMB, AD 연동)     → FSx for Windows File Server
Linux HPC, ML, 대규모 병렬 처리           → FSx for Lustre
NFS + SMB + iSCSI 동시 지원, ONTAP 이전  → FSx for NetApp ONTAP
ZFS 이전, 초고속 NFS (100만 IOPS)        → FSx for OpenZFS
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Storage Gateway&lt;/h2&gt;
&lt;h3&gt;Hybrid Cloud for Storage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;On-premises ↔ AWS 클라우드 간 브릿지(Bridge)&lt;/strong&gt; 역할&lt;/li&gt;
&lt;li&gt;S3는 독점 스토리지 기술 (NFS처럼 표준 프로토콜이 아님) → On-premises에서 직접 접근 불가 → &lt;strong&gt;Storage Gateway가 해결&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt; Disaster Recovery, Backup &amp;amp; Restore, Tiered Storage, On-premises Cache &amp;amp; Low-latency File Access&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;S3 File Gateway&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On-premises 애플리케이션이 &lt;strong&gt;NFS / SMB 프로토콜&lt;/strong&gt;로 S3에 접근하도록 지원&lt;/li&gt;
&lt;li&gt;최근 사용 데이터는 File Gateway에 &lt;strong&gt;로컬 캐시&lt;/strong&gt; → 빠른 접근 속도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;지원 S3 Storage Classes:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;✅ S3 Standard
✅ S3 Standard-IA
✅ S3 One Zone-IA
✅ S3 Intelligent-Tiering
❌ S3 Glacier 직접 지원 안 함
   → Lifecycle Policy로 S3에서 Glacier로 전환
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;SMB + Active Directory 통합:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMB Protocol 사용 시 &lt;strong&gt;Microsoft AD&lt;/strong&gt;로 사용자 인증 가능&lt;/li&gt;
&lt;li&gt;Bucket별로 &lt;strong&gt;IAM Role&lt;/strong&gt; 기반 접근 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Volume Gateway&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iSCSI Protocol&lt;/strong&gt;을 통한 Block Storage 제공 (S3 백업)&lt;/li&gt;
&lt;li&gt;EBS Snapshot으로 On-premises 볼륨 복원 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;데이터 위치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cached Volumes&lt;/strong&gt; (캐시 볼륨)&lt;/td&gt;
&lt;td&gt;최근 데이터만 로컬 캐시, 전체는 S3&lt;/td&gt;
&lt;td&gt;주 데이터: S3 / 캐시: On-premises&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stored Volumes&lt;/strong&gt; (저장 볼륨)&lt;/td&gt;
&lt;td&gt;전체 데이터셋 On-premises, S3에 주기적 백업&lt;/td&gt;
&lt;td&gt;주 데이터: On-premises / 백업: S3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Tape Gateway&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;물리 테이프 기반 백업 프로세스를 사용하는 기업을 위한 &lt;strong&gt;Virtual Tape Library(VTL)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기존 테이프 방식의 백업 소프트웨어(iSCSI Interface)를 그대로 사용하면서 클라우드로 이전&lt;/li&gt;
&lt;li&gt;백업 데이터: &lt;strong&gt;Amazon S3 + Glacier&lt;/strong&gt; 백업&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[On-premises Backup Software] → iSCSI → [Tape Gateway] → [S3 / Glacier]
(기존 테이프 프로세스 유지)                 (가상 테이프 라이브러리)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;지원 백업 소프트웨어&lt;/strong&gt;: Veeam, Backup Exec, NetBackup 등 주요 벤더 호환&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Storage Gateway 유형 선택 가이드&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NFS/SMB로 S3 접근 (파일 공유)           → S3 File Gateway
iSCSI Block Storage + S3 백업           → Volume Gateway
  ├── 전체 On-premises 저장 + 스케줄 백업   → Stored Volumes
  └── 최근 데이터 캐시 + 나머지는 S3       → Cached Volumes
기존 테이프 백업 소프트웨어 그대로 유지    → Tape Gateway
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS Transfer Family&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Amazon S3 또는 Amazon EFS로의 파일 전송을 위한 &lt;strong&gt;완전 관리형 FTP 서비스&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;기존 FTP 기반 파일 교환 인프라를 AWS로 이전할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;지원 프로토콜&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로토콜&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;보안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Transfer Protocol&lt;/td&gt;
&lt;td&gt;❌ 비암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FTPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FTP over SSL&lt;/td&gt;
&lt;td&gt;✅ SSL 암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SFTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure File Transfer Protocol (SSH 기반)&lt;/td&gt;
&lt;td&gt;✅ SSH 암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인프라&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;완전 관리형, Scalable, Reliable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;가용성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;과금&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provisioned Endpoint 시간당 요금 + 데이터 전송(GB) 요금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인증 통합&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft AD, LDAP, Okta, Amazon Cognito, Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;저장 대상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon S3 또는 Amazon EFS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt; 파일 공유(File Sharing), 공개 데이터셋 배포, CRM, ERP 시스템 연동&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;AWS DataSync&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;대용량 데이터를 자동화하여 빠르게 전송&lt;/strong&gt;하는 온라인 데이터 이전 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;전송 방향&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방향&lt;/th&gt;
&lt;th&gt;Agent 필요 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-premises → AWS&lt;/strong&gt; (NFS, SMB, HDFS, S3 API 등)&lt;/td&gt;
&lt;td&gt;✅ DataSync Agent 설치 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;다른 Cloud → AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Agent 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS → AWS&lt;/strong&gt; (Storage 서비스 간)&lt;/td&gt;
&lt;td&gt;❌ Agent 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;지원 대상 스토리지&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;DataSync가 동기화할 수 있는 AWS 서비스:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Amazon S3  (모든 Storage Class, Glacier 포함)
Amazon EFS
Amazon FSx for Windows File Server
Amazon FSx for Lustre
Amazon FSx for NetApp ONTAP
Amazon FSx for OpenZFS
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;핵심 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;속도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent 1개로 최대 &lt;strong&gt;10 Gbps&lt;/strong&gt; 활용 (Bandwidth Throttle 설정 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케줄링&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시간별(Hourly), 일별(Daily), 주별(Weekly) 예약 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메타데이터 보존&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;File Permissions + Metadata 그대로 유지&lt;/strong&gt; (NFS POSIX, SMB 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;무결성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전송 중 및 완료 후 데이터 무결성 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;재시도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실패한 전송 자동 재시도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;DataSync vs Storage Gateway — 실무 패턴&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 핵심 패턴&lt;/strong&gt;: 두 서비스를 함께 쓰는 것이 Best Practice&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Phase 1 — 초기 Data Migration:
  [On-premises NFS] → [DataSync Agent] → [Amazon S3 / EFS]
  (대용량 데이터를 빠르게 일회성 또는 반복 이전)

Phase 2 — 지속적 On-premises 접근 유지:
  [On-premises App] → [S3 File Gateway] → [Amazon S3]
  (마이그레이션 후에도 On-premises 앱이 로컬처럼 접근)
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;DataSync&lt;/th&gt;
&lt;th&gt;Storage Gateway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주요 목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;데이터 이전(Migration) 및 동기화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;On-premises ↔ AWS 지속적 연동&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 시점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;초기 대량 이전, 정기 배치 동기화&lt;/td&gt;
&lt;td&gt;이전 완료 후 지속적 Hybrid 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;프로토콜&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NFS, SMB, HDFS, S3 API 등&lt;/td&gt;
&lt;td&gt;NFS, SMB, iSCSI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;캐시&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ 로컬 캐시 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;전체 Storage 서비스 비교 (Storage Comparison)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;분류&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;핵심 키워드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Object Storage&lt;/td&gt;
&lt;td&gt;범용 객체 스토리지&lt;/td&gt;
&lt;td&gt;Buckets, Keys, 11 9&apos;s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Glacier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Object Archival&lt;/td&gt;
&lt;td&gt;장기 아카이브, 저비용&lt;/td&gt;
&lt;td&gt;Vault, 최소 90~180일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EBS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block Storage&lt;/td&gt;
&lt;td&gt;EC2 1:1 네트워크 드라이브&lt;/td&gt;
&lt;td&gt;AZ-bound, Snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instance Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block Storage&lt;/td&gt;
&lt;td&gt;EC2 직결 물리 디스크, 임시&lt;/td&gt;
&lt;td&gt;Ephemeral, 최고 IOPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Storage&lt;/td&gt;
&lt;td&gt;Linux 멀티 인스턴스 공유 NFS&lt;/td&gt;
&lt;td&gt;POSIX, Multi-AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Storage&lt;/td&gt;
&lt;td&gt;Windows SMB, AD 통합&lt;/td&gt;
&lt;td&gt;NTFS, DFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for Lustre&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Storage&lt;/td&gt;
&lt;td&gt;Linux HPC 병렬 파일 시스템&lt;/td&gt;
&lt;td&gt;Sub-ms, S3 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for NetApp ONTAP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Storage&lt;/td&gt;
&lt;td&gt;NFS+SMB+iSCSI 멀티 프로토콜&lt;/td&gt;
&lt;td&gt;광범위 OS 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FSx for OpenZFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Storage&lt;/td&gt;
&lt;td&gt;ZFS 관리형, 초고속 NFS&lt;/td&gt;
&lt;td&gt;100만 IOPS, 0.5ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;On-premises ↔ Cloud 브릿지&lt;/td&gt;
&lt;td&gt;S3 File/Volume/Tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transfer Family&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Transfer&lt;/td&gt;
&lt;td&gt;FTP/FTPS/SFTP 관리형&lt;/td&gt;
&lt;td&gt;FTP 프로토콜, S3/EFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DataSync&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Transfer&lt;/td&gt;
&lt;td&gt;자동화 온라인 데이터 이전&lt;/td&gt;
&lt;td&gt;Agent, 10Gbps, 스케줄링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Snow Family&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Physical Transfer&lt;/td&gt;
&lt;td&gt;오프라인 대용량 이전&lt;/td&gt;
&lt;td&gt;오지/단절 환경, Petabyte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트 총정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Snowball → Glacier&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;직접 import 불가&lt;/strong&gt; → S3 먼저 import → Lifecycle Policy로 Glacier 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;1주 이상 걸리면&quot;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Snow Family&lt;/strong&gt; 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snow Family 대안 (2024~)&lt;/td&gt;
&lt;td&gt;대부분 &lt;strong&gt;AWS DataSync&lt;/strong&gt; 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowmobile 기준&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10 PB 이상&lt;/strong&gt; 대규모 Migration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FSx for Windows 특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SMB + NTFS + AD 통합&lt;/strong&gt;, Linux EC2에서도 마운트 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FSx for Lustre 이름&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Linux + cluster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FSx Scratch vs Persistent&lt;/td&gt;
&lt;td&gt;Scratch: 데이터 복제 없음, 6x 빠름 / Persistent: AZ 내 복제, 분 단위 복구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FSx for NetApp ONTAP 프로토콜&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NFS + SMB + iSCSI&lt;/strong&gt; 동시 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FSx for OpenZFS 성능&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,000,000 IOPS, &amp;lt;0.5ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetApp ONTAP &amp;amp; OpenZFS 공통 기능&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Point-in-time Instantaneous Cloning&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 File Gateway Glacier&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;직접 지원 안 함&lt;/strong&gt; → Lifecycle Policy 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 File Gateway + SMB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Active Directory 사용자 인증&lt;/strong&gt; 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volume Gateway Cached&lt;/td&gt;
&lt;td&gt;최근 데이터 로컬 캐시, 전체는 &lt;strong&gt;S3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volume Gateway Stored&lt;/td&gt;
&lt;td&gt;전체 On-premises, 주기적 &lt;strong&gt;S3 백업&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tape Gateway&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Virtual Tape Library&lt;/strong&gt;, 기존 테이프 소프트웨어 그대로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataSync Agent&lt;/td&gt;
&lt;td&gt;On-premises → AWS 전송 시 &lt;strong&gt;필수&lt;/strong&gt;, AWS → AWS는 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataSync 속도&lt;/td&gt;
&lt;td&gt;Agent 1개당 최대 &lt;strong&gt;10 Gbps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataSync 스케줄&lt;/td&gt;
&lt;td&gt;시간별 / 일별 / &lt;strong&gt;주별&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataSync 메타데이터&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;File Permissions + Metadata 보존&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataSync + File Gateway&lt;/td&gt;
&lt;td&gt;초기 이전은 DataSync, 이후 지속 접근은 &lt;strong&gt;File Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer Family 저장 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3 또는 EFS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer Family 프로토콜&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FTP, FTPS, SFTP&lt;/strong&gt; (3가지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer Family 인증&lt;/td&gt;
&lt;td&gt;AD, LDAP, Okta, Cognito, Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/datasync/latest/userguide/what-is-datasync.html&quot;&gt;AWS DataSync 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html&quot;&gt;Amazon FSx 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/storagegateway/latest/userguide/WhatIsStorageGateway.html&quot;&gt;AWS Storage Gateway 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/transfer/latest/userguide/what-is-aws-transfer-family.html&quot;&gt;AWS Transfer Family 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/snowball/latest/developer-guide/whatisedge.html&quot;&gt;Snow Family 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🔐 AWS S3 Security</title><link>https://tessa1217.github.io/posts/aws/aws-security/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-security/</guid><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🔐 AWS S3 Security&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;S3 보안의 모든 것 — Encryption, Access Control, Data Protection&lt;/p&gt;
&lt;p&gt;AWS SAA 시험에서 S3 관련 문제의 절반 이상이 이 파일의 내용에서 출제됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-s3-encryption-overview&quot;&gt;S3 Encryption Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-sse-s3-s3-managed-keys&quot;&gt;SSE-S3 (S3-Managed Keys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-sse-kms-kms-managed-keys&quot;&gt;SSE-KMS (KMS-Managed Keys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-sse-c-customer-provided-keys&quot;&gt;SSE-C (Customer-Provided Keys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-dsse-kms-dual-layer-sse&quot;&gt;DSSE-KMS (Dual-Layer SSE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-client-side-encryption-cse&quot;&gt;Client-Side Encryption (CSE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-encryption-in-transit&quot;&gt;Encryption in Transit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-default-encryption-vs-bucket-policy-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84&quot;&gt;Default Encryption vs. Bucket Policy 우선순위&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-s3-bucket-key&quot;&gt;S3 Bucket Key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-s3-access-logs&quot;&gt;S3 Access Logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-pre-signed-urls&quot;&gt;Pre-signed URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-mfa-delete&quot;&gt;MFA Delete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-s3-object-lock-glacier-vault-lock&quot;&gt;S3 Object Lock &amp;amp; Glacier Vault Lock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-cors-cross-origin-resource-sharing&quot;&gt;CORS (Cross-Origin Resource Sharing)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#15-s3-access-points&quot;&gt;S3 Access Points&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#16-s3-object-lambda&quot;&gt;S3 Object Lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#17-vpc-endpoint-for-s3&quot;&gt;VPC Endpoint for S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#18-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD--%EC%8B%9C%ED%97%98-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;핵심 요약 &amp;amp; 시험 포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. S3 Encryption Overview&lt;/h2&gt;
&lt;h3&gt;암호화 유형 한눈에 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;키 관리 주체&lt;/th&gt;
&lt;th&gt;키 저장&lt;/th&gt;
&lt;th&gt;요청 Header&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSE-S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;AWS 내부&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-amz-server-side-encryption: AES256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;기본값, 무료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSE-KMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS KMS&lt;/td&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-amz-server-side-encryption: aws:kms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CloudTrail 감사, 추가 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DSSE-KMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS KMS&lt;/td&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-amz-server-side-encryption: aws:kms:dsse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;이중 암호화, 규정 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSE-C&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Customer&lt;/td&gt;
&lt;td&gt;Customer (AWS에 저장 안 함)&lt;/td&gt;
&lt;td&gt;HTTPS 필수, 매 요청마다 키 전달&lt;/td&gt;
&lt;td&gt;고객 완전 통제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Customer&lt;/td&gt;
&lt;td&gt;Customer&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;업로드 전 클라이언트 측 암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;선택 가이드:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;별도 요구사항 없음                → SSE-S3 (기본값)
키 사용 감사 로그 필요 (규정 준수)  → SSE-KMS (Customer Managed Key)
이중 암호화 규정 준수 필요         → DSSE-KMS
키를 완전히 직접 통제             → SSE-C
AWS가 원본 데이터를 절대 보면 안 됨 → Client-Side Encryption
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. SSE-S3 (S3-Managed Keys)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS가 키를 완전히 생성, 관리, 교체 — 사용자 개입 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AES-256&lt;/strong&gt; 알고리즘 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2023년 1월 5일부터 모든 신규 Object에 기본 자동 적용&lt;/strong&gt; (추가 비용 없음)&lt;/li&gt;
&lt;li&gt;Cross-Account 공유 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;요청 방법:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PUT /my-object HTTP/1.1
x-amz-server-side-encryption: AES256
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bucket Policy로 SSE-S3 강제 예시:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Effect&quot;: &quot;Deny&quot;,
    &quot;Principal&quot;: &quot;*&quot;,
    &quot;Action&quot;: &quot;s3:PutObject&quot;,
    &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;,
    &quot;Condition&quot;: {
        &quot;StringNotEquals&quot;: {
            &quot;s3:x-amz-server-side-encryption&quot;: &quot;AES256&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. SSE-KMS (KMS-Managed Keys)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWS KMS(Key Management Service)를 통해 키 관리&lt;/li&gt;
&lt;li&gt;SSE-S3 대비 &lt;strong&gt;추가적인 제어와 감사 기능&lt;/strong&gt; 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SSE-KMS 장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키 사용 이력 → &lt;strong&gt;AWS CloudTrail에 자동 기록&lt;/strong&gt; (언제, 누가, 어떤 Key로 접근했는지)&lt;/li&gt;
&lt;li&gt;Customer Managed Key (CMK) 생성/교체/비활성화 직접 제어&lt;/li&gt;
&lt;li&gt;Cross-Account 접근 세밀한 권한 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SSE-KMS 단점 (시험 포인트):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upload 시 &lt;code&gt;GenerateDataKey&lt;/code&gt; KMS API 호출&lt;/li&gt;
&lt;li&gt;Download 시 &lt;code&gt;Decrypt&lt;/code&gt; KMS API 호출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KMS 쿼터 제한&lt;/strong&gt;: 리전별 5,500 / 10,000 / 30,000 req/s&lt;/li&gt;
&lt;li&gt;고처리량 환경에서 KMS 병목 발생 가능 → Service Quotas Console에서 증가 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;요청 방법:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PUT /my-object HTTP/1.1
x-amz-server-side-encryption: aws:kms
x-amz-server-side-encryption-aws-kms-key-id: arn:aws:kms:...  (선택, 생략 시 AWS Managed Key 사용)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bucket Policy로 SSE-KMS 강제 예시:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Effect&quot;: &quot;Deny&quot;,
    &quot;Principal&quot;: &quot;*&quot;,
    &quot;Action&quot;: &quot;s3:PutObject&quot;,
    &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;,
    &quot;Condition&quot;: {
        &quot;StringNotEquals&quot;: {
            &quot;s3:x-amz-server-side-encryption&quot;: &quot;aws:kms&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Cross-Account 고려사항:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Managed Key (aws/s3): 같은 계정에서만 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다른 계정과 SSE-KMS 데이터 공유&lt;/strong&gt;: 반드시 &lt;strong&gt;Customer Managed Key(CMK)&lt;/strong&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. SSE-C (Customer-Provided Keys)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;고객이 키를 직접 생성/관리, AWS는 &lt;strong&gt;암호화/복호화 작업만&lt;/strong&gt; 수행&lt;/li&gt;
&lt;li&gt;AWS는 키를 &lt;strong&gt;저장하지 않음&lt;/strong&gt; — 요청 처리 후 즉시 메모리에서 삭제&lt;/li&gt;
&lt;li&gt;고객이 키 분실 시 데이터 복구 &lt;strong&gt;완전 불가&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;필수 요건:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;반드시 HTTPS&lt;/strong&gt; 사용 (HTTP 요청 시 S3가 거부)&lt;/li&gt;
&lt;li&gt;모든 Upload/Download 요청마다 HTTP Header로 키 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;PUT /my-object HTTP/1.1
x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-server-side-encryption-customer-key: [Base64 인코딩된 키]
x-amz-server-side-encryption-customer-key-MD5: [키의 MD5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
⚠️ AWS 콘솔에서 SSE-C 객체 접근 불가 (CLI/SDK만 가능 — 키를 매번 전달해야 하므로)
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. DSSE-KMS (Dual-Layer SSE)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;KMS 키를 사용한 &lt;strong&gt;이중(Dual-Layer) 서버 사이드 암호화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AES-256을 &lt;strong&gt;두 번&lt;/strong&gt; 독립적으로 적용:
&lt;ol&gt;
&lt;li&gt;AWS KMS Data Encryption Key로 1차 암호화&lt;/li&gt;
&lt;li&gt;별도 S3 관리 암호화 키로 2차 암호화&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;엄격한 규정 준수(Compliance) 요구사항이 있는 환경용&lt;/li&gt;
&lt;li&gt;SSE-KMS보다 높은 비용 및 지연 시간 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Client-Side Encryption (CSE)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 S3에 Upload하기 &lt;strong&gt;전&lt;/strong&gt; 클라이언트 측에서 직접 암호화&lt;/li&gt;
&lt;li&gt;AWS SDK의 &lt;strong&gt;Amazon S3 Client-Side Encryption Library&lt;/strong&gt; 활용&lt;/li&gt;
&lt;li&gt;AWS는 암호화된 데이터만 수신 — &lt;strong&gt;원본 데이터에 접근 불가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;고객이 키와 암호화 라이프사이클 &lt;strong&gt;완전 관리&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[클라이언트]                    [S3]
  원본 데이터
      │ 클라이언트 측 암호화
      ▼
  암호화된 데이터  ──HTTPS──→  암호화된 데이터 저장
                              (S3는 내용 모름)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Encryption in Transit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3는 두 가지 Endpoint 제공:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP Endpoint&lt;/strong&gt;: 암호화 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS Endpoint&lt;/strong&gt;: In-flight Encryption (SSL/TLS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTTPS 권장, &lt;strong&gt;SSE-C에서는 HTTPS 필수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;대부분의 클라이언트/SDK는 기본적으로 HTTPS 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTTPS 강제 (aws:SecureTransport)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [{
        &quot;Effect&quot;: &quot;Deny&quot;,
        &quot;Principal&quot;: &quot;*&quot;,
        &quot;Action&quot;: &quot;s3:*&quot;,
        &quot;Resource&quot;: [
            &quot;arn:aws:s3:::my-bucket&quot;,
            &quot;arn:aws:s3:::my-bucket/*&quot;
        ],
        &quot;Condition&quot;: {
            &quot;Bool&quot;: {
                &quot;aws:SecureTransport&quot;: &quot;false&quot;
            }
        }
    }]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
&lt;code&gt;aws:SecureTransport: false&lt;/code&gt;를 Deny하면 HTTP 요청 차단. Bucket과 Object 모두 Resource에 포함해야 함.
:::&lt;/h2&gt;
&lt;h2&gt;8. Default Encryption vs. Bucket Policy 우선순위&lt;/h2&gt;
&lt;p&gt;:::tip
&lt;strong&gt;Bucket Policy가 Default Encryption보다 먼저 평가됨&lt;/strong&gt;
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Object Upload 요청
        │
        ▼
1️⃣ Bucket Policy 평가
   (Deny 조건에 해당하면 요청 거부)
        │ Policy 통과
        ▼
2️⃣ Default Encryption 적용
   (Header 없으면 기본 암호화 설정으로 처리)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;실제 시나리오:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Default Encryption을 SSE-KMS로 설정해도, Bucket Policy에서 &lt;code&gt;aws:kms&lt;/code&gt; Header가 없는 요청을 Deny하면 &lt;strong&gt;정책이 우선 적용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-amz-server-side-encryption&lt;/code&gt; Header 없이 Upload하면 → Default Encryption 적용 (SSE-S3 또는 SSE-KMS)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;9. S3 Bucket Key&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSE-KMS 사용 시 KMS API 호출 횟수를 줄이기 위한 기능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bucket Key가 활성화되면:
&lt;ul&gt;
&lt;li&gt;S3가 버킷 레벨에서 단기 Bucket-level KMS Key를 생성&lt;/li&gt;
&lt;li&gt;개별 Object마다 KMS 호출 대신 Bucket Key로 Data Key 생성&lt;/li&gt;
&lt;li&gt;KMS 호출 수 대폭 감소 → &lt;strong&gt;비용 절감 + CloudTrail 로그 감소&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Bucket Key 비활성화:
  Object 1  →  KMS API Call  →  Data Key 1
  Object 2  →  KMS API Call  →  Data Key 2
  Object 3  →  KMS API Call  →  Data Key 3  (많은 KMS 비용)

Bucket Key 활성화:
  Bucket  →  KMS API Call  →  Bucket Key
    Object 1  →  (Bucket Key로)  →  Data Key 1
    Object 2  →  (Bucket Key로)  →  Data Key 2
    Object 3  →  (Bucket Key로)  →  Data Key 3  (KMS 비용 대폭 감소)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;10. S3 Access Logs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;감사(Audit) 목적으로 S3에 대한 &lt;strong&gt;모든 요청을 다른 S3 Bucket에 로그&lt;/strong&gt;로 기록&lt;/li&gt;
&lt;li&gt;어떤 계정, 어떤 요청(인가 여부 포함)이든 모두 기록&lt;/li&gt;
&lt;li&gt;로그 데이터를 Athena 등 데이터 분석 도구로 분석 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로깅 대상 Bucket과 로그 저장 Bucket은 같은 AWS Region에 있어야 함&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
❌ 절대 금지: 모니터링 대상 Bucket = 로그 저장 Bucket
→ Logging Loop 발생 → Bucket 크기 지수적 증가&lt;/p&gt;
&lt;h2&gt;✅ 올바른 구성:
[모니터링 Bucket]  →  Access Logs  →  [별도 Logging Bucket]
:::&lt;/h2&gt;
&lt;h2&gt;11. Pre-signed URLs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;제한된 시간 동안만 유효&lt;/strong&gt;한 S3 객체 접근 URL&lt;/li&gt;
&lt;li&gt;S3 Console, AWS CLI, SDK로 생성 가능&lt;/li&gt;
&lt;li&gt;URL을 받은 사용자는 &lt;strong&gt;URL 생성자의 권한(Permission)을 그대로 상속&lt;/strong&gt; (GET/PUT)&lt;/li&gt;
&lt;li&gt;Bucket을 Public으로 열지 않고 &lt;strong&gt;일시적으로 특정 사용자에게 접근 허용&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;유효 시간&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;생성 방법&lt;/th&gt;
&lt;th&gt;유효 시간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 Console&lt;/td&gt;
&lt;td&gt;최소 1분, 최대 &lt;strong&gt;12시간 (720분)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CLI&lt;/td&gt;
&lt;td&gt;기본 3,600초, 최대 &lt;strong&gt;604,800초 (7일)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;활용 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[앱 서버] ─ Pre-signed URL 생성 ─→ [사용자 브라우저]
                                          │
                                          ▼
                                    [S3 객체 직접 접근]
                                    (Bucket은 Private 유지,
                                     유효 시간 내에만 접근 가능)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로그인한 사용자에게만 프리미엄 영상 다운로드 허용&lt;/li&gt;
&lt;li&gt;동적으로 생성되는 업로드 URL (사용자 Profile 이미지 업로드)&lt;/li&gt;
&lt;li&gt;일시적인 파일 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;12. MFA Delete&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Versioning이 활성화된 Bucket에서 중요 작업 시 &lt;strong&gt;MFA(Multi-Factor Authentication) 코드 요구&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MFA가 필요한 작업&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;✅ MFA 필요:
  - Object Version 영구 삭제 (Permanently delete an object version)
  - Versioning 비활성화 또는 Suspend

❌ MFA 불필요:
  - Versioning 활성화
  - Delete Marker 추가 (= 일반 Delete 작업)
  - Version 목록 조회
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;설정 규칙&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;설정 가능 주체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bucket Owner (Root 계정)만&lt;/strong&gt; 가능 — IAM User 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전제 조건&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bucket에 &lt;strong&gt;Versioning 활성화&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;설정 방법&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI 또는 SDK만 가능 (Console 미지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;13. S3 Object Lock &amp;amp; Glacier Vault Lock&lt;/h2&gt;
&lt;h3&gt;S3 Object Lock&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WORM (Write Once Read Many)&lt;/strong&gt; 모델 적용&lt;/li&gt;
&lt;li&gt;지정된 기간 동안 Object Version 삭제/수정 불가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versioning 활성화 필수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Retention Mode 비교:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;Root 포함 삭제 가능?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;어떤 사용자도(Root 포함) 수정/삭제 불가. 보존 기간 단축 불가&lt;/td&gt;
&lt;td&gt;❌ 절대 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대부분 사용자는 불가. &lt;code&gt;s3:BypassGovernanceRetention&lt;/code&gt; 권한 보유자만 가능&lt;/td&gt;
&lt;td&gt;✅ 특별 권한자만&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Retention Period:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object를 고정 기간 동안 보호&lt;/li&gt;
&lt;li&gt;기간 연장(Extend)은 가능, 단축(Shorten)은 Compliance Mode에서 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Legal Hold:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;보존 기간과 무관하게 &lt;strong&gt;무기한 잠금&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s3:PutObjectLegalHold&lt;/code&gt; IAM 권한으로 자유롭게 적용/해제 가능&lt;/li&gt;
&lt;li&gt;예: 소송 진행 중 증거 보전&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Glacier Vault Lock&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 Glacier Vault에 &lt;strong&gt;Vault Lock Policy (JSON)&lt;/strong&gt; 적용&lt;/li&gt;
&lt;li&gt;WORM 모델로 아카이브 데이터 보호&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한 번 Lock되면 누구도 정책 변경/삭제 불가&lt;/strong&gt; — Root 포함&lt;/li&gt;
&lt;li&gt;규정 준수(Compliance) 및 데이터 보존(Data Retention) 요구사항 충족&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Vault Lock Policy 작성]
        │
        ▼
[24시간 이내 검증 기간] ← 이 기간 중에만 정책 수정 가능
        │ 검증 완료 후 Lock 실행
        ▼
[정책 영구 잠금] ← 이후 절대 변경 불가
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;14. CORS (Cross-Origin Resource Sharing)&lt;/h2&gt;
&lt;h3&gt;기본 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Origin&lt;/strong&gt; = Scheme (Protocol) + Host (Domain) + Port
&lt;ul&gt;
&lt;li&gt;예: &lt;code&gt;https://example.com&lt;/code&gt; (scheme=https, host=example.com, port=443)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;웹 브라우저의 Same-Origin Policy: 다른 Origin의 리소스 요청 기본 차단&lt;/li&gt;
&lt;li&gt;CORS Headers로 다른 Origin에서의 요청 허용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Same Origin vs. Cross Origin&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Same Origin   (허용):  https://example.com/app1  →  https://example.com/app2
Cross Origin  (차단):  https://example.com        →  https://other.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;S3에서 CORS 설정이 필요한 경우&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;S3 정적 웹사이트에서 다른 S3 Bucket의 리소스 참조&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;웹 앱(다른 도메인)이 S3 Bucket의 파일을 직접 요청&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;CORS 설정 예시 (S3 Bucket에 적용)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;CORSConfiguration&amp;gt;
  &amp;lt;CORSRule&amp;gt;
    &amp;lt;AllowedOrigin&amp;gt;https://www.example.com&amp;lt;/AllowedOrigin&amp;gt;
    &amp;lt;AllowedMethod&amp;gt;GET&amp;lt;/AllowedMethod&amp;gt;
    &amp;lt;AllowedMethod&amp;gt;PUT&amp;lt;/AllowedMethod&amp;gt;
    &amp;lt;AllowedHeader&amp;gt;*&amp;lt;/AllowedHeader&amp;gt;
    &amp;lt;MaxAgeSeconds&amp;gt;3000&amp;lt;/MaxAgeSeconds&amp;gt;
  &amp;lt;/CORSRule&amp;gt;
&amp;lt;/CORSConfiguration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;AllowedOrigin&amp;gt;&lt;/code&gt;: 허용할 출처 (로 전체 허용 가능)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;AllowedMethod&amp;gt;&lt;/code&gt;: 허용할 HTTP 메서드&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;AllowedHeader&amp;gt;&lt;/code&gt;: 허용할 Header&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;MaxAgeSeconds&amp;gt;&lt;/code&gt;: Pre-flight 결과 캐시 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
CORS 설정은 &lt;strong&gt;리소스를 제공하는 Bucket&lt;/strong&gt; (파일이 있는 쪽)에 설정. 요청하는 쪽이 아님.
:::&lt;/h2&gt;
&lt;h2&gt;15. S3 Access Points&lt;/h2&gt;
&lt;h3&gt;개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 Bucket에 대한 &lt;strong&gt;독립적인 접근 포인트&lt;/strong&gt; 생성&lt;/li&gt;
&lt;li&gt;각 Access Point마다 &lt;strong&gt;고유한 DNS 이름 + 독립적인 Access Point Policy&lt;/strong&gt; 보유&lt;/li&gt;
&lt;li&gt;대규모 Bucket의 보안 관리 단순화 (Bucket Policy 복잡성 해소)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[S3 Bucket]
    │
    ├── [Access Point: /finance/*]
    │       Access Point Policy: Finance 팀만 읽기/쓰기
    │
    ├── [Access Point: /analytics/*]
    │       Access Point Policy: Analytics 팀만 읽기
    │
    └── [Access Point: /logs/*]
            Access Point Policy: Logging 서비스만 쓰기
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Access Point Policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bucket Policy와 유사한 JSON 형식&lt;/li&gt;
&lt;li&gt;Access Point Policy + Bucket Policy 모두 허용해야 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;VPC Origin (VPC 전용 Access Point)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[EC2 - Private VPC]
        │
        ▼
[VPC Endpoint (Gateway or Interface)]
        │
        ▼
[S3 Access Point (VPC Origin)]
        │
        ▼
[S3 Bucket]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;VPC 내부에서만 접근 가능한 Access Point 정의&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPC Endpoint 생성 필수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VPC Endpoint Policy에서 대상 Bucket과 Access Point에 대한 접근 허용 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;16. S3 Object Lambda&lt;/h2&gt;
&lt;h3&gt;개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3에서 Object를 반환할 때 &lt;strong&gt;Lambda Function이 데이터를 변환&lt;/strong&gt;한 후 반환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;원본 Object는 변경 없음&lt;/strong&gt; — 요청자에게만 변환된 결과 제공&lt;/li&gt;
&lt;li&gt;Bucket 1개로 여러 형태의 데이터 제공 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;아키텍처&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;                    [원본 S3 Bucket]
                           │
            ┌──────────────┼─────────────────┐
            │              │                 │
    [일반 Access Point] [Object Lambda   [Object Lambda
                          Access Point 1]   Access Point 2]
                               │                  │
                         [Lambda: PII         [Lambda: XML
                          Redaction]           → JSON 변환]
                               │                  │
                         [Analytics App]    [Modern App]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;주요 Use Cases&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PII Redaction&lt;/strong&gt; (개인정보 마스킹)&lt;/td&gt;
&lt;td&gt;분석용/비운영 환경에서 개인정보 제거 후 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Format Conversion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XML → JSON, CSV → Parquet 등 포맷 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Processing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;요청자에 맞게 이미지 리사이징, 워터마크 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;17. VPC Endpoint for S3&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3를 &lt;strong&gt;인터넷 경유 없이&lt;/strong&gt; VPC 내부에서 직접 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway Endpoint&lt;/strong&gt; 타입 사용 — &lt;strong&gt;무료&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Private Subnet의 EC2가 NAT Gateway 없이 S3 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;❌ 인터넷 경유 방식:
[EC2 - Private Subnet] → [NAT Gateway] → [Internet] → [S3]
              (NAT Gateway 비용 + 데이터 전송 비용 발생)

✅ VPC Gateway Endpoint 방식:
[EC2 - Private Subnet] → [VPC Gateway Endpoint] → [S3]
              (비용 없음, 인터넷 경유 없음)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;설정 구성요소:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route Table에 S3용 Prefix List 경로 추가 (자동)&lt;/li&gt;
&lt;li&gt;VPC Endpoint Policy로 접근 가능한 Bucket/Action 제한 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;:::tip
S3와 DynamoDB는 &lt;strong&gt;Gateway Endpoint&lt;/strong&gt; (무료). 다른 서비스는 Interface Endpoint (비용 발생).
:::&lt;/h2&gt;
&lt;h2&gt;18. 핵심 요약 &amp;amp; 시험 포인트&lt;/h2&gt;
&lt;h3&gt;암호화 결정 트리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;암호화 필요?
├── 아니요 → 그래도 SSE-S3 기본 적용됨 (2023년~)
└── 예
    ├── 키 감사 로그 필요? (CloudTrail)
    │   ├── 예 → SSE-KMS (CMK)
    │   │         KMS 쿼터 고려, S3 Bucket Key로 비용 절감
    │   └── 아니요 → SSE-S3 (무료, 간단)
    ├── 이중 암호화 규정 준수?  → DSSE-KMS
    ├── 키를 직접 통제/관리?   → SSE-C (HTTPS 필수)
    └── AWS가 원본 못 봐야 함?  → Client-Side Encryption
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;보안 레이어 평가 순서&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Object Upload 요청
    │
    1️⃣ Bucket Policy 평가 (Deny 조건 확인)
    │
    2️⃣ Default Encryption 적용 (Header 없으면 기본값)
    │
    3️⃣ IAM Policy 확인 (User/Role 권한)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 시험 자주 출제 포인트 총정리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 기본 암호화 (2023~)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SSE-S3 자동 적용&lt;/strong&gt;, 추가 비용 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-S3 Header&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-amz-server-side-encryption: AES256&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-KMS Header&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-amz-server-side-encryption: aws:kms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-C 필수 요건&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; (HTTP 요청 시 S3가 거부)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-C 키 저장&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS는 키 저장 안 함&lt;/strong&gt;, 매 요청 시 Header로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-KMS Cross-Account&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Customer Managed Key(CMK) 필수&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-KMS 병목&lt;/td&gt;
&lt;td&gt;KMS 쿼터 초과 가능, &lt;strong&gt;S3 Bucket Key로 KMS 호출 감소&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bucket Policy 평가&lt;/td&gt;
&lt;td&gt;Default Encryption보다 &lt;strong&gt;먼저 평가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS 강제 정책&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aws:SecureTransport: false&lt;/code&gt; → Deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Logs Loop 방지&lt;/td&gt;
&lt;td&gt;모니터링 Bucket ≠ 로그 저장 Bucket &lt;strong&gt;(절대 같아선 안 됨)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-signed URL 유효 기간&lt;/td&gt;
&lt;td&gt;Console &lt;strong&gt;12h&lt;/strong&gt; / CLI &lt;strong&gt;최대 7일 (604,800초)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-signed URL 권한&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;생성자의 권한 상속&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA Delete 설정 주체&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Root 계정(Bucket Owner)만&lt;/strong&gt; 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA Delete 전제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Versioning 활성화&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA Delete 필요 작업&lt;/td&gt;
&lt;td&gt;영구 버전 삭제, Versioning Suspend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA Delete 불필요 작업&lt;/td&gt;
&lt;td&gt;Versioning 활성화, Delete Marker 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object Lock 전제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Versioning 활성화&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance Mode&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Root 포함 누구도&lt;/strong&gt; 수정/삭제 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance Mode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s3:BypassGovernanceRetention&lt;/code&gt; 권한자만 수정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal Hold&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;보존 기간과 무관&lt;/strong&gt;, 무기한 잠금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glacier Vault Lock&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;한 번 Lock 후 변경 불가&lt;/strong&gt; (Root 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORS 설정 위치&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;리소스를 제공하는 Bucket&lt;/strong&gt;에 설정 (요청하는 쪽 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Points&lt;/td&gt;
&lt;td&gt;각자 &lt;strong&gt;독립 DNS + 독립 Policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC Access Point&lt;/td&gt;
&lt;td&gt;VPC Endpoint + Endpoint Policy 모두 설정 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Object Lambda&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;원본 변경 없음&lt;/strong&gt;, Lambda가 변환 후 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC Endpoint 타입&lt;/td&gt;
&lt;td&gt;S3, DynamoDB → &lt;strong&gt;Gateway Endpoint (무료)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html&quot;&gt;S3 Encryption 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html&quot;&gt;SSE-KMS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html&quot;&gt;S3 Object Lock 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html&quot;&gt;S3 Access Points 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/transforming-objects.html&quot;&gt;S3 Object Lambda 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock.html&quot;&gt;S3 Glacier Vault Lock 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🪣 Amazon S3 (Simple Storage Service)</title><link>https://tessa1217.github.io/posts/aws/aws-s3-1/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-s3-1/</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🪣 Amazon S3 (Simple Storage Service)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS의 핵심 빌딩 블록 — &lt;strong&gt;&quot;무한히 확장 가능한&quot; 객체 스토리지&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;내구성 99.999999999%(11 9&apos;s), 시험 전 영역에서 고빈도 출제&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-s3-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90&quot;&gt;S3 기본 개념&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-s3-%EB%B3%B4%EC%95%88-security-%EA%B0%9C%EC%9A%94&quot;&gt;S3 보안 (Security) 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EC%A0%95%EC%A0%81-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%ED%98%B8%EC%8A%A4%ED%8C%85-static-website-hosting&quot;&gt;정적 웹사이트 호스팅 (Static Website Hosting)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EB%B2%84%EC%A0%80%EB%8B%9D-versioning&quot;&gt;버저닝 (Versioning)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EB%B3%B5%EC%A0%9C-replication&quot;&gt;복제 (Replication)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%ED%81%B4%EB%9E%98%EC%8A%A4-storage-classes&quot;&gt;스토리지 클래스 (Storage Classes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-s3-lifecycle&quot;&gt;S3 Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EC%84%B1%EB%8A%A5-performance&quot;&gt;성능 (Performance)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-s3-batch-operations&quot;&gt;S3 Batch Operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-s3-event-notifications&quot;&gt;S3 Event Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-s3-analytics-storage-class-analysis&quot;&gt;S3 Analytics - Storage Class Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-s3-storage-lens&quot;&gt;S3 Storage Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-requester-pays&quot;&gt;Requester Pays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD-%EC%8B%9C%ED%97%98-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;핵심 요약 &amp;amp; 시험 포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. S3 기본 개념&lt;/h2&gt;
&lt;h3&gt;🪣 버킷 (Buckets)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;객체(파일)를 저장하는 컨테이너 (= 디렉터리)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;버킷 이름은 전 세계 모든 계정에서 고유&lt;/strong&gt; (Globally Unique Name)&lt;/li&gt;
&lt;li&gt;버킷은 &lt;strong&gt;리전(Region) 레벨&lt;/strong&gt;에서 생성됨 — 글로벌 서비스처럼 보이지만 실제는 리전별&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;버킷 이름 규칙:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;소문자, 숫자, 하이픈만 사용&lt;/li&gt;
&lt;li&gt;3~63자&lt;/li&gt;
&lt;li&gt;IP 주소 형태 불가&lt;/li&gt;
&lt;li&gt;소문자 또는 숫자로 시작&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xn--&lt;/code&gt; 접두사 불가, &lt;code&gt;s3alias&lt;/code&gt; 접미사 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📄 객체 (Objects)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;키 (Key)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;객체의 전체 경로 (prefix + 객체명)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 객체 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5TB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5GB 초과 업로드&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;멀티파트 업로드 (Multi-part Upload)&lt;/strong&gt; 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메타데이터&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;텍스트 키/값 쌍 (시스템 또는 사용자 정의)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;태그 (Tags)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;유니코드 키/값 쌍, &lt;strong&gt;최대 10개&lt;/strong&gt; (보안/라이프사이클 활용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;버저닝 활성화 시 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;s3://my-bucket/images/2025/photo.jpg
              └─────prefix──────┘└─name─┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::note
⚠️ S3에는 실제 &lt;strong&gt;&quot;디렉터리&quot; 개념이 없음&lt;/strong&gt; — 키의 슬래시(/)가 구조처럼 보이게 하는 것뿐.
:::&lt;/h2&gt;
&lt;h3&gt;🎯 주요 Use Cases&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;백업/스토리지, 재해 복구(DR), 아카이브, 하이브리드 클라우드 스토리지,
애플리케이션 호스팅, 미디어 호스팅, 데이터 레이크/빅데이터 분석,
소프트웨어 배포, 정적 웹사이트
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. S3 보안 (Security) 개요&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;🔐 &lt;strong&gt;상세 내용은 별도 파일 참고&lt;/strong&gt;: &lt;code&gt;AWS_S3_Security_Notes.md&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;(Encryption, Access Points, Object Lambda, MFA Delete, Object Lock, CORS, Pre-signed URL, Access Logs 포함)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;보안 정책 계층&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;레이어&lt;/th&gt;
&lt;th&gt;종류&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Policies&lt;/td&gt;
&lt;td&gt;특정 IAM User/Role에 API 허용 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bucket Policy&lt;/td&gt;
&lt;td&gt;Bucket-wide JSON 정책, Cross-Account 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Object/Bucket ACL&lt;/td&gt;
&lt;td&gt;세밀한 객체 단위 제어 (비활성화 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;계정 레벨&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block Public Access&lt;/td&gt;
&lt;td&gt;전체 계정 또는 버킷 단위 Public 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;접근 허용 조건 (IAM Principal이 S3 객체에 접근하려면):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(IAM 권한 ALLOW  OR  Resource Policy ALLOW)
            AND
       명시적 DENY 없음
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Bucket Policy 핵심 활용&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [{
        &quot;Sid&quot;: &quot;PublicRead&quot;,
        &quot;Effect&quot;: &quot;Allow&quot;,
        &quot;Principal&quot;: &quot;*&quot;,
        &quot;Action&quot;: [&quot;s3:GetObject&quot;],
        &quot;Resource&quot;: [&quot;arn:aws:s3:::examplebucket/*&quot;]
    }]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Public read 허용 (정적 웹사이트)&lt;/li&gt;
&lt;li&gt;Upload 시 Encryption 강제&lt;/li&gt;
&lt;li&gt;Cross-Account 접근 허용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws:PrincipalOrgID&lt;/code&gt; 조건으로 AWS Organizations 단위 접근 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Block Public Access&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기본값: &lt;strong&gt;모든 Public 접근 차단&lt;/strong&gt; (데이터 유출 방지)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;계정 레벨&lt;/strong&gt; 설정 가능 → 전체 계정 Bucket 일괄 차단&lt;/li&gt;
&lt;li&gt;정적 웹사이트 공개 시 반드시 비활성화 + Bucket Policy 허용 둘 다 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 정적 웹사이트 호스팅 (Static Website Hosting)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3로 정적 HTML/CSS/JS 웹사이트 호스팅 가능&lt;/li&gt;
&lt;li&gt;URL 형식:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://bucket-name.s3-website-{region}.amazonaws.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://bucket-name.s3-website.{region}.amazonaws.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;설정 체크리스트:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;✅ Static Website Hosting 활성화
✅ Block Public Access 비활성화
✅ Bucket Policy에서 s3:GetObject 허용 (Principal: *)
✅ index.html 지정
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;403 Forbidden 오류&lt;/strong&gt;: Bucket Policy가 Public read를 허용하지 않는 것. CloudFront + OAC(Origin Access Control)를 사용하면 S3를 Public으로 열지 않고도 웹사이트 서비스 가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 버저닝 (Versioning)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;버킷 레벨에서 활성화&lt;/strong&gt; — 객체 단위 활성화 불가&lt;/li&gt;
&lt;li&gt;같은 키로 업로드 시 버전 번호가 증가 (1, 2, 3…)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실수 삭제 방지&lt;/strong&gt; + 이전 버전 롤백 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;버저닝 활성화 전 파일&lt;/td&gt;
&lt;td&gt;버전 ID = &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버저닝 비활성화(Suspend)&lt;/td&gt;
&lt;td&gt;기존 버전 &lt;strong&gt;삭제되지 않음&lt;/strong&gt; — 신규 업로드만 버전 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파일 삭제 시&lt;/td&gt;
&lt;td&gt;실제 삭제 아닌 &lt;strong&gt;Delete Marker(삭제 마커)&lt;/strong&gt; 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete Marker 삭제 시&lt;/td&gt;
&lt;td&gt;파일 복원됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;버전 1 → 버전 2 → 버전 3 (현재)
                    │ 삭제
                    ▼
              [Delete Marker] → 파일이 없는 것처럼 보임
              Delete Marker 삭제 → 버전 3 복원
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
📌 &lt;strong&gt;복제(Replication) 사용 시&lt;/strong&gt;: 버저닝이 소스/대상 버킷 모두에서 &lt;strong&gt;필수&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h2&gt;5. 복제 (Replication)&lt;/h2&gt;
&lt;h3&gt;종류&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CRR&lt;/strong&gt; (Cross-Region Replication)&lt;/td&gt;
&lt;td&gt;다른 리전으로 복제&lt;/td&gt;
&lt;td&gt;규정 준수, 지연 시간 감소, 계정 간 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRR&lt;/strong&gt; (Same-Region Replication)&lt;/td&gt;
&lt;td&gt;같은 리전 내 복제&lt;/td&gt;
&lt;td&gt;로그 집계, 운영/테스트 계정 간 실시간 동기화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사전 요건&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;소스 + 대상 버킷 모두 &lt;strong&gt;버저닝 활성화 필수&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;복제 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비동기 (Asynchronous)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;계정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;서로 다른 AWS 계정 간 복제 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3에 적절한 IAM 권한 부여 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기존 객체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;복제 활성화 후 &lt;strong&gt;새 객체만&lt;/strong&gt; 자동 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기존 객체 복제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3 Batch Replication&lt;/strong&gt; 사용 (실패 객체 재시도도 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;삭제 동작&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Delete Marker 복제:   선택적 설정 (기본값: 복제 안 함)
Version ID 포함 삭제: 복제 안 함 (악의적 삭제 방지)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;⚠️ 체이닝 없음&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;버킷 1 → (복제) → 버킷 2 → (복제) → 버킷 3

버킷 1의 객체는 버킷 2에만 복제됨
버킷 3에는 자동 복제 안 됨 (No &quot;chaining&quot; of replication)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 스토리지 클래스 (Storage Classes)&lt;/h2&gt;
&lt;h3&gt;📊 전체 비교표&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스토리지 클래스&lt;/th&gt;
&lt;th&gt;가용성&lt;/th&gt;
&lt;th&gt;내구성&lt;/th&gt;
&lt;th&gt;AZ 수&lt;/th&gt;
&lt;th&gt;검색 시간&lt;/th&gt;
&lt;th&gt;최소 보존 기간&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;즉시&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;자주 접근하는 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Standard-IA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.9%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;즉시&lt;/td&gt;
&lt;td&gt;30일&lt;/td&gt;
&lt;td&gt;비정기 접근, 빠른 조회 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 One Zone-IA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.5%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;즉시&lt;/td&gt;
&lt;td&gt;30일&lt;/td&gt;
&lt;td&gt;재생성 가능한 보조 백업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Glacier Instant Retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.9%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;밀리초&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;분기별 접근, 즉각 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Glacier Flexible Retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;분~시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;백업, 아카이브&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Glacier Deep Archive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12~48시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;180일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;장기 보관, 최저 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Intelligent-Tiering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.9%&lt;/td&gt;
&lt;td&gt;11 9&apos;s&lt;/td&gt;
&lt;td&gt;≥3&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;접근 패턴 예측 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Express One Zone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99.95%&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;단일 자릿수 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;초저지연, AI/ML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;클래스별 상세&lt;/h3&gt;
&lt;h3&gt;S3 Standard (범용)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;자주 접근하는 데이터, 낮은 지연 + 높은 처리량&lt;/li&gt;
&lt;li&gt;동시 2개 시설 장애 허용 (내결함성)&lt;/li&gt;
&lt;li&gt;Use Case: 빅데이터, 모바일/게임, 콘텐츠 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;S3 Standard-IA / S3 One Zone-IA (비정기 접근)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Standard보다 저렴하나 &lt;strong&gt;검색 시 요금 발생&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One Zone-IA&lt;/strong&gt;: 단일 AZ → AZ 파괴 시 데이터 손실, 재생성 가능 데이터에만&lt;/li&gt;
&lt;li&gt;Use Case: Standard-IA → DR/백업, One Zone-IA → 온프레미스 보조 백업, 재생성 가능 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;S3 Glacier (아카이브 3종)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Glacier 유형&lt;/th&gt;
&lt;th&gt;검색 옵션&lt;/th&gt;
&lt;th&gt;검색 시간&lt;/th&gt;
&lt;th&gt;최소 보존&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glacier Instant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;밀리초&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glacier Flexible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Expedited (긴급)&lt;/td&gt;
&lt;td&gt;1~5분&lt;/td&gt;
&lt;td&gt;90일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Standard (표준)&lt;/td&gt;
&lt;td&gt;3~5시간&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Bulk (대량)&lt;/td&gt;
&lt;td&gt;5~12시간 (무료)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glacier Deep Archive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;180일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Bulk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48시간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;S3 Intelligent-Tiering (자동 계층 이동)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;월별 소액 모니터링 + 자동 계층화 수수료 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검색 요금 없음&lt;/strong&gt; (Intelligent-Tiering의 핵심 장점)&lt;/li&gt;
&lt;li&gt;접근 패턴에 따라 자동 이동:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Frequent Access  (기본)         ← 자동
Infrequent Access               ← 30일 미접근 시 자동 이동
Archive Instant Access          ← 90일 미접근 시 자동 이동
Archive Access (선택, 설정 필요) ← 90~700일
Deep Archive Access (선택)      ← 180~700일
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;S3 Express One Zone (신규, 2023)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;단일 AZ&lt;/strong&gt; 내 Directory Bucket에 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단일 자릿수 밀리초 (single-digit millisecond)&lt;/strong&gt; 지연 시간&lt;/li&gt;
&lt;li&gt;S3 Standard 대비 최대 &lt;strong&gt;10배 성능&lt;/strong&gt;, 비용 50% 절감&lt;/li&gt;
&lt;li&gt;SageMaker, Athena, EMR, Glue와 최적 통합&lt;/li&gt;
&lt;li&gt;Use Case: AI/ML 훈련, 금융 모델링, HPC, 미디어 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7. S3 Lifecycle&lt;/h2&gt;
&lt;h3&gt;개요&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lifecycle Rules를 사용해 객체를 &lt;strong&gt;자동으로 다른 Storage Class로 전환&lt;/strong&gt;하거나 &lt;strong&gt;삭제&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;비용 최적화의 핵심 기능 — 시험에서 &quot;가장 비용 효율적인 스토리지 전략&quot; 문제의 정답&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Standard] →(30일)→ [Standard-IA] →(60일)→ [Glacier Flexible] →(365일)→ 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Lifecycle Rule 종류&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;규칙 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transition Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 시간 후 다른 Storage Class로 이동&lt;/td&gt;
&lt;td&gt;생성 60일 후 Standard-IA로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expiration Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 시간 후 객체 삭제(만료)&lt;/td&gt;
&lt;td&gt;365일 후 로그 파일 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Transition Actions (전환 규칙)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Standard  →  Standard-IA  →  Glacier Instant  →  Glacier Flexible  →  Deep Archive
         ↑                ↑
     최소 30일          최소 90일
     Standard 이후       IA 이후
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;전환 방향: &lt;strong&gt;항상 아래 등급으로만 가능&lt;/strong&gt; (상위 클래스로 되돌아가지 않음)&lt;/li&gt;
&lt;li&gt;각 Storage Class로 전환되기까지 &lt;strong&gt;최소 보존 기간 충족&lt;/strong&gt; 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Expiration Actions (만료 규칙)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;활용&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;오래된 객체 삭제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Access log 파일 365일 후 자동 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;이전 버전 삭제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Versioning 활성화 시 non-current version 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;불완전한 Multipart Upload 삭제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;일정 기간 완료되지 않은 Part 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expired Delete Marker 삭제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불필요한 Delete Marker 자동 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Rule 적용 범위&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prefix 기반&lt;/strong&gt;: 특정 경로에만 적용 (예: &lt;code&gt;s3://mybucket/logs/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag 기반&lt;/strong&gt;: 특정 Tag가 있는 객체에만 적용 (예: &lt;code&gt;Department:Finance&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;시험 시나리오 예시&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: 6개월간 자주 접근, 이후 1년간 가끔 접근, 그 이후 보관이 필요한 데이터의 비용 최적화 방법은?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;생성 후 0~6개월:  S3 Standard
        ↓ Lifecycle Rule: 180일 후 전환
6개월~1.5년:     S3 Standard-IA
        ↓ Lifecycle Rule: 365일 후 전환
1.5년 이후:      S3 Glacier Flexible Retrieval
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 성능 (Performance)&lt;/h2&gt;
&lt;h3&gt;🔢 S3 Baseline Performance (기준 성능 수치)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 핵심 수치&lt;/strong&gt; — 자주 출제됨&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;S3는 높은 요청 속도에 자동으로 스케일링 (지연 시간 100~200ms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix당&lt;/strong&gt; 초당 요청 처리량:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PUT/COPY/POST/DELETE: 3,500 req/s&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GET/HEAD: 5,500 req/s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;버킷 내 Prefix 수 제한 없음&lt;/li&gt;
&lt;li&gt;Prefix를 4개로 분산 시: GET/HEAD &lt;strong&gt;22,000 req/s&lt;/strong&gt; 달성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;s3://bucket/folder1/sub1/file   ← prefix: /folder1/sub1/
s3://bucket/folder1/sub2/file   ← prefix: /folder1/sub2/
s3://bucket/folder2/sub1/file   ← prefix: /folder2/sub1/
s3://bucket/folder2/sub2/file   ← prefix: /folder2/sub2/
→ 각 prefix에서 5,500 GET/s × 4 = 22,000 GET/s
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🚀 S3 Transfer Acceleration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3 버킷으로의 &lt;strong&gt;장거리 파일 전송 속도 향상&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AWS CloudFront의 **엣지 로케이션(Edge Location)**을 경유:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[사용자 (일본)]  →  [CloudFront Edge (일본)]  →  [AWS 전용 백본망]  →  [S3 버킷 (us-east-1)]
                    빠른 업로드                       고속 전용선
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 전 세계에서 하나의 S3 버킷으로 데이터를 빠르게 집계할 때&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;버킷 레벨&lt;/strong&gt;에서 활성화, 별도 엔드포인트 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📦 Multipart Upload (멀티파트 업로드)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5GB 초과 시 필수&lt;/strong&gt;, 100MB 초과부터 권장&lt;/li&gt;
&lt;li&gt;파일을 여러 파트로 분할하여 &lt;strong&gt;병렬 업로드&lt;/strong&gt; → 속도 향상&lt;/li&gt;
&lt;li&gt;파트 업로드 실패 시 해당 파트만 재시도&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[100GB 파일]
    │ 분할
    ├── Part 1 (10GB) ─→ S3
    ├── Part 2 (10GB) ─→ S3  (병렬)
    └── Part N (10GB) ─→ S3
                          │
                    완료 시 S3가 합성
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🔍 S3 Byte-Range Fetches (바이트 범위 가져오기)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일의 &lt;strong&gt;특정 바이트 범위만&lt;/strong&gt; 병렬로 GET 요청&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다운로드 속도 향상&lt;/strong&gt; (병렬 처리)&lt;/li&gt;
&lt;li&gt;파일의 &lt;strong&gt;일부만 조회&lt;/strong&gt; 가능 (헤더 데이터 파싱 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 S3 Select &amp;amp; Glacier Select&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3 Select&lt;/strong&gt;: SQL 쿼리로 S3에서 &lt;strong&gt;필요한 데이터만 서버 사이드 필터링&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;전체 파일 다운로드 없이 필요한 데이터만 추출 → &lt;strong&gt;비용, 트래픽 절감&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CSV, JSON, Parquet 형식 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;전체 CSV 다운로드 후 필터링 → [큰 파일 전체 전송]  ← 비효율
S3 Select 사용             → [필요한 행만 반환]    ← 효율적
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;9. S3 Batch Operations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;기존 S3 객체에 대해 &lt;strong&gt;단일 요청으로 대규모 작업&lt;/strong&gt; 수행&lt;/li&gt;
&lt;li&gt;Job = 객체 목록 + 수행할 Action + 선택적 파라미터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;지원하는 작업 (Actions)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copy objects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;버킷 간 객체 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modify metadata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;객체 메타데이터/속성 일괄 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encrypt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;미암호화 객체 일괄 암호화 (SSE-KMS 등으로 전환)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modify ACLs/Tags&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ACL 또는 Tag 일괄 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Restore from Glacier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Glacier 객체 일괄 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Invoke Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;각 객체에 대해 Lambda Function 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;작동 흐름&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;S3 Inventory로 객체 목록 생성
        │
        ▼
Athena로 필터링 (특정 조건의 객체만 선택)
        │
        ▼
S3 Batch Operations Job 생성
        │
        ▼
진행률 추적 + 재시도 자동 관리 + 완료 알림 + 리포트 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;실무 활용&lt;/strong&gt;: 기존 미암호화 객체를 SSE-KMS로 일괄 전환할 때, S3 Replication 활성화 이전의 기존 객체를 복제할 때 (S3 Batch Replication)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;10. S3 Event Notifications&lt;/h2&gt;
&lt;h3&gt;지원 이벤트 유형&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;S3:ObjectCreated&lt;/code&gt;, &lt;code&gt;S3:ObjectRemoved&lt;/code&gt;, &lt;code&gt;S3:ObjectRestore&lt;/code&gt;, &lt;code&gt;S3:Replication&lt;/code&gt; 등&lt;/li&gt;
&lt;li&gt;Object 이름으로 필터링 가능 (예: &lt;code&gt;.jpg&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;이벤트 대상 (Destinations)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;S3 이벤트 발생
    │
    ├──→ SNS Topic  ← SNS Resource Policy 필요
    ├──→ SQS Queue  ← SQS Resource Policy 필요
    └──→ Lambda Function  ← Lambda Resource Policy 필요
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
📌 &lt;strong&gt;중요&lt;/strong&gt;: S3 → SNS/SQS/Lambda 연결 시 IAM Role이 아닌 &lt;strong&gt;Resource-based Policy(리소스 정책)&lt;/strong&gt; 설정 필요
:::&lt;/p&gt;
&lt;h3&gt;S3 Event Notifications with Amazon EventBridge&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;S3 Bucket  →  Amazon EventBridge  →(Rules)→  18개 이상 AWS 서비스
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;EventBridge 사용 시 장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;고급 필터링&lt;/strong&gt;: JSON Rules로 Metadata, Object size, 이름 기반 필터링&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple Destinations&lt;/strong&gt;: Step Functions, Kinesis Streams/Firehose 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Archive / Replay Events&lt;/strong&gt;: 이벤트 재처리 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliable delivery&lt;/strong&gt;: 신뢰성 높은 전달 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;선택 기준&lt;/strong&gt;: 단순한 트리거는 SNS/SQS/Lambda 직접 연결. 복잡한 라우팅이나 다양한 Destination이 필요하면 EventBridge 경유.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;11. S3 Analytics - Storage Class Analysis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;언제&lt;/strong&gt; 객체를 다른 Storage Class로 전환할지 &lt;strong&gt;분석 및 권장&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;지원 범위: &lt;strong&gt;Standard → Standard-IA 전환&lt;/strong&gt; 분석만 가능
&lt;ul&gt;
&lt;li&gt;❌ One Zone-IA, Glacier는 직접 분석 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Report는 S3 버킷에 &lt;strong&gt;CSV 형식&lt;/strong&gt;으로 출력&lt;/li&gt;
&lt;li&gt;분석 초기화 소요 시간: &lt;strong&gt;24~48시간&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Daily 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;S3 Analytics 분석 결과
        │
        ▼
Lifecycle Rules 설계의 출발점으로 활용
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Lifecycle Rules를 처음 설계하거나 개선할 때 S3 Analytics를 먼저 실행해서 데이터 기반으로 전환 시점 결정 권장&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;12. S3 Storage Lens&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;전체 AWS Organization 수준&lt;/strong&gt;에서 S3 스토리지 사용량과 활동을 분석·최적화하는 도구&lt;/li&gt;
&lt;li&gt;30일간 사용량 및 활동 지표 집계&lt;/li&gt;
&lt;li&gt;이상 탐지(Anomaly Detection), 비용 효율화, 데이터 보호 Best Practice 적용&lt;/li&gt;
&lt;li&gt;집계 단위: Organization, 특정 Account, Region, Bucket, Prefix&lt;/li&gt;
&lt;li&gt;기본 대시보드(Default Dashboard) 제공 또는 커스텀 대시보드 생성&lt;/li&gt;
&lt;li&gt;일별 S3 버킷으로 메트릭 내보내기 가능 (CSV, Parquet)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Default Dashboard&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Multi-Region, Multi-Account 데이터 시각화&lt;/li&gt;
&lt;li&gt;Amazon S3가 사전 구성 (Preconfigured)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;삭제 불가&lt;/strong&gt; (단, 비활성화는 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;주요 Metrics 카테고리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;주요 지표&lt;/th&gt;
&lt;th&gt;활용 목적&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Summary Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;StorageBytes, ObjectCount&lt;/td&gt;
&lt;td&gt;가장 빠르게 증가하는 Bucket/Prefix 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost-Optimization Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NonCurrentVersionStorageBytes, IncompleteMultipartUploadStorageBytes&lt;/td&gt;
&lt;td&gt;7일 이상된 불완전 Multipart Upload 탐지, 저비용 클래스 전환 후보 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data-Protection Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VersioningEnabledBucketCount, MFADeleteEnabledBucketCount, SSEKMSEnabledBucketCount&lt;/td&gt;
&lt;td&gt;데이터 보호 Best Practice 미준수 Bucket 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access-Management Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ObjectOwnershipBucketOwnerEnforcedBucketCount&lt;/td&gt;
&lt;td&gt;Object Ownership 설정 현황 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Event Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EventNotificationEnabledBucketCount&lt;/td&gt;
&lt;td&gt;Event Notification 설정 현황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TransferAccelerationEnabledBucketCount&lt;/td&gt;
&lt;td&gt;Transfer Acceleration 활성화 현황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Activity Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AllRequests, GetRequests, PutRequests, BytesDownloaded&lt;/td&gt;
&lt;td&gt;스토리지 요청 패턴 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detailed Status Code Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;200OKStatusCount, 403ForbiddenErrorCount, 404NotFoundErrorCount&lt;/td&gt;
&lt;td&gt;HTTP 오류 패턴 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Free vs. Advanced (Paid)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Advanced (Paid)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;자동 제공 여부&lt;/td&gt;
&lt;td&gt;✅ 모든 고객 자동 제공&lt;/td&gt;
&lt;td&gt;추가 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기본 Metrics 수&lt;/td&gt;
&lt;td&gt;~28개&lt;/td&gt;
&lt;td&gt;더 많은 추가 지표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 보존 기간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15개월&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch 연동&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ 추가 비용 없이 CloudWatch 게시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefix 레벨 집계&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Cost Optimization / Data Protection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;13. Requester Pays&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;기본: Bucket 소유자가 모든 S3 Storage 비용 + 데이터 전송 비용 부담&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requester Pays 활성화 시&lt;/strong&gt;: 요청자(Requester)가 데이터 다운로드 요청 비용 부담&lt;/li&gt;
&lt;li&gt;대용량 Dataset을 다른 계정과 공유할 때 유용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;요청자는 반드시 AWS에 인증(Authenticated)&lt;/strong&gt; 되어야 함 — 익명(Anonymous) 접근 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;일반 Bucket:        [요청자] →(무료 다운로드)→ [S3]  → 비용: Bucket Owner 부담
Requester Pays:     [요청자] →(유료 다운로드)→ [S3]  → 비용: Requester 부담
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;14. 핵심 요약 &amp;amp; 시험 포인트&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;S3 Architecture Overview
├── 보안: IAM Policy + Bucket Policy + Block Public Access (+ ACL)
├── 암호화: SSE-S3(기본) / SSE-KMS(감사 필요) / SSE-C(고객 키) / CSE
│          → 상세: AWS_S3_Security_Notes.md 참고
├── 가용성: Versioning + CRR/SRR Replication
├── 비용: Storage Class + Lifecycle Rules
├── 성능: Multipart Upload + Transfer Acceleration + Prefix 분산
└── 운영: Event Notifications + Batch Operations + Storage Lens

Storage Class 비용 순서 (비쌈 → 저렴)
Standard &amp;gt; Standard-IA &amp;gt; One Zone-IA &amp;gt; Glacier Instant &amp;gt; Glacier Flexible &amp;gt; Deep Archive

Glacier 최소 보존 기간
├── Instant / Flexible Retrieval: 90일
└── Deep Archive:                 180일

Glacier Flexible Retrieval 검색 시간
├── Expedited: 1~5분
├── Standard:  3~5시간
└── Bulk:      5~12시간 (무료)

Glacier Deep Archive 검색 시간
├── Standard: 12시간
└── Bulk:     48시간
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 시험 자주 출제 포인트 총정리&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bucket 이름&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;전 세계 고유&lt;/strong&gt;, 소문자/숫자/하이픈만, 리전 레벨 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 Object 크기&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5TB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5GB 초과 업로드&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Multipart Upload 필수&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기본 암호화 (2023~)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SSE-S3 자동 적용&lt;/strong&gt;, 추가 비용 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-C 필수 요건&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; (HTTP 요청 시 거부)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE-KMS Cross-Account&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Customer Managed Key(CMK) 필수&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bucket Policy vs Default Encryption&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bucket Policy가 먼저 평가됨&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA Delete 설정 권한&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bucket Owner (Root 계정)만&lt;/strong&gt; 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versioning Suspend&lt;/td&gt;
&lt;td&gt;기존 버전 &lt;strong&gt;삭제 안 됨&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버저닝 전 파일 Version ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication 전제조건&lt;/td&gt;
&lt;td&gt;소스+대상 모두 &lt;strong&gt;Versioning 활성화&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기존 객체 복제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;S3 Batch Replication&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication 체이닝&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;없음&lt;/strong&gt; (Bucket 1→2→3 자동 복제 안 됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer Acceleration&lt;/td&gt;
&lt;td&gt;CloudFront &lt;strong&gt;Edge Location&lt;/strong&gt; 경유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baseline Performance&lt;/td&gt;
&lt;td&gt;Prefix당 PUT 3,500/s, GET 5,500/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Select&lt;/td&gt;
&lt;td&gt;SQL로 &lt;strong&gt;서버 사이드&lt;/strong&gt; 필터링, 전송 비용 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Event → SNS/SQS/Lambda&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource-based Policy&lt;/strong&gt; 필요 (IAM Role 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Event + EventBridge&lt;/td&gt;
&lt;td&gt;18개 이상 Destination, 고급 필터링, Replay 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Analytics 대상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Standard → Standard-IA만&lt;/strong&gt; (Glacier 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Analytics 소요 시간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24~48시간&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Lens Default Dashboard&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;삭제 불가&lt;/strong&gt; (비활성화만 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Lens 데이터 보존&lt;/td&gt;
&lt;td&gt;Free: 14일 / Advanced: &lt;strong&gt;15개월&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requester Pays&lt;/td&gt;
&lt;td&gt;요청자 비용 부담, &lt;strong&gt;익명 접근 불가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object Lock&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WORM&lt;/strong&gt;, Versioning 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance Mode&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Root 포함 누구도&lt;/strong&gt; 수정/삭제 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance Mode&lt;/td&gt;
&lt;td&gt;특별 권한(&lt;code&gt;s3:BypassGovernanceRetention&lt;/code&gt;) 있으면 수정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal Hold&lt;/td&gt;
&lt;td&gt;보존 기간 무관, 무기한 잠금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glacier Vault Lock&lt;/td&gt;
&lt;td&gt;한 번 설정 후 &lt;strong&gt;변경 불가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static Website 403&lt;/td&gt;
&lt;td&gt;Block Public Access 또는 Bucket Policy 미설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One Zone-IA&lt;/td&gt;
&lt;td&gt;단일 AZ, &lt;strong&gt;AZ 파괴 시 데이터 손실&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intelligent-Tiering 장점&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;검색(Retrieval) 요금 없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-signed URL 유효 기간&lt;/td&gt;
&lt;td&gt;Console 12h / CLI 최대 &lt;strong&gt;604800초(7일)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html&quot;&gt;S3 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/s3/storage-classes/&quot;&gt;S3 Storage Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html&quot;&gt;S3 Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html&quot;&gt;S3 Event Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html&quot;&gt;S3 Storage Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html&quot;&gt;S3 Batch Operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html&quot;&gt;S3 Replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html&quot;&gt;S3 Object Lock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>⚖️ AWS ELB (Elastic Load Balancer) &amp; ASG (Auto Scaling Group)</title><link>https://tessa1217.github.io/posts/aws/aws-elb-asg/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-elb-asg/</guid><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;⚖️ AWS ELB (Elastic Load Balancer) &amp;amp; ASG (Auto Scaling Group)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;고가용성(High Availability)과 확장성(Scalability)의 핵심 서비스&lt;/p&gt;
&lt;p&gt;ELB는 트래픽을 분산하고, ASG는 인스턴스 수를 자동으로 조절합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-%ED%99%95%EC%9E%A5%EC%84%B1--%EA%B3%A0%EA%B0%80%EC%9A%A9%EC%84%B1-%EA%B0%9C%EB%85%90&quot;&gt;확장성 &amp;amp; 고가용성 개념&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-elb-%EA%B0%9C%EC%9A%94&quot;&gt;ELB 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%84%9C-%EC%9C%A0%ED%98%95-%EB%B9%84%EA%B5%90&quot;&gt;로드 밸런서 유형 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-alb-application-load-balancer&quot;&gt;ALB (Application Load Balancer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-nlb-network-load-balancer&quot;&gt;NLB (Network Load Balancer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-gwlb-gateway-load-balancer&quot;&gt;GWLB (Gateway Load Balancer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-elb-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5&quot;&gt;ELB 주요 기능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-asg-auto-scaling-group&quot;&gt;ASG (Auto Scaling Group)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-asg-%EC%8A%A4%EC%BC%80%EC%9D%BC%EB%A7%81-%EC%A0%95%EC%B1%85&quot;&gt;ASG 스케일링 정책&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD&quot;&gt;핵심 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 확장성 &amp;amp; 고가용성 개념&lt;/h2&gt;
&lt;h3&gt;📈 스케일링 방향&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방향&lt;/th&gt;
&lt;th&gt;영어 표현&lt;/th&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;수직 확장 (Scale Up/Down)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vertical Scalability&lt;/td&gt;
&lt;td&gt;인스턴스 크기 증가&lt;/td&gt;
&lt;td&gt;t2.micro → t2.large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;수평 확장 (Scale Out/In)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Horizontal Scalability (= Elasticity)&lt;/td&gt;
&lt;td&gt;인스턴스 수 증가/감소&lt;/td&gt;
&lt;td&gt;ASG, 로드 밸런서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;수직 확장 (Scale Up):   [작은 서버]  →  [큰 서버]        ← 한계 있음 (하드웨어 상한)
수평 확장 (Scale Out):  [서버1]  →  [서버1][서버2][서버3]  ← 이론상 무제한
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수직 확장&lt;/strong&gt;: RDS, ElastiCache 같은 **비분산 시스템(Non-distributed Systems)**에 일반적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수평 확장&lt;/strong&gt;: 웹 애플리케이션, 현대 분산 시스템에 일반적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🏢 고가용성 (High Availability)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션을 **최소 2개의 데이터 센터(= AZ)**에서 운영&lt;/li&gt;
&lt;li&gt;목표: 하나의 데이터 센터 장애 시에도 서비스 지속 (Survive a data center loss)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수평 확장과 함께 설계&lt;/strong&gt;되는 것이 일반적&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;EC2 HA 구성 예시:
    [Load Balancer]
    /             \
[EC2 - AZ1]  [EC2 - AZ2]   ← 한 AZ 장애 시 다른 AZ가 트래픽 처리
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. ELB 개요&lt;/h2&gt;
&lt;h3&gt;🔀 로드 밸런서란?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;여러 다운스트림 서버(EC2 등)에 &lt;strong&gt;트래픽을 분산&lt;/strong&gt;하는 서버&lt;/li&gt;
&lt;li&gt;애플리케이션에 &lt;strong&gt;단일 접근 지점(Single Point of Access, DNS)&lt;/strong&gt; 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;왜 ELB(관리형)를 쓰는가?&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;직접 구성&lt;/th&gt;
&lt;th&gt;AWS ELB (관리형)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;초기 비용 낮음&lt;/td&gt;
&lt;td&gt;비용이 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유지보수·패치 직접&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS가 관리&lt;/strong&gt; (업그레이드, 유지보수, HA 보장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설정 복잡&lt;/td&gt;
&lt;td&gt;설정 간단 (Configuration knobs 제공)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS 서비스 통합 어려움&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EC2, ASG, ECS, ACM, CloudWatch, Route 53, WAF 등과 통합&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;ELB의 주요 역할&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다운스트림 인스턴스 장애 시 seamless하게 처리 (Health Check)&lt;/li&gt;
&lt;li&gt;SSL 종료(SSL Termination, HTTPS 처리)&lt;/li&gt;
&lt;li&gt;쿠키 기반 고정성(Stickiness)&lt;/li&gt;
&lt;li&gt;AZ 간 고가용성&lt;/li&gt;
&lt;li&gt;퍼블릭/프라이빗 트래픽 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;❤️ Health Check (헬스 체크)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LB가 &lt;strong&gt;인스턴스 정상 여부를 지속적으로 확인&lt;/strong&gt;하는 기능&lt;/li&gt;
&lt;li&gt;특정 포트와 경로(Route)에 요청 → 200 OK면 정상, 아니면 비정상&lt;/li&gt;
&lt;li&gt;비정상 인스턴스로는 &lt;strong&gt;트래픽을 전송하지 않음&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;LB → GET /health (포트 80)
       ↓
   200 OK → 정상 → 트래픽 전달
   기타   → 비정상 → 트래픽 차단
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 로드 밸런서 유형 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;출시&lt;/th&gt;
&lt;th&gt;레이어&lt;/th&gt;
&lt;th&gt;프로토콜&lt;/th&gt;
&lt;th&gt;주요 특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLB&lt;/strong&gt; (Classic)&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;td&gt;L4/L7&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, TCP, SSL&lt;/td&gt;
&lt;td&gt;구세대, Deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ALB&lt;/strong&gt; (Application)&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;L7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, WebSocket&lt;/td&gt;
&lt;td&gt;경로/호스트/쿼리 기반 라우팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NLB&lt;/strong&gt; (Network)&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;L4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP, TLS, UDP&lt;/td&gt;
&lt;td&gt;초고성능, 정적 IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GWLB&lt;/strong&gt; (Gateway)&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;L3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP (GENEVE 6081)&lt;/td&gt;
&lt;td&gt;3rd Party 가상 어플라이언스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
💡 &lt;strong&gt;권장&lt;/strong&gt;: 항상 신세대(ALB, NLB, GWLB) 사용. CLB는 Deprecated.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. ALB (Application Load Balancer)&lt;/h2&gt;
&lt;h3&gt;🌐 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;레이어 7 (Layer 7, HTTP 레이어)&lt;/strong&gt; 전용&lt;/li&gt;
&lt;li&gt;HTTP/2, WebSocket 지원&lt;/li&gt;
&lt;li&gt;HTTP → HTTPS 리다이렉트 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;고정 호스트명(Fixed Hostname)&lt;/strong&gt; 제공&lt;/li&gt;
&lt;li&gt;클라이언트 IP는 인스턴스에 직접 전달되지 않음 → &lt;strong&gt;X-Forwarded-For 헤더&lt;/strong&gt;로 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;클라이언트 IP: 1.2.3.4
  │
  ▼
[ALB]  ──→  EC2: X-Forwarded-For: 1.2.3.4
               X-Forwarded-Port: 443
               X-Forwarded-Proto: https
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🗺️ 라우팅 규칙 (Routing Rules)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;라우팅 기준&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URL 경로 (Path)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/users&lt;/code&gt; → 서비스 A, &lt;code&gt;/posts&lt;/code&gt; → 서비스 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;호스트명 (Hostname)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api.example.com&lt;/code&gt; → API 서버, &lt;code&gt;web.example.com&lt;/code&gt; → 웹 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;쿼리스트링 (Query String)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;?platform=mobile&lt;/code&gt; → 모바일 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP 헤더 (Headers)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 헤더 값에 따라 분기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;마이크로서비스와 컨테이너에 최적&lt;/strong&gt;: ECS와 연동 시 동적 포트 매핑(Dynamic Port Mapping) 지원.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;🎯 Target Groups (대상 그룹)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;대상 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2 Instances&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto Scaling Group으로 관리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECS Tasks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECS 자체 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lambda Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP 요청 → JSON 이벤트로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP Addresses&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;반드시 프라이빗 IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Health Check는 &lt;strong&gt;Target Group 레벨&lt;/strong&gt;에서 수행&lt;/li&gt;
&lt;li&gt;ALB는 &lt;strong&gt;여러 Target Group&lt;/strong&gt;으로 동시 라우팅 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. NLB (Network Load Balancer)&lt;/h2&gt;
&lt;h3&gt;⚡ 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;레이어 4 (Layer 4, 전송 계층)&lt;/strong&gt; — TCP &amp;amp; UDP 트래픽 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;초고성능&lt;/strong&gt;: 초당 수백만 요청 처리, 초저지연(Ultra-low Latency)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AZ당 정적 IP(Static IP) 1개&lt;/strong&gt; 보유 → Elastic IP 할당 가능 (특정 IP 화이트리스팅에 유리)&lt;/li&gt;
&lt;li&gt;극한 성능, TCP/UDP 트래픽 처리에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🎯 Target Groups&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EC2 Instances&lt;/li&gt;
&lt;li&gt;IP Addresses (반드시 프라이빗 IP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Load Balancer&lt;/strong&gt; (NLB 뒤에 ALB 배치 가능)&lt;/li&gt;
&lt;li&gt;Health Check: &lt;strong&gt;TCP, HTTP, HTTPS&lt;/strong&gt; 프로토콜 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[정적 IP: 1.2.3.4]        ← 클라이언트가 고정 IP로 접근 (방화벽 화이트리스팅)
     [NLB]
       │
   [ALB / EC2]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6. GWLB (Gateway Load Balancer)&lt;/h2&gt;
&lt;h3&gt;🛡️ 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;레이어 3 (Layer 3, 네트워크 계층)&lt;/strong&gt; — IP 패킷 수준 처리&lt;/li&gt;
&lt;li&gt;3rd Party 네트워크 가상 어플라이언스 배포·확장·관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GENEVE 프로토콜 (포트 6081)&lt;/strong&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;두 가지 역할&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transparent Network Gateway&lt;/strong&gt; (투명 네트워크 게이트웨이)&lt;/td&gt;
&lt;td&gt;모든 트래픽의 단일 진입/출구점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Balancer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가상 어플라이언스들에 트래픽 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;인터넷 트래픽
     │
     ▼
  [GWLB]  ← 모든 트래픽이 먼저 여기를 통과
     │
[방화벽/IDS/IPS 어플라이언스 Fleet]
     │
     ▼
  [EC2 앱]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;주요 Use Case&lt;/strong&gt;: 방화벽(Firewalls), 침입탐지/방지 시스템(IDS/IPS), 딥 패킷 검사(Deep Packet Inspection), 페이로드 조작&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. ELB 주요 기능&lt;/h2&gt;
&lt;h3&gt;🍪 Sticky Sessions (세션 고정, Session Affinity)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;동일 클라이언트가 &lt;strong&gt;항상 동일한 인스턴스&lt;/strong&gt;로 라우팅되도록 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLB, ALB, NLB&lt;/strong&gt; 지원 (NLB는 쿠키 없이 동작)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 사용자 세션 데이터(로그인 정보 등)를 인스턴스 로컬에 저장하는 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
⚠️ &lt;strong&gt;단점&lt;/strong&gt;: 트래픽 불균형 발생 가능 (일부 인스턴스에 부하 집중)
:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;쿠키 유형:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;쿠키 종류&lt;/th&gt;
&lt;th&gt;생성 주체&lt;/th&gt;
&lt;th&gt;쿠키 이름&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom Cookie&lt;/td&gt;
&lt;td&gt;애플리케이션(Target)&lt;/td&gt;
&lt;td&gt;직접 지정&lt;/td&gt;
&lt;td&gt;커스텀 속성 포함 가능, AWSALB/AWSALBAPP/AWSALBTG 이름 사용 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Cookie&lt;/td&gt;
&lt;td&gt;LB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AWSALBAPP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ALB 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duration-based Cookie&lt;/td&gt;
&lt;td&gt;LB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AWSALB&lt;/code&gt; (ALB), &lt;code&gt;AWSELB&lt;/code&gt; (CLB)&lt;/td&gt;
&lt;td&gt;만료 시간 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🌍 Cross-Zone Load Balancing (교차 AZ 로드 밸런싱)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;활성화 시&lt;/th&gt;
&lt;th&gt;비활성화 시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동작&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 AZ의 인스턴스에 &lt;strong&gt;균등 분산&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;같은 AZ의 인스턴스에만 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;활성화:  AZ1(10대) + AZ2(2대) → 전체 12대에 균등 분배 (각 8.3%)
비활성화: AZ1(10대) → AZ1 10대만, AZ2(2대) → AZ2 2대만 (각 AZ 50%)
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LB 유형&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;교차 AZ 데이터 비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ALB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;활성화 (기본)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;없음 (No charges)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NLB / GWLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비활성화 (기본)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;활성화 시 데이터 요금 부과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;비활성화 (기본)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔒 SSL/TLS 인증서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSL (Secure Sockets Layer)&lt;/strong&gt; / &lt;strong&gt;TLS (Transport Layer Security)&lt;/strong&gt;: 클라이언트 ↔ LB 간 전송 암호화 (In-flight Encryption)&lt;/li&gt;
&lt;li&gt;TLS는 SSL의 최신 버전 (현재 대부분 TLS 사용)&lt;/li&gt;
&lt;li&gt;인증서는 **CA(Certificate Authority)**에서 발급 (Comodo, DigiCert, GoDaddy 등)&lt;/li&gt;
&lt;li&gt;LB는 &lt;strong&gt;X.509 인증서&lt;/strong&gt; 사용&lt;/li&gt;
&lt;li&gt;*ACM (AWS Certificate Manager)**으로 인증서 관리 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📛 SNI (Server Name Indication)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하나의 웹 서버(LB)에 여러 SSL 인증서를 로드&lt;/strong&gt;하여 여러 도메인을 서비스하는 기술&lt;/li&gt;
&lt;li&gt;클라이언트가 SSL 핸드셰이크 시 접속할 &lt;strong&gt;호스트명을 먼저 전달&lt;/strong&gt; → 서버가 올바른 인증서 선택&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ALB, NLB, CloudFront만 지원&lt;/strong&gt; — CLB는 미지원&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LB 유형&lt;/th&gt;
&lt;th&gt;SSL 인증서&lt;/th&gt;
&lt;th&gt;SNI 지원&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;단 1개&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ALB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;여러 개&lt;/strong&gt; (리스너당)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;여러 개&lt;/strong&gt; (리스너당)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;⏳ Connection Draining (연결 드레이닝)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LB 유형&lt;/th&gt;
&lt;th&gt;명칭&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLB&lt;/td&gt;
&lt;td&gt;Connection Draining&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALB / NLB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deregistration Delay (등록 해제 지연)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스가 비정상이거나 등록 해제 중일 때 &lt;strong&gt;진행 중인 요청(In-flight Requests)을 완료할 시간&lt;/strong&gt; 부여&lt;/li&gt;
&lt;li&gt;해제 중인 인스턴스에 &lt;strong&gt;새 요청 전달 중단&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;설정 범위: &lt;strong&gt;1~3600초&lt;/strong&gt; (기본값: 300초)&lt;/li&gt;
&lt;li&gt;0으로 설정 시 비활성화 (즉시 연결 종료)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;짧은 요청이 많은 서비스&lt;/strong&gt;: 낮은 값 설정 (ex: 30초). 긴 처리가 필요한 서비스: 높은 값 설정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;8. ASG (Auto Scaling Group)&lt;/h2&gt;
&lt;h3&gt;📐 개념&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Load Balancer]
      │
  [ASG]
  ├── EC2 (최소: min)
  ├── EC2 (현재: desired)
  └── EC2 (최대: max)

트래픽 증가 → Scale Out (인스턴스 추가)
트래픽 감소 → Scale In  (인스턴스 제거)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;비용 없음&lt;/strong&gt;: ASG 자체는 무료, 실행되는 EC2 인스턴스 비용만 지불&lt;/li&gt;
&lt;li&gt;비정상 인스턴스 감지 시 &lt;strong&gt;자동으로 새 인스턴스 생성 (Re-create)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;새 인스턴스를 자동으로 &lt;strong&gt;LB에 등록&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;⚙️ ASG 구성 요소&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Launch Template (시작 템플릿)&lt;/strong&gt; — 인스턴스 설정의 청사진&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AMI + Instance Type&lt;/td&gt;
&lt;td&gt;이미지와 인스턴스 사양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 User Data&lt;/td&gt;
&lt;td&gt;부트스트랩 스크립트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EBS Volumes&lt;/td&gt;
&lt;td&gt;스토리지 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Groups&lt;/td&gt;
&lt;td&gt;방화벽 규칙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH Key Pair&lt;/td&gt;
&lt;td&gt;접속 키&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM Roles&lt;/td&gt;
&lt;td&gt;인스턴스에 부여할 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network + Subnets&lt;/td&gt;
&lt;td&gt;배치할 네트워크 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load Balancer&lt;/td&gt;
&lt;td&gt;연결할 LB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::important
구세대 &lt;strong&gt;Launch Configurations&lt;/strong&gt;는 Deprecated. 반드시 &lt;strong&gt;Launch Template&lt;/strong&gt; 사용.
:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;크기 설정:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Min Size&lt;/strong&gt;: 최소 실행 인스턴스 수 (가용성 하한)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Max Size&lt;/strong&gt;: 최대 실행 인스턴스 수 (비용 상한)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desired Capacity&lt;/strong&gt;: 현재 목표 인스턴스 수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 CloudWatch와 ASG 연동&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CloudWatch 알람(Alarm)이 트리거되면 Scale Out/In 정책 실행&lt;/li&gt;
&lt;li&gt;메트릭 예시: &lt;strong&gt;평균 CPU 사용률 (Average CPU)&lt;/strong&gt; — ASG 전체 인스턴스의 평균값&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;CPU &amp;gt; 70% → CloudWatch Alarm → ASG Scale Out (+2 인스턴스)
CPU &amp;lt; 30% → CloudWatch Alarm → ASG Scale In  (-1 인스턴스)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;9. ASG 스케일링 정책&lt;/h2&gt;
&lt;h3&gt;🔄 Dynamic Scaling (동적 스케일링)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;정책 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Tracking Scaling&lt;/strong&gt; (목표 추적)&lt;/td&gt;
&lt;td&gt;특정 지표를 목표값으로 유지&lt;/td&gt;
&lt;td&gt;평균 CPU를 40%로 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simple / Step Scaling&lt;/strong&gt; (단순/단계)&lt;/td&gt;
&lt;td&gt;알람 트리거 시 고정 수량 추가/제거&lt;/td&gt;
&lt;td&gt;CPU &amp;gt; 70% → +2, CPU &amp;lt; 30% → -1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scheduled Scaling&lt;/strong&gt; (예약)&lt;/td&gt;
&lt;td&gt;알려진 사용 패턴에 맞춰 사전 설정&lt;/td&gt;
&lt;td&gt;매주 월요일 09:00에 5대로 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔮 Predictive Scaling (예측 스케일링)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ML로 &lt;strong&gt;미래 부하를 예측&lt;/strong&gt;하여 사전에 스케일링 예약&lt;/li&gt;
&lt;li&gt;반복적인 패턴이 있는 워크로드에 효과적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📏 스케일링에 좋은 지표&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;적합한 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU Utilization&lt;/strong&gt; (CPU 사용률)&lt;/td&gt;
&lt;td&gt;ASG 전체 평균 CPU&lt;/td&gt;
&lt;td&gt;컴퓨팅 집약적 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RequestCountPerTarget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인스턴스당 요청 수&lt;/td&gt;
&lt;td&gt;웹 서버, API 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Network In/Out&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;평균 네트워크 입출력&lt;/td&gt;
&lt;td&gt;네트워크 집약적 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Metric&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudWatch에 직접 푸시한 지표&lt;/td&gt;
&lt;td&gt;비즈니스 로직 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;⏸️ Scaling Cooldown (스케일링 쿨다운)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;스케일링 활동 후 &lt;strong&gt;기본 300초(5분) 대기&lt;/strong&gt; — 지표가 안정될 때까지 추가 스케일링 중단&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;권장&lt;/strong&gt;: 미리 구성된 AMI (Ready-to-use AMI) 사용 → 인스턴스 준비 시간 단축 → 쿨다운 기간 축소 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🔐 LB Security Groups 구성 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;인터넷 (0.0.0.0/0)
        │ HTTP/HTTPS
        ▼
[Load Balancer Security Group]   ← 0.0.0.0/0:80, 443 허용
        │ 포트 80
        ▼
[EC2 Security Group]             ← LB Security Group에서 온 트래픽만 허용
        (인터넷에서 직접 접근 불가)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 핵심 요약&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;로드 밸런서 선택 가이드
├── HTTP/HTTPS, 경로·호스트 기반 라우팅   → ALB (Layer 7)
├── TCP/UDP, 초고성능, 정적 IP 필요       → NLB (Layer 4)
├── 3rd Party 보안 어플라이언스 삽입      → GWLB (Layer 3)
└── (구세대)                              → CLB (사용 지양)

SNI 지원: ALB, NLB, CloudFront (CLB 미지원)
Cross-Zone LB: ALB 기본 활성화, NLB/GWLB 기본 비활성화

ASG 스케일링 정책
├── Target Tracking    → 목표 지표 자동 유지 (가장 간단)
├── Simple/Step        → 알람 기반 고정 수량 조정
├── Scheduled          → 사전 예약 (알려진 패턴)
└── Predictive         → ML 기반 사전 예측

핵심 수치
├── Connection Draining 범위: 1~3600초 (기본 300초)
├── ASG Cooldown 기본: 300초
└── ELB Health Check: 포트 + 경로(/health 일반적)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 시험 자주 출제 포인트&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;클라이언트 실제 IP 확인&lt;/td&gt;
&lt;td&gt;ALB → &lt;strong&gt;X-Forwarded-For&lt;/strong&gt; 헤더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLB 정적 IP&lt;/td&gt;
&lt;td&gt;AZ당 1개 정적 IP, Elastic IP 할당 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GWLB 프로토콜&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GENEVE (포트 6081)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNI 지원 LB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ALB, NLB&lt;/strong&gt; (CLB 미지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLB SSL 제한&lt;/td&gt;
&lt;td&gt;SSL 인증서 &lt;strong&gt;1개&lt;/strong&gt;만, 다중 도메인은 CLB 여러 개 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Zone 과금&lt;/td&gt;
&lt;td&gt;NLB/GWLB는 활성화 시 데이터 요금 부과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASG 쿨다운 단축&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;미리 구성된 AMI&lt;/strong&gt; 사용 → 부팅 시간 단축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch Configurations&lt;/td&gt;
&lt;td&gt;Deprecated → &lt;strong&gt;Launch Template&lt;/strong&gt; 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html&quot;&gt;ALB 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html&quot;&gt;NLB 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/elasticloadbalancing/latest/gateway/introduction.html&quot;&gt;GWLB 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html&quot;&gt;ASG 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scale-based-on-demand.html&quot;&gt;ASG 스케일링 정책&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🗄️ AWS RDS &amp; Aurora (관계형 데이터베이스)</title><link>https://tessa1217.github.io/posts/aws/aws-rds-aurora/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-rds-aurora/</guid><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🗄️ AWS RDS &amp;amp; Aurora (관계형 데이터베이스)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS 관리형 관계형 DB 서비스 — 시험 고빈도 영역&lt;/p&gt;
&lt;p&gt;RDS는 다양한 엔진을 지원하고, Aurora는 AWS 전용 고성능 DB입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-rds-%EA%B0%9C%EC%9A%94&quot;&gt;RDS 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-rds-vs-ec2%EC%97%90%EC%84%9C-db-%EC%A7%81%EC%A0%91-%EC%9A%B4%EC%98%81&quot;&gt;RDS vs EC2에서 DB 직접 운영&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-rds-storage-auto-scaling&quot;&gt;RDS Storage Auto Scaling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-rds-read-replicas-%EC%9D%BD%EA%B8%B0-%EB%B3%B5%EC%A0%9C%EB%B3%B8&quot;&gt;RDS Read Replicas (읽기 복제본)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-rds-multi-az-%EC%9E%AC%ED%95%B4-%EB%B3%B5%EA%B5%AC&quot;&gt;RDS Multi-AZ (재해 복구)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-rds-custom&quot;&gt;RDS Custom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-amazon-aurora&quot;&gt;Amazon Aurora&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-aurora-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5&quot;&gt;Aurora 고급 기능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-rds-aurora-%EB%B0%B1%EC%97%85&quot;&gt;RDS &amp;amp; Aurora 백업&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-rds-aurora-%EB%B3%B4%EC%95%88&quot;&gt;RDS &amp;amp; Aurora 보안&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-%ED%95%B5%EC%8B%AC-%EB%B9%84%EA%B5%90-%EC%9A%94%EC%95%BD&quot;&gt;핵심 비교 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. RDS 개요&lt;/h2&gt;
&lt;h3&gt;🔑 RDS (Relational Database Service)란?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQL 기반 관계형 데이터베이스를 위한 &lt;strong&gt;AWS 관리형 서비스 (Managed DB Service)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;사용자가 DB 엔진만 선택하면 나머지는 AWS가 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;지원 DB 엔진&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔진&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;오픈소스, 기능 풍부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;가장 널리 사용되는 오픈소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MariaDB&lt;/td&gt;
&lt;td&gt;MySQL 포크, 오픈소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle&lt;/td&gt;
&lt;td&gt;상용 엔터프라이즈 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft SQL Server&lt;/td&gt;
&lt;td&gt;상용 엔터프라이즈 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBM DB2&lt;/td&gt;
&lt;td&gt;상용 엔터프라이즈 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS 독자 개발 (PostgreSQL/MySQL 호환)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;2. RDS vs EC2에서 DB 직접 운영&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;RDS (관리형)&lt;/th&gt;
&lt;th&gt;EC2에서 직접 운영&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;프로비저닝·OS 패치&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS 자동&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;연속 자동 백업 (PITR)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;직접 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모니터링 대시보드&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;직접 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;읽기 복제본 (Read Replica)&lt;/td&gt;
&lt;td&gt;✅ (간편 설정)&lt;/td&gt;
&lt;td&gt;직접 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-AZ 구성&lt;/td&gt;
&lt;td&gt;✅ (간편 설정)&lt;/td&gt;
&lt;td&gt;직접 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유지보수 창 (Maintenance Window)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;직접 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스토리지 자동 확장&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;직접 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH 접속&lt;/td&gt;
&lt;td&gt;❌ (관리 불가)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스토리지&lt;/td&gt;
&lt;td&gt;EBS 기반&lt;/td&gt;
&lt;td&gt;선택 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;3. RDS Storage Auto Scaling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RDS 인스턴스의 스토리지가 부족해질 때 &lt;strong&gt;자동으로 용량 확장&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;수동으로 DB 스토리지를 확장할 필요 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maximum Storage Threshold&lt;/strong&gt; (최대 스토리지 임계값) 설정 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;자동 확장 조건 (모두 충족 시)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1️⃣ 여유 스토리지 &amp;lt; 할당 스토리지의 10%
        AND
2️⃣ 저용량 상태가 5분 이상 지속
        AND
3️⃣ 마지막 수정으로부터 6시간 이상 경과
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Use Case&lt;/strong&gt;: 예측 불가한 워크로드(Unpredictable Workloads)가 있는 애플리케이션. 모든 RDS 엔진 지원.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. RDS Read Replicas (읽기 복제본)&lt;/h2&gt;
&lt;h3&gt;📖 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;읽기 요청(SELECT)을 메인 DB에서 분산하여 &lt;strong&gt;읽기 성능 향상&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비동기 복제 (ASYNC Replication)&lt;/strong&gt; → &lt;strong&gt;최종 일관성 (Eventually Consistent)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;복제 전에 읽으면 약간 오래된(Stale) 데이터가 조회될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Primary DB] ──ASYNC 복제──→ [Read Replica 1]
             ──ASYNC 복제──→ [Read Replica 2]  ← 읽기 전용 쿼리
             ──ASYNC 복제──→ [Read Replica N]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📋 주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 복제본 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;복제본 위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동일 AZ, 교차 AZ, &lt;strong&gt;교차 리전&lt;/strong&gt; 모두 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;복제 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비동기 (ASYNC)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;승격 가능 여부&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 독립 DB로 승격 가능 (Promote to own DB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 가능 작업&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SELECT만&lt;/strong&gt; (INSERT, UPDATE, DELETE 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::warning
⚠️ &lt;strong&gt;애플리케이션 수정 필요&lt;/strong&gt;: Read Replica를 사용하려면 연결 문자열(Connection String)을 복제본 엔드포인트로 업데이트해야 함.
:::&lt;/h2&gt;
&lt;h3&gt;💰 Read Replica 네트워크 비용&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;복제본 위치&lt;/th&gt;
&lt;th&gt;데이터 전송 비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동일 리전&lt;/strong&gt; 내 (AZ가 달라도)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;무료&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;교차 리전 (Cross Region)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;요금 부과&lt;/strong&gt; (비동기 복제 데이터 전송)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;💡 Read Replica 활용 시나리오&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[상황]
운영 DB: 정상 트래픽 처리 중
팀 요청: 분석용 리포팅 애플리케이션 추가

[잘못된 방법]  운영 DB에서 직접 분석 쿼리 실행 → 성능 저하
[올바른 방법]  Read Replica 생성 → 분석 쿼리는 복제본에서 실행
              → 운영 DB 영향 없음
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. RDS Multi-AZ (재해 복구)&lt;/h2&gt;
&lt;h3&gt;🔄 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;동기 복제 (SYNC Replication)&lt;/strong&gt; — 메인 DB의 모든 변경사항을 &lt;strong&gt;즉시&lt;/strong&gt; Standby에 동기화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단일 DNS 이름&lt;/strong&gt; — 장애 시 애플리케이션 수정 없이 &lt;strong&gt;자동 페일오버 (Automatic Failover)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[Primary DB] ──SYNC 복제──→ [Standby DB]
     │                           │
     └────── 단일 DNS ───────────┘
             (자동 전환)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📋 주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;복제 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;동기 (SYNC)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;재해 복구 (Disaster Recovery, DR)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;엔드포인트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;단일 DNS 이름&lt;/strong&gt; (페일오버 시 앱 수정 불필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;페일오버 트리거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AZ 장애, 네트워크 장애, 인스턴스 장애, 스토리지 장애&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스케일링 목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ (읽기 분산에 사용 불가, 스케일링 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
📌 &lt;strong&gt;Read Replica는 Multi-AZ로 설정 가능&lt;/strong&gt; → Standby 복제본을 이중 보호
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🔧 Single-AZ → Multi-AZ 전환&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero Downtime&lt;/strong&gt; — DB 중지 없이 전환 가능&lt;/li&gt;
&lt;li&gt;AWS 콘솔에서 &quot;Modify(수정)&quot; 클릭만으로 완료&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;내부 동작:
1. 현재 DB 스냅샷 생성
2. 새 AZ에 스냅샷에서 Standby DB 복원
3. 두 DB 간 동기화 확립 완료
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 Read Replica vs Multi-AZ 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Read Replica&lt;/th&gt;
&lt;th&gt;Multi-AZ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;복제 방식&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비동기 (ASYNC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;동기 (SYNC)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 목적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;읽기 성능 향상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;재해 복구 (DR)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;쓰기 가능 여부&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (Standby는 쓰기 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔드포인트&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;복제본별 별도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;단일 DNS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AZ 수&lt;/td&gt;
&lt;td&gt;1개 이상&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2개 (Primary + Standby)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수&lt;/td&gt;
&lt;td&gt;최대 15개&lt;/td&gt;
&lt;td&gt;1개 (Standby)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;6. RDS Custom&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oracle, Microsoft SQL Server&lt;/strong&gt;에만 지원&lt;/li&gt;
&lt;li&gt;표준 RDS: AWS가 DB와 OS를 완전 관리 (SSH 불가)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS Custom&lt;/strong&gt;: OS와 DB에 대한 &lt;strong&gt;관리자 수준 접근 권한&lt;/strong&gt; 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;RDS&lt;/th&gt;
&lt;th&gt;RDS Custom&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;설정 자동화&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (기본)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS 접근&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB 접근 (SSH/SSM)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패치 직접 설치&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;네이티브 기능 활성화&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::note
💡 &lt;strong&gt;커스터마이징 전&lt;/strong&gt;: 반드시 DB 스냅샷 생성 후 Automation Mode 비활성화
:::&lt;/h2&gt;
&lt;h2&gt;7. Amazon Aurora&lt;/h2&gt;
&lt;h3&gt;✨ 개요&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS가 독자 개발한 &lt;strong&gt;독점 기술 (Proprietary Technology)&lt;/strong&gt; (오픈소스 아님)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL, MySQL과 호환&lt;/strong&gt; (드라이버 교체만으로 마이그레이션 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS 클라우드에 최적화&lt;/strong&gt;: MySQL 대비 &lt;strong&gt;5배&lt;/strong&gt;, PostgreSQL 대비 &lt;strong&gt;3배&lt;/strong&gt; 성능 향상 주장&lt;/li&gt;
&lt;li&gt;스토리지 자동 증가: &lt;strong&gt;10GB 단위, 최대 128TB&lt;/strong&gt; (이전 256TB에서 업데이트)&lt;/li&gt;
&lt;li&gt;최대 &lt;strong&gt;15개 복제본&lt;/strong&gt;, 복제 지연 &lt;strong&gt;10ms 미만 (Sub 10ms replica lag)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;즉각적인 페일오버 (Instantaneous Failover)&lt;/strong&gt; — HA Native&lt;/li&gt;
&lt;li&gt;RDS 대비 &lt;strong&gt;약 20% 비용 증가&lt;/strong&gt; (하지만 효율성으로 상쇄)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🏗️ Aurora 고가용성 &amp;amp; 스토리지 아키텍처&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Aurora Writer (Master)]  →  [Read Replica] × 최대 15개
         │
         ▼
[분산 스토리지 클러스터]
├── AZ 1: 복사본 2개
├── AZ 2: 복사본 2개
└── AZ 3: 복사본 2개
     → 총 6개 복사본 (3 AZ × 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;총 데이터 복사본&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6개&lt;/strong&gt; (3개 AZ에 각 2개씩)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;쓰기 성공 기준&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6개 중 &lt;strong&gt;4개&lt;/strong&gt; 이상 성공 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;읽기 성공 기준&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6개 중 &lt;strong&gt;3개&lt;/strong&gt; 이상 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;자가 복구&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Peer-to-Peer 복제로 자동 복구 (Self-healing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스토리지 구성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;수백 개 볼륨에 스트라이핑(Striped)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Master 페일오버&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30초 이내&lt;/strong&gt; 자동 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔗 Aurora 엔드포인트&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Writer Endpoint] ──→ [Master (쓰기)]          ← 항상 마스터를 가리킴
[Reader Endpoint] ──→ [Read Replicas (읽기)]   ← 복제본 간 로드 밸런싱
[Custom Endpoint] ──→ [특정 복제본 서브셋]      ← 분석 쿼리 등 특수 목적
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔드포인트 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Writer Endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;마스터 자동 추적 (페일오버 시 자동 전환)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reader Endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 Read Replica에 연결 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 인스턴스 서브셋 지정 (고성능 인스턴스에만 분석 쿼리 전달)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;⚙️ Aurora DB 클러스터 주요 기능&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic Failover&lt;/strong&gt; (자동 페일오버)&lt;/td&gt;
&lt;td&gt;Master 장애 시 30초 내 자동 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup &amp;amp; Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자동 백업, PITR 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Isolation &amp;amp; Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC, KMS 암호화, IAM 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Industry Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;각종 규정 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Push-button Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;버튼 클릭으로 용량 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automated Patching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zero Downtime&lt;/strong&gt; 자동 패치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;세밀한 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backtrack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;백업 없이 &lt;strong&gt;특정 시점으로 데이터 복원&lt;/strong&gt; (Restore data at any point in time without using backups)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;8. Aurora 고급 기능&lt;/h2&gt;
&lt;h3&gt;🌐 Aurora Serverless&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;실제 사용량 기반 &lt;strong&gt;자동 DB 인스턴스화 및 오토스케일링&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비정기적(Infrequent), 간헐적(Intermittent), 예측 불가한(Unpredictable) 워크로드&lt;/strong&gt;에 적합&lt;/li&gt;
&lt;li&gt;용량 계획 불필요&lt;/li&gt;
&lt;li&gt;초 단위 과금 (Pay per second) — 경우에 따라 비용 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🌍 Global Aurora&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora Cross Region Read Replicas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;재해 복구(DR)용, 간단히 구성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora Global DB&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;전용 글로벌 아키텍처&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Aurora Global DB 특성:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1개 Primary Region&lt;/strong&gt; (읽기/쓰기)&lt;/li&gt;
&lt;li&gt;최대 &lt;strong&gt;5개 Secondary(보조) 리전&lt;/strong&gt; (읽기 전용)&lt;/li&gt;
&lt;li&gt;보조 리전당 최대 &lt;strong&gt;16개 Read Replica&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;리전 간 복제 지연 &lt;strong&gt;1초 미만 (&amp;lt; 1 second)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;보조 리전 승격 시 &lt;strong&gt;RTO(Recovery Time Objective) &amp;lt; 1분&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;지역별 지연 시간 감소에 효과적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🤖 Aurora Machine Learning&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Aurora에서 SQL 쿼리로 &lt;strong&gt;ML 기반 예측&lt;/strong&gt; 수행&lt;/li&gt;
&lt;li&gt;Aurora ↔ AWS ML 서비스 간 최적화된 보안 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지원 서비스&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon SageMaker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ML 모델 (범용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Comprehend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;감성 분석 (Sentiment Analysis)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 사기 탐지(Fraud Detection), 광고 타겟팅, 감성 분석, 상품 추천&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🔄 Babelfish for Aurora PostgreSQL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Aurora PostgreSQL이 &lt;strong&gt;Microsoft SQL Server의 T-SQL 명령을 이해&lt;/strong&gt;하도록 지원&lt;/li&gt;
&lt;li&gt;MS SQL Server 기반 애플리케이션을 &lt;strong&gt;코드 수정 거의 없이&lt;/strong&gt; Aurora PostgreSQL로 마이그레이션 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;9. RDS &amp;amp; Aurora 백업&lt;/h2&gt;
&lt;h3&gt;🔄 자동 백업 (Automated Backups)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;RDS&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백업 주기&lt;/td&gt;
&lt;td&gt;매일 전체 백업 (지정 백업 창)&lt;/td&gt;
&lt;td&gt;지속 백업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;트랜잭션 로그&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5분마다&lt;/strong&gt; 백업&lt;/td&gt;
&lt;td&gt;지속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PITR (Point-in-Time Recovery)&lt;/td&gt;
&lt;td&gt;최근 5분 전까지 복원 가능&lt;/td&gt;
&lt;td&gt;동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보존 기간&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1~35일&lt;/strong&gt; (0으로 설정 시 비활성화)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1~35일&lt;/strong&gt; (&lt;strong&gt;비활성화 불가&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;📸 수동 스냅샷 (Manual DB Snapshots)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;사용자가 직접 트리거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;보존 기간 무제한&lt;/strong&gt; (자동 백업은 최대 35일)&lt;/li&gt;
&lt;li&gt;오래 DB를 중지할 경우: 스냅샷 저장 후 삭제 → 나중에 복원 (스토리지 비용 절감)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🔃 복원 옵션 (Restore Options)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백업/스냅샷 복원&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;새 DB 인스턴스 생성&lt;/strong&gt; (기존 DB 덮어쓰기 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL RDS ← S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;온프레미스 DB 백업을 S3에 저장 후 새 RDS에 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL Aurora ← S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Percona XtraBackup&lt;/strong&gt;으로 백업 → S3 → 새 Aurora 클러스터 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔁 Aurora Database Cloning (클로닝)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기존 Aurora DB 클러스터에서 &lt;strong&gt;새 클러스터 빠르게 생성&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;스냅샷 &amp;amp; 복원보다 &lt;strong&gt;빠름&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy-on-Write 프로토콜&lt;/strong&gt; 사용:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;초기 상태: 원본과 클론이 동일한 스토리지 볼륨 공유 (복사 없음 → 빠름)
         │
         ▼
클론에 데이터 변경 발생 시: 변경된 데이터만 별도 스토리지에 분리 저장
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: &lt;strong&gt;프로덕션 DB에 영향 없이 스테이징 DB 즉시 생성&lt;/strong&gt; (Useful to create a staging database from a production database without impacting the production database)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. RDS &amp;amp; Aurora 보안&lt;/h2&gt;
&lt;h3&gt;🔐 보안 레이어&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;보안 항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;저장 데이터 암호화 (At-rest Encryption)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS KMS&lt;/strong&gt; 사용, 생성 시 정의 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전송 데이터 암호화 (In-flight Encryption)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TLS 기본 활성화&lt;/strong&gt; (AWS TLS 루트 인증서 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM 인증&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용자명/비밀번호 대신 &lt;strong&gt;IAM 역할&lt;/strong&gt;로 DB 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보안 그룹 (Security Groups)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RDS/Aurora에 대한 네트워크 접근 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSH 접속&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 불가 (RDS Custom 제외)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;감사 로그 (Audit Logs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;활성화 시 &lt;strong&gt;CloudWatch Logs&lt;/strong&gt;로 전송 (장기 보존)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔑 암호화 관련 핵심 규칙&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;마스터 암호화 ← Read Replica 암호화 여부 결정
  │
  ├── 마스터 암호화 → 복제본도 암호화 가능
  └── 마스터 미암호화 → 복제본 암호화 불가 ❌

미암호화 DB → 암호화 변환 방법:
  1. DB 스냅샷 생성
  2. 스냅샷 복사 시 암호화 활성화
  3. 암호화된 스냅샷으로 새 DB 복원
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;11. 핵심 비교 요약&lt;/h2&gt;
&lt;h3&gt;RDS vs Aurora&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;RDS&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;엔진&lt;/td&gt;
&lt;td&gt;여러 엔진 선택&lt;/td&gt;
&lt;td&gt;PostgreSQL/MySQL 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;표준&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MySQL 5배, PostgreSQL 3배&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스토리지&lt;/td&gt;
&lt;td&gt;EBS (수동 확장)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;자동 확장 (최대 128TB)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read Replica 수&lt;/td&gt;
&lt;td&gt;최대 15개&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대 15개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복제 지연&lt;/td&gt;
&lt;td&gt;일반적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sub 10ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;페일오버&lt;/td&gt;
&lt;td&gt;수분&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30초 이내&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;기준&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20% 높음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 복사본&lt;/td&gt;
&lt;td&gt;1~2개&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6개 (3 AZ × 2)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH 접속&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backtrack&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 시험 자주 출제 포인트&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read Replica 복제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비동기 (ASYNC)&lt;/strong&gt; → 최종 일관성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-AZ 복제&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;동기 (SYNC)&lt;/strong&gt; → 재해 복구 목적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-AZ 목적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DR (재해 복구)&lt;/strong&gt;, 스케일링 아님&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read Replica 비용&lt;/td&gt;
&lt;td&gt;동일 리전은 무료, 교차 리전은 유료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read Replica 용도&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SELECT만&lt;/strong&gt; (쓰기 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single→Multi-AZ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zero Downtime&lt;/strong&gt; 전환 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora 복사본 수&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6개&lt;/strong&gt; (3 AZ, 각 2개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora 쓰기 정족수&lt;/td&gt;
&lt;td&gt;6개 중 &lt;strong&gt;4개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora 읽기 정족수&lt;/td&gt;
&lt;td&gt;6개 중 &lt;strong&gt;3개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora 페일오버&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30초 이내&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Global 복제 지연&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1초 미만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Global RTO&lt;/td&gt;
&lt;td&gt;리전 승격 시 &lt;strong&gt;1분 미만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Backtrack&lt;/td&gt;
&lt;td&gt;백업 없이 특정 시점 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Cloning&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Copy-on-Write&lt;/strong&gt;, 스테이징 DB 생성에 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS 자동 백업 보존&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대 35일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora 자동 백업&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비활성화 불가&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL Aurora S3 복원&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Percona XtraBackup&lt;/strong&gt; 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS 암호화 키&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS KMS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;암호화 DB 복제본&lt;/td&gt;
&lt;td&gt;마스터 미암호화 시 복제본 암호화 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS Custom 지원 엔진&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Oracle, MS SQL Server만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/rds/latest/userguide/Welcome.html&quot;&gt;Amazon RDS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html&quot;&gt;Amazon Aurora 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html&quot;&gt;Aurora Global Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.BackupRestore.html&quot;&gt;RDS 백업 및 복원&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Clone.html&quot;&gt;Aurora Database Cloning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>💾 AWS Storage</title><link>https://tessa1217.github.io/posts/aws/aws-storage/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-storage/</guid><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;💾 AWS Storage&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;EC2와 함께 사용하는 핵심 스토리지 서비스 정리&lt;/p&gt;
&lt;p&gt;EBS · EFS · EC2 Instance Store · AMI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%9C%A0%ED%98%95-%EB%B9%84%EA%B5%90&quot;&gt;1. 스토리지 유형 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-ebs-elastic-block-store&quot;&gt;2. EBS (Elastic Block Store)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-ebs-%EB%B3%BC%EB%A5%A8-%ED%83%80%EC%9E%85&quot;&gt;3. EBS 볼륨 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-ebs-snapshots-%EC%8A%A4%EB%83%85%EC%83%B7&quot;&gt;4. EBS Snapshots (스냅샷)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-ebs-encryption-%EC%95%94%ED%98%B8%ED%99%94&quot;&gt;5. EBS Encryption (암호화)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-ebs-multi-attach&quot;&gt;6. EBS Multi-Attach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-ec2-instance-store&quot;&gt;7. EC2 Instance Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-ami-amazon-machine-image&quot;&gt;8. AMI (Amazon Machine Image)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-efs-elastic-file-system&quot;&gt;9. EFS (Elastic File System)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%ED%95%B5%EC%8B%AC-%EB%B9%84%EA%B5%90-%EC%9A%94%EC%95%BD&quot;&gt;10. 핵심 비교 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%9C%ED%97%98-%EC%9E%90%EC%A3%BC-%EC%B6%9C%EC%A0%9C-%ED%8F%AC%EC%9D%B8%ED%8A%B8&quot;&gt;📌 시험 자주 출제 포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;📚 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 스토리지 유형 비교&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;EC2 인스턴스가 사용할 수 있는 스토리지 종류

├── Block Storage (블록 스토리지)
│   ├── EBS (Elastic Block Store)  — 네트워크 연결, 영구, AZ 종속
│   └── EC2 Instance Store         — 하드웨어 직결, 임시(Ephemeral), 초고속
│
└── File Storage (파일 스토리지)
    └── EFS (Elastic File System)  — 네트워크 파일시스템, 멀티 AZ, 멀티 인스턴스
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;EBS&lt;/th&gt;
&lt;th&gt;EC2 Instance Store&lt;/th&gt;
&lt;th&gt;EFS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;연결 방식&lt;/td&gt;
&lt;td&gt;네트워크 (Network-attached)&lt;/td&gt;
&lt;td&gt;하드웨어 직결 (Hardware)&lt;/td&gt;
&lt;td&gt;네트워크 파일시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;영속성&lt;/td&gt;
&lt;td&gt;✅ 영구 (인스턴스 종료 후에도 유지 가능)&lt;/td&gt;
&lt;td&gt;❌ 임시 (인스턴스 중지/종료 시 소멸)&lt;/td&gt;
&lt;td&gt;✅ 영구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AZ 범위&lt;/td&gt;
&lt;td&gt;특정 AZ에 종속&lt;/td&gt;
&lt;td&gt;특정 인스턴스에 종속&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;멀티 AZ 공유 가능&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;좋음 (설정에 따라 다름)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최고 (직결 I/O)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;좋음 (처리량 확장 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공유 가능&lt;/td&gt;
&lt;td&gt;제한적 (Multi-Attach: io1/io2만)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ 수백 인스턴스 동시 마운트&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS 지원&lt;/td&gt;
&lt;td&gt;Linux, Windows&lt;/td&gt;
&lt;td&gt;Linux, Windows&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Linux 전용 (POSIX)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;프로비저닝 용량 기준 과금&lt;/td&gt;
&lt;td&gt;인스턴스 비용에 포함&lt;/td&gt;
&lt;td&gt;사용량 기준 과금 (gp2의 약 3배)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;2. EBS (Elastic Block Store)&lt;/h2&gt;
&lt;h3&gt;📦 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;네트워크 USB 스틱 (Network USB Stick)&quot;&lt;/strong&gt; — 인스턴스와 네트워크로 통신&lt;/li&gt;
&lt;li&gt;실행 중인 인스턴스에 연결 가능한 &lt;strong&gt;네트워크 드라이브 (Network Drive)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;인스턴스 종료(Terminate) 후에도 &lt;strong&gt;데이터 영구 보존&lt;/strong&gt; 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특정 AZ에 종속&lt;/strong&gt; — AZ 간 이동 불가 (스냅샷을 통해 이전)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[EC2 Instance]  ←── 네트워크 ───→  [EBS Volume]
  us-east-1a                         us-east-1a (동일 AZ 필수)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;⚙️ 주요 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;속성&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량 (Capacity)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;생성 시 크기(GiB)와 IOPS를 미리 프로비저닝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;과금 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;프로비저닝한 전체 용량&lt;/strong&gt; 기준 (사용량 무관)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;용량 변경&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;운영 중 온라인으로 증가 가능 (감소 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;연결 대상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본적으로 &lt;strong&gt;한 인스턴스에만&lt;/strong&gt; 연결 (Multi-Attach 예외)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🗑️ Delete on Termination 속성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;볼륨 유형&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;루트 EBS 볼륨 (Root Volume)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;활성화 (Enabled)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인스턴스 종료 시 자동 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;추가 EBS 볼륨 (Additional Volume)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;비활성화 (Disabled)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인스턴스 종료 후에도 볼륨 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;실무 팁&lt;/strong&gt;: 데이터 보호가 필요한 경우 루트 볼륨의 Delete on Termination을 비활성화하거나, 별도 데이터 볼륨을 추가로 구성하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;3. EBS 볼륨 타입&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;시험 핵심&lt;/strong&gt;: 부트 볼륨(Boot Volume)으로 사용 가능한 타입은 &lt;strong&gt;gp2, gp3, io1, io2 Block Express&lt;/strong&gt; 뿐. HDD 계열(st1, sc1)은 부트 볼륨 불가.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 전체 타입 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;타입&lt;/th&gt;
&lt;th&gt;분류&lt;/th&gt;
&lt;th&gt;크기 범위&lt;/th&gt;
&lt;th&gt;최대 IOPS&lt;/th&gt;
&lt;th&gt;최대 처리량&lt;/th&gt;
&lt;th&gt;부트 볼륨&lt;/th&gt;
&lt;th&gt;주요 용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gp3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSD 범용&lt;/td&gt;
&lt;td&gt;1GiB~16TiB&lt;/td&gt;
&lt;td&gt;16,000&lt;/td&gt;
&lt;td&gt;1,000 MiB/s&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;대부분의 워크로드 ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gp2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSD 범용&lt;/td&gt;
&lt;td&gt;1GiB~16TiB&lt;/td&gt;
&lt;td&gt;16,000&lt;/td&gt;
&lt;td&gt;250 MiB/s&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;gp3 전환 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;io1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSD 고성능&lt;/td&gt;
&lt;td&gt;4GiB~16TiB&lt;/td&gt;
&lt;td&gt;64,000 (Nitro)&lt;/td&gt;
&lt;td&gt;1,000 MiB/s&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;고성능 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;io2 Block Express&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSD 고성능&lt;/td&gt;
&lt;td&gt;4GiB~64TiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4,000 MiB/s&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;미션 크리티컬 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;st1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HDD 처리량 최적화&lt;/td&gt;
&lt;td&gt;125GiB~16TiB&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;500 MiB/s&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;빅데이터, 로그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sc1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HDD 저비용&lt;/td&gt;
&lt;td&gt;125GiB~16TiB&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;250 MiB/s&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;콜드 데이터, 최저가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔵 General Purpose SSD (gp3 / gp2)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;gp3&lt;/strong&gt; — 현재 권장 범용 타입 ⭐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기본 IOPS 3,000, 처리량 125 MiB/s 제공&lt;/li&gt;
&lt;li&gt;IOPS(최대 16,000)와 처리량(최대 1,000 MiB/s)을 &lt;strong&gt;독립적으로&lt;/strong&gt; 설정 가능&lt;/li&gt;
&lt;li&gt;적합: 시스템 부트 볼륨, 가상 데스크톱, 개발/테스트 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;gp2&lt;/strong&gt; — 구세대 (마이그레이션 권장)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IOPS와 볼륨 크기가 &lt;strong&gt;연동&lt;/strong&gt; (3 IOPS/GiB), 크기 늘려야 IOPS 증가&lt;/li&gt;
&lt;li&gt;5,334 GiB에서 최대 IOPS(16,000) 도달&lt;/li&gt;
&lt;li&gt;소규모 볼륨은 3,000 IOPS까지 버스트 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;gp2 → gp3 전환&lt;/strong&gt;: 동일 성능 기준 약 20% 비용 절감. 독립 IOPS 설정으로 유연성도 향상.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;🟠 Provisioned IOPS SSD (io1 / io2 Block Express)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;지속적인 고IOPS&lt;/strong&gt;가 필요한 미션 크리티컬 비즈니스 애플리케이션&lt;/li&gt;
&lt;li&gt;DB 워크로드처럼 &lt;strong&gt;스토리지 성능과 일관성에 민감한&lt;/strong&gt; 애플리케이션에 최적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16,000 IOPS 초과&lt;/strong&gt;가 필요한 경우 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;io1&lt;/th&gt;
&lt;th&gt;io2 Block Express&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;크기&lt;/td&gt;
&lt;td&gt;4GiB ~ 16TiB&lt;/td&gt;
&lt;td&gt;4GiB ~ &lt;strong&gt;64TiB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 PIOPS&lt;/td&gt;
&lt;td&gt;64,000 (Nitro EC2) / 32,000 (기타)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IOPS:GiB 비율&lt;/td&gt;
&lt;td&gt;50:1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,000:1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;지연 시간&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;서브 밀리초 (Sub-millisecond)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EBS Multi-Attach&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🟤 Hard Disk Drives (st1 / sc1)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;부트 볼륨으로 사용 불가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;크기 범위: 125GiB ~ 16TiB&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;타입&lt;/th&gt;
&lt;th&gt;별칭&lt;/th&gt;
&lt;th&gt;최대 처리량&lt;/th&gt;
&lt;th&gt;최대 IOPS&lt;/th&gt;
&lt;th&gt;적합한 용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;st1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Throughput Optimized HDD (처리량 최적화 HDD)&lt;/td&gt;
&lt;td&gt;500 MiB/s&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;빅데이터, 데이터 웨어하우스, 로그 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sc1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cold HDD (콜드 HDD)&lt;/td&gt;
&lt;td&gt;250 MiB/s&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;비정기 접근 데이터, 최저 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;4. EBS Snapshots (스냅샷)&lt;/h2&gt;
&lt;h3&gt;📸 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;특정 시점의 EBS 볼륨 백업 (Point-in-time Backup)&lt;/li&gt;
&lt;li&gt;스냅샷 시 볼륨을 꼭 분리(Detach)할 필요는 없으나 &lt;strong&gt;권장&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;스냅샷은 &lt;strong&gt;AZ 또는 리전 간 복사&lt;/strong&gt; 가능 → AZ 간 볼륨 이전 수단&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;us-east-1a [EBS Volume] → 스냅샷 생성 → us-east-1b [새 EBS Volume] 복원
                             (S3에 저장됨)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;✨ 스냅샷 주요 기능&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;비용/속도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EBS Snapshot Archive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스냅샷을 &apos;아카이브 티어(Archive Tier)&apos;로 이동&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75% 저렴&lt;/strong&gt;, 복원에 24~72시간 소요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recycle Bin (휴지통)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;삭제된 스냅샷을 지정 기간 동안 보존&lt;/td&gt;
&lt;td&gt;보존 기간: 1일~1년 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fast Snapshot Restore (FSR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스냅샷의 전체 초기화를 강제하여 첫 사용 시 지연 없음&lt;/td&gt;
&lt;td&gt;비용 높음 ($$$), 즉시 사용 필요 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;실무 팁&lt;/strong&gt;: 자주 접근하지 않는 스냅샷은 Archive Tier로 이동하고, 실수 삭제 방지를 위해 Recycle Bin 규칙을 설정하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;5. EBS Encryption (암호화)&lt;/h2&gt;
&lt;h3&gt;🔒 암호화된 EBS 볼륨의 특성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;볼륨 내 저장 데이터 (Data at rest) 암호화&lt;/li&gt;
&lt;li&gt;인스턴스 ↔ 볼륨 간 전송 데이터 (Data in flight) 암호화&lt;/li&gt;
&lt;li&gt;해당 볼륨으로 생성된 모든 스냅샷 암호화&lt;/li&gt;
&lt;li&gt;암호화된 스냅샷으로 생성한 모든 볼륨 암호화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;암호화/복호화는 AWS가 투명하게 처리&lt;/strong&gt; (사용자가 별도 조작 불필요)&lt;/li&gt;
&lt;li&gt;지연 시간에 미치는 영향 최소화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS KMS (AES-256)&lt;/strong&gt; 키 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🔄 미암호화 볼륨 → 암호화 변환 절차&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1️⃣ 기존 미암호화 EBS 볼륨의 스냅샷 생성
        │
        ▼
2️⃣ 스냅샷 복사 시 암호화 옵션 활성화 (Encrypt the EBS snapshot using copy)
        │
        ▼
3️⃣ 암호화된 스냅샷으로 새 EBS 볼륨 생성 (볼륨도 자동으로 암호화됨)
        │
        ▼
4️⃣ 원본 인스턴스에 새 암호화 볼륨 연결
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;시험 포인트&lt;/strong&gt;: 미암호화 스냅샷을 복사(Copy)할 때 암호화를 활성화하면 암호화된 스냅샷으로 변환 가능. 암호화된 볼륨의 스냅샷은 항상 암호화됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;6. EBS Multi-Attach&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;동일 AZ 내&lt;/strong&gt; 여러 EC2 인스턴스에 &lt;strong&gt;같은 EBS 볼륨&lt;/strong&gt;을 동시에 연결&lt;/li&gt;
&lt;li&gt;각 인스턴스는 볼륨에 대한 &lt;strong&gt;전체 읽기/쓰기 권한&lt;/strong&gt; 보유&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;io1 / io2 Block Express 타입만&lt;/strong&gt; 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 연결 인스턴스 수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;16개&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 가능 파일시스템&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;클러스터 인식 파일시스템 필수 (XFS, EXT4 등 일반 파일시스템 사용 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주요 Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;클러스터형 Linux 애플리케이션의 고가용성 확보 (ex: Teradata)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::warning
일반 XFS, EXT4 파일시스템은 Multi-Attach 환경에서 데이터 충돌 발생. OCFS2, GFS2 같은 클러스터 인식 파일시스템 사용 필요.
:::&lt;/h2&gt;
&lt;h2&gt;7. EC2 Instance Store&lt;/h2&gt;
&lt;h3&gt;⚡ 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EC2 인스턴스에 &lt;strong&gt;물리적으로 직결된 하드웨어 디스크&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;네트워크 경유 없이 직접 I/O → &lt;strong&gt;EBS보다 훨씬 높은 I/O 성능&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⚠️ 핵심 제약: 임시 스토리지 (Ephemeral Storage)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;인스턴스 중지(Stop) 또는 종료(Terminate) → 데이터 완전 소멸 ❌
인스턴스 재부팅(Reboot) → 데이터 유지 ✅
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;매우 높음 (수백만 IOPS 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영속성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 임시 (인스턴스 중지/종료 시 소멸)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;하드웨어 장애 시&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 손실 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;백업/복제&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용자 책임&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;적합한 Use Case:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;버퍼 (Buffer)&lt;/li&gt;
&lt;li&gt;캐시 (Cache)&lt;/li&gt;
&lt;li&gt;임시 데이터 (Scratch data / Temporary content)&lt;/li&gt;
&lt;li&gt;빠른 읽기/쓰기가 필요한 임시 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;데이터베이스, 영구 보관 데이터에는 절대 사용 금지&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;8. AMI (Amazon Machine Image)&lt;/h2&gt;
&lt;h3&gt;🖼️ 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMI (Amazon Machine Image, 아마존 머신 이미지)&lt;/strong&gt;: EC2 인스턴스의 커스터마이징 템플릿&lt;/li&gt;
&lt;li&gt;OS, 소프트웨어, 설정, 모니터링 에이전트 등을 미리 패키징&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;빠른 부팅/설정&lt;/strong&gt;: 필요한 소프트웨어가 이미 포함되어 있어 User Data 스크립트 최소화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특정 리전에 귀속&lt;/strong&gt;, 리전 간 복사 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📂 AMI 소스 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public AMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS가 제공하는 공식 AMI&lt;/td&gt;
&lt;td&gt;Amazon Linux 2, Ubuntu, Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Own AMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 생성·관리하는 커스텀 AMI&lt;/td&gt;
&lt;td&gt;사내 표준 이미지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Marketplace AMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;벤더가 제공하는 상용 AMI&lt;/td&gt;
&lt;td&gt;방화벽, DB, 보안 솔루션 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🛠️ AMI 생성 프로세스&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1️⃣ EC2 인스턴스 시작 후 소프트웨어/설정 커스터마이징
        │
        ▼
2️⃣ 인스턴스 중지 (데이터 무결성 보장을 위해 Stop 권장)
        │
        ▼
3️⃣ AMI 빌드 (내부적으로 EBS 스냅샷도 함께 생성)
        │
        ▼
4️⃣ 다른 인스턴스를 해당 AMI로 신속하게 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;골든 AMI (Golden AMI) 패턴&lt;/strong&gt;: 표준화된 기업 환경 이미지를 AMI로 만들어 두고, Auto Scaling Group에서 사용. 배포 속도와 일관성 향상.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;9. EFS (Elastic File System)&lt;/h2&gt;
&lt;h3&gt;📁 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;관리형 NFS (Network File System)&lt;/strong&gt; — 여러 EC2에 동시에 마운트 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;멀티 AZ&lt;/strong&gt;에서 동시 접근 가능&lt;/li&gt;
&lt;li&gt;용량 자동 확장 (페타바이트 규모까지), 사용량 기반 과금 (Pay-per-use)&lt;/li&gt;
&lt;li&gt;Linux 기반 AMI 전용 (&lt;strong&gt;Windows 미지원&lt;/strong&gt;, POSIX 파일시스템)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFSv4.1 프로토콜&lt;/strong&gt; 사용&lt;/li&gt;
&lt;li&gt;보안 그룹(Security Group)으로 접근 제어&lt;/li&gt;
&lt;li&gt;KMS 기반 저장 데이터 암호화&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;           [EFS]
          /  |  \
    [EC2]  [EC2]  [EC2]
    AZ-1   AZ-2   AZ-3
    (동시 마운트 가능, 파일 공유)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;주요 Use Case&lt;/strong&gt;: 콘텐츠 관리(Content Management), 웹 서빙(Web Serving), 데이터 공유, WordPress&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;⚡ 성능 모드 (Performance Mode)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;EFS 생성 시 설정, &lt;strong&gt;이후 변경 불가&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;적합한 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;General Purpose&lt;/strong&gt; (기본값)&lt;/td&gt;
&lt;td&gt;저지연, 범용&lt;/td&gt;
&lt;td&gt;웹 서버, CMS, 일반 파일 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max I/O&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;높은 지연 허용, 높은 처리량, 고도 병렬 처리&lt;/td&gt;
&lt;td&gt;빅데이터, 미디어 처리, HPC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔄 처리량 모드 (Throughput Mode)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bursting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저장 용량 기반 처리량 (1TB = 50MiB/s + 최대 100MiB/s 버스트)&lt;/td&gt;
&lt;td&gt;예측 가능한 소규모 워크로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Provisioned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저장 용량과 무관하게 원하는 처리량 설정&lt;/td&gt;
&lt;td&gt;ex: 1TiB 용량에 1GiB/s 처리량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Elastic&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;워크로드에 따라 처리량 자동 확장/축소&lt;/td&gt;
&lt;td&gt;읽기 최대 3GiB/s, 쓰기 최대 1GiB/s, &lt;strong&gt;예측 불가한 워크로드에 권장&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🗂️ 스토리지 클래스 (Storage Classes)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;라이프사이클 정책(Lifecycle Policy)으로 N일 후 자동 계층 이동&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;계층&lt;/th&gt;
&lt;th&gt;접근 빈도&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자주 접근&lt;/td&gt;
&lt;td&gt;기본 계층, 빠른 응답&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrequent Access (EFS-IA)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;비정기 접근&lt;/td&gt;
&lt;td&gt;저장 비용 저렴, 조회 시 추가 요금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;연 몇 차례&lt;/td&gt;
&lt;td&gt;50% 더 저렴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;비용 절감&lt;/strong&gt;: 라이프사이클 정책으로 &lt;strong&gt;90% 이상 비용 절감&lt;/strong&gt; 가능&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;🌐 가용성 및 내구성 (Availability &amp;amp; Durability)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;적합한 환경&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard (Multi-AZ)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;여러 AZ에 분산 저장&lt;/td&gt;
&lt;td&gt;프로덕션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One Zone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;단일 AZ&lt;/td&gt;
&lt;td&gt;개발/테스트, 비용 절감 필요 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One Zone-IA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;단일 AZ + 비정기 접근 계층&lt;/td&gt;
&lt;td&gt;최대 비용 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 핵심 비교 요약&lt;/h2&gt;
&lt;h3&gt;EBS vs EFS vs Instance Store&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;데이터 영속성
  영구 ──────────────────────────── 임시
  EFS          EBS          EC2 Instance Store

공유 범위
  멀티 인스턴스/멀티 AZ ──────── 단일 인스턴스
  EFS              EBS (기본)    Instance Store

성능
  중간           중간~높음       최고 (직결)
  EFS             EBS            Instance Store
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;선택&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS 루트 볼륨&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EBS gp3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;고성능 DB (높은 IOPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EBS io2 Block Express&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;여러 인스턴스 파일 공유&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EFS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;임시 캐시·버퍼 (최고속도)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EC2 Instance Store&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자주 쓰는 이미지 배포 표준화&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AMI&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;콜드 데이터, 최저 비용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EBS sc1&lt;/strong&gt; or &lt;strong&gt;EFS Archive&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📌 시험 자주 출제 포인트&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부트 볼륨 가능 타입&lt;/td&gt;
&lt;td&gt;gp2, gp3, io1, io2 Block Express (HDD는 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EBS AZ 이전 방법&lt;/td&gt;
&lt;td&gt;스냅샷 생성 → 다른 AZ에서 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EBS 암호화 키&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AWS KMS (AES-256)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;미암호화 → 암호화&lt;/td&gt;
&lt;td&gt;스냅샷 복사 시 암호화 옵션 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EBS Multi-Attach&lt;/td&gt;
&lt;td&gt;io1/io2만, 동일 AZ 내, 최대 16개 인스턴스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instance Store 데이터 유지&lt;/td&gt;
&lt;td&gt;재부팅(Reboot)만 유지, Stop/Terminate 시 소멸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFS OS 지원&lt;/td&gt;
&lt;td&gt;Linux 전용 (POSIX), Windows 미지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFS 처리량 모드 권장&lt;/td&gt;
&lt;td&gt;예측 불가 워크로드 → &lt;strong&gt;Elastic&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFS 비용 절감&lt;/td&gt;
&lt;td&gt;라이프사이클 정책 → 최대 90% 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html&quot;&gt;EBS 볼륨 타입 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ebs/latest/userguide/EBSSnapshots.html&quot;&gt;EBS 스냅샷 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html&quot;&gt;EFS 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html&quot;&gt;EC2 Instance Store 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🖥️ AWS EC2 (Elastic Compute Cloud)</title><link>https://tessa1217.github.io/posts/aws/aws-ec2-1/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-ec2-1/</guid><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🖥️ AWS EC2 (Elastic Compute Cloud)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;EC2 = &lt;strong&gt;Infrastructure as a Service (IaaS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;가상 서버를 온디맨드로 임대하여 컴퓨팅 리소스를 유연하게 사용하는 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-ec2-%EA%B0%9C%EC%9A%94&quot;&gt;EC2 개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-ec2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%ED%83%80%EC%9E%85&quot;&gt;EC2 인스턴스 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-security-groups-%EB%B3%B4%EC%95%88-%EA%B7%B8%EB%A3%B9&quot;&gt;Security Groups (보안 그룹)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-ssh-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95&quot;&gt;SSH 접속 방법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EA%B5%AC%EB%A7%A4-%EC%98%B5%EC%85%98-purchasing-options&quot;&gt;구매 옵션 (Purchasing Options)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-spot-instance-%EC%8B%AC%ED%99%94&quot;&gt;Spot Instance 심화&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-ip-%EC%A3%BC%EC%86%8C-elastic-ip&quot;&gt;IP 주소 &amp;amp; Elastic IP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EB%B0%B0%EC%B9%98-%EA%B7%B8%EB%A3%B9-placement-groups&quot;&gt;배치 그룹 (Placement Groups)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%ED%83%84%EB%A0%A5%EC%A0%81-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-eni&quot;&gt;탄력적 네트워크 인터페이스 (ENI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-ec2-%EC%B5%9C%EB%8C%80-%EC%A0%88%EC%A0%84-%EB%AA%A8%EB%93%9C-hibernate&quot;&gt;EC2 최대 절전 모드 (Hibernate)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-best-practices&quot;&gt;Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD&quot;&gt;핵심 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. EC2 개요&lt;/h2&gt;
&lt;h3&gt;☁️ EC2가 제공하는 것&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;서비스&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;가상 서버 임대&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2&lt;/td&gt;
&lt;td&gt;다양한 OS/스펙의 가상 머신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;가상 드라이브&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EBS&lt;/td&gt;
&lt;td&gt;네트워크 연결 블록 스토리지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;로드 분산&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ELB&lt;/td&gt;
&lt;td&gt;여러 인스턴스에 트래픽 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;자동 확장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ASG&lt;/td&gt;
&lt;td&gt;수요에 따른 인스턴스 수 조절&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;⚙️ EC2 설정 옵션&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;EC2 인스턴스 구성 요소
├── OS: Linux / Windows / macOS
├── CPU: vCPU 수, 프로세서 아키텍처 (x86, ARM/Graviton)
├── RAM: 메모리 크기
├── Storage
│   ├── Network-attached: EBS (Elastic Block Store), EFS (Elastic File System)
│   └── Hardware: EC2 Instance Store (임시, 고속)
├── Network: 네트워크 카드 속도, 공인 IP 설정
├── Security Group: 방화벽 규칙
└── User Data: 최초 실행 시 부트스트랩 스크립트
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🚀 EC2 User Data (부트스트랩)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스 &lt;strong&gt;최초 시작 시 딱 한 번만&lt;/strong&gt; 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;root 권한&lt;/strong&gt;으로 실행됨&lt;/li&gt;
&lt;li&gt;자동화할 수 있는 작업 예시:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# EC2 User Data 예시
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo &quot;&amp;lt;h1&amp;gt;Hello from EC2 $(hostname -f)&amp;lt;/h1&amp;gt;&quot; &amp;gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;활용 팁&lt;/strong&gt;: 소프트웨어 설치, 설정 파일 다운로드, 환경변수 설정 등 초기화 작업을 자동화할 때 사용. 복잡한 설정이 필요하면 CloudFormation 또는 Ansible 연계 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2. EC2 인스턴스 타입&lt;/h2&gt;
&lt;h3&gt;🏷️ 명명 규칙&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;m  7  g  .  2xlarge
│  │  │       └── 크기 (nano / micro / small / medium / large / xlarge / 2xlarge ...)
│  │  └────────── 추가 속성 (g=Graviton, a=AMD, i=Intel, n=고속 네트워크)
│  └───────────── 세대 (숫자가 높을수록 최신)
└──────────────── 인스턴스 패밀리 (m=범용, c=컴퓨팅, r=메모리, i=스토리지 등)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 인스턴스 패밀리별 용도&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;패밀리&lt;/th&gt;
&lt;th&gt;대표 타입&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;General Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;m7i, m7g, t3&lt;/td&gt;
&lt;td&gt;CPU/메모리/네트워크 균형&lt;/td&gt;
&lt;td&gt;웹 서버, 코드 저장소, 소규모 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute Optimized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;c7i, c7g, c6a&lt;/td&gt;
&lt;td&gt;고성능 CPU 중심&lt;/td&gt;
&lt;td&gt;배치 처리, 미디어 트랜스코딩, HPC, ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Optimized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;r7i, r7g, x2&lt;/td&gt;
&lt;td&gt;대용량 메모리&lt;/td&gt;
&lt;td&gt;인메모리 DB, 실시간 빅데이터, SAP HANA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Optimized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;i4i, d3, h1&lt;/td&gt;
&lt;td&gt;고속 로컬 스토리지&lt;/td&gt;
&lt;td&gt;OLTP, Redis 캐시, 데이터 웨어하우스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accelerated Computing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;p4, g5, trn1, inf2&lt;/td&gt;
&lt;td&gt;GPU/NPU 탑재&lt;/td&gt;
&lt;td&gt;AI/ML 학습·추론, 게임 스트리밍&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;⚡ Graviton (ARM 기반) 인스턴스 — 2025 핵심 트렌드&lt;/h3&gt;
&lt;p&gt;AWS Graviton 프로세서 기반 EC2 인스턴스는 x86 기반 인스턴스 대비 최대 40% 향상된 가격 대비 성능을 제공합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;세대&lt;/th&gt;
&lt;th&gt;인스턴스 예시&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graviton2&lt;/td&gt;
&lt;td&gt;m6g, c6g, r6g&lt;/td&gt;
&lt;td&gt;1세대 ARM, 검증된 안정성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton3&lt;/td&gt;
&lt;td&gt;m7g, c7g, r7g&lt;/td&gt;
&lt;td&gt;20% 향상된 네트워크 대역폭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton4&lt;/td&gt;
&lt;td&gt;m8g (신규)&lt;/td&gt;
&lt;td&gt;최신 세대, 최고 효율&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::warning
ARM 아키텍처이므로 애플리케이션이 x86 바이너리에 의존하는 경우 멀티 아키텍처 빌드 테스트 필요. Docker 이미지도 &lt;code&gt;arm64&lt;/code&gt; 지원 여부 확인 필수.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🔀 버스터블 인스턴스 (T 시리즈)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기준 CPU 성능 + 필요 시 일시적으로 버스트 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 크레딧&lt;/strong&gt; 방식: 평소에 크레딧 적립 → 부하 시 소진&lt;/li&gt;
&lt;li&gt;개발/테스트, 트래픽 변동이 큰 소규모 앱에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;t3.micro:  기준 20% CPU, 필요 시 최대 100%까지 버스트
t3.large:  기준 30% CPU, 필요 시 최대 100%까지 버스트
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::warning
프로덕션 고부하 환경에서 크레딧 고갈 시 심각한 성능 저하 발생. &lt;code&gt;unlimited&lt;/code&gt; 모드 설정 시 추가 비용 발생.
:::&lt;/h2&gt;
&lt;h2&gt;3. Security Groups (보안 그룹)&lt;/h2&gt;
&lt;h3&gt;🔥 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EC2 인스턴스 앞단의 &lt;strong&gt;가상 방화벽&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow 규칙만&lt;/strong&gt; 존재 (Deny 규칙 없음 — NACL과 차이)&lt;/li&gt;
&lt;li&gt;IP 또는 &lt;strong&gt;다른 Security Group&lt;/strong&gt;을 참조해 규칙 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;인터넷
  │
  ▼
[Security Group]  ← 여기서 허용된 트래픽만 통과
  │
  ▼
[EC2 Instance]   ← 차단된 트래픽은 인스턴스가 아예 볼 수 없음
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📋 Inbound / Outbound 기본값&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;트래픽 방향&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inbound&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;전체 차단&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;명시적으로 허용하지 않으면 외부 접근 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outbound&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;전체 허용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인스턴스에서 외부로 나가는 트래픽 제한 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 주요 포트 번호&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포트&lt;/th&gt;
&lt;th&gt;프로토콜&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;Linux 인스턴스 원격 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SFTP&lt;/td&gt;
&lt;td&gt;SSH 기반 파일 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FTP&lt;/td&gt;
&lt;td&gt;파일 전송 (보안 취약, 비권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;웹 서버 (비암호화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;443&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;웹 서버 (암호화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3389&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RDP&lt;/td&gt;
&lt;td&gt;Windows 인스턴스 원격 데스크톱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3306&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MySQL/Aurora&lt;/td&gt;
&lt;td&gt;DB 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5432&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;DB 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6379&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;캐시 서버 접속&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;✅ Security Group 활용 팁&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Security Group 간 참조 (IP 대신)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[App Server SG]  →  Inbound: MySQL(3306) from [DB Server SG]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;→ IP 변경 시에도 자동 적용, IP 관리 불필요&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 트러블슈팅 가이드&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;증상&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;해결&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;앱에 아예 접근 안 됨 (timeout)&lt;/td&gt;
&lt;td&gt;Security Group 차단&lt;/td&gt;
&lt;td&gt;Inbound 규칙 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;접근은 되는데 &lt;code&gt;Connection refused&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;앱이 안 떴거나 포트 불일치&lt;/td&gt;
&lt;td&gt;앱 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 IP만 안 됨&lt;/td&gt;
&lt;td&gt;Inbound IP 범위 설정 오류&lt;/td&gt;
&lt;td&gt;CIDR 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::important[💡 &lt;strong&gt;Best Practice&lt;/strong&gt;]
SSH용 Security Group을 별도로 분리하여 관리. 0.0.0.0/0 (전체 허용)은 절대 프로덕션에 사용 금지.
:::&lt;/h2&gt;
&lt;h2&gt;4. SSH 접속 방법&lt;/h2&gt;
&lt;h3&gt;플랫폼별 지원 현황&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;Mac&lt;/th&gt;
&lt;th&gt;Linux&lt;/th&gt;
&lt;th&gt;Windows &amp;lt; 10&lt;/th&gt;
&lt;th&gt;Windows ≥ 10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PuTTY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2 Instance Connect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Systems Manager (SSM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;SSH 접속 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 키 파일 권한 설정 (최초 1회)
chmod 400 my-key.pem

# 접속
ssh -i my-key.pem ec2-user@&amp;lt;공인IP&amp;gt;
# Amazon Linux: ec2-user
# Ubuntu: ubuntu
# CentOS: centos
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🌟 EC2 Instance Connect vs SSM Session Manager&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;EC2 Instance Connect&lt;/th&gt;
&lt;th&gt;SSM Session Manager&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH 키 필요&lt;/td&gt;
&lt;td&gt;❌ (브라우저 기반)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공인 IP 필요&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;❌ (프라이빗 서브넷 가능)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포트 22 오픈 필요&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;❌&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;감사 로그&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail + S3 완전 기록&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안 수준&lt;/td&gt;
&lt;td&gt;보통&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최고 (Best Practice)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;AWS Systems Manager Session Manager&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH 포트를 열거나 Bastion 호스트를 사용하지 않고 EC2 인스턴스, 온프레미스 서버, VM 등을 엑세스 할 수 있는 안전하고(secure), 감사가 가능하며(audited), 브라우저 기반(browser-based) 쉘&lt;/li&gt;
&lt;li&gt;Benefits
&lt;ul&gt;
&lt;li&gt;보안 (Security) : SSH 포트나 RDP (3389) 포트를 열지 않아도 되어서 높은 보안 수준 유지 가능&lt;/li&gt;
&lt;li&gt;접근 제어 (Access Control) : IAM 정책을 사용하여 사용자의 접근 제어 가능&lt;/li&gt;
&lt;li&gt;감사 추적 가능성 (Auditability) : 모든 세션 명령어는 로깅 → CloudWatch Logs가 Amazon S3 등에서 로그 중앙 관리 지원&lt;/li&gt;
&lt;li&gt;SSH Key 관리 ❌ : SSH 키 관리, 저장 및 로테이션이 불필요&lt;/li&gt;
&lt;li&gt;크로스 플랫폼 (Cross-Platform) : Windows와 Linux 인스턴스 둘다 지원 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to setup?
&lt;ul&gt;
&lt;li&gt;SSM Agent 설치&lt;/li&gt;
&lt;li&gt;IAM Role Configuration : &lt;code&gt;AmazonSSMManagedInstanceCore&lt;/code&gt; 정책 설정을 통해서 System Manager service와 통신 가능하도록 허용&lt;/li&gt;
&lt;li&gt;Network Connectivity : 인스턴스는 HTTPS (443) 아웃바운드 정책 허용
:::important[💡 &lt;strong&gt;2025 Best Practice&lt;/strong&gt;]
포트 22를 아예 열지 않고 &lt;strong&gt;SSM Session Manager&lt;/strong&gt;로 접속하는 것이 보안상 가장 권장되는 방식입니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 구매 옵션 (Purchasing Options)&lt;/h2&gt;
&lt;h3&gt;🏨 호텔 비유로 이해하기&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구매 옵션&lt;/th&gt;
&lt;th&gt;호텔 비유&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-Demand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;예약 없이 정가로 체크인&lt;/td&gt;
&lt;td&gt;유연, 단기, 가장 비쌈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reserved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1~3년 장기 계약 할인&lt;/td&gt;
&lt;td&gt;최대 72% 할인, 안정적 워크로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Savings Plans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;일정 금액 선불, 어느 방이든 OK&lt;/td&gt;
&lt;td&gt;유연한 할인 약정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;빈 방 경매, 언제든 퇴실 가능&lt;/td&gt;
&lt;td&gt;최대 90% 할인, 중단 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated Host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;건물 전체 임대&lt;/td&gt;
&lt;td&gt;물리 서버 단독 사용, 라이선스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated Instance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;같은 건물 내 남과 공유 없음&lt;/td&gt;
&lt;td&gt;논리적 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Capacity Reservation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;방 예약만 해두기 (안 써도 요금)&lt;/td&gt;
&lt;td&gt;용량 보장, 특정 AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;💰 비용 비교 및 사용 시나리오&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;비용 (높음 → 낮음)
On-Demand &amp;gt; Dedicated Host &amp;gt; Reserved &amp;gt; Savings Plans &amp;gt; Spot

유연성 (높음 → 낮음)
On-Demand &amp;gt; Spot &amp;gt; Savings Plans &amp;gt; Reserved &amp;gt; Dedicated Host
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;On-Demand&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linux/Windows: &lt;strong&gt;초 단위&lt;/strong&gt; 과금 (최초 1분 이후)&lt;/li&gt;
&lt;li&gt;기타 OS: &lt;strong&gt;시간&lt;/strong&gt; 단위 과금&lt;/li&gt;
&lt;li&gt;예측 불가한 단기 워크로드, 신규 앱 테스트에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reserved Instances (RI)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;최대 &lt;strong&gt;72% 할인&lt;/strong&gt; (3년 전액 선불 시 최대)&lt;/li&gt;
&lt;li&gt;고정 조건: 인스턴스 타입, 리전, OS, 테넌시&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;결제 방식&lt;/th&gt;
&lt;th&gt;할인율&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No Upfront (선불 없음)&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partial Upfront (일부 선불)&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All Upfront (전액 선불)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;최대&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Convertible RI&lt;/strong&gt;: 인스턴스 타입 변경 가능, 최대 &lt;strong&gt;66% 할인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Reserved Instance Marketplace에서 남은 기간 판매 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Savings Plans&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;시간당 사용 금액 약정 (&lt;code&gt;$X/시간&lt;/code&gt; 형태)&lt;/li&gt;
&lt;li&gt;RI보다 유연: 인스턴스 크기, OS, 테넌시 변경 가능&lt;/li&gt;
&lt;li&gt;약정 초과분은 On-Demand 요금 적용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;취소 불가&lt;/strong&gt; (1년 또는 3년 약정)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;대부분의 팀에게는 Compute Savings Plans가 절감액과 유연성의 가장 좋은 균형을 제공합니다. AWS는 새로운 약정에 대해 Savings Plans를 권장합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Spot Instances&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;최대 &lt;strong&gt;90% 할인&lt;/strong&gt; — AWS에서 가장 저렴&lt;/li&gt;
&lt;li&gt;현재 Spot 가격이 설정한 최대 가격 초과 시 &lt;strong&gt;2분 경고 후 인스턴스 종료&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;중단에 견딜 수 있는 워크로드에만 적합:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;✅ 적합: 배치 처리, 데이터 분석, 이미지 처리, ML 학습, CI/CD
❌ 부적합: 운영 DB, 결제 시스템, 실시간 서비스
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dedicated Hosts vs Dedicated Instances&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Dedicated Instance&lt;/th&gt;
&lt;th&gt;Dedicated Host&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;물리 서버 전용 사용&lt;/td&gt;
&lt;td&gt;❌ (계정 내 공유 가능)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소켓/코어 수 가시성&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인스턴스 배치 제어&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기존 라이선스 활용 (BYOL)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용&lt;/td&gt;
&lt;td&gt;비쌈&lt;/td&gt;
&lt;td&gt;가장 비쌈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Dedicated Host 사용 시나리오&lt;/strong&gt;: Oracle, Microsoft SQL Server 등 소켓/코어 기반 라이선스가 있는 소프트웨어를 클라우드로 이전(Lift &amp;amp; Shift)할 때.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Spot Instance 심화&lt;/h2&gt;
&lt;h3&gt;🎯 Spot Instance 작동 방식&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;사용자가 max price 설정
        │
        ▼
현재 Spot 가격 &amp;lt; max price → 인스턴스 실행 유지
        │
현재 Spot 가격 &amp;gt; max price → 2분 경고
        │
        ├── Stop: Spot 가격이 낮아지면 자동 재시작 (Persistent)
        └── Terminate: 완전 종료 (One-time)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📋 Spot Request 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;종료 후&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;한 번만 요청, 종료 시 끝&lt;/td&gt;
&lt;td&gt;재시작 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가격 조건 충족 시 자동 재시작&lt;/td&gt;
&lt;td&gt;자동 재실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;올바른 종료 순서:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1️⃣ Spot Request 취소 (Cancel) — 먼저!
2️⃣ 연결된 인스턴스 종료 (Terminate)

⚠️ 인스턴스만 종료하면 Persistent 요청이 새 인스턴스를 다시 시작시킴
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🚢 Spot Fleet — 더 스마트한 Spot 활용&lt;/h3&gt;
&lt;p&gt;Spot Fleet = &lt;strong&gt;Spot 인스턴스 집합&lt;/strong&gt; + (선택) On-Demand 인스턴스&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Spot Fleet
├── Launch Pool A: c5.xlarge, Linux, us-east-1a
├── Launch Pool B: c5.2xlarge, Linux, us-east-1b
└── Launch Pool C: c5a.xlarge, Linux, us-east-1c

→ 목표 용량에 맞춰 가장 유리한 풀에서 자동으로 인스턴스 요청
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Spot Fleet 할당 전략:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;적합한 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lowestPrice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가장 저렴한 풀 우선&lt;/td&gt;
&lt;td&gt;비용 최우선 단기 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;diversified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;여러 풀에 분산&lt;/td&gt;
&lt;td&gt;가용성 중시, 장기 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;capacityOptimized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;용량 여유 있는 풀 우선&lt;/td&gt;
&lt;td&gt;중단 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;priceCapacityOptimized&lt;/code&gt; ⭐&lt;/td&gt;
&lt;td&gt;용량 여유 풀 중 최저가&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;대부분의 워크로드에 권장&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;7. IP 주소 &amp;amp; Elastic IP&lt;/h2&gt;
&lt;h3&gt;🌐 공인 IP (Public IP) vs 사설 IP (Private IP)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;공인 IP (Public IP)&lt;/th&gt;
&lt;th&gt;사설 IP (Private IP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;식별 범위&lt;/td&gt;
&lt;td&gt;인터넷 전체&lt;/td&gt;
&lt;td&gt;해당 사설 네트워크 내부만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유일성&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;전 세계에서 유일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;같은 네트워크 내에서만 유일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중복&lt;/td&gt;
&lt;td&gt;불가&lt;/td&gt;
&lt;td&gt;서로 다른 회사 간에는 중복 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외부 접근&lt;/td&gt;
&lt;td&gt;직접 가능&lt;/td&gt;
&lt;td&gt;NAT + 인터넷 게이트웨이 경유 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;위치 추적&lt;/td&gt;
&lt;td&gt;가능 (Geo-location)&lt;/td&gt;
&lt;td&gt;불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;[사설 네트워크 A]          [사설 네트워크 B]
  192.168.1.10               192.168.1.10   ← 사설 IP 중복 가능
       │                          │
   [NAT/IGW]                  [NAT/IGW]
       │                          │
       └──────── 인터넷 ──────────┘
           (공인 IP는 유일)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
EC2 인스턴스는 기본적으로 사설 IP는 고정이지만, &lt;strong&gt;공인 IP는 인스턴스를 중지(Stop) 후 재시작(Start)하면 변경됩니다.&lt;/strong&gt;
:::&lt;/h2&gt;
&lt;h3&gt;🔒 IPv4 vs IPv6&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;IPv4&lt;/th&gt;
&lt;th&gt;IPv6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.160.10.240&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3ffe:1900:4545:3:200:f8ff:fe21:67cf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주소 수&lt;/td&gt;
&lt;td&gt;약 37억 개 (고갈 중)&lt;/td&gt;
&lt;td&gt;사실상 무제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;현재 상태&lt;/td&gt;
&lt;td&gt;인터넷의 주류 방식&lt;/td&gt;
&lt;td&gt;IoT 등 신규 기기 확산으로 증가 중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;📌 Elastic IP (탄력적 IP)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EC2 인스턴스를 &lt;strong&gt;중지(Stop) 후 시작(Start)하면 공인 IP가 바뀌는 문제&lt;/strong&gt;를 해결하는 고정 공인 IPv4 주소&lt;/li&gt;
&lt;li&gt;삭제하지 않는 한 계속 소유 가능&lt;/li&gt;
&lt;li&gt;한 번에 &lt;strong&gt;하나의 인스턴스에만&lt;/strong&gt; 연결 가능&lt;/li&gt;
&lt;li&gt;인스턴스 또는 네트워크 인터페이스 장애 시, 다른 인스턴스로 빠르게 재매핑(Remap)하여 장애를 마스킹(Masking)하는 용도로 활용 가능&lt;/li&gt;
&lt;li&gt;계정당 기본 &lt;strong&gt;5개 제한&lt;/strong&gt; (AWS에 증가 요청 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연결되지 않은 Elastic IP에는 요금 부과&lt;/strong&gt; (낭비 방지용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;⚠️ Elastic IP 사용을 피해야 하는 이유&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Elastic IP를 사용하는 아키텍처는 종종 설계가 잘못된 신호입니다 (often reflect poor architectural decisions).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;대신 권장하는 방법:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;권장 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;고정 주소가 필요한 경우&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DNS 이름(Route 53)을 공인 IP에 연결&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외부 트래픽 처리&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;로드 밸런서(ELB) 사용&lt;/strong&gt; → 인스턴스에 공인 IP 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장애 복구&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Auto Scaling + ELB&lt;/strong&gt; 조합으로 IP 의존성 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 배치 그룹 (Placement Groups)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;EC2 인스턴스가 AWS 인프라 내에 &lt;strong&gt;어떻게 배치될지를 제어&lt;/strong&gt;하는 기능&lt;/li&gt;
&lt;li&gt;세 가지 전략 중 하나를 선택하여 그룹 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📊 배치 전략 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;핵심 목표&lt;/th&gt;
&lt;th&gt;제약&lt;/th&gt;
&lt;th&gt;주요 Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cluster&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;초저지연, 고대역폭&lt;/td&gt;
&lt;td&gt;단일 AZ, 단일 랙&lt;/td&gt;
&lt;td&gt;HPC, 빅데이터, 초고속 통신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spread&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최대 가용성, 물리적 격리&lt;/td&gt;
&lt;td&gt;AZ당 최대 7 인스턴스&lt;/td&gt;
&lt;td&gt;미션 크리티컬, 고가용성 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Partition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대규모 분산, 파티션 단위 격리&lt;/td&gt;
&lt;td&gt;AZ당 최대 7 파티션, 수백 인스턴스&lt;/td&gt;
&lt;td&gt;분산 데이터 시스템 (Hadoop, Kafka)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🚀 Cluster Placement Group (클러스터 배치 그룹)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌─────────── Availability Zone ───────────┐
│  ┌─────────── 단일 랙 ─────────────┐   │
│  │  [EC2] [EC2] [EC2] [EC2] [EC2]  │   │
│  └─────────────────────────────────┘   │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;장점&lt;/strong&gt;: Enhanced Networking (향상된 네트워킹) 활성화 시 인스턴스 간 10Gbps 대역폭&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단점&lt;/strong&gt;: AZ 전체 장애 시 &lt;strong&gt;모든 인스턴스가 동시에 중단&lt;/strong&gt;됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 빠르게 완료해야 하는 빅데이터 작업 (Big Data job), 초저지연·고처리량이 필요한 애플리케이션&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🛡️ Spread Placement Group (분산 배치 그룹)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌── AZ 1 ──┐   ┌── AZ 2 ──┐   ┌── AZ 3 ──┐
│ [랙1]    │   │ [랙2]    │   │ [랙3]    │
│  [EC2]   │   │  [EC2]   │   │  [EC2]   │
└──────────┘   └──────────┘   └──────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;장점&lt;/strong&gt;: 각 인스턴스가 서로 다른 물리 하드웨어(랙)에 배치 → 동시 장애 위험 최소화, 여러 AZ에 걸쳐 배치 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단점&lt;/strong&gt;: &lt;strong&gt;AZ당 최대 7개 인스턴스&lt;/strong&gt; 제한 (소규모 배포에만 적합)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: 각 인스턴스가 서로 독립적으로 장애 격리(Isolated from failure)되어야 하는 고가용성 미션 크리티컬 애플리케이션&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🗂️ Partition Placement Group (파티션 배치 그룹)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌──────────────── AZ 1 ──────────────────┐
│  ┌─파티션1─┐  ┌─파티션2─┐  ┌─파티션3─┐ │
│  │ [EC2]  │  │ [EC2]  │  │ [EC2]  │ │
│  │ [EC2]  │  │ [EC2]  │  │ [EC2]  │ │
│  │ [EC2]  │  │ [EC2]  │  │ [EC2]  │ │
│  └────────┘  └────────┘  └────────┘ │
│   (서로 다른 랙, 파티션 간 랙 공유 없음)     │
└────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;AZ당 최대 &lt;strong&gt;7개 파티션&lt;/strong&gt;, 동일 리전 내 여러 AZ에 걸쳐 배치 가능&lt;/li&gt;
&lt;li&gt;그룹당 수백 개의 EC2 인스턴스 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파티션 간 랙을 절대 공유하지 않음&lt;/strong&gt; → 한 파티션 장애가 다른 파티션에 영향 없음&lt;/li&gt;
&lt;li&gt;인스턴스 메타데이터(Instance Metadata)로 자신이 속한 파티션 정보 접근 가능 → 애플리케이션이 토폴로지 인식(Topology-aware) 배포 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: HDFS, HBase, Cassandra, Kafka 등 대규모 분산 데이터 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 탄력적 네트워크 인터페이스 (ENI)&lt;/h2&gt;
&lt;h3&gt;🔌 ENI란?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ENI (Elastic Network Interface, 탄력적 네트워크 인터페이스)&lt;/strong&gt;: VPC (Virtual Private Cloud, 가상 사설 클라우드) 내에서 가상 네트워크 카드를 나타내는 논리적 컴포넌트&lt;/li&gt;
&lt;li&gt;EBS 볼륨을 필요에 따라 EC2에 붙이듯, 네트워킹 계층도 인스턴스와 독립적으로 분리하여 별도로 관리 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특정 AZ (Availability Zone, 가용 영역)에 종속&lt;/strong&gt;됨 — AZ 간 이동 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 AWS 공식 블로그 핵심 인사이트: ENI 도입 이전에는 EC2 인스턴스가 특정 서브넷(Subnet)에 속하는 개념이었으나, ENI 도입 이후 &lt;strong&gt;서브넷 귀속 단위는 인스턴스가 아닌 ENI&lt;/strong&gt; 로 바뀌었습니다. 따라서 하나의 인스턴스에 서로 다른 서브넷의 ENI 두 개를 붙여 듀얼 홈(Dual-homed) 환경을 구성할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;📋 ENI 속성 (Attributes)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;속성&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기본 사설 IPv4 (Primary Private IPv4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;반드시 1개, 서브넷 대역 내 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보조 사설 IPv4 (Secondary Private IPv4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1개 이상 추가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;탄력적 IP (Elastic IP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사설 IPv4당 최대 1개 연결 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공인 IPv4 (Public IPv4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보안 그룹 (Security Groups)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1개 이상 연결 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MAC 주소 (MAC Address)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;고유 식별자, BYOL 라이선스에 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;소스/목적지 확인 플래그 (Source/Destination Check Flag)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NAT·프록시 서버 구성 시 비활성화 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;종료 시 삭제 플래그 (Delete on Termination Flag)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 ENI는 인스턴스 종료 시 자동 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔄 ENI의 독립적 생명주기 (Independent Lifetime)&lt;/h3&gt;
&lt;p&gt;EBS 볼륨처럼 ENI도 &lt;strong&gt;특정 EC2 인스턴스와 독립적인 생명주기&lt;/strong&gt;를 가집니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ENI 생성 (미리 만들어 놓기 가능)
    │
    ├── 인스턴스 시작 시 연결 (Launch-time attach)
    ├── 실행 중인 인스턴스에 즉시 연결 (Hot attach, 핫 어태치)
    └── 인스턴스 종료 후에도 ENI는 유지 (Delete on Termination = false 시)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🏗️ ENI 주요 활용 패턴&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 관리 네트워크 분리 (Management Network / Backnet)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EC2 인스턴스
├── ENI 1 (공용 서브넷) ─→ 인터넷 게이트웨이 → 외부 트래픽 처리 (포트 80/443)
└── ENI 2 (사설 서브넷) ─→ VPN 게이트웨이 → SSH 접속·로그·관리 트래픽 (포트 22)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 ENI에 다른 보안 그룹을 적용해 트래픽을 세밀하게 제어 가능.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 멀티 인터페이스 애플리케이션 (Multi-Interface Applications)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;로드 밸런서(Load Balancer), 프록시 서버(Proxy Server), NAT 서버 구성 시 두 서브넷 사이에서 트래픽을 전달. 이 경우 &lt;strong&gt;소스/목적지 확인(Source/Destination Check)을 비활성화&lt;/strong&gt;해야 함.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. MAC 주소 기반 라이선스 (MAC-Based Licensing)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;특정 MAC 주소에 묶인 상용 소프트웨어 라이선스를 사용할 때, 인스턴스가 교체·타입 변경이 필요한 경우에도 동일한 ENI(MAC 주소 유지)를 새 인스턴스에 재연결하여 라이선스 재발급 없이 계속 사용 가능.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 저비용 고가용성 (Low-Budget High Availability)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1️⃣ ENI를 인스턴스 A에 연결
2️⃣ 인스턴스 A 장애 발생
3️⃣ 새 인스턴스 B 시작
4️⃣ ENI를 인스턴스 B에 재연결 → 수 초 내 트래픽 복구
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IP 주소와 보안 그룹 설정이 ENI에 종속되어 있으므로, 인스턴스가 바뀌어도 네트워크 구성이 그대로 유지됨.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;🔁 장애 복구 시나리오 (Failover)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[ENI: 10.0.1.50]──→ [인스턴스 A: 정상]
                             │ 장애!
                             ▼
[ENI: 10.0.1.50]──→ [인스턴스 B: 교체됨]
  (동일 IP 유지)      (수 초 내 트래픽 전환)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::tip
ENI는 특정 AZ에 종속(Bound to a specific AZ)됩니다. AZ 간 이동은 불가하므로, 멀티 AZ 고가용성이 필요한 경우 ELB(Elastic Load Balancer)를 사용해야 합니다.
:::&lt;/h2&gt;
&lt;h2&gt;10. EC2 최대 절전 모드 (Hibernate)&lt;/h2&gt;
&lt;h3&gt;💤 인스턴스 상태 전환 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상태&lt;/th&gt;
&lt;th&gt;EBS 데이터&lt;/th&gt;
&lt;th&gt;RAM 상태&lt;/th&gt;
&lt;th&gt;다음 시작 시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stop (중지)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 유지&lt;/td&gt;
&lt;td&gt;❌ 소멸&lt;/td&gt;
&lt;td&gt;OS 부팅 + 앱 초기화 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terminate (종료)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 소멸 (루트 볼륨 기본 삭제)&lt;/td&gt;
&lt;td&gt;❌ 소멸&lt;/td&gt;
&lt;td&gt;새 인스턴스 시작 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hibernate (최대 절전)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 유지&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;EBS에 저장 후 복원&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;훨씬 빠른 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔧 Hibernate 작동 원리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Hibernate 실행
    │
    ▼
RAM 전체 내용을 루트 EBS 볼륨 파일에 덤프(Dump)
    │
    ▼
인스턴스 중지 (OS가 완전히 종료되지 않음)
    │
    ▼
재시작 시 → EBS에서 RAM 상태 복원 → 중단 지점부터 즉시 재개
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::important
OS 재부팅(OS booting)이 없으므로 시작 시간이 매우 빠름. 애플리케이션이 캐시 워밍(Cache Warming)을 다시 할 필요 없음.
:::&lt;/h2&gt;
&lt;h3&gt;✅ 지원 조건 (Requirements)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;조건&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인스턴스 패밀리 (Instance Family)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;C3, C4, C5, I3, M3, M4, R3, R4, T2, T3 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM 크기 (RAM Size)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;150 GB 미만&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인스턴스 크기 (Instance Size)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;베어 메탈(Bare Metal) 인스턴스 미지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Linux 2, Linux AMI, Ubuntu, Windows 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;루트 볼륨 (Root Volume)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;반드시 &lt;strong&gt;EBS&lt;/strong&gt;, &lt;strong&gt;암호화(Encrypted)&lt;/strong&gt; 필수, Instance Store 불가, RAM을 담을 충분한 용량 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;구매 옵션&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On-Demand, Reserved, Spot 인스턴스 모두 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최대 절전 유지 기간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60일을 초과할 수 없음 (cannot be hibernated more than 60 days)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;💡 Hibernate 주요 Use Case&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;장시간 실행 프로세스 (Long-running processing)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;재시작 없이 작업 상태 그대로 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM 상태 보존 (Saving the RAM state)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인메모리 데이터·캐시 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;초기화가 오래 걸리는 서비스 (Services that take time to initialize)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;부팅·캐시 워밍 비용 없이 즉시 재개&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::warning
⚠️ &lt;strong&gt;루트 볼륨 암호화가 필수&lt;/strong&gt;인 이유: RAM 내용(민감한 데이터 포함 가능)이 EBS 디스크에 평문으로 쓰이는 것을 방지하기 위함.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;11. Best Practices&lt;/h2&gt;
&lt;h3&gt;💡 인스턴스 선택&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 워크로드 특성 먼저 파악&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU 집약적  → Compute Optimized (c 계열)
메모리 집약적 → Memory Optimized (r, x 계열)
스토리지 I/O  → Storage Optimized (i, d 계열)
균형 잡힌 일반 → General Purpose (m, t 계열)
AI/ML 학습   → GPU (p, g 계열) 또는 Trn1
AI/ML 추론   → Inf2 (가장 저렴한 추론 전용)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Graviton(ARM) 우선 검토&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Graviton(arm64)은 x86 대비 최대 40% 향상된 가격 대비 성능을 제공합니다. 멀티 아키텍처 빌드를 테스트하고 롤아웃 전에 p95/p99 성능을 측정하세요.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;💰 비용 최적화 전략&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Right-Sizing (적정 규모 조정)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2~4주 동안 활용도 데이터를 수집하고, AWS Compute Optimizer 또는 Cost Explorer를 통해 과소 활용 인스턴스를 파악한 뒤 적절한 크기로 조정하세요.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# AWS Compute Optimizer로 우선 분석
# → CloudWatch 지표 기반 권장 인스턴스 타입 제안
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 구매 옵션 혼합 (Blended Pricing)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;안정적 기본 부하  → Reserved Instances 또는 Savings Plans (72% 절감)
변동적 추가 부하  → Spot Instances (최대 90% 절감)
예측 불가 피크   → On-Demand (백업)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;기준 부하에는 Savings Plans/Reserved Instance로 커버하고, 기준 초과의 변동 부하에는 Spot Instance를 사용하세요. Spot 용량 부족 시에는 중요 워크로드를 위해 On-Demand로 자동 폴백하도록 구성하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. 스케줄링으로 유휴 비용 절감&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;개발/테스트 환경: 업무 시간(09:00-19:00)에만 실행
→ 태그 기반 자동 시작/종료 → 최대 65% 비용 절감

권장 태그 체계:
  Environment = dev | staging | prod
  Schedule    = OfficeHours | AlwaysOn
  Owner       = team-name
  CostCenter  = CC-1234
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. EBS 볼륨 비용 최적화&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CloudWatch 또는 Compute Optimizer를 통해 일관되게 낮은 IOPS 또는 처리량을 보이는 볼륨을 식별하고, 더 저렴한 gp3 또는 st1 볼륨 타입으로 다운그레이드를 검토하세요.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;볼륨 타입&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;적합한 용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gp3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;비용 효율 높음 ⭐&lt;/td&gt;
&lt;td&gt;대부분의 워크로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gp2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;구형, gp3보다 비쌈&lt;/td&gt;
&lt;td&gt;마이그레이션 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;io2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;고IOPS, 고비용&lt;/td&gt;
&lt;td&gt;미션 크리티컬 DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;st1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;저비용, 순차 읽기&lt;/td&gt;
&lt;td&gt;로그, 빅데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sc1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가장 저렴&lt;/td&gt;
&lt;td&gt;콜드 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;:::tip
gp2 → gp3 전환 시 동일 성능에 약 20% 비용 절감 가능.
:::&lt;/h2&gt;
&lt;h3&gt;🔐 EC2 보안 Best Practice&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 인스턴스 접근&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;포트 22(SSH)를 0.0.0.0/0으로 여는 것 &lt;strong&gt;절대 금지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;가능하면 &lt;strong&gt;SSM Session Manager&lt;/strong&gt; 사용 (포트 22 불필요)&lt;/li&gt;
&lt;li&gt;불가피한 경우 회사 IP 또는 VPN IP만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. IAM Role 사용&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ❌ 절대 금지: Access Key를 EC2에 직접 저장
export AWS_ACCESS_KEY_ID=&quot;AKIA...&quot;
export AWS_SECRET_ACCESS_KEY=&quot;...&quot;

# ✅ 권장: EC2 IAM Role 사용 (자동으로 임시 자격증명 관리)
# 인스턴스에 Role만 붙이면 코드에서 자격증명 불필요
import boto3
s3 = boto3.client(&apos;s3&apos;)  # Role이 자동으로 처리
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Auto Scaling 활용&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Auto Scaling Group
├── Minimum: 2 (최소 가용성 보장)
├── Desired: 4 (평소 운영 수량)
└── Maximum: 10 (트래픽 급증 대비)

→ CloudWatch 지표(CPU 70% 초과 시) 기반 자동 Scale Out
→ CloudWatch 지표(CPU 30% 미만 시) 기반 자동 Scale In
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🚨 자주 하는 실수 (Anti-Patterns)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;실수&lt;/th&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;해결책&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;인스턴스 타입 고려 없이 m5.xlarge 고정&lt;/td&gt;
&lt;td&gt;비용 낭비 또는 성능 부족&lt;/td&gt;
&lt;td&gt;Compute Optimizer로 분석 후 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모든 워크로드에 On-Demand&lt;/td&gt;
&lt;td&gt;불필요한 비용&lt;/td&gt;
&lt;td&gt;RI + Savings Plans + Spot 혼합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Group에서 0.0.0.0/0:22 허용&lt;/td&gt;
&lt;td&gt;무차별 대입 공격 노출&lt;/td&gt;
&lt;td&gt;SSM 또는 특정 IP만 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발 환경 24시간 가동&lt;/td&gt;
&lt;td&gt;불필요한 비용&lt;/td&gt;
&lt;td&gt;스케줄 기반 자동 중지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Key를 EC2 내 파일로 저장&lt;/td&gt;
&lt;td&gt;키 탈취 위험&lt;/td&gt;
&lt;td&gt;IAM Role로 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인스턴스 스토어에 중요 데이터 저장&lt;/td&gt;
&lt;td&gt;종료 시 데이터 소멸&lt;/td&gt;
&lt;td&gt;EBS 또는 S3에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구버전 인스턴스 타입 방치&lt;/td&gt;
&lt;td&gt;가격 대비 성능 낮음&lt;/td&gt;
&lt;td&gt;신세대로 마이그레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;12. 핵심 요약&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;EC2 구성 핵심
├── 인스턴스 타입: 워크로드에 맞게 선택 (m=범용, c=컴퓨팅, r=메모리, i=스토리지)
├── User Data: 최초 1회 부트스트랩 (root 권한)
├── Security Group: 상태 기반 가상 방화벽 (Allow만, 기본 Inbound 차단)
└── 접속: SSH / EC2 Instance Connect / SSM Session Manager

IP 주소
├── Public IP: 인터넷에서 식별, 인스턴스 재시작 시 변경됨
├── Private IP: 내부 네트워크 전용, 재시작해도 고정
└── Elastic IP: 고정 공인 IP, 5개 제한, 미연결 시 과금

배치 그룹 (Placement Groups)
├── Cluster:   단일 AZ, 단일 랙 → 초저지연·고대역폭 (10Gbps), 동시 장애 위험
├── Spread:    서로 다른 랙 → 최대 가용성, AZ당 7개 제한
└── Partition: 파티션 단위 격리 → 분산 시스템 (Hadoop, Kafka, Cassandra)

ENI (Elastic Network Interface)
├── VPC 내 가상 네트워크 카드 (논리적 컴포넌트)
├── 특정 AZ에 종속, AZ 간 이동 불가
├── 인스턴스와 독립적 생명주기 (Hot attach 가능)
└── 활용: 관리망 분리, MAC 라이선스, 저비용 고가용성 Failover

Hibernate (최대 절전 모드)
├── RAM 상태를 암호화된 EBS에 저장 → 빠른 재시작
├── 루트 EBS 암호화(Encrypted) 필수
├── RAM 150GB 미만, 최대 60일 제한
└── 구매 옵션: On-Demand / Reserved / Spot 모두 지원

구매 옵션 선택 가이드
├── 단기·불규칙  → On-Demand
├── 안정적 장기  → Reserved Instances 또는 Savings Plans (72% 절감)
├── 중단 허용   → Spot Instances (90% 절감)
├── 라이선스 제약 → Dedicated Host
└── 용량 보장   → Capacity Reservation

비용 최적화 3단계
1️⃣ Right-Sizing: Compute Optimizer로 적정 규모 분석
2️⃣ 구매 혼합: 기본 부하 → RI/SP, 변동 부하 → Spot
3️⃣ 스케줄링: 개발 환경 업무시간만 가동
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/ec2/instance-types/&quot;&gt;EC2 인스턴스 타입 전체 목록&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://calculator.aws/pricing/2/home&quot;&gt;EC2 가격 계산기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/compute-optimizer/&quot;&gt;AWS Compute Optimizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html&quot;&gt;EC2 Spot Instance 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/ec2/cost-and-capacity/&quot;&gt;EC2 비용 및 용량 최적화&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/savingsplans/faq/&quot;&gt;Savings Plans vs Reserved Instances 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/blogs/aws/new-elastic-network-interfaces-in-the-virtual-private-cloud/&quot;&gt;ENI 공식 AWS 블로그 (Jeff Barr)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html&quot;&gt;Placement Groups 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html&quot;&gt;EC2 Hibernate 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🔐 AWS IAM (Identity and Access Management)</title><link>https://tessa1217.github.io/posts/aws/aws-iam-1/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/aws/aws-iam-1/</guid><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🔐 AWS IAM (Identity and Access Management)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;IAM은 AWS 리소스에 대한 접근을 안전하게 제어하는 **Global Service (글로벌 서비스)**입니다.&lt;/p&gt;
&lt;p&gt;&quot;누가(Who) → 무엇을(What) → 어떤 조건에서(Condition) 할 수 있는가&quot;를 정의합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;목차&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-iam-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90&quot;&gt;IAM 기본 개념&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-iam-%EC%A0%95%EC%B1%85-policies&quot;&gt;IAM 정책 (Policies)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-iam-mfa-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%A0%95%EC%B1%85&quot;&gt;IAM MFA &amp;amp; 비밀번호 정책&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-aws-%EC%A0%91%EA%B7%BC-%EB%B0%A9%EB%B2%95&quot;&gt;AWS 접근 방법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-iam-%EC%97%AD%ED%95%A0-roles&quot;&gt;IAM 역할 (Roles)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-iam-%EB%B3%B4%EC%95%88-%EB%8F%84%EA%B5%AC&quot;&gt;IAM 보안 도구&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-best-practices&quot;&gt;Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD&quot;&gt;핵심 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1. IAM 기본 개념&lt;/h2&gt;
&lt;h3&gt;🌍 AWS Region vs IAM&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Region&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 지역에 종속 (Compliance, 지연속도, 가용 서비스, 가격 고려)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;글로벌 서비스&lt;/strong&gt; — 리전에 종속되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Region 선택 기준&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compliance&lt;/strong&gt;: 데이터 주권 (Data governance) / 법적 요구사항 (Legal requirements)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proximity&lt;/strong&gt;: 고객과의 물리적 거리 (지연속도 - Reduced Latency)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Available Services&lt;/strong&gt;: 신규 서비스는 일부 리전에서만 먼저 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pricing&lt;/strong&gt;: 리전마다 가격 상이&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;👤 Root Account&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 계정 생성 시 자동으로 만들어지는 &lt;strong&gt;최고 권한 계정&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일상적인 작업에 절대 사용 금지&lt;/strong&gt; — 초기 설정 및 루트만 가능한 작업에만 사용&lt;/li&gt;
&lt;li&gt;루트 계정으로만 가능한 작업 예시: 결제 정보 변경, 계정 삭제, Support Plan 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;👥 Users &amp;amp; Groups&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;AWS Account
├── Root User (최상위, 공유 금지)
├── Group: Developers
│   ├── User: Alice
│   └── User: Bob
├── Group: Admins
│   └── User: Charlie
└── User: Dave (그룹 미소속도 가능)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: 조직 내 개별 사람 또는 애플리케이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group&lt;/strong&gt;: User들의 집합 (그룹 안에 그룹 중첩 불가)&lt;/li&gt;
&lt;li&gt;하나의 User는 &lt;strong&gt;여러 Group에 동시에 소속&lt;/strong&gt; 가능&lt;/li&gt;
&lt;li&gt;User는 반드시 Group에 속할 필요 없음 (단, 권장하지 않음)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. IAM 정책 (Policies)&lt;/h2&gt;
&lt;h3&gt;📋 정책의 종류&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;정책 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;사용 시기&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Managed Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS가 관리하는 사전 정의 정책&lt;/td&gt;
&lt;td&gt;빠른 시작, 일반적인 Use Case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customer Managed Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;직접 생성/관리하는 정책&lt;/td&gt;
&lt;td&gt;세밀한 권한 제어 필요 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inline Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 User/Group/Role에 직접 첨부&lt;/td&gt;
&lt;td&gt;1:1 대응, 재사용 불필요 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;🔗 정책 상속 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Group: Developers  ──── Policy A (S3 Full Access)
    └── User: Alice  ── Policy B (EC2 Read, Inline)

Group: QA  ──────────── Policy C (CloudWatch Read)
    └── User: Alice (중복 소속)

→ Alice가 최종적으로 갖는 권한: Policy A + Policy B + Policy C
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📄 IAM 정책 JSON 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Id&quot;: &quot;S3-Account-Permissions&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Sid&quot;: &quot;AllowS3Access&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: {
                &quot;AWS&quot;: [&quot;arn:aws:iam::123456789012:root&quot;]
            },
            &quot;Action&quot;: [
                &quot;s3:GetObject&quot;,
                &quot;s3:PutObject&quot;
            ],
            &quot;Resource&quot;: [&quot;arn:aws:s3:::mybucket/*&quot;],
            &quot;Condition&quot;: {
                &quot;StringEquals&quot;: {
                    &quot;aws:RequestedRegion&quot;: &quot;ap-northeast-2&quot;
                }
            }
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;각 필드 설명:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;필드&lt;/th&gt;
&lt;th&gt;필수&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;권장&lt;/td&gt;
&lt;td&gt;정책 언어 버전 (항상 &lt;code&gt;&quot;2012-10-17&quot;&lt;/code&gt; 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;정책 식별자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Statement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;필수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;권한 규칙 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Sid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;Statement 식별자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Effect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;필수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Allow&lt;/code&gt; 또는 &lt;code&gt;Deny&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Principal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;조건부&lt;/td&gt;
&lt;td&gt;정책이 적용될 대상 (Resource-based policy에서 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Action&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;필수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;허용/거부할 API 작업 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Resource&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;필수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작업이 적용될 AWS 리소스 ARN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Condition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;정책이 적용되는 조건&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;최소 권한 원칙 (Least Privilege Principle)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;사용자에게 필요한 최소한의 권한만 부여합니다.&lt;/p&gt;
&lt;p&gt;불필요한 권한은 공격 표면(Attack Surface)을 넓힙니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;🏷️ 정책 예시: EC2 + CloudWatch 읽기 권한&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: &quot;ec2:Describe*&quot;,
            &quot;Resource&quot;: &quot;*&quot;
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;cloudwatch:ListMetrics&quot;,
                &quot;cloudwatch:GetMetricStatistics&quot;,
                &quot;cloudwatch:Describe*&quot;
            ],
            &quot;Resource&quot;: &quot;*&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3. IAM MFA &amp;amp; 비밀번호 정책&lt;/h2&gt;
&lt;h3&gt;🔑 비밀번호 정책 설정 항목&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;최소 길이 지정&lt;/li&gt;
&lt;li&gt;특정 문자 유형 필수 포함 (대문자, 숫자, 특수문자 등)&lt;/li&gt;
&lt;li&gt;IAM 사용자의 자체 비밀번호 변경 허용 여부&lt;/li&gt;
&lt;li&gt;비밀번호 만료 기간 설정 (정기적 변경 강제)&lt;/li&gt;
&lt;li&gt;이전 비밀번호 재사용 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📱 MFA (Multi-Factor Authentication)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;MFA = 알고 있는 것 (비밀번호) + 소유한 것 (기기)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;비밀번호가 탈취되더라도, 물리적 기기 없이는 계정 접근 불가.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MFA 기기 옵션:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;제품&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Virtual MFA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Authenticator, Authy&lt;/td&gt;
&lt;td&gt;단일 기기에 다수 계정 등록 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;U2F Security Key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;YubiKey (Yubico)&lt;/td&gt;
&lt;td&gt;물리적 USB 키, 다수 계정 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hardware Key Fob&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemalto 제품&lt;/td&gt;
&lt;td&gt;전용 하드웨어 OTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GovCloud용 Key Fob&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SurePassID 제품&lt;/td&gt;
&lt;td&gt;AWS GovCloud(US) 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;실무 권장&lt;/strong&gt;: Root 계정과 관리자 계정에는 반드시 MFA 활성화.&lt;/p&gt;
&lt;p&gt;콘솔 접근 권한이 있는 모든 IAM 사용자에게도 MFA 강제 적용 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. AWS 접근 방법&lt;/h2&gt;
&lt;h3&gt;세 가지 접근 방식&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;보호 수단&lt;/th&gt;
&lt;th&gt;주요 용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Management Console&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;비밀번호 + MFA&lt;/td&gt;
&lt;td&gt;사람이 직접 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI (Command Line Interface)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Access Key&lt;/td&gt;
&lt;td&gt;스크립트, 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK (Software Development Kit)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Access Key&lt;/td&gt;
&lt;td&gt;애플리케이션 코드 내&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔑 Access Key 관리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 콘솔에서 사용자가 직접 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비밀번호처럼 취급&lt;/strong&gt; — 절대 공유 금지, 코드에 하드코딩 금지&lt;/li&gt;
&lt;li&gt;Access Key ID = 사용자 이름 / Secret Access Key = 비밀번호 (비유)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Access Key 설정 예시 (CLI)
aws configure
# AWS Access Key ID: AKIAIOSFODNN7EXAMPLE
# AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Default region name: ap-northeast-2
# Default output format: json
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;:::warning
Access Key는 장기 자격증명(Long-term Credentials)입니다.
가능하면 &amp;lt;strong&amp;gt;임시 자격증명(IAM Role + STS)&amp;lt;/strong&amp;gt;을 사용하고, 불가피한 경우 90일 주기로 교체(Rotation)하세요.
:::&lt;/h2&gt;
&lt;h3&gt;🖥️ AWS CLI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 서비스의 Public API에 직접 접근&lt;/li&gt;
&lt;li&gt;반복 작업 자동화 및 스크립트화 가능&lt;/li&gt;
&lt;li&gt;AWS SDK(Python용 Boto3) 기반으로 빌드됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 주요 CLI 예시
aws iam list-users                         # 사용자 목록
aws iam create-user --user-name newuser    # 사용자 생성
aws iam attach-user-policy \               # 사용자에 정책 연결
  --user-name newuser \
  --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;📦 AWS SDK&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;언어별 라이브러리 제공 (Python Boto3, Java, Node.js, Go 등)&lt;/li&gt;
&lt;li&gt;애플리케이션 내에 임베드되어 AWS 서비스 호출&lt;/li&gt;
&lt;li&gt;Mobile SDK (iOS, Android), IoT Device SDK도 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Python Boto3 예시
import boto3

iam = boto3.client(&apos;iam&apos;)
response = iam.list_users()
for user in response[&apos;Users&apos;]:
    print(user[&apos;UserName&apos;])
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. IAM 역할 (Roles)&lt;/h2&gt;
&lt;h3&gt;🎭 역할이란?&lt;/h3&gt;
&lt;p&gt;IAM Role은 &lt;strong&gt;사람이 아닌 AWS 서비스&lt;/strong&gt;가 다른 서비스에 접근할 때 사용하는 임시 자격증명입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EC2 Instance
    └── IAM Role (S3 Read Access 부여)
            └── S3 Bucket 접근 가능
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Access Key를 EC2에 직접 저장하는 것보다 &lt;strong&gt;훨씬 안전&lt;/strong&gt;합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;주요 Role 유형&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role 유형&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2 Instance Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2가 AWS 서비스 접근 시&lt;/td&gt;
&lt;td&gt;EC2 → S3 파일 읽기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lambda Function Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda 실행 시 필요한 권한&lt;/td&gt;
&lt;td&gt;Lambda → DynamoDB 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudFormation Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인프라 배포 권한&lt;/td&gt;
&lt;td&gt;Stack 생성 시 리소스 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Account Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;다른 계정의 리소스 접근&lt;/td&gt;
&lt;td&gt;멀티 계정 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;💡 Role vs User 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;IAM User&lt;/th&gt;
&lt;th&gt;IAM Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;자격증명&lt;/td&gt;
&lt;td&gt;장기 (비밀번호/Access Key)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;임시&lt;/strong&gt; (STS 토큰, 기본 1시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대상&lt;/td&gt;
&lt;td&gt;사람&lt;/td&gt;
&lt;td&gt;서비스, 앱, 다른 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안 수준&lt;/td&gt;
&lt;td&gt;낮음 (키 유출 위험)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;높음&lt;/strong&gt; (자동 만료)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;권장 여부&lt;/td&gt;
&lt;td&gt;사람만, 최소화&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;워크로드에는 반드시 사용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🔐 Permissions Boundary (권한 경계)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Role이나 User가 가질 수 있는 &lt;strong&gt;최대 권한의 상한선&lt;/strong&gt; 설정&lt;/li&gt;
&lt;li&gt;예: DevOps 엔지니어에게 Role 생성 권한은 주되, dev 환경으로만 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: &quot;*&quot;,
            &quot;Resource&quot;: &quot;*&quot;,
            &quot;Condition&quot;: {
                &quot;StringEquals&quot;: {
                    &quot;aws:RequestedRegion&quot;: &quot;ap-northeast-2&quot;
                }
            }
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6. IAM 보안 도구&lt;/h2&gt;
&lt;h3&gt;🔍 IAM Credentials Report (계정 수준)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;위치&lt;/strong&gt;: IAM 콘솔 → Credential Report&lt;/li&gt;
&lt;li&gt;계정 내 &lt;strong&gt;모든 사용자&lt;/strong&gt;의 자격증명 상태를 CSV로 다운로드&lt;/li&gt;
&lt;li&gt;확인 항목: 마지막 로그인, MFA 활성화 여부, Access Key 사용 일자, 비밀번호 교체 일자&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# CLI로 생성 및 다운로드
aws iam generate-credential-report
aws iam get-credential-report --query Content --output text | base64 -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🔍 IAM Access Advisor (사용자 수준)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;위치&lt;/strong&gt;: IAM 콘솔 → 특정 User 선택 → Access Advisor 탭&lt;/li&gt;
&lt;li&gt;사용자에게 부여된 서비스 권한과 &lt;strong&gt;마지막 접근 시간&lt;/strong&gt; 확인&lt;/li&gt;
&lt;li&gt;오랫동안 사용하지 않은 권한 → 제거 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;🔍 IAM Access Analyzer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;외부 공개 또는 교차 계정 접근을 허용하는 리소스 자동 탐지&lt;/li&gt;
&lt;li&gt;정책 검증 기능: 100개 이상의 체크 항목으로 정책 오류 탐지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;신기능 (2025)&lt;/strong&gt;: 미사용 접근(Unused Access) 분석 → 최소 권한 달성 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Best Practices&lt;/h2&gt;
&lt;h3&gt;✅ 기본 보안 원칙&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Root 계정 보호&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MFA 설정 후 사용 최소화, 자격증명 잠금 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1인 1계정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자격증명 절대 공유 금지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;그룹으로 권한 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;개별 User에 직접 정책 첨부 지양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;최소 권한 원칙&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;필요한 작업에 딱 맞는 권한만 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MFA 강제 적용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;콘솔 접근 모든 계정, 특히 관리자/루트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Key 최소화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;장기 키 대신 Role + 임시 자격증명 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;정기 감사&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Credentials Report + Access Advisor 주기적 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;🏗️ 실무 아키텍처 Best Practice&lt;/h3&gt;
&lt;h3&gt;1. 사람 사용자 → Federation (SSO) 권장&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS IAM 공식 문서는 사람 사용자에게 직접 IAM User를 생성하는 대신,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AWS IAM Identity Center (구 AWS SSO)&lt;/strong&gt; 또는 외부 IdP(Okta, Azure AD, Google Workspace)를 통한 Federation을 권장합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;개발자 (Okta 로그인)
    └── IAM Identity Center
            └── IAM Role Assume → 임시 자격증명 발급
                    └── AWS 리소스 접근
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;퇴사자 계정 한 곳에서 일괄 비활성화&lt;/li&gt;
&lt;li&gt;장기 Access Key 없음 (자동 만료 토큰)&lt;/li&gt;
&lt;li&gt;CloudTrail에서 개인 추적 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2. 워크로드 → 반드시 IAM Role 사용&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ❌ 나쁜 예: Access Key를 코드에 하드코딩
import boto3
client = boto3.client(
    &apos;s3&apos;,
    aws_access_key_id=&apos;AKIAIOSFODNN7EXAMPLE&apos;,      # 절대 금지!
    aws_secret_access_key=&apos;wJalrXUtnFEMI...&apos;        # 절대 금지!
)

# ✅ 좋은 예: EC2 Instance Role 사용 (자동으로 인증)
import boto3
client = boto3.client(&apos;s3&apos;)  # Role에서 자동으로 자격증명 가져옴
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Access Key 사용 불가피한 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;90일 이내 주기적 교체&lt;/strong&gt; (Rotation)&lt;/li&gt;
&lt;li&gt;환경변수 또는 &lt;code&gt;~/.aws/credentials&lt;/code&gt; 파일로 관리&lt;/li&gt;
&lt;li&gt;코드/레포지토리에 절대 커밋 금지&lt;/li&gt;
&lt;li&gt;불필요한 Key는 즉시 비활성화 및 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Access Key 교체 절차
# 1. 새 Key 생성
aws iam create-access-key --user-name myuser

# 2. 애플리케이션에 새 Key 적용 및 테스트

# 3. 기존 Key 비활성화
aws iam update-access-key --access-key-id OLD_KEY_ID --status Inactive

# 4. 문제 없으면 삭제
aws iam delete-access-key --access-key-id OLD_KEY_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4. 정책 작성 팁&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// ✅ 좋은 예: 특정 리소스 + 조건 지정
{
    &quot;Effect&quot;: &quot;Allow&quot;,
    &quot;Action&quot;: [&quot;s3:GetObject&quot;, &quot;s3:PutObject&quot;],
    &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/uploads/*&quot;,
    &quot;Condition&quot;: {
        &quot;StringEquals&quot;: {&quot;aws:RequestedRegion&quot;: &quot;ap-northeast-2&quot;},
        &quot;Bool&quot;: {&quot;aws:MultiFactorAuthPresent&quot;: &quot;true&quot;}
    }
}

// ❌ 나쁜 예: 과도하게 넓은 권한
{
    &quot;Effect&quot;: &quot;Allow&quot;,
    &quot;Action&quot;: &quot;*&quot;,
    &quot;Resource&quot;: &quot;*&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;5. 멀티 계정 환경 (AWS Organizations)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;서비스별/팀별/환경별(Dev/Staging/Prod) 계정 분리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCP (Service Control Policy)&lt;/strong&gt;: 조직 전체 권한 상한선 설정&lt;/li&gt;
&lt;li&gt;계정 간 접근은 Cross-Account Role로만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;AWS Organization
├── Root OU
│   ├── Management Account (빌링만)
│   ├── Security OU
│   │   └── Security Account (로그, 감사)
│   ├── Dev OU
│   │   └── Dev Account
│   └── Prod OU
│       └── Prod Account (SCP로 위험 작업 차단)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;🚨 자주 하는 실수 (Anti-Patterns)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;실수&lt;/th&gt;
&lt;th&gt;문제점&lt;/th&gt;
&lt;th&gt;해결책&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Root 계정으로 일상 작업&lt;/td&gt;
&lt;td&gt;전체 계정 탈취 위험&lt;/td&gt;
&lt;td&gt;별도 Admin IAM User 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Action: &quot;*&quot;&lt;/code&gt; 남발&lt;/td&gt;
&lt;td&gt;과도한 권한 부여&lt;/td&gt;
&lt;td&gt;필요한 Action만 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Key 코드 내 하드코딩&lt;/td&gt;
&lt;td&gt;키 유출 시 즉각 위협&lt;/td&gt;
&lt;td&gt;IAM Role / 환경변수 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;오래된 Access Key 방치&lt;/td&gt;
&lt;td&gt;미사용 키 유출 위험&lt;/td&gt;
&lt;td&gt;주기적 감사 및 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개인별 정책 관리&lt;/td&gt;
&lt;td&gt;일관성 없는 권한 관리&lt;/td&gt;
&lt;td&gt;Group 또는 Role 기반으로 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA 미설정&lt;/td&gt;
&lt;td&gt;비밀번호만으로 접근 가능&lt;/td&gt;
&lt;td&gt;모든 콘솔 접근 계정에 MFA 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 핵심 요약&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;IAM 구성 요소
├── Users       → 사람 또는 앱, 콘솔 비밀번호 또는 Access Key
├── Groups      → User들의 집합, 그룹 중첩 불가
├── Policies    → JSON 형식의 권한 문서
├── Roles       → 서비스/앱을 위한 임시 자격증명
└── Root User   → 최고 권한, 일상 작업에 사용 금지

접근 방법
├── Console    → 비밀번호 + MFA
├── CLI        → Access Key
└── SDK        → Access Key

보안 도구
├── Credentials Report → 계정 전체 자격증명 현황
├── Access Advisor     → 사용자별 미사용 권한 파악
└── Access Analyzer    → 외부 노출 및 미사용 권한 자동 탐지
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/iam/&quot;&gt;AWS IAM 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html&quot;&gt;AWS IAM Best Practices (공식)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/iam/identity-center/&quot;&gt;AWS IAM Identity Center (구 SSO)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html&quot;&gt;IAM Access Analyzer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html&quot;&gt;AWS Organizations SCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🧩 동시성(Concurrency)</title><link>https://tessa1217.github.io/posts/react/concurrency/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/react/concurrency/</guid><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;🧩 동시성(Concurrency)&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;**동시성(Concurrency)**이란 여러 개의 작업을 &lt;strong&gt;동시에 처리하는 것처럼&lt;/strong&gt; 보이게 하는 것이다.&lt;/p&gt;
&lt;p&gt;단일 CPU 환경에서 **빠른 전환(Context Switching)**을 통해 여러 작업이 동시에 진행되는 것처럼 보이게 하는 기법으로, CPU가 한순간 하나의 작업만 처리하지만, 빠른 전환 속도로 마치 여러 작업이 겹쳐 실행되는 듯한 효과를 낼 수 있다.&lt;/p&gt;
&lt;p&gt;즉 동시성은 실제로 여러 작업이 동시에 실행되는 것이 아니라, **작업의 “진행 순서를 조율”**함으로써 &lt;strong&gt;동시에 처리되는 듯한 효과&lt;/strong&gt;를 만드는 것이다. 따라서 &lt;strong&gt;동시성은 ‘일정한 시간 단위 내에서 여러 일을 조율하는 능력&lt;/strong&gt;이라고 볼 수 있다.&lt;/p&gt;
&lt;h3&gt;🆚 병렬성(Parallelism)과의 차이점?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;병렬성&lt;/strong&gt;은 &lt;strong&gt;여러 작업을 실제로 동시에 처리&lt;/strong&gt;하는 것이다.&lt;/p&gt;
&lt;p&gt;여러 CPU 또는 코어를 사용하여 &lt;em&gt;(물리적으로)&lt;/em&gt; 여러 작업을 병렬로 처리한다. 각각의 작업은 별도의 프로세스나 스레드에서 실행되며, 이러한 작업들은 각각이 독립적으로 실행되기 때문에 서로 영향을 주지 않는다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;동시성(Concurrency)&lt;/td&gt;
&lt;td&gt;여러 작업을 &lt;em&gt;동시에 겹쳐서 처리&lt;/em&gt;하되, 실제 CPU는 하나씩 번갈아가며 처리&lt;/td&gt;
&lt;td&gt;한 사람이 전화, 메일, 채팅 업무를 번갈아 가면서 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;병렬성(Parallelism)&lt;/td&gt;
&lt;td&gt;여러 작업을 &lt;em&gt;동시에 여러 CPU 코어&lt;/em&gt;에서 수행&lt;/td&gt;
&lt;td&gt;3명이 각각 전화, 메일, 채팅 업무를 받아서 동시에 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;🚦 프론트엔드에서 동시성&lt;/h3&gt;
&lt;p&gt;브라우저는 사용자 상호작용과 다양한 비동기 이벤트를 동시에 다뤄야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자의 입력 이벤트 (Click, Typing input values 등)&lt;/li&gt;
&lt;li&gt;네트워크 통신 (API 요청)&lt;/li&gt;
&lt;li&gt;애니메이션 렌더링 (CSS, requestAnimationFrame)&lt;/li&gt;
&lt;li&gt;타이머 (setTimeout, setInterval)&lt;/li&gt;
&lt;li&gt;React의 상태 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 작업을 동시에 진행하면서 &lt;strong&gt;서로 영향을 주지 않고 매끄럽게 동작&lt;/strong&gt;하여 사용자의 UX에 부정적인 영향이 가지 않도록 하게 하는 것이 중요하다. 즉, 단일 스레드 환경인 브라우저에서 비동기 이벤트를 효율적으로 스케줄링하여 “사용자 상호작용(User Interaction)과 렌더링이 경쟁하지 않도록” 해야 한다.&lt;/p&gt;
&lt;h3&gt;📝 동시성이 중요한 몇 가지 사례 (Cases)&lt;/h3&gt;
&lt;h3&gt;💬 &lt;strong&gt;검색 자동완성 / 필터링 UI&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Situation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;사용자가 입력할 때마다 사용자의 입력값을 기반으로 API 요청&lt;/li&gt;
&lt;li&gt;사용자가 빠르게 타이핑 시 이전 요청에 대한 응답이 돌아오기 전에 새로운 요청 발생&lt;/li&gt;
&lt;li&gt;나중에 처리된 이전 요청의 응답이 &lt;strong&gt;새로운 검색 결과를 덮어쓰는 상황 발생&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;UI가 최신 상태를 반영하지 못함&lt;/li&gt;
&lt;li&gt;뒤늦은 응답이 최신 입력을 덮어버리는 &lt;strong&gt;Race Condition&lt;/strong&gt; 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to solve&lt;/strong&gt;?
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AbortController&lt;/code&gt;로 이전 요청에 대한 중단을 통해 Race Condition 방지&lt;/li&gt;
&lt;li&gt;Concurrent Rendering: &lt;code&gt;useTransition&lt;/code&gt;을 사용해 입력(우선순위 High) vs. 렌더링(우선순위 Low) 구분지어 우선순위 기준으로 변경사항 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;📑 &lt;strong&gt;탭 전환 + API 요청&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Situation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;사용자가 탭을 전환하는 순간, 이전 탭의 데이터 요청이 아직 완료되지 않았을 경우&lt;/li&gt;
&lt;li&gt;전환 후 이전 탭 전환 시 호출했던 요청에 대한 응답 도착 → 새로운 탭의 UI를 이전 요청에 대한 응답이 덮어씀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;상태 꼬임 (State inconsistency)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;사용자 경험 저하 (잘못된 데이터 표시 또는 UI 깜빡거림 발생)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to solve?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AbortController&lt;/code&gt; 또는 React Query의 &lt;code&gt;cancelQueries()&lt;/code&gt;로 이전 요청 취소&lt;/li&gt;
&lt;li&gt;React의 Concurrent Rendering 활용
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;startTransition&lt;/code&gt;을 이용해 전환 렌더링을 낮은 우선순위로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;📃 &lt;strong&gt;대량 데이터 렌더링 + 사용자 입력&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Situation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;몇 만 개의 데이터를 렌더링 중에 사용자의 입력 발생&lt;/li&gt;
&lt;li&gt;렌더링이 끝나기 전까지 사용자의 입력이 UI에 반영되지 않음 (입력이 “먹통”처럼 보임)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;메인 스레드가 렌더링으로 점유되어 입력 이벤트 처리 지연&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to solve?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Virtualization (&lt;code&gt;react-window&lt;/code&gt;, &lt;code&gt;react-virtualized&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;React Concurrent Mode로 렌더링을 나누어 “프레임 단위”로 분할 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✏️ &lt;strong&gt;자동 저장(Auto Save) + 사용자 입력&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Situation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;사용자가 입력 중일 때 일정 주기로 자동 저장 API 호출&lt;/li&gt;
&lt;li&gt;네트워크가 느릴 경우 이전 입력 값으로 덮어써버림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;서버와 클라이언트의 상태 불일치 (Stale data)&lt;/li&gt;
&lt;li&gt;입력 중단이나 깜빡임 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to solve?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트에 버전 키(version key) 관리&lt;/li&gt;
&lt;li&gt;요청 완료 시점 기준이 아닌 입력 타임스탬프 기준으로 반영&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useDeferredValue&lt;/code&gt;로 입력값을 늦게 반영해 충돌 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🎨 &lt;strong&gt;애니메이션 처리 + API 호출&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Situation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;스크롤 애니메이션, 모션 효과가 있는 상태에서 fetch 요청이 동시에 일어남&lt;/li&gt;
&lt;li&gt;렌더링 성능 떨어지면서 프레임 드랍(Frame drop) 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;동시성 부하로 인해 애니메이션이 끊김&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to solve?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requestIdleCallback&lt;/code&gt;으로 idle 타임에 비동기 호출&lt;/li&gt;
&lt;li&gt;Concurrent Rendering으로 렌더링과 애니메이션 스케줄링 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;🧩 React의 Concurrent Rendering 이전에 동시성 제어&lt;/h2&gt;
&lt;p&gt;React 18 이후부터는 React에서 **React 내부 스케줄러(Fiber Scheduler)**가 렌더링 우선순위를 자동으로 조정하여 동시성 제어를 지원한다.&lt;/p&gt;
&lt;p&gt;그렇다면 React가 이러한 제어를 하기 이전에는 프론트엔드의 사용자 입력 지연 문제, API 경쟁 상태(Race Condition) 등을 어떻게 처리했을까?&lt;/p&gt;
&lt;h3&gt;🧩 수동적인 제어 방식&lt;/h3&gt;
&lt;p&gt;React 18 이전에는 모든 상태 업데이트와 렌더링이 **동기적(Synchronous)**으로 진행되었다.&lt;/p&gt;
&lt;p&gt;즉 입력 이벤트, API 호출, 렌더링이 모두 같은 우선순위로 실행되었기 때문에 사용자 입력 중에도 UI가 버벅이거나, 이전 요청이 나중에 도착하면서 최신 상태를 덮어쓰는 등의 문제가 발생했다. 이러한 문제 해결을 위해서 &lt;code&gt;debounce&lt;/code&gt;, &lt;code&gt;throttle&lt;/code&gt;, &lt;code&gt;request cancellation&lt;/code&gt; 등 &lt;strong&gt;수동적인 제어 방식&lt;/strong&gt;을 활용했다.&lt;/p&gt;
&lt;h3&gt;⚙️ Throttle and Debounce&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;debounce&lt;/code&gt; 함수 구현 예시&lt;/p&gt;
&lt;p&gt;→ 사용자가 입력을 멈추고 일정 시간(delay) 동안 아무 입력이 없을 때만 요청을 보냄&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function debounce(fn, delay) {
  let timer;
  return (...args) =&amp;gt; {
    clearTimeout(timer);
    timer = setTimeout(() =&amp;gt; fn(...args), delay);
  };
}

// 검색 API
const handleSearch = debounce((value) =&amp;gt; {
  fetch(`/api/search?q=${value}`);
}, 500);

&amp;lt;input onChange={(e) =&amp;gt; handleSearch(e.target.value)} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;throttle&lt;/code&gt; 함수 구현 예시&lt;/p&gt;
&lt;p&gt;→ 200ms 단위로 스크롤 이벤트가 실행하도록 제한&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function throttle(fn, limit) {
  let inThrottle;
  return (...args) =&amp;gt; {
    if (!inThrottle) {
      fn(...args);
      inThrottle = true;
      setTimeout(() =&amp;gt; (inThrottle = false), limit);
    }
  };
}

// 스크롤 이벤트
window.addEventListener(
  &apos;scroll&apos;,
  throttle(() =&amp;gt; console.log(window.scrollY), 200)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;함수&lt;/th&gt;
&lt;th&gt;작동 방식&lt;/th&gt;
&lt;th&gt;대표 사례&lt;/th&gt;
&lt;th&gt;함수의 실행 목적&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;debounce&lt;/td&gt;
&lt;td&gt;마지막 이벤트 이후 일정 시간 동안 추가 이벤트 진행이 없을 때 실행&lt;/td&gt;
&lt;td&gt;검색 자동완성&lt;/td&gt;
&lt;td&gt;“마지막 입력만 반영” → 불필요한 API 호출 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;throttle&lt;/td&gt;
&lt;td&gt;일정 시간 간격마다 한 번만 실행&lt;/td&gt;
&lt;td&gt;스크롤/resize 이벤트&lt;/td&gt;
&lt;td&gt;“일정 시간을 기준으로 실행” → CPU 부하 완화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;⚙️ AbortController (Request Cancellation - 요청 취소)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt; 요청을 보낼 때 이전 요청이 완료되기 전에 새로운 요청이 발생하면, 이전 요청의 응답이 나중에 도착하면서 UI가 이전 상태로 되돌아가는 문제가 발생했다.&lt;/p&gt;
&lt;p&gt;이런 문제를 해결하기 위해 수동으로 요청 제어를 할 수 있는 &lt;code&gt;AbortController&lt;/code&gt;를 사용해 이전 요청을 취소하는 방식이 널리 사용되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function useSearch() {
  const controllerRef = useRef();

  const fetchSearchResults = async (query) =&amp;gt; {
	  // 진행되는 요청 있으면 취소 (abort)
    if (controllerRef.current) controllerRef.current.abort();
    const controller = new AbortController();
    controllerRef.current = controller;

    try {
      const res = await fetch(`/api/search?q=${query}`, {
        signal: controller.signal, // abort controller를 통한 호출 관리를 위한 signal
      });
      const data = await res.json();
      console.log(&apos;결과:&apos;, data);
    } catch (error) {
      if (error.name === &apos;AbortError&apos;) {
        console.log(&apos;요청이 취소되었습니다.&apos;);
      }
    }
  };

  return { fetchSearchResults };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;🔥 수동적인 제어 방식이 갖는 한계점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;UX 불안정성
&lt;ul&gt;
&lt;li&gt;사용자의 입력 타이밍에 따라 반응이 지연되거나, 반영이 느려 보일 수 있음&lt;/li&gt;
&lt;li&gt;사용자의 입력 타이밍을 추측하여 그에 맞는 실행 시간에 대한 별도 제어가 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;렌더링과의 분리 불가
&lt;ul&gt;
&lt;li&gt;이벤트 발생 빈도 제어는 가능하지만, 렌더링 자체의 우선순위 조절은 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;React 내부 상태 업데이트와 별개
&lt;ul&gt;
&lt;li&gt;React 렌더링 사이클과는 무관하게 동작하여 상태 불일치(stale state) 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;코드 중복 / 복잡도 증가
&lt;ul&gt;
&lt;li&gt;debounce, throttle, abort controller 등을 매 함수마다 따로 관리 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;🧩 React 18 이후의 변화 - Concurrent Rendering&lt;/h2&gt;
&lt;h3&gt;❓ Concurrent Rendering이란?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Concurrent Rendering&lt;/strong&gt;은 React 18 버전에서 처음 도입되어, React 19에서도 지속적으로 개선되고 있는 &lt;strong&gt;동시적 렌더링(Concurrent Rendering)&lt;/strong&gt; 기능이다.&lt;/p&gt;
&lt;p&gt;기존의 동기적(Synchronous)으로 진행되었던 렌더링 작업을 작은 단위로 분할하여 &lt;strong&gt;우선순위 기반으로 스케줄링&lt;/strong&gt;할 수 있도록 하며, &lt;strong&gt;필요 시 중단 및 재개&lt;/strong&gt;가 가능하도록 하여 **UI의 반응성(Responsiveness)**을 유지하는 &lt;strong&gt;동시적 렌더링 방식&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Concurrent Rendering의 특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;변경 우선순위에 따른 렌더링 (Prioritized Updates)&lt;/strong&gt;: React는 &lt;strong&gt;Fiber 아키텍처&lt;/strong&gt;를 기반으로 &lt;strong&gt;변경 우선순위&lt;/strong&gt;에 따라 Fiber 노드를 스케줄링한다. 예를 들어, 사용자 입력과 같은 ‘긴급한 업데이트(high priority)’는 즉시 처리하고, 데이터 fetch나 렌더링과 같은 ‘비긴급 업데이트(low priority)’는 나중에 처리하여 빠르게 반영되어야 하는 변경사항을 우선적으로 처리할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;논 블로킹 (Non-Blocking)&lt;/strong&gt;: 렌더링이 메인 스레드를 완전히 점유하지 않고, **일정 단위마다 중단(yield)**하여 이벤트나 사용자 입력을 처리할 수 있는 시간을 확보한다. 따라서 작업량이 많고 복잡한 업데이트를 진행하더라도 애플리케이션은 여전히 끊김 없이 사용자가 상호작용 할 수 있도록 해 UX를 저해하지 않을 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세밀한 제어 (Fine-Grained Control)&lt;/strong&gt;: React는 Fiber 단위로 각 업데이트의 &lt;strong&gt;우선순위를 계산해서 자동 조정&lt;/strong&gt;한다. 또한 개발자는 &lt;code&gt;useTransition&lt;/code&gt;, &lt;code&gt;useDeferredValue&lt;/code&gt;, &lt;code&gt;Suspense&lt;/code&gt; 등을 통해 간접적으로 &lt;strong&gt;우선순위 힌트&lt;/strong&gt;를 제공할 수 있다. 이를 통해 개발자는 렌더링 흐름을 직접 제어하지 않고도 UI의 반응성과 렌더링 효율을 균형 있게 관리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ Concurrent Rendering은 React가 렌더링 과정을 **동기적(Synchronous)**에서 &lt;strong&gt;스케줄링 가능한 비동기적(Asynchronous) 과정&lt;/strong&gt;으로 전환함으로써, 복잡한 UI에서도 **입력 반응성(Responsiveness)**과 **렌더링 유연성(Flexibility)**을 확보하여 끊김 없는 사용자 경험(Seamless UX)를 제공할 수 있는 핵심 기술이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;📚 참고자료&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://yozm.wishket.com/magazine/detail/2996/&lt;/li&gt;
&lt;li&gt;https://www.linkedin.com/pulse/react-19-concurrent-rendering-boosting-performance-modern-machado-m707f/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Concurrent Rendering을 활용할 수 있는 React API</title><link>https://tessa1217.github.io/posts/react/concurrency-hooks/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/react/concurrency-hooks/</guid><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Concurrent Rendering을 활용할 수 있는 React API&lt;/h2&gt;
&lt;p&gt;React 18부터는 내부 스케줄러(Fiber Scheduler)가 Concurrent Rendering을 지원하면서 개발자가 렌더링 우선순위를 직접 제어하거나 힌트를 줄 수 있는 다양한 API가 새롭게 추가되었다.&lt;/p&gt;
&lt;p&gt;이 API들은 모두 “UI 반응성을 유지하면서 무거운 렌더링이나 비동기 처리를 부드럽게 실행”하는 것을 목표로 한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;useTransition&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;useTransition&lt;/code&gt; is a React Hook that lets you render a part of the UI in the background.
&lt;code&gt;useTransition&lt;/code&gt;은 UI의 특정 부분을 백그라운드에서 렌더링할 수 있도록 하는 React 훅이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;const [isPending, startTransition] = useTransition();
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;useTransition 훅의 우선순위 조정&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;useTransition&lt;/code&gt;은 상태 업데이트를 **낮은 우선순위(Transition 상태)**로 마킹해준다.&lt;/p&gt;
&lt;p&gt;React는 모든 상태 업데이트를 Lane(우선순위 트랙)에 배치하여 스케줄링한다. &lt;code&gt;startTransition&lt;/code&gt;으로 감싼 업데이트는 &lt;strong&gt;TransitionLane&lt;/strong&gt;에 할당되어 (사용자 입력 등과 같이 높은 우선순위 Lane을 부여 받은 작업보다) 낮은 우선순위로 처리된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;사용자 입력(setKeyword) → SyncLane (높은 우선순위)
필터링(setFiltered)     → TransitionLane (낮은 우선순위)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;즉 “지금 바로 반응해야 하는 작업(입력, 클릭)”과 “조금 늦게 반영되어도 되는 작업(리스트 렌더링, 필터링) 결과 표시”를 분리해준다.&lt;/p&gt;
&lt;h3&gt;📦 사용자 입력 + 검색 필터링 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import { useState, useTransition } from &apos;react&apos;;

function SearchList({ items }) {
	const [keyword, setKeyword] = useState(&quot;&quot;);
	const [filtered, setFiltered] = useState(items);
	const [isPending, startTransition] = useTransition();
	
	const handleChange = (e) =&amp;gt; {
		const value = e.target.value;
		setKeyword(value); // 즉시 반영
		
		// 렌더링 여유 있을 때 실행하도록 우선순위 조정
		startTransition(() =&amp;gt; {
			const result = items.filter((item) =&amp;gt; item.toLowerCase().includes(value.toLowerCase()));
			setFiltered(result);
		});		
	}
	
	return (
		&amp;lt;div&amp;gt;
			&amp;lt;input value={keyword} onChange={handleChange} /&amp;gt;
			{isPending &amp;amp;&amp;amp; &amp;lt;p&amp;gt;검색 중입니다...&amp;lt;/p&amp;gt;}
			&amp;lt;ul&amp;gt;
				{filtered.map((item) =&amp;gt; (
					&amp;lt;li key={item.itemId}&amp;gt;{item.name}&amp;lt;/li&amp;gt;
				))}
			&amp;lt;/ul&amp;gt;
		&amp;lt;/div&amp;gt;
	)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;🧠 동작 원리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setKeyword&lt;/code&gt; → &lt;strong&gt;즉시 렌더링 (높은 우선순위)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;사용자의 입력이 즉각 반영되어 입력 지연이 발생하지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;startTransition&lt;/code&gt; 내부의 setFiltered → &lt;strong&gt;낮은 우선순위로 스케줄링&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;React는 브라우저가 idle 상태일 때(즉, 여유가 있을 때) 해당 렌더링을 수행한다.&lt;/li&gt;
&lt;li&gt;만약 렌더링 도중 새로운 high-priority 이벤트가 발생하면, transition 렌더링은 즉시 중단(yield)되었다가 다시 재개된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isPending&lt;/code&gt; → &lt;strong&gt;Transition 상태 동안 true&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;백그라운드 렌더링이 진행 중임을 나타내며, 로딩 표시 등에 활용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;⚡장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;✅ 입력 반응성 유지&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;무거운 필터링이나 렌더링이 있어도 입력 타이핑 끊김 현상 발생 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅ 부드러운 전환 (Transition)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;리스트나 UI 변화가 부드럽게 진행되며, React가 여유 있을 때만 렌더링을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅ 로딩 상태 표시 가능&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isPending&lt;/code&gt;을 통해 Transition 중임을 감지하여, 스켈레톤 UI, 스피너 등을 표시할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅ Race condition 방지&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;startTransition&lt;/code&gt;으로 감싼 비동기 처리(fetch 등)는 렌더링 반영 시점을 조절하기 때문에,
&lt;ul&gt;
&lt;li&gt;사용자의 빠른 입력 변경과 서버 응답 도착 간의 **UI 불일치 현상(stale UI)**을 줄이는 데 도움이 된다.&lt;/li&gt;
&lt;li&gt;(단, 네트워크 요청 자체를 취소하려면 &lt;code&gt;AbortController&lt;/code&gt;를 병행해야 한다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;useDeferredValue&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;useDeferredValue&lt;/code&gt; is a React Hook that lets you defer updating a part of the UI.
&lt;code&gt;useDeferredValue&lt;/code&gt;는 UI의 특정 부분의 업데이트를 지연시킬 수 있도록 하는 React 훅이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;const deferredValue = useDeferredValue(value)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;공식 문서에 따르면 useDeferredValue는 새로운 콘텐츠가 로딩되는 동안 stale(신선하지 않은 상태)한 콘텐츠를 보여줄 때 사용할 수 있다. (&lt;strong&gt;Showing stale content while fresh content is loading&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;따라서, useDeferredValue는 **값(value)**을 기반으로 렌더링되는 UI가 있을 때, 그 값을 “조금 늦게 반영”하도록 만들어 UI 반응성을 유지하는 훅이다.&lt;/p&gt;
&lt;p&gt;업데이트가 진행될 때, 최초 리렌더링 시에는 이전 값(deferred value)을 그대로 사용하고, 백그라운드에서 새롭게 전달 받은 값을 다음 렌더링 시에 반영함으로서 &lt;strong&gt;UI의 상태 불일치를&lt;/strong&gt; 최소화할 수 있도록 한다.&lt;/p&gt;
&lt;h3&gt;useDeferredValue 훅의 우선순위 조정&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;useTransition&lt;/code&gt;과 마찬가지로 &lt;code&gt;useDeferredValue&lt;/code&gt;로 생성된 값의 업데이트는 &lt;strong&gt;TransitionLane&lt;/strong&gt;에 매핑된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;사용자 입력(setKeyword) → SyncLane (높은 우선순위)
필터링(setFiltered)     → TransitionLane (낮은 우선순위)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과적으로 사용자 입력은 즉시 반영하지만 리스트는 조금 늦게 업데이트되는 자연스러운 UX 경험을 제공할 수 있다.&lt;/p&gt;
&lt;h3&gt;📦 사용자 입력 + 검색 필터링 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import { useState, useDeferredValue } from &apos;react&apos;;

function SearchList({ items }) {
	const [keyword, setKeyword] = useState(&apos;&apos;);
	const deferredKeyword = useDeferredvalue(keyword); // 입력값 늦게 반영
	
	const filteredItems = items.filter((item) =&amp;gt; item.toLowerCase().includes(deferredQuery.toLowerCase());
	
	return (
		&amp;lt;div&amp;gt;
			&amp;lt;input value={keyword} onChange={(e) =&amp;gt; setKeyword(e.target.value)} /&amp;gt;
			&amp;lt;ul&amp;gt;
				{filteredItems.map((item) =&amp;gt; (
					&amp;lt;li key={item.itemId}&amp;gt;{item.name}&amp;lt;/li&amp;gt;
				))}			
			&amp;lt;/ul&amp;gt;
		&amp;lt;/div&amp;gt;
	)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;🧠 동작 원리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setKeyword&lt;/code&gt; → &lt;strong&gt;즉시 렌더링 (높은 우선순위)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;사용자의 입력이 즉각 반영되어 입력 지연이 발생하지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deferredQuery&lt;/code&gt; → keyword의 &lt;strong&gt;지연된 버전&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;React가 브라우저의 렌더링 우선순위를 고려해 **TransitionLane(낮은 우선순위)**로 스케줄링&lt;/li&gt;
&lt;li&gt;렌더링이 무거운 경우, React는 &lt;strong&gt;사용자 입력이 먼저 처리된 뒤&lt;/strong&gt; 여유가 있을 때 &lt;code&gt;deferredQuery&lt;/code&gt; 기반의 렌더링을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;⚡장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;✅ 입력 반응성 유지&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;무거운 필터링이나 렌더링이 있어도 입력 타이핑 끊김 현상 발생 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅ 렌더링 부하 완화&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;무거운 필터링, 정렬, 데이터 렌더링 연산을 브라우저가 idle한 시점에 수행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅ 다른 훅에서 활용 가능&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useDeferredValue&lt;/code&gt;는 React Query, 상태 관리 라이브러리 등에 상태 값에도 적용 가능하여 전역 상태 기반 UI 렌더링 반응성 개선이 가능하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📚 참고자료&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://react.dev/reference/react/useTransition&lt;/li&gt;
&lt;li&gt;https://react.dev/reference/react/useDeferredValue&lt;/li&gt;
&lt;li&gt;https://goidle.github.io/react/in-depth-react18-lane/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>❓ Zero-runtime CSS-in-JS?</title><link>https://tessa1217.github.io/posts/css/zero-runtime-css/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/css/zero-runtime-css/</guid><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;❓ Zero-runtime CSS-in-JS?&lt;/h1&gt;
&lt;p&gt;최근 진행하고 있는 사이드 프로젝트에서 디자인 토큰 시스템을 개발하면서 &lt;strong&gt;Vanilla Extract&lt;/strong&gt;를 도입하게 되었다. 이 과정에서 자연스럽게 *&lt;strong&gt;“Zero-runtime CSS-in-JS&lt;/strong&gt;란 무엇일까?”*라는 의문이 생겼고, 관련 개념을 공부하다 보니 CSS-in-JS의 등장 배경과 Zero-runtime CSS-in-JS가 어떤 한계를 보완하기 위해 나왔는지 이해할 필요가 있었다.&lt;/p&gt;
&lt;p&gt;전통적인 CSS의 한계를 극복하기 위해 등장한 CSS-in-JS, 그리고 그 단점을 보완하기 위해 진화한 Zero-runtime CSS-in-JS까지의 흐름을 정리하고, 두 접근 방식이 실제로 어떤 차이를 보이는지 간단한 벤치마킹을 진행해 보았다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;전통적인 CSS의 문제점&lt;/h2&gt;
&lt;p&gt;브라우저의 렌더링 동작 방식(Critical Rendering Path)은 다음과 같다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;서버로부터 HTML을 다운로드 받고 DOM 트리를 생성한다.&lt;/li&gt;
&lt;li&gt;CSS 파일을 다운로드하고 CSSOM 트리를 생성한다.&lt;/li&gt;
&lt;li&gt;DOM 트리와 CSSOM 트리를 결합하여 Render Tree를 생성한다.&lt;/li&gt;
&lt;li&gt;Render Tree를 기반으로 레이아웃과 페인트 작업을 거친다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Render Tree는 실제로 화면에 그려질 요소와 스타일 정보를 결합한 구조다.&lt;/p&gt;
&lt;p&gt;이때 CSSOM이 완성되지 않으면 렌더링이 지연되며, CSS 파일이 크거나 선택자가 많을수록 CSSOM 생성 시간이 길어져 사용자 경험을 해칠 수 있다.&lt;/p&gt;
&lt;p&gt;이를 개선하기 위한 한 가지 방법으로는 CSS를 작은 단위로 분리해 CSSOM을 빠르게 구성하는 방식을 고려할 수 있다. 하지만 이렇게 분할된 파일이 늘어나면 늘어날수록 관리 포인트가 많아지고, 전역 스코프 문제로 인해 클래스/선택자 충돌 위험이 커지는 단점이 존재한다. 컴포넌트 수가 많아질수록 이 문제는 더 심각해질 것이다.&lt;/p&gt;
&lt;p&gt;이러한 한계를 보완하기 위해 등장한 것이 바로 &lt;strong&gt;CSS-in-JS다.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;🎨 CSS-in-JS&lt;/h2&gt;
&lt;p&gt;CSS-in-JS는 컴포넌트 안에서 자바스크립트와 함께 CSS를 작성할 수 있게 해준다.&lt;/p&gt;
&lt;p&gt;이 방식은 직관적이고, 여러 CSS 파일을 따로 관리하는 것보다 유지보수가 용이하다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import styled from &quot;styled-components&quot;;

const StyledButton = styled.button`
  padding: 0.75em 1em;
  border-radius: 4px;
  background-color: ${ ({ primary }) =&amp;gt; ( primary ? &quot;blue&quot; : &quot;gray&quot; ) };
  color: white;
  &amp;amp;:hover {
    background-color: #111;
  }
`;

export default StyledButton;

// App
import StyledButton from &apos;./components/StyledButton&apos;

function App() {
	return (
		&amp;lt;div className=&quot;app&quot;&amp;gt;
			&amp;lt;StyledButton&amp;gt;Button&amp;lt;/StyledButton&amp;gt;
			&amp;lt;StyledButton primary&amp;gt;Primary Button&amp;lt;/StyledButton&amp;gt;			
		&amp;lt;/div&amp;gt;
	)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CSS-in-JS의 가장 큰 장점은 &lt;strong&gt;스코프 문제 해결&lt;/strong&gt;이다. 스타일이 컴포넌트 로컬 스코프에 선언되므로 다른 컴포넌트와 충돌할 염려가 없다.&lt;/p&gt;
&lt;p&gt;또한 props에 따라 동적으로 스타일을 지정할 수 있어 동적 스타일링이 가능한 점도 큰 장점이다.&lt;/p&gt;
&lt;h3&gt;CSS-in-JS의 단점&lt;/h3&gt;
&lt;p&gt;이처럼 CSS-in-JS는 전통적인 CSS의 한계를 극복하기 위해 탄생했지만 모든 문제를 완벽히 해결하지는 못한다.&lt;/p&gt;
&lt;p&gt;CSS-in-JS는 런타임 시점에 라이브러리가 스타일을 해석하고 적용하기 때문에 런타임 오버헤드가 발생한다. 또한 전통적인 CSS는 브라우저 캐싱의 이점을 누릴 수 있지만, 런타임에 동적으로 생성되는 CSS-in-JS는 캐싱 효과를 기대하기 어렵다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;🧩 Zero-runtime CSS-in-JS의 등장&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Zero-runtime CSS-in-JS&lt;/strong&gt;는 CSS-in-JS의 단점을 보완하기 위해 등장했다.&lt;/p&gt;
&lt;p&gt;대표적으로 &lt;strong&gt;Vanilla Extract&lt;/strong&gt;, &lt;strong&gt;Panda CSS&lt;/strong&gt; 등이 있다.&lt;/p&gt;
&lt;p&gt;Vanilla Extract는 빌드 시점에 className을 확정하고 CSS 파일을 정적으로 출력한다. 따라서 런타임에는 단순히 문자열을 바인딩하는 것만으로 빠르게 스타일을 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;즉, CSS-in-JS가 제공하는 생산성과 확장성은 유지하면서도, 런타임 오버헤드를 제거하여 성능 문제를 보완하는 방식이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;🆚 CSS-in-JS vs. Zero-runtime CSS-in-JS 벤치마크&lt;/h1&gt;
&lt;p&gt;그렇다면 실제로 CSS-in-JS와 Zero-runtime CSS-in-JS는 얼마나 차이가 있을까?
이를 확인하기 위해 &lt;strong&gt;React + Vite 환경에서 3,000개의 Box 컴포넌트&lt;/strong&gt;를 렌더링하고, &lt;strong&gt;Styled-components&lt;/strong&gt;와 &lt;strong&gt;Vanilla Extract&lt;/strong&gt;를 비교하는 간단한 벤치마킹을 진행했다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;📃 벤치마크 시나리오&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;React + Vite 환경에서 3,000개의 Box 컴포넌트 렌더링&lt;/li&gt;
&lt;li&gt;Styled-components vs. Vanilla Extract 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/css-in-js-benchmark.png&quot; alt=&quot;CSS-in-JS 벤치마크&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CSS-in-JS 벤치마크&lt;/p&gt;
&lt;h3&gt;코드 예시&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Vanilla Extract를 활용한 Box Style&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// zero-runtime.css.ts
import { style } from &quot;@vanilla-extract/css&quot;;

export const box = style({
  width: &quot;24px&quot;,
  height: &quot;24px&quot;,
  borderRadius: &quot;4px&quot;,
});

export const variants = [
  style({ background: &quot;#1e3a8a&quot; }),
  style({ background: &quot;#2563eb&quot; }),
  style({ background: &quot;#16a34a&quot; }),
  style({ background: &quot;#d97706&quot; }),
  style({ background: &quot;#dc2626&quot; }),
];

export const bordered = style({
  outline: &quot;1px solid rgba(0,0,0,.08)&quot;,
});

export const shadowed = style({
  boxShadow: &quot;0 1px 2px rgba(0,0,0,.12)&quot;,
});

// ZeroRuntimeBoxes.tsx
import * as styles from &quot;../zero-runtime.css&quot;;

type BoxProps = {
  variant: number;
  bordered: boolean;
  shadowed: boolean;
};

function Box({ variant = 0, bordered = false, shadowed = false }: BoxProps) {
  const boxStyles = [
    styles.box,
    styles.variants[variant],
    bordered ? styles.bordered : &quot;&quot;,
    shadowed ? styles.shadowed : &quot;&quot;,
  ].join(&quot; &quot;);
  return &amp;lt;div className={boxStyles}&amp;gt;&amp;lt;/div&amp;gt;;
}

type ZeroRuntimeBoxesProps = {
  N: number;
  variantSeed: number;
};

export default function ZeroRuntimeBoxes({
  N,
  variantSeed,
}: ZeroRuntimeBoxesProps) {
  const items = new Array(N).fill(0).map((_, i) =&amp;gt; (i + variantSeed) % 5);
  const bordered = variantSeed % 2 === 0;
  const shadowed = variantSeed % 3 === 0;
  return items.map((v, i) =&amp;gt; (
    &amp;lt;Box key={i} variant={v} bordered={bordered} shadowed={shadowed} /&amp;gt;
  ));
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Styled Component를 활용한 Box Style&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
import styled from &quot;styled-components&quot;;

type BoxProps = {
  variant: number;
  bordered?: boolean;
  shadowed?: boolean;
};

const Box = styled.div&amp;lt;BoxProps&amp;gt;`
  width: 24px;
  height: 24px;
  border-radius: 4px;
  background: ${(p) =&amp;gt;
      [&quot;#1e3a8a&quot;, &quot;#2563eb&quot;, &quot;#16a34a&quot;, &quot;#d97706&quot;, &quot;#dc2626&quot;][p.variant]}
    ${(p) =&amp;gt; (p.bordered ? &quot;outline: 1px solid rgba(0,0,0,.08);&quot; : &quot;&quot;)}
    ${(p) =&amp;gt; (p.shadowed ? &quot;box-shadow: 0 1px 2px rgba(0,0,0,.12);&quot; : &quot;&quot;)};
`;

type StyledBoxesProps = {
  N: number;
  variantSeed: number;
};

export default function StyledBoxes({ N, variantSeed }: StyledBoxesProps) {
  const items = new Array(N).fill(0).map((_, i) =&amp;gt; (i + variantSeed) % 5);
  const bordered = variantSeed % 2 === 0;
  const shadowed = variantSeed % 3 === 0;
  return items.map((v, i) =&amp;gt; (
    &amp;lt;Box key={i} variant={v} bordered={bordered} shadowed={shadowed} /&amp;gt;
  ));
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;React DevTools Profiler로 렌더링 시간 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/benchmark-profiler1.png&quot; alt=&quot;Styled Components&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Styled Components&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/benchmark-profiler2.png&quot; alt=&quot;Vanilla Extract&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vanilla Extract&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/mount-time1.png&quot; alt=&quot;Styled-components Mount, Update 시간 출력&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Styled-components Mount, Update 시간 출력&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/mount-time2.png&quot; alt=&quot;Vanilla Extract Mount, Update 시간 출력&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vanilla Extract Mount, Update 시간 출력&lt;/p&gt;
&lt;p&gt;&amp;lt;aside&amp;gt;
💡&amp;lt;strong&amp;gt;벤치마크 결과&amp;lt;/strong&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(렌더링 시간 비교)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Styled-components&lt;/strong&gt; 렌더링 시간: 339.3ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vanilla Extract&lt;/strong&gt; 렌더링 시간: 284.5ms&lt;/li&gt;
&lt;li&gt;약 &lt;strong&gt;16% 차이&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;(Console 측정 기준)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mount&lt;/strong&gt;: Styled-components는 0.50ms, Vanilla Extract는 0.20ms → 초기 렌더링에서 약 2.5배 차이&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update&lt;/strong&gt;: Styled-components는 0.72ms, Vanilla Extract는 0.08ms → 업데이트에서 약 9배 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 벤치마크 결과 측정 결과 상 Zero-runtime 방식이 런타임 오버헤드를 줄인다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;✏️ 벤치마킹을 진행하면서…&lt;/h1&gt;
&lt;p&gt;사실 CSS-in-JS를 활용한 경험이 전무했던 터라, 두 접근 방식이 어떤 차이가 있는지, 그리고 DX(Developer Experience) 측면에서 각각의 장단점이 무엇인지 뚜렷하게 알지 못한 상태에서 이번 벤치마킹을 시작했다.&lt;/p&gt;
&lt;p&gt;여전히 거대한 &lt;code&gt;global.css&lt;/code&gt; 빌드 결과물의 크기를 줄이기 위해 고군분투하고, 컴포넌트 단위 CSS 모듈화를 두고 치열하게 고민하는 입장에서 이번 미니 벤치마킹은 굉장히 신선한 경험이었다.&lt;/p&gt;
&lt;p&gt;특히 컴포넌트 내부에서 스타일을 정의하고 조건부 처리나 variant 기반의 디자인을 적용할 수 있다는 점에서 &lt;strong&gt;DX적인 장점&lt;/strong&gt;을 크게 체감할 수 있었다.&lt;/p&gt;
&lt;p&gt;벤치마킹을 진행하며 느낀 두 방식의 차이점은,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Styled-components&lt;/strong&gt;는 이미 많은 회사에서 활용되는 만큼 생태계와 플러그인이 풍부하고, 직관적인 API를 통해 스타일을 작성할 수 있는 점이 매력적으로 다가왔다. 하지만 런타임 오버헤드라는 태생적인 성능 문제는 피하기 어렵고, 컴포넌트 단위가 커질수록 스타일 코드가 함께 섞이면서 직관성이 떨어질 수 있겠다는 우려도 생겼다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vanilla Extract&lt;/strong&gt;는 CSS-in-JS의 런타임 오버헤드 문제를 최소화하면서도, 현재 설계 중인 &lt;strong&gt;디자인 토큰 시스템과 연동&lt;/strong&gt;하여 테마 관리와 확장을 손쉽게 할 수 있다는 장점이 있었다. 이런 이유로 이번 프로젝트에서는 Vanilla Extract를 도입하기로 결정했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전통적인 CSS 방식을 고수하던 관성에서 벗어나, 다양한 스타일링 접근 방식을 직접 경험해 볼 수 있었다는 점에서 이번 벤치마킹은 매우 유익한 시간이었다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;📚 참고자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://junghan92.medium.com/%EB%B2%88%EC%97%AD-%EC%9A%B0%EB%A6%AC%EA%B0%80-css-in-js%EC%99%80-%ED%97%A4%EC%96%B4%EC%A7%80%EB%8A%94-%EC%9D%B4%EC%9C%A0-a2e726d6ace6&quot;&gt;https://junghan92.medium.com/번역-우리가-css-in-js와-헤어지는-이유-a2e726d6ace6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;https://blog.logrocket.com/css-vs-css-in-js/#render-blocking-css&lt;/li&gt;
&lt;li&gt;https://vanilla-extract.style/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🧩 Javascript의 Object</title><link>https://tessa1217.github.io/posts/javascript/object/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/javascript/object/</guid><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🧩 Javascript의 Object&lt;/h1&gt;
&lt;p&gt;최근 &lt;strong&gt;깊은 복사를 위한 유틸리티 함수&lt;/strong&gt;를 직접 구현하라는 과제를 받았다.&lt;/p&gt;
&lt;p&gt;단순한 객체만이 아니라 Array, Map, Set은 물론 커스텀 객체까지 모두 제대로 복사할 수 있어야 했다. 처음엔 키-값 쌍을 재귀적으로 새 객체에 복사하는 방식으로 해결하려 했지만, 곧 다양한 객체 타입을 정확히 다루려면 자바스크립트의 Object, 속성 구조, 그리고 프로토타입 체계에 대한 이해가 필수적이었다.&lt;/p&gt;
&lt;p&gt;이 과정에서 내가 객체 시스템에 대해 얼마나 피상적으로 알고 있었는지 실감했고, 이를 계기로 관련 개념을 깊이 있게 학습하고 정리해보게 되었다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1) Object란?&lt;/h2&gt;
&lt;p&gt;객체는 **데이터와 기능(메서드)**를 &lt;strong&gt;키–값&lt;/strong&gt; 쌍으로 저장하는 구조.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const person = {
  name: &apos;MyName&apos;,
  age: 25,
  greeting() {
    console.log(&quot;Hello, my name is&quot;, this.name);
  }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;age&lt;/code&gt;는 &lt;strong&gt;속성(property)&lt;/strong&gt;, &lt;code&gt;greeting&lt;/code&gt;은 &lt;strong&gt;메서드(method)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2) 객체 생성 방법&lt;/h2&gt;
&lt;h3&gt;✅ 리터럴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const obj = { key: &apos;value&apos;, number: 12345 };
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;✅ 생성자 &amp;amp; Object.create&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const obj = new Object();
obj.key = &apos;value&apos;;
obj.number = 12345;

// 원본의 프로토타입/디스크립터까지 유지 복사
const clone = Object.create(
  Object.getPrototypeOf(obj),
  Object.getOwnPropertyDescriptors(obj)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Object.create(proto, descriptors)&lt;/code&gt;&lt;/strong&gt;: 지정한 프로토타입과 디스크립터로 새 객체 생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 클래스&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class Person {
  constructor(name, age) { this.name = name; this.age = age; }
}
const personA = new Person(&quot;a&quot;, 27);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;✅ Getter/Setter&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const person = {
  firstName: &apos;value&apos;,
  lastName: &apos;12345&apos;,
  get fullName() { return `${this.firstName} ${this.lastName}`; },
  set fullName(name) { [this.firstName, this.lastName] = name.split(&quot; &quot;); }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3) 속성 접근&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const a = new Person(&quot;a&quot;, 27);
console.log(a.name);      // 점 표기법
console.log(a[&apos;name&apos;]);   // 대괄호 표기법
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4) 속성 추가/수정/삭제&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const p = new Person(&quot;a&quot;, 27);
p.job = &apos;Developer&apos;; // 등록
p.age = 26; // 변경
delete p.job; // 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Object.defineProperty / defineProperties&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const p2 = new Person(&quot;a&quot;, 27);
Object.defineProperties(p2, {
  job: { value: &apos;Developer&apos;, writable: true, configurable: true, enumerable: true }
});
Object.defineProperty(p2, &quot;favoriteFood&quot;, {
  value: &apos;apple&apos;, writable: true, configurable: true, enumerable: true
});
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;디스크립터로 &lt;strong&gt;쓰기/열거/재정의 가능 여부&lt;/strong&gt;를 제어.
&lt;ul&gt;
&lt;li&gt;writable&lt;/li&gt;
&lt;li&gt;configurable&lt;/li&gt;
&lt;li&gt;enumerable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5) 변경 제약: freeze / seal (＋preventExtensions)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.freeze()&lt;/code&gt; 메서드를 통해 객체를 &lt;strong&gt;동결&lt;/strong&gt;하게 되면 동결된 객체는 더 이상 새로운 속성을 추가하거나 제거하는 것을 방지한다.
&lt;ul&gt;
&lt;li&gt;존재하는 속성의 불변성, 설정 가능성, 작성 가능성이 변경되는 것 역시 방지되며, 존재 속성의 값을 수정하는 것도 방지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.seal()&lt;/code&gt; 메서드를 통해 객체를 &lt;strong&gt;밀봉&lt;/strong&gt;하게 되면 새로운 속성의 추가가 불가능하며 현재 존재하는 속성을 설정 불가능 상태로 만들어준다. 다만 &lt;strong&gt;쓰기 가능한 속성&lt;/strong&gt;에 대한 속성의 값은 밀봉 후에도 변경할 수 있다는 점에서 &lt;code&gt;Object.freeze()&lt;/code&gt; 메서드와 차이가 있다.&lt;/li&gt;
&lt;li&gt;동결/밀봉 여부는 &lt;code&gt;Object.isFrozen()&lt;/code&gt;, &lt;code&gt;Object.isSealed()&lt;/code&gt; 메서드를 통해 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;const f = Object.freeze(new Person(&quot;a&quot;, 25));
f.age = 27; // 무시
console.log(Object.isFrozen(f), Object.isSealed(f)); // true, true

const s = Object.seal(new Person(&quot;a&quot;, 26));
s.age = 27; // 가능(속성 writable이면)
console.log(Object.isFrozen(s), Object.isSealed(s)); // false, true
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;메서드&lt;/th&gt;
&lt;th&gt;새 속성 추가&lt;/th&gt;
&lt;th&gt;기존 속성 삭제&lt;/th&gt;
&lt;th&gt;값 변경(쓰기)&lt;/th&gt;
&lt;th&gt;디스크립터 변경&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Object.freeze&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Object.seal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (writable일 때)&lt;/td&gt;
&lt;td&gt;일부 ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Object.preventExtensions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;6) 속성 보유 확인: &lt;code&gt;hasOwnProperty&lt;/code&gt; vs &lt;code&gt;Object.hasOwn&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;객체가 특정 속성을 자신의 속성으로 가지고 있는지 확인할 때 &lt;code&gt;hasOwnproperty&lt;/code&gt; 메서드나 ES2022에 새로 추가된 정적 메서드인 &lt;code&gt;Object.hasOwn()&lt;/code&gt;을 사용할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Person {
  constructor(name, age) { this.name = name; this.age = age; }
  greeting() { console.log(&quot;Hi&quot;, this.name); }
}
const p = new Person(&quot;person&quot;, 25);
p.sayHello = function() { console.log(&quot;Hello&quot;, this.name); };

console.log(p.hasOwnProperty(&quot;name&quot;));      // true
console.log(Object.hasOwn(p, &quot;name&quot;));      // true
console.log(Object.hasOwn(p, &quot;sayHello&quot;));  // true
console.log(Object.hasOwn(p, &quot;greeting&quot;));  // false (프로토타입의 메서드)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.hasOwn(obj, key)&lt;/code&gt;는 &lt;strong&gt;안전한 정적 메서드&lt;/strong&gt; (인스턴스가 &lt;code&gt;hasOwnProperty&lt;/code&gt;를 오버라이드해도 안전).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🧬 프로토타입 체인&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔗 프로토타입&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트의 모든 객체는 내부 &lt;code&gt;[[Prototype]]&lt;/code&gt; 링크를 가진다.&lt;/li&gt;
&lt;li&gt;이러한 구조를 통해 객체는 클래스 기반 언어의 상속처럼 공통 속성과 메서드를 상속받거나 참조할 수 있으며, 이렇게 형성된 상속 구조를 **프로토타입 체인(Prototype Chain)**이라고 한다.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;없으면 자기 자신 → 프로토타입 → … → Object.prototype → null&lt;/strong&gt;로 탐색.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;const arr = [1, 2, 3];
console.log(arr.toString()); // &quot;1,2,3&quot;  (Array.prototype → Object.prototype)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;🛠️ 생성자 함수와 프로토타입&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;new 연산자로 객체를 생성하면 해당 객체는 생성자 함수의 prototype 속성을 자신의 [[Prototype]]으로 연결한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function Person(name) { 
	this.name = name; 
}
Person.prototype.sayHello = function () { console.log(`Hi, I&apos;m ${this.name}`); };
const p1 = new Person(&quot;Alice&quot;);
console.log(p1.sayHello === Person.prototype.sayHello); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7) 속성 설명자 조회&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const p = new Person(&quot;a&quot;, 1);
Object.defineProperty(p, &quot;job&quot;, {
  value: &apos;Developer&apos;, writable: true, configurable: false, enumerable: true
});
console.log(Object.getOwnPropertyDescriptors(p));
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;getOwnPropertyDescriptors&lt;/code&gt;로 &lt;strong&gt;모든 own 속성의 디스크립터&lt;/strong&gt;를 조회할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;8) 객체 순회&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;for…in&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// for...in (자신 + 상속된 enumerable 포함)
for (const k in p) console.log(k, p[k]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Object.keys / values / entries&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// own enumerable만
Object.keys(p);    // 키 배열
Object.values(p);  // 값 배열
Object.entries(p); // [키,값] 배열  (정수 키 → 문자열 키 삽입 순서)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;열거 불가능/심볼 키&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const obj = { a: 1, b: 2 };
Object.defineProperty(obj, &quot;c&quot;, { value: 3, enumerable: false });

console.log(Object.keys(obj));               // [&apos;a&apos;,&apos;b&apos;]
console.log(Object.getOwnPropertyNames(obj));// [&apos;a&apos;,&apos;b&apos;,&apos;c&apos;]

const sym = Symbol(&apos;id&apos;);
const o2 = { [sym]: 123, a: 1 };
console.log(Object.getOwnPropertySymbols(o2)); // [Symbol(id)]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;9) Map ↔ Object 변환&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.entries()&lt;/code&gt;는 for...in과 같은 순서로 주어진 객체 자체의 &lt;strong&gt;enumerable&lt;/strong&gt; 속성을 키-값 쌍 형태의 배열로 반환한다. 이를 활용하여 Map으로 변환할 수 있다.&lt;/li&gt;
&lt;li&gt;반대로 &lt;code&gt;Object.fromEntries&lt;/code&gt;는 키-값 쌍 형태의 배열을 객체로 변환해주는 메서드이다. 이를 통해 Map을 Object로 변환할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;const object = { a: 1, b: 2, c: 3 };
const map = new Map(Object.entries(object));   // Object → Map

const fromMap = new Map([[&quot;a&quot;,1],[&quot;b&quot;,2]]);
const toObj = Object.fromEntries(fromMap);     // Map → Object
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;10) 객체 복사&lt;/h2&gt;
&lt;h3&gt;✅ 얕은 복사&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const copy1 = Object.assign({}, person);
const copy2 = { ...person };

// 프로토타입/비열거 속성까지 살리는 얕은 복사
const copyAll = Object.create(
  Object.getPrototypeOf(person),
  Object.getOwnPropertyDescriptors(person)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;얕은 복사 시에는 중첩 객체는 참조 공유&lt;/strong&gt; → 내부 변경이 원본에 전파한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.assign()&lt;/code&gt;을 통한 복사는 목표 객체로 열거 가능한 속성과 객체의 속성들만 복사할 수 있지만 &lt;code&gt;Object.getPrototypeOf&lt;/code&gt;, &lt;code&gt;Object.getOwnPropertyDescriptors&lt;/code&gt;를 활용하면 열거 불가능한 속성들도 복사할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 병합&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const m = Object.assign({}, obj1, obj2); // 뒤에 온 키가 덮어씀
const m2 = { ...obj1, ...obj2 };
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Spread 연산자, Object.assign 메서드를 활용해 다중 객체를 병합할 수 있다. 다만 후자의 키가 덮어씌워지기 때문에 병합 순서에 유의해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 깊은 복사 (주의: JSON 기반 한계)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const deepCopied = JSON.parse(JSON.stringify(person));
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;JSON.parse, JSON.stringify를 활용하여 간단하게 깊은 복사를 할 수 있다. 다만 JSON.parse, JSON.stringify를 사용한 깊은 복사에는 여러가지 제약사항 및 한계가 존재한다.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;무시/불가&lt;/strong&gt;: &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;Function&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;, &lt;code&gt;BigInt(에러)&lt;/code&gt;, &lt;code&gt;Map/Set&lt;/code&gt;, &lt;code&gt;Date/RegExp(손실)&lt;/code&gt;, 순환 참조(에러).&lt;/li&gt;
&lt;li&gt;대안: &lt;strong&gt;직접 구현&lt;/strong&gt; 또는 &lt;code&gt;lodash.cloneDeep&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;11) 객체 비교&lt;/h2&gt;
&lt;p&gt;객체는 참조형 타입으로 내부 속성의 값이 동일하더라도 참조값이 다를 경우 서로 다른 객체로 간주된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const person = new Person(&quot;a&quot;, 26);
const copy = { ...person };
console.log(person === copy); // false (참조 비교)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;“값 동등” 검사(간단 용도)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;JSON.stringify(person) === JSON.stringify(copy);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;객체 내부 속성 값이 실제로 동일한지 비교할 때, JSON.stringify를 활용할 수 있다. 단, JSON.stringify는 &lt;strong&gt;함수, undefined, Symbol&lt;/strong&gt; 등은 무시하고, 속성 순서가 다를 경우 다른 경우가 나올 수 있다.
&lt;ul&gt;
&lt;li&gt;함수/undefined/Symbol 무시, 키 순서 영향 가능.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정교한 비교&lt;/strong&gt;는 &lt;code&gt;lodash.isEqual&lt;/code&gt; 등 사용 권장.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📚 참고 자료&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object&quot;&gt;MDN Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/js/js_objects.asp&quot;&gt;W3School Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.javascript.info/object&quot;&gt;Javascript.Info Object&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>이벤트 루프 (Event Loop)</title><link>https://tessa1217.github.io/posts/javascript/event-loop/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/javascript/event-loop/</guid><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;🧩 JavaScript의 비동기 처리 개요&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;자바스크립트는 &lt;strong&gt;싱글 스레드&lt;/strong&gt; 언어이다.&lt;/p&gt;
&lt;p&gt;즉 한 번에 하나의 작업만 수행할 수 있으며, 코드 실행을 담당하는 **호출 스택(Call Stack)**도 하나뿐이다.&lt;/p&gt;
&lt;p&gt;싱글 스레드 구조는 복잡한 처리가 필요한 &lt;strong&gt;동시성 문제를 줄이는 장점&lt;/strong&gt;이 있지만, 네트워크 요청·파일 읽기처럼 오래 걸리는 작업이 있을 때 전체 실행 흐름을 멈추는 **블로킹(blocking)**이 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;이를 보완하기 위해 &lt;strong&gt;비동기 처리&lt;/strong&gt;와 &lt;strong&gt;이벤트 루프(Event Loop)&lt;/strong&gt; 개념이 도입되었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;❓ JavaScript는 왜 싱글 스레드로 설계되었을까?&lt;/p&gt;
&lt;p&gt;자바스크립트가 처음 등장했을 때는 멀티 스레드에 대한 개념이 대중화된 시기가 아니었다. 또한 자바스크립트의 전신인 LiveScript는 브라우저에서 간단한 UI 조작을 위한 스크립트로 사용되었다.&lt;/p&gt;
&lt;p&gt;따라서 복잡한 멀티 스레드 제어보다는 &lt;strong&gt;“Run-to-Completion”&lt;/strong&gt; — 하나의 작업이 끝난 뒤 “동기적”으로 다음 작업을 실행하는 순차적 처리 방식 — 이 합리적인 선택이었다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🔄 이벤트 루프란?&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;이벤트 루프는 &lt;strong&gt;ECMAScript&lt;/strong&gt; &lt;strong&gt;표준이 아닌, 브라우저/Node.js 런타임이 구현한 매커니즘&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;자바스크립트 엔진은 &lt;strong&gt;동기 실행&lt;/strong&gt;만 담당하고, 비동기 처리는 &lt;strong&gt;브라우저 Web API&lt;/strong&gt; 또는 &lt;strong&gt;Node.js의&lt;/strong&gt; c++ 라이브러리인 &lt;strong&gt;libuv&lt;/strong&gt;가 담당한다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/event-loop-gautam-kumar.png&quot; alt=&quot;https://dev.to/gautam_kumar_d3daad738680/understanding-call-stack-callback-queue-event-loop-and-microtask-queue-in-javascript-2c7n&quot; /&gt;&lt;/p&gt;
&lt;p&gt;https://dev.to/gautam_kumar_d3daad738680/understanding-call-stack-callback-queue-event-loop-and-microtask-queue-in-javascript-2c7n&lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;이벤트 루프의 핵심 역할&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;호출 스택&lt;/strong&gt;을 감시&lt;/li&gt;
&lt;li&gt;스택이 비어 있으면 **큐(Event Queue, Callback Queue)**에 있는 작업을 꺼내 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이처럼 이벤트 루프는 메인 스레드와 백그라운드 사이에서 &lt;strong&gt;신호등&lt;/strong&gt;처럼 타이밍을 조율하는 역할을 한다.&lt;/p&gt;
&lt;h3&gt;📦 호출 스택과 이벤트 루프&lt;/h3&gt;
&lt;p&gt;호출 스택(Call Stack)은 자바스크립트에서 &lt;strong&gt;현재 실행 중이거나 대기 중인 함수&lt;/strong&gt;를 LIFO(Last In First Out) 형태로 순차적으로 쌓아두는 스택이다.&lt;/p&gt;
&lt;p&gt;다음과 같이 실행되는 코드가 있다고 가정했을 때 이 코드들은 어떤 순서로 호출 스택에 쌓이게 되는 걸까?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function a() {
	console.log(&quot;a&quot;);
}

function b() {
	console.log(&quot;b&quot;);
}

function ab() {
	console.log(&quot;ab&quot;);
	a();
	b();
}

ab();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;@/assets/posts/call-stack1.mp4&quot;&gt;call stack1.mp4&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;실행 흐름 요약&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;ab()가 호출 스택에 먼저 들어간다.&lt;/li&gt;
&lt;li&gt;ab() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 ab()는 존재)&lt;/li&gt;
&lt;li&gt;a()가 호출 스택에 들어간다.&lt;/li&gt;
&lt;li&gt;a() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 ab(), a()는 존재)&lt;/li&gt;
&lt;li&gt;a()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다. (아직 ab()는 존재)&lt;/li&gt;
&lt;li&gt;b()가 호출 스택에 들어간다.&lt;/li&gt;
&lt;li&gt;b() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 ab(), b()는 존재)&lt;/li&gt;
&lt;li&gt;b()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다. (아직 ab()는 존재)&lt;/li&gt;
&lt;li&gt;ab()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다.&lt;/li&gt;
&lt;li&gt;이제 호출 스택이 완전히 비워졌다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 일련의 과정을 거치며 처리해야 할 작업들이 순차적으로 쌓이고 제거되는 과정을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;그렇다면 비동기 작업의 실행은 어떤 식으로 처리될까?&lt;/p&gt;
&lt;h3&gt;⏰ 비동기 작업과 이벤트 루프&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;function a() {
	console.log(&quot;a&quot;);
}

function b() {
	console.log(&quot;b&quot;);
}

function ab() {
	console.log(&quot;ab&quot;);
	setTimeout(a, 0); // setTimeout을 추가
	b();
}

ab();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;비동기 작업인 &lt;code&gt;setTimeout&lt;/code&gt;을 추가했을 때, 호출 스택 내부에서는 다음과 같은 일이 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;@/assets/posts/call-stack2.mp4&quot;&gt;call stack 2.mp4&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;실행 흐름 요약&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ab()가 호출 스택에 먼저 들어간다.&lt;/li&gt;
&lt;li&gt;ab() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 ab()는 존재)&lt;/li&gt;
&lt;li&gt;setTimeout(a, 0)이 호출 스택에 들어간다.&lt;/li&gt;
&lt;li&gt;런타임으로 타이머 요청이 전달되고, setTimeout은 스택에서 제거된다.
&lt;ol&gt;
&lt;li&gt;메인 스레드(자바스크립트 엔진)는 &lt;strong&gt;이 콜백을 delay후에 실행해줘&lt;/strong&gt;라는 요청을 런타임 환경에 전달한다.&lt;/li&gt;
&lt;li&gt;런타임 환경은 백그라운드 스레드에서 타이머를 관리한다.&lt;/li&gt;
&lt;li&gt;지정한 시간이 지나면, 해당 콜백(&lt;code&gt;a&lt;/code&gt;)을 &lt;strong&gt;태스크 큐&lt;/strong&gt;에 등록한다.&lt;/li&gt;
&lt;li&gt;이 과정은 &lt;strong&gt;메인 스레드와 병렬로 진행&lt;/strong&gt;된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;b()가 호출 스택에 들어간다.&lt;/li&gt;
&lt;li&gt;b() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 ab(), b()는 존재)&lt;/li&gt;
&lt;li&gt;b()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다. (아직 ab()는 존재)&lt;/li&gt;
&lt;li&gt;ab()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다.&lt;/li&gt;
&lt;li&gt;이벤트 루프는 호출 스택이 비워져 있는 것을 확인하고, 태스크 큐에서 a()를 꺼내 호출 스택에 넣는다.&lt;/li&gt;
&lt;li&gt;a() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다.&lt;/li&gt;
&lt;li&gt;a()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💡 &lt;strong&gt;setTimeout의 실행 흐름&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;현재 실행 흐름을 보면 &lt;code&gt;setTimeout(() =&amp;gt; {}, delay)&lt;/code&gt;이 delay만큼 설정된 지연 시간 이후 바로 실행됨을 보장하지 않는다는 것을 알 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt;과 같은 비동기 함수는 자바스크립트 엔진이 아닌 **런타임(브라우저의 Web API/Node.js의 libuv)**에서 처리된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;런타임의 백그라운드 스레드가 타이머를 관리하고, 완료 시 해당 콜백을 **태스크 큐(Task Queue/Callback Queue)**에 등록한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이벤트 루프는 호출 스택이 완전히 비워진 뒤, &lt;strong&gt;다음 이벤트 루프 사이클&lt;/strong&gt;에서 큐에 있는 작업을 꺼내 실행한다.&lt;/p&gt;
&lt;p&gt;→ 따라서 최소 지연 시간이 0ms여도, 메인 스레드가 바쁘거나 다른 작업이 대기 중이면 실행이 지연될 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🧩 &lt;strong&gt;태스크 큐(Task/Callback Queue)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;새롭게 등장한 개념인 태스크 큐는 &lt;strong&gt;실행해야 할 태스크&lt;/strong&gt;를 보관하고 있는 공간이다. 이때 실행해야 할 태스크란 런타임(Web API, libuv)이 처리하는 비동기 함수의 &lt;strong&gt;콜백 함수&lt;/strong&gt;나 &lt;strong&gt;이벤트 핸들러&lt;/strong&gt; 등을 의미한다.&lt;/p&gt;
&lt;p&gt;이벤트 루프는 호출 스택이 비어있음을 확인하면 가장 오래된 태스크부터 꺼내 호출 스택으로 순차적으로 보내어 실행한다.&lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;주요 태스크&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;브라우저 &lt;strong&gt;DOM 이벤트&lt;/strong&gt; 콜백&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postMessage&lt;/code&gt;, &lt;code&gt;MessageChannel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Node.js: &lt;code&gt;setImmediate&lt;/code&gt; (루프의 check phase)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 과정에서 이벤트 루프는 호출 스택이 비고, 콜백이 실행 가능한 시점이 되면 해당 콜백을 호출 스택으로 전달하는 역할을 한다.&lt;/p&gt;
&lt;h3&gt;🧩 태스크 큐와 마이크로 태스크 큐&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;function a() {
	console.log(&quot;a&quot;);
}

function b() {
	console.log(&quot;b&quot;);
}

function c() {
	console.log(&quot;c&quot;);
}

function foo() {
	console.log(&quot;foo&quot;);
}

foo(); 

setTimeout(a, 0); // setTimeout - 태스크 큐

Promise.resolve().then(b).then(c); // 마이크로태스크 큐
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같은 코드가 있다면 실행 순서는 어떻게 될까?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/call-stack1.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;foo -&amp;gt; a -&amp;gt; b -&amp;gt; c&lt;/code&gt; 순으로 실행될 거라 예상했지만 Promise와 관련된 콜백이 먼저 실행됨을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/event-loop-webapi.gif&quot; alt=&quot;event-loop-webapi.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;이러한 순서로 실행된 이유는 Promise에 대한 콜백은 태크스 큐(콜백 큐)가 아닌 **마이크로 태스크 큐(Microtask queue)**에 등록되기 때문이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;실행 흐름 요약&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;foo() 호출 스택에 먼저 들어간다.&lt;/li&gt;
&lt;li&gt;foo() 내부에 console.log가 존재하므로 호출 스택에 들어가 실행이 완료된 후 제거된다. (아직 foo()는 존재)&lt;/li&gt;
&lt;li&gt;foo()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다.&lt;/li&gt;
&lt;li&gt;setTimeout(a, 0)이 호출 스택에 들어간다.&lt;/li&gt;
&lt;li&gt;setTimeout은 Web API가 타이머 관리를 하므로 호출 스택에서 제거된다.
&lt;ol&gt;
&lt;li&gt;Web API가 타이머 관리 → 만료 후에 태스크 큐에 a가 등록된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Promise.resolve()가 호출 스택에 들어간다&lt;/li&gt;
&lt;li&gt;Promise는 Web API가 관리하므로 호출 스택에서 제거된다.
&lt;ol&gt;
&lt;li&gt;Promise.resolve().then(b) 평가 → 마이크로태스크 큐에 b를 등록한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;호출 스택이 비었음을 이벤트 루프가 확인 후 &lt;strong&gt;마이크로태스크 큐부터 먼저 비우기 시작한다.&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;b()를 실행한다 → console.log가 존재하므로 호출 스택에 들어가 b 출력 후 제거된다. → then(c)가 마이크로 테스크로 등록된다.&lt;/li&gt;
&lt;li&gt;c()를 실행한다. → console.log가 존재하므로 c를 출력 후 제거된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;호출 스택이 비었음을 이벤트 루프가 확인 후 태스크 큐에서 a를 가져와 실행한다. console.log가 존재하므로 호출 스택에 넣고 a 출력 후 제거된다.&lt;/li&gt;
&lt;li&gt;a()에 더 이상 남은 것이 없으므로 호출 스택에서 제거된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;💡&lt;strong&gt;마이크로 태스크 큐(Microtask Queue)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**마이크로 태스크 큐(Microtask Queue)**는 콜백 큐보다 &lt;strong&gt;더 높은 우선순위&lt;/strong&gt;를 가지고 있는 큐다. 콜백 큐에 있는 어떤 태스크들보다도 우선적으로 실행된다. 즉 마이크로 태스크 큐가 빌 때까지 그 어떤 콜백 큐 내의 태스크들도 실행될 수 없다.&lt;/p&gt;
&lt;p&gt;마이크로 태스크 큐에 등록되는 태스크들은 대표적으로 &lt;strong&gt;Promise 콜백&lt;/strong&gt;과 &lt;strong&gt;Mutation Observer 콜백&lt;/strong&gt;이 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;태스크 큐와 마이크로 태스크 큐 비교&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Task Queue&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Microtask Queue&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;콜백&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;브라우저 &lt;strong&gt;DOM 이벤트&lt;/strong&gt; 콜백&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;postMessage&lt;/code&gt;, &lt;code&gt;MessageChannel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js: &lt;code&gt;setImmediate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Promise callbacks&lt;/code&gt; (then, catch, finally)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MutationObserver callbacks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queueMicrotask&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js: &lt;code&gt;process.nextTick&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(* nextTick은 Node에서 마이크로태스크보다 더 먼저 실행되는 별도 큐이다.)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;우선순위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;처리 시점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;호출 스택, 마이크로 태스크를 모두 비운 뒤 처리&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;🎨 마이크로 태스크 큐와 렌더링&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;브라우저는 보통 마이크로태스크 처리 이후 렌더링(페인트)을 시도한다.&lt;/li&gt;
&lt;li&gt;마이크로태스크를 과도하게 연쇄 등록하면 렌더링이 지연(Starvation) 될 수 있다.&lt;/li&gt;
&lt;li&gt;프레임 단위 작업이 필요한 경우에는 &lt;code&gt;requestAnimationFrame&lt;/code&gt;을 고려할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;📚 참고자료&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;모던 자바스크립트 Deep Dive&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/%F0%9F%94%84-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84-%EA%B5%AC%EC%A1%B0-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC#:~:text=%EC%9D%B4%EB%B2%A4%ED%8A%B8%20%EB%A3%A8%ED%94%84%EB%8A%94%20%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%20%EB%8F%99%EC%9E%91%EC%9D%84%20%EC%A0%9C%EC%96%B4%ED%95%98%EB%8A%94%20%EA%B4%80%EB%A6%AC%EC%9E%90,-%EC%8B%B1%EA%B8%80%20%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%B8&amp;amp;text=%EC%9D%B4%EB%B2%A4%ED%8A%B8%20%EB%A3%A8%ED%94%84%EB%8A%94%20%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%20%EB%82%B4%EB%B6%80,%EC%9D%84%20%EC%A0%9C%EC%96%B4%ED%95%98%EB%8A%94%20%EB%85%80%EC%84%9D%EC%9D%B4%EB%8B%A4&quot;&gt;Inpa Dev: 자바스크립트 이벤트 루프 동작 원리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/gautam_kumar_d3daad738680/understanding-call-stack-callback-queue-event-loop-and-microtask-queue-in-javascript-2c7n&quot;&gt;Understanding Call Stack, Callback Queue, Event Loop, and Microtask Queue in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://latentflip.com/loupe/?code=JC5vbignYnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24gb25DbGljaygpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZXIoKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1lvdSBjbGlja2VkIHRoZSBidXR0b24hJyk7ICAgIAogICAgfSwgMjAwMCk7Cn0pOwoKY29uc29sZS5sb2coIkhpISIpOwoKc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0KCkgewogICAgY29uc29sZS5sb2coIkNsaWNrIHRoZSBidXR0b24hIik7Cn0sIDUwMDApOwoKY29uc29sZS5sb2coIldlbGNvbWUgdG8gbG91cGUuIik7!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D&quot;&gt;loupe - 콜 스택, 이벤트 루프 시각화&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🌐 브라우저란?</title><link>https://tessa1217.github.io/posts/browser/browser/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/browser/browser/</guid><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;🌐 브라우저란?&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;브라우저(웹 브라우저)는 사용자가 웹에 접근하고 정보를 볼 수 있도록 하는 소프트웨어 애플리케이션이다. 웹 서버로부터 데이터를 받아 사용자가 상호작용할 수 있는 &lt;strong&gt;시각적 포맷&lt;/strong&gt;으로 변환(렌더링, Rendering)하는 역할을 수행한다.&lt;/p&gt;
&lt;p&gt;브라우저의 주요 구성 요소:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;사용자 인터페이스 (UI)&lt;/strong&gt; - 뒤로가기, 주소창 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;렌더링 엔진&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;네트워킹 모듈&lt;/strong&gt; (웹 서버와의 통신)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 엔진&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 저장소&lt;/strong&gt; (쿠키, 로컬 스토리지 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 글에서는 &lt;strong&gt;렌더링 엔진&lt;/strong&gt;과, 브라우저가 리소스를 화면에 표시하기까지의 과정인 **Critical Rendering Path(CRP)**를 집중적으로 다뤄보고자 한다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;🚂 브라우저 렌더링 엔진&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;렌더링 엔진은 HTML, CSS, JavaScript 등 웹 리소스를 받아서 &lt;strong&gt;픽셀 단위의 UI&lt;/strong&gt;로 변환하는 핵심 모듈이다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;브라우저&lt;/th&gt;
&lt;th&gt;렌더링 엔진&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chrome, Edge, Opera&lt;/td&gt;
&lt;td&gt;Blink&lt;/td&gt;
&lt;td&gt;WebKit 기반으로 V8 JS 엔진과 결합, 최신 표준 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari&lt;/td&gt;
&lt;td&gt;WebKit&lt;/td&gt;
&lt;td&gt;애플 생태계에 최적화된 iOS 필수 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox&lt;/td&gt;
&lt;td&gt;Gecko&lt;/td&gt;
&lt;td&gt;오픈 소스 기반, 표준 호환성 우수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구형 IE&lt;/td&gt;
&lt;td&gt;Trident&lt;/td&gt;
&lt;td&gt;현재는 사용 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;렌더링 과정의 효율성은 브라우저 성능과 사용자 경험에 직접적으로 영향을 준다. 따라서 렌더링 과정을 이해하고 최적화 하는 과정은 굉장히 중요하다.&lt;/p&gt;
&lt;h2&gt;Critical Rendering Path&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;CRP는 브라우저가 &lt;strong&gt;HTML, CSS, JavaScript&lt;/strong&gt;를 처리해 &lt;strong&gt;첫 픽셀을 화면에 그릴 때까지&lt;/strong&gt; 거치는 일련의 과정이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CRP 절차:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;서버에 리소스 요청 및 응답 수신&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTML 파싱 →&lt;/strong&gt; &lt;strong&gt;DOM&lt;/strong&gt;(Document Object Model) &lt;strong&gt;생성&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💡 DOM이란?&lt;/p&gt;
&lt;p&gt;HTML 문서의 계층적 구조와 정보를 트리 구조로 표현한 객체 모델이다. 각 노드에 접근, 수정 가능한 API를 제공한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💡 파싱 vs. 렌더링&lt;/p&gt;
&lt;p&gt;파싱(구문 분석 )은 프로그래밍 언어의 문법에 맞게 작성된 텍스트 문서를 읽어 들여 실행하기 위해 일련의 과정을 거쳐 적절하게 변환하는 과정을 의미한다.&lt;/p&gt;
&lt;p&gt;문자열 토큰(token)으로 분해 → 토큰에 문법적 의미와 구조를 반영하여 트리 구조의 자료구조인 파스 트리(parse tree/syntax tree) 생성&lt;/p&gt;
&lt;p&gt;일반적으로 파스 트리를 기반으로 중간 언어(intermediate code)인 바이트코드(bytecode)를 생성 및 실행한다.&lt;/p&gt;
&lt;p&gt;렌더링은 HTML, CSS, JavaScript로 작성된 문서를 파싱하여 브라우저에 시각적으로 출력하는 과정을 의미한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 파싱&lt;/strong&gt; → &lt;strong&gt;CSSOM&lt;/strong&gt;(CSS Object Model) &lt;strong&gt;생성&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DOM + CSSOM → Render Tree 생성&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Layout(Reflow)&lt;/strong&gt; : 렌더 트리의 각 요소 크기 및 위치 계산&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💡 렌더 트리 (Render Tree)&lt;/p&gt;
&lt;p&gt;렌더 트리는 렌더링을 위한 트리 구조의 자료구조로 브라우저 화면에 렌더링하지 않는 노드 (e.g. meta 태그, script 태그 등)와 CSS에 의해 비표시되는 노드들은 포함하지 않는다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Paint&lt;/strong&gt;: 계산된 레이아웃을 픽셀 데이터로 변환&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Composite&lt;/strong&gt;: GPU가 레이어를 합성하여 화면에 출력&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;🔄 Reflow, Repaint&lt;/h3&gt;
&lt;p&gt;CRP 이후에도 브라우저는 UI 변화에 따라 렌더링 과정을 반복할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reflow&lt;/strong&gt;: DOM 요소의 레이아웃(크기/위치) 재계산&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repaint&lt;/strong&gt;: 레이아웃 변화 없이 스타일(색상, 배경 등)만 다시 그리기&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reflow/Repaint가 발생할 수 있는 예시는 다음과 같다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트에 의한 노드 추가 또는 삭제&lt;/li&gt;
&lt;li&gt;브라우저 창의 리사이징(Resizing)에 의한 뷰포트 크기 변경&lt;/li&gt;
&lt;li&gt;HTML 요소의 레이아웃에 변경을 유발하는 width/height, margin, padding, border, display, position, top/right/bottom/left 등의 요소 크기 및 위치에 대한 스타일 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;💡 리렌더링, 특히 &lt;strong&gt;Reflow&lt;/strong&gt; 과정은 비용이 큰 연산이다. 빈번하게 발생하지 않도록 DOM 업데이트를 최소화하는 것이 중요하다.&lt;/p&gt;
&lt;h2&gt;🚀 렌더링 최적화 전략&lt;/h2&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;렌더링 차단 리소스 줄이기&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot;&amp;gt;&lt;/code&gt;는 렌더링 차단 → DOM 생성 중단 후 CSSOM 생성 완료 시 재개&lt;/li&gt;
&lt;li&gt;핵심 CSS는 &lt;strong&gt;Critical CSS 인라인 삽입&lt;/strong&gt;한다**.**
&lt;ul&gt;
&lt;li&gt;첫 화면 렌더링에 필요한 최소한의 CSS를 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 태그로 HTML 상단에 삽입하여 필수적인 CSS만 빠르게 렌더링할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;나머지 CSS는 &lt;code&gt;media&lt;/code&gt; 속성 또는 &lt;code&gt;preload&lt;/code&gt;로 지연 로드를 통한 Render blocking 방지 및 최적화를 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JS&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;는 기본적으로 HTML 파싱을 차단한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 하단 배치로 파싱 블로킹을 최소화할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 하단 배치를 통해 누릴 수 있는 이점?
&lt;ul&gt;
&lt;li&gt;DOM이 완성되지 않는 상태에서 자바스크립트가 DOM 조작 시 발생할 수 있는 에러 차단&lt;/li&gt;
&lt;li&gt;자바스크립트 로딩/파싱/실행으로 인한 HTML 파싱 지연 방지를 통한 페이지 로딩 시간 단축&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTML5에서 제공하는 &lt;code&gt;async&lt;/code&gt;, &lt;code&gt;defer&lt;/code&gt; 어트리뷰트 활용&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;async attribute&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTML 파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행되는 점은 defer 어트리뷰트와 동일하지만 자바스크립트의 파싱과 실행은 로드 완료된 직후 진행된다. 이때 HTML 파싱이 중단된다.&lt;/p&gt;
&lt;p&gt;여러 개의 script 태그에 async 어트리뷰트를 지정하면 script 태그의 순서와는 상관없이 로드 완료 순으로 실행되므로 순서 보장이 되지 않는다. 따라서 순서 보장이 필요한 경우 (e.g. script끼리 연관 관계가 존재하는 경우 등) async 어트리뷰트를 지정하지 않아야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;defer attribute&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;async 어트리뷰트와 마찬가지로 HTML 파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행된다.&lt;/p&gt;
&lt;p&gt;단 자바스크립트 파싱과 실행은 HTML 파싱이 완료된 직후, 즉 DOM 생성이 완료된 직후(DOMContentLoaded 이벤트) 진행된다. 따라서 DOM 생성이 완료된 이후 DOM 조작 등을 실행해야 하는 자바스크립트 또는 서로 연관 관계가 존재하여 반드시 실행 순서를 지켜야 하는 경우 사용하면 유용하다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⚠️ 해당 어트리뷰트는 외부 자바스크립트 파일을 로드하는 경우에만 사용할 수 있다. 즉 src 어트리뷰트가 없는 인라인 자바스크립트에는 사용이 불가능 하다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;리소스 크기 최적화&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;CSS/JS Minify &amp;amp;  압축을 통해 받아오는 리소스 크기를 최적화할 수 있다.&lt;/li&gt;
&lt;li&gt;이미지 최적화(WebP, AVIF 등 압축 포맷 활용)와 지연 로딩을 통해 이미지 리소스 관련 최적화를 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;요청 수 줄이기&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CSS/JS 병합&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 개의 CSS 또는 JavaScript 파일을 &lt;strong&gt;하나로 합쳐&lt;/strong&gt; 서버 요청 수를 줄이는 기법으로 HTTP/1.1 환경에서는 요청 개수가 많아지면 TCP 연결 지연 + 요청 대기 시간이 누적되는 현상을 완화하므로서 성능 개선 효과를 누릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTTP/2 &amp;amp; HTTP/3 활용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💡 &lt;strong&gt;HTTP/1.1 vs. HTTP/2 &amp;amp; HTTP/3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTTP(HyperText Transfer Protocol)는 **웹에서 브라우저와 서버가 통신하기 위한 프로토콜(규약)**이다. HTTP 역시 시간이 지나면서 성능과 보안, 효율성을 개선하기 위해 버전이 업그레이드되었다.&lt;/p&gt;
&lt;p&gt;HTTP/1.1의 가장 큰 특징은 &lt;strong&gt;커넥션당 하나의 요청과 응답만 처리&lt;/strong&gt;한다는 점이다. 리소스의 동시 전송이 불가능하여 &lt;strong&gt;요청할 리소스의 개수에 비례하여 응답 시간이 증가&lt;/strong&gt;한다는 단점이 있다. 특히 선두 요청이 지연되면 뒤의 요청이 대기해야 하는 &lt;strong&gt;Head-of-line Blocking(HOL Blocking)&lt;/strong&gt; 문제로 인해 요청 수 최소화를 위한 &lt;strong&gt;CSS/JS 병합, 이미지 스프라이트&lt;/strong&gt; 등의 우회 전략이 필요했다.&lt;/p&gt;
&lt;p&gt;HTTP/2는 이같은 HTTP/1.1의 단점을 보완하기 위해 **멀티플렉싱(Multiplexing)**을 지원한다. 멀티플렉싱이란 하나의 TCP 연결에서 &lt;strong&gt;여러 요청/응답을 동시에 처리&lt;/strong&gt;하는 것을 의미한다. HTTP/1.1과 완벽하게 호환되며, **헤더 압축(HPACK)**을 통해 전송 데이터 양을 절감할 수 있는 장점도 있다. 또한 브라우저 요청 없이도 서버가 필요한 리소스를 미리 전송하는 **서버 푸시(Server Push)**기능을 제공한다. ****&lt;/p&gt;
&lt;p&gt;HTTP/3는 &lt;strong&gt;UDP&lt;/strong&gt; 기반의 &lt;strong&gt;QUIC&lt;/strong&gt; 프로토콜을 통해 빠르고 네트워크 간의 빠른 전환을 지원하도록 설계되었다. TCP 기반이 아니기 때문에 &lt;strong&gt;HOL 블로킹 문제를 근본적으로 완화&lt;/strong&gt;하고 &lt;strong&gt;연결 설정 지연(RTT)을 최소화&lt;/strong&gt;하여 모바일이나 불안정한 네트워크 환경에서 유리하다.  또한 QUIC은 &lt;strong&gt;TLS(전송 계층 보안)를 기본적으로 내장&lt;/strong&gt;하고 있어 보안성 측면에서도 강화되었다는 장점이 있다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;HTTP/1.1&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;HTTP/3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;연결 방식&lt;/td&gt;
&lt;td&gt;요청마다 TCP 연결 (혹은 파이프라이닝)&lt;/td&gt;
&lt;td&gt;단일 TCP 연결에서 &lt;strong&gt;멀티플렉싱 (Multiplexing)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;QUIC(UDP 기반)&lt;/strong&gt; 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;요청 처리&lt;/td&gt;
&lt;td&gt;순차 처리 (Head-of-line Blocking)&lt;/td&gt;
&lt;td&gt;병렬 처리 가능&lt;/td&gt;
&lt;td&gt;TCP HOL 문제 해결, 연결 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속도 빠름&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;헤더 압축&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HPACK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;QPACK&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속도&lt;/td&gt;
&lt;td&gt;많은 요청 시 성능 저하&lt;/td&gt;
&lt;td&gt;다수의 작은 요청 처리에 유리&lt;/td&gt;
&lt;td&gt;네트워크 품질 불안정 시에도 속도 안정적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;선택&lt;/td&gt;
&lt;td&gt;권장 (사실상 필수)&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Above-the-fold 콘텐츠 우선 로딩&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;❓ &lt;strong&gt;Above-the-fold?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;스크롤 없이 첫 화면에 보이는 영역을 의미한다. 사용자가 페이지를 열었을 때 &lt;strong&gt;가장 먼저 보이는 콘텐츠&lt;/strong&gt;를 빠르게 로딩하여 사용자가 &lt;strong&gt;페이지 로딩이 빠르다&lt;/strong&gt;라고 인식하게 할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;폰트: &lt;code&gt;font-display: swap;&lt;/code&gt;으로 &lt;strong&gt;FOUT&lt;/strong&gt; 허용&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FOUT(Flash of Unstyled Text)는 웹 폰트 로드 전 브라우저가 기본 폰트로 텍스트를 먼저 렌더링했다가 나중에 웹 폰트 로드 시 교체되는 현상을 의미한다. 초기 지연 문제는 없지만 웹 폰트로 교체 과정에서 텍스트 깜빡임 및 레이아웃 흔들림이 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;FOIT(Flash of Invisible Text)는 폰트가 로드될 때까지 텍스트를 숨겼다가, 로드 완료 후 한 번에 표시하는 현상을 의미한다. 웹 폰트 교체로 인한 깜빡임은 없지만 초기 표시 자체가 지연되는 문제가 있다.&lt;/li&gt;
&lt;li&gt;폰트 최적화 전략
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;font-display&lt;/code&gt; 속성을 활용한 폰트 최적화 → &lt;code&gt;font-display: swap&lt;/code&gt; 속성을 통해 초기 렌더링 속도 및 접근성을 향상할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;link rel=&quot;preload&quot; as=&quot;font&quot;&amp;gt;&lt;/code&gt;로 폰트를 사전에 로드한다.&lt;/li&gt;
&lt;li&gt;시스템 폰트 fallback 설계하여 레이아웃 변화를 최소화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;첫 화면 콘텐츠를 빠르게 표시하여 LCP(Largest Contentful Paint) 개선&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;📚 참고자료&lt;/h3&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.yes24.com/product/goods/92742567&quot;&gt;모던 자바스크립트 Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/2909/&quot;&gt;요즘 IT: 브라우저가 화면을 그리는 방법, 렌더링 과정 이해하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://whatap.io/bbs/board.php?bo_table=blog&amp;amp;wr_id=110&amp;amp;page=13#:~:text=HTTP/2%EB%8A%94%20%EA%B8%B0%EC%A1%B4%EC%9D%98%20HTTP/1.x%20%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%95%B5%EC%8B%AC%20%EA%B0%9C%EB%85%90%EB%93%A4%EC%9D%84%20%EA%B7%B8%EB%8C%80%EB%A1%9C%20%EC%9C%A0%EC%A7%80%ED%95%98%EB%A9%B4%EC%84%9C%20%ED%81%B0%20%EC%84%B1%EB%8A%A5%20%EA%B0%9C%EC%84%A0%EC%9D%84%20%EB%B3%B4%EC%97%AC%EC%A4%8D%EB%8B%88%EB%8B%A4&quot;&gt;Whatap: HTTP/2 알아보기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hpbn.co/http2/&quot;&gt;HTTP/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>자바스크립트의 데이터 타입</title><link>https://tessa1217.github.io/posts/javascript/copy/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/javascript/copy/</guid><pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;자바스크립트의 데이터 타입&lt;/h2&gt;
&lt;p&gt;자바스크립트의 데이터 타입은 크게 두 가지로 나눌 수 있다. &lt;strong&gt;기본형&lt;/strong&gt;과 &lt;strong&gt;참조형&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;@/assets/posts/javascript-datatype.png&quot; alt=&quot;자바스크립트 데이터 타입의 종류&quot; /&gt;&lt;/p&gt;
&lt;p&gt;자바스크립트 데이터 타입의 종류&lt;/p&gt;
&lt;p&gt;기본형과 참조형의 차이점은 기본형은 할당이나 연산 시 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가르키는 주솟값을 복제한다는 점이다. 이러한 점에서 기본형은 불변성을 띈다.&lt;/p&gt;
&lt;h3&gt;메모리 구조와 불변성&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 변수 a를 선언하고 &apos;abc&apos;라는 문자열을 할당
var a = &apos;abc&apos;;
// 기본형 값의 변경
a = a + &apos;def&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드가 실행되었을 때 자바스크립트의 메모리는 다음과 같은 방식으로 작동한다.&lt;/p&gt;
&lt;p&gt;먼저 변수 &lt;code&gt;a&lt;/code&gt;를 선언하고 문자열 &lt;code&gt;‘abc’&lt;/code&gt;를 할당하면, 자바스크립트 엔진은 &lt;code&gt;‘abc’&lt;/code&gt;라는 문자열 값을 저장하기 위한 별도의 메모리 공간을 확보한 뒤, 이 공간의 주소값을 변수 &lt;code&gt;a&lt;/code&gt;가 가르키도록 만든다. 즉, 변수는 문자열 자체를 저장하는 것이 아닌, 해당 문자열이 존재하는 메모리 공간을 참조(포인트)하게 된다.&lt;/p&gt;
&lt;p&gt;이처럼 변수는 &lt;strong&gt;값을 직접 담기보다는 값을 저장한 메모리 위치를 가르키는 식별자&lt;/strong&gt;로 동작한다.&lt;/p&gt;
&lt;p&gt;그렇다면 이후 &lt;code&gt;a = a + &apos;def&apos;&lt;/code&gt;와 같이 문자열을 변경하려고 하면 어떻게 될까?&lt;/p&gt;
&lt;p&gt;표현상으로는 기존 문자열 데이터 &lt;code&gt;&apos;abc&apos;&lt;/code&gt;에 &lt;code&gt;&apos;def&apos;&lt;/code&gt;가 “덧붙여져서” 변경된 것처럼 보이지만, 자바스크립트에서 문자열은 &lt;strong&gt;불변(immutable)&lt;/strong&gt; 하기 때문에 기존 문자열을 수정하는 것이 아니라, &lt;strong&gt;새로운 문자열&lt;/strong&gt; &lt;code&gt;&apos;abcdef&apos;&lt;/code&gt;를 &lt;strong&gt;생성&lt;/strong&gt;하고 이를 위한 메모리 공간을 다시 확보한다. 그리고 변수 &lt;code&gt;a&lt;/code&gt;는 이제 새롭게 생성된 문자열을 가르키게 된다. 기존의 &lt;code&gt;&apos;abc&apos;&lt;/code&gt;가 다른 곳에서 참조되지 않는다면 (참조 카운트가 0인 메모리 주소라면) 가비지 컬렉터의 수거 대상이 될 수 있다.&lt;/p&gt;
&lt;p&gt;즉, 변경처럼 보이는 이 동작은 실제로는 &lt;strong&gt;새로운 값을 생성해서 변수에 재할당하는 방식&lt;/strong&gt;으로 이루어진다. 이런 특성 때문에 문자열(String)을 포함한 자바스크립트의 &lt;strong&gt;기본형 타입은 불변값&lt;/strong&gt;이라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;💡 &lt;strong&gt;문자열은 문자 단위 변경도 불가능!&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let s = &apos;abc&apos;;
console.log(s[0]) // a
s[0] = &apos;z&apos;;
console.log(s); // &apos;abc&apos; =&amp;gt; 문자열 내부 요소에 대한 직접 변경을 허용하지 않음
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;참조형 데이터의 가변성&lt;/h3&gt;
&lt;p&gt;참조형 데이터가 **가변(mutable)**하다고 하는 이유는 &lt;strong&gt;값 자체가 아니라 값을 가르키는 “참조”를 통해 조작&lt;/strong&gt;되기 때문이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var obj1 = {
	a : 1,
	b : &apos;bbb&apos;
}

var obj2 = obj1;

obj2.a = 2;

console.log(obj1.a); // 2
console.log(obj2.a); // 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 예제에서 &lt;code&gt;obj1&lt;/code&gt;과 &lt;code&gt;obj2&lt;/code&gt;는 &lt;strong&gt;동일한 객체를 참조&lt;/strong&gt;하고 있다. 따라서 &lt;code&gt;obj2.a = 2&lt;/code&gt;와 같이 &lt;code&gt;obj2&lt;/code&gt;를 통해 객체의 프로퍼티를 변경하면, &lt;code&gt;obj1&lt;/code&gt;을 통해 접근해도 변경된 값이 그대로 나타난다. 이는 두 변수가 &lt;strong&gt;같은객체를공유하고 있기 때문에, 하나의 변경이 곧 전체 객체에 영향을 주는 것&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;즉 참조형 데이터는 객체의 구조나 내용을 &lt;strong&gt;자유롭게 수정할 수 있으므로&lt;/strong&gt; &lt;strong&gt;가변성을 가진다&lt;/strong&gt;라고 볼 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var obj1 = {c : 10, d : &apos;ddd&apos;}
var obj2 = obj1;

obj2 = {c : 20, d : &apos;ddd&apos;}

console.log(obj1.c);
console.log(obj2.c);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이번 예제에서는 &lt;code&gt;obj2&lt;/code&gt;에 &lt;strong&gt;새로운 객체를 할당&lt;/strong&gt;함으로써 참조 대상 자체를 변경했다. 그러면 &lt;code&gt;obj2&lt;/code&gt;는 더 이상 &lt;code&gt;obj1&lt;/code&gt;과 같은 객체를 참조하지 않고, &lt;strong&gt;완전히 새로운 객체를 가르키게 된다.&lt;/strong&gt; 따라서 &lt;code&gt;obj2.c&lt;/code&gt;의 값을 변경해도 &lt;code&gt;obj1&lt;/code&gt;에는 아무런 영향을 주지 않는다.&lt;/p&gt;
&lt;p&gt;이처럼, 참조형 데이터가 가변적이라는 말은 &lt;strong&gt;참조된 객체의 내부 상태를 수정할 수 있다&lt;/strong&gt;는 의미이지 &lt;strong&gt;참조 자체를 바꾸면 원본도 바뀐다&lt;/strong&gt;는 의미는 아니다. 즉 가변성이란 &lt;strong&gt;참조형 데이터의 내부 프로퍼티를 변경할 수 있다는 특성&lt;/strong&gt;을 의미한다.&lt;/p&gt;
&lt;h2&gt;불변 객체 (Immutable Object)&lt;/h2&gt;
&lt;p&gt;불변 객체는 최근의 React, Vue.js, Angular 등의 라이브러리나 프레임워크, 함수형 프로그래밍, 디자인 패턴 등에서 매우 중요한 기초가 되는 개념이다. 객체의 불변성이 필요한 이유는 주로 &lt;strong&gt;예측 가능성, 디버깅 용이성, 성능 최적화, 사이드 이펙트 방지&lt;/strong&gt; 등과 관련이 있다.&lt;/p&gt;
&lt;h3&gt;상태 변경 추적 및 예측 가능성 향상&lt;/h3&gt;
&lt;p&gt;객체가 불변이라면 객체가 변경되었을 때 &lt;strong&gt;이전 상태와 이후 상태가 명확하게 구분&lt;/strong&gt;된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const oldObject = {a : 1, b : 2}
const newObject = {...oldObject, b : 3}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예제에서는 &lt;code&gt;oldObject&lt;/code&gt;를 직접 수정하지 않고, 변경된 값을 반영한 새로운 객체를 &lt;code&gt;newObject&lt;/code&gt;에 생성했다. 이런 방식은 &lt;strong&gt;디버깅, 타임 트래블 디버깅, Undo/Redo 기능&lt;/strong&gt; &lt;strong&gt;구현&lt;/strong&gt;에 매우 유리하다.&lt;/p&gt;
&lt;h3&gt;사이드 이펙트(side effects) 방지&lt;/h3&gt;
&lt;p&gt;같은 객체를 여러 곳에서 참조하고 있을 때, 어느 한 곳에서 누군가가 그 객체를 변경하면 &lt;strong&gt;예상치 못한 버그&lt;/strong&gt;가 발생할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const user = { name : &apos;user 1&apos;, age : 20 }

function updateName(user) {
	user.name = &apos;Changed user name&apos;; // 원본 user까지 바뀜
}

function updateNameImmutably(user) {
	return {...user, name : &apos;Changed user name&apos;} // 원본은 그대로 유지한 채 새로운 객체 반환
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;불변 객체는 &lt;strong&gt;원본을 건드리지 않고 새로운 객체를 생성&lt;/strong&gt;하므로써 사이드 이펙트 없이 안정적으로 동작한다.&lt;/p&gt;
&lt;h3&gt;React, Redux 등 상태 관리 라이브러리에서는 필수 개념&lt;/h3&gt;
&lt;p&gt;React는 &lt;code&gt;state&lt;/code&gt;가 변경되어야만 컴포넌트를 리렌더링한다. 이때 객체를 &lt;strong&gt;불변으로 다뤄야&lt;/strong&gt; **이전 상태와의 얕은 비교(shallow compare)**가 가능하다.&lt;/p&gt;
&lt;p&gt;Redux 또한 &lt;code&gt;store&lt;/code&gt;의 상태를 직접 변경하지 않고, 항상 &lt;strong&gt;새 상태를 반환&lt;/strong&gt;해야 하므로 불변성 유지가 핵심이다.&lt;/p&gt;
&lt;h3&gt;성능 최적화&lt;/h3&gt;
&lt;p&gt;불변 객체는 참조 값만 비교해도 같고 다름을 판단할 수 있다. 이를 통해 &lt;strong&gt;깊은 비교(deep compare)&lt;/strong&gt; 대신 **얕은 비교(shallow compare)**만으로도 성능 최적화를 이룰 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (prevState == nextState) {
	// 상태가 변경되지 않았으므로 리렌더링 생략 가능
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;얕은 복사와 깊은 복사&lt;/h2&gt;
&lt;p&gt;불변성을 유지하기 위해 기존 객체의 값을 복사하는 방법에는 **얕은 복사(shallow copy)**와 **깊은 복사(deep copy)**가 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;얕은 복사&lt;/strong&gt;는 바로 아래 단계의 값만 복사하는 방법이고, &lt;strong&gt;깊은 복사&lt;/strong&gt;는 내부의 모든 값들을 하나하나 재귀적으로 순회하며 전부 복사하는 방법이다.&lt;/p&gt;
&lt;h3&gt;얕은 복사 (Shallow Copy)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 얕은 복사
const shallowObj1 = {
	a : 1,
	b : 2,
	c : 3
}

const shallowObj2 = {
	name : &quot;user1&quot;,
	urls : {
		portfolio: &quot;http://github.com/user1&quot;,
		facebook: &quot;http://facebook.com/user1&quot;
	}
}

const copyObj1 = {...shallowObj1}
const copyObj2 = {...shallowObj2}

copyObj1.a = 4

console.log(shallowObj1.a === copyObj1.a) // false

copyObj2.name = &quot;changed user&quot;

console.log(shallowObj2.name === copyObj2.name) // false

copyObj2.urls.portfolio = &quot;https://notion.com/user1&quot;

console.log(shallowObj2.urls.portfolio === copyObj2.urls.portfolio) // true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 예제에서 사용된 &lt;strong&gt;Spread 연산자&lt;/strong&gt;는 ES6부터 도입된 문법으로, 배열이나 객체의 전체 또는 일부를 다른 배열이나 객체로 빠르게 복사할 수 있게 해준다.&lt;/p&gt;
&lt;p&gt;하지만 이때 주의할 점은 Spread 연산자를 활용한 복사는 &lt;strong&gt;앝은 복사&lt;/strong&gt;라는 점이다.&lt;/p&gt;
&lt;p&gt;위 예제에서 &lt;code&gt;shallowObj1&lt;/code&gt;과 &lt;code&gt;shallowObj2&lt;/code&gt;를 각각 &lt;code&gt;copyObj1&lt;/code&gt;과 &lt;code&gt;copyObj2&lt;/code&gt;라는 객체에 복사했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;copyObj1.a&lt;/code&gt;와 &lt;code&gt;copyObj2.name&lt;/code&gt;은 기본형 데이터를 가진 프로퍼티이므로, 복사 후 값을 변경해도 원복 객체에 영향을 주지 않는다.&lt;/li&gt;
&lt;li&gt;그러나 &lt;code&gt;copyObj2.urls&lt;/code&gt; &lt;strong&gt;참조형 데이터&lt;/strong&gt;를 ****가진 프로퍼티이다. 얕은 복사 시 이 객체의 참조만 복사되므로, 복사한 객체에서 내부 값을 변경하면 &lt;strong&gt;원본 객체에도 영향을 준다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;따라서 참조형 데이터를 포함한 객체의 불변성을 유지하기 위해서는 반드시 &lt;strong&gt;깊은 복사&lt;/strong&gt;를 통해 하위의 중첩 객체들에 대해서도 재귀적인 복사를 진행하여 원본과 완전히 분리해야만 불변성을 유지할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💡 대표적인 얕은 복사 방법&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spread 연산자&lt;/strong&gt; 외에도 자바스크립트에서 얕은 복사를 수행할 수 있는 방법은 여러 가지가 있다. 대표적으로 아래 두 가지 방법이 자주 사용된다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Array.prototype.slice()&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;배열을 얕은 복사하려면  &lt;code&gt;slice&lt;/code&gt; 메서드를 활용할 수 있다. 이 메서드는 start부터 end까지의 요소를 기존 배열에서 추출하여 새로운 배열을 반환한다.&lt;/li&gt;
&lt;li&gt;Array.prototype.slice() 활용 예시&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const users = [
	{name : &apos;user1&apos;, age : 20},
	{name : &apos;user2&apos;, age : 21},
	{name : &apos;user3&apos;, age : 22},
	{name : &apos;user4&apos;, age : 23},
	{name : &apos;user5&apos;, age : 24},
]
const copyUsers = users.slice()

copyUsers[0].name = &apos;changed user1&apos;

console.log(JSON.stringify(users) === JSON.stringify(copyUsers)); // true
console.log(users[0].name === copyUsers[0].name) // true

// 내부 객체가 공유되므로, 원본 배열 요소도 변경됨
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ 배열 자체는 새로 복사되지만, 내부 객체는 같은 주소를 참조하므로 변경 시 원본도 영향을 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Object.assign(target, source)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Object.assign()&lt;/code&gt;은 하나 이상의 소스 객체로부터 속성을 복사하여 target 객체에 할당하는 메서드이다. 이때도 내부 객체까지는 복사되지 않기 때문에 &lt;strong&gt;얕은 복사&lt;/strong&gt;만 수행된다.&lt;/li&gt;
&lt;li&gt;Object.assign() 활용 예시&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const object = {
	a : 1,
	b : [1, 2, 3]
}

const copyObj = Object.assign({}, object);

console.log(object.b === copyObj.b); // true

copyObj.b[0] = 0

console.log(object.b === copyObj.b); // true
console.log(object.b[0] === copyObj.b[0]); // true

// 이때도 마찬가지로 object 내부에 있던 참조형 데이터를 가진 b를 변경했을 때
// 원본 객체 역시 함께 변경되고 있음을 알 수 있다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;깊은 복사 (Deep Copy)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const copyObjectDeep = function (target) {
	let result = {}
	if (typeof target === &apos;object&apos; &amp;amp;&amp;amp; target !== null) {
		for (let prop in target) {
			result[prop] = copyObjectDeep(target[prop]); // 재귀적으로 복사를 수행
		}
	} else {
		result = target;
	}
	return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 예제는 범용적으로 객체의 깊은 복사를 수행할 수 있는 재귀 함수이다.&lt;/p&gt;
&lt;p&gt;만약 &lt;code&gt;target&lt;/code&gt;이 객체인 경우에는 내부 프로퍼티들을 순회하며 &lt;code&gt;copyObjectDeep()&lt;/code&gt; 함수를 재귀적으로 호출하고, 객체가 아닌 경우에는 원시 값을 그대로 반환한다.&lt;/p&gt;
&lt;p&gt;이를 통해 원본과 복사본이 &lt;strong&gt;서로 다른 참조를 가지게 되어,&lt;/strong&gt; 어느 한 쪽의 (참조형 데이터를 가진) 프로퍼티를 변경해도 &lt;strong&gt;다른 쪽에 전혀 영향을 주지 않게 된다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💡 깊은 복사를 수행하는 주요 방법&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;자바스크립트에서는 위의 &lt;code&gt;copyObjectDeep&lt;/code&gt;처럼 별도로 깊은 복사를 구현하지 않고도 깊은 복사를 할 수 있는 방법을 제공하고 있다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JSON.stringify() + JSON.parse()&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;가장 간단한 방법은 객체를 JSON 문자열로 변환한 뒤 다시 객체로 파싱하여 깊은 복사를 수행하는 방식이다.&lt;/li&gt;
&lt;li&gt;JSON.stringify → JSON.parse 예시&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const object = {
	a : 1,
	b : [1, 2, 3]
}

const copyObject = JSON.parse(JSON.stringify(object))

copyObject.b[0] = 0

console.log(object.b === copyObject.b) // false
console.log(object.b[0] === copyObject.b[0]) // false

// 복사한 copyObject에서 참조형 데이터를 변경했음에로
// 원본 객체에는 영향이 가지 않는 것을 확인할 수 있다
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ 다만 JSON.stringify를 활용한 깊은 복사 방식에는 몇 가지 한계가 존재한다.
&lt;ul&gt;
&lt;li&gt;JSON 문자열로 변환이 불가능한 메서드(함수)나 숨겨진 프로퍼티인 &lt;strong&gt;proto&lt;/strong&gt;, getter/seter, Date, RegExp, Map, Set과 같이 변환할 수 없는 객체 등의 속성은 &lt;strong&gt;모두 무시하거나 제거&lt;/strong&gt;된 채 변환하는 제약사항이 있다.&lt;/li&gt;
&lt;li&gt;순환 참조가 있는 객체는 &lt;strong&gt;오류가 발생&lt;/strong&gt;할 수 있다.&lt;/li&gt;
&lt;li&gt;이러한 깊은 복사 방식은 httpRequest로 받은 데이터를 저장한 객체를 복사하는 등 순수한 정보만 다룰 때 활용하기 좋은 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;structuredClone()&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;structuredClone&lt;/code&gt; 메서드는 자바스크립트에서 structured clone 알고리즘을 사용하여 주어진 값의 깊은 복사를 생성하는 전역 함수이다. ES2021 이후부터 사용할 수 있는 &lt;strong&gt;공식적인 깊은 복사 전역 함수이다.&lt;/strong&gt; 이 메서드는 새로운 객체로 복사하는 대신 원래 값에서 전송 가능한 객체를 전송할 수도 있다.&lt;/li&gt;
&lt;li&gt;structuredClone 예시&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const object = {
	a : 1,
	b : [1, 2, 3]	
}

const copyObject = structuredClone(object)

copyObject.b[0] = 0

console.log(object.b === copyObject.b) // false
console.log(object.b[0] === copyObject.b[0]) // false
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ JSON.stringify와 마찬가지로 몇 가지 제약사항이 존재한다.
&lt;ul&gt;
&lt;li&gt;함수 속성은 복사되지 않고 undefined로 처리된다.&lt;/li&gt;
&lt;li&gt;객체의 프로토타입 체인을 유지하지 않는다.&lt;/li&gt;
&lt;li&gt;다만 JSON을 활용한 깊은 복사 방법과는 달리 Date, RegExp 등 다양한 타입을 지원한다는 차이점이 있으며 성능적으로 JSON 문자열을 활용하는 방법보다는 빠르다는 장점이 있다. 또한 순환 참조를 지원한다.&lt;/li&gt;
&lt;li&gt;최신 브라우저 또는 Node.js 환경에서 안전하고 빠른 깊은 복사를 할 때 활용하기 좋은 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lodash 라이브러리의 cloneDeep()&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lodash 라이브러리를 활용한다면 &lt;code&gt;cloneDeep()&lt;/code&gt; 메서드를 통해 깊은 복사를 진행할 수 있다. Lodash 외에도 &lt;strong&gt;Immer, immutable.js&lt;/strong&gt; 등 다양한 라이브러리들에서 깊은 복사를 위한 방법을 제공하고 있다.&lt;/li&gt;
&lt;li&gt;Lodash의 cloneDeep()을 활용한 예제&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;import cloneDeep from &apos;lodash/cloneDeep&apos;

const object = {
	a : 1,
	b : [1, 2, 3],
	f : { g : { h : 100 } } 
}

const copyObject = cloneDeep(object);

copyObject.f.g.h = 999;

console.log(object.f.g.h) // 100
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이러한 라이브러리들은 앞서 언급한 방식에서 제한적이었던 프로토타입 체인 유지, 순환 참조와 다양한 타입 지원 등 폭넓은 깊은 복사 방식을 지원한다.&lt;/li&gt;
&lt;li&gt;다만 외부 라이브러리에 의존해야 한다는 단점이 존재한다. 또한 번들 크기에 영향을 줄 수 있다.&lt;/li&gt;
&lt;li&gt;복잡한 구조의 데이터에 대한 깊은 복사가 필요한 경우 안정적으로 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;📚 참고 자료&lt;/h3&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.javascript.info/js&quot;&gt;코드 자바스크립트&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>실행 컨텍스트 (Execution Context)</title><link>https://tessa1217.github.io/posts/javascript/context/</link><guid isPermaLink="true">https://tessa1217.github.io/posts/javascript/context/</guid><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;실행 컨텍스트 (Execution Context)&lt;/h2&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;실행 컨텍스트란 자바스크립트 코드가 실행될 때 **식별자(변수, 함수 등)**를 어떻게 찾아서 동작할지를 결정하는 &lt;strong&gt;환경(Context)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;자바스크립트가 코드를 어떻게 실행할지 결정하는 공간이며 그 안에 어떤 변수가 어디에 있는지, 어떤 함수를 실행해야 하는지를 담고 있는 &lt;strong&gt;실행 정보 저장소&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;실행 컨텍스트의 3가지 구성 요소&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variable Environment (변수 환경)&lt;/td&gt;
&lt;td&gt;변수 선언 정보 저장 (var, 함수 선언 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lexical Environment (렉시컬 환경)&lt;/td&gt;
&lt;td&gt;let, const 정보 및 스코프 체인 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This Binding&lt;/td&gt;
&lt;td&gt;현재 컨텍스트의 this가 무엇인지 가리킴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;실행 컨텍스트의 생성과 실행 단계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트 엔진은 코드를 실행할 때 두 단계로 나눠서 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;생성 단계 (Creation Phase)&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;실행 컨텍스트가 &lt;strong&gt;생성&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;호이스팅&lt;/strong&gt; (변수, 함수 선언이 메모리에 등록)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스코프 체인 및 this 결정&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실행 단계 (Execution Phase)&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;코드가 한 줄 씩 실행&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변수 할당, 함수 호출 등의 로직이 실제 작동&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;실행 컨텍스트 스택 (콜 스택)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;자바크스립트는 &lt;strong&gt;싱글 스레드&lt;/strong&gt; 기반 언어&lt;/li&gt;
&lt;li&gt;한 번에 하나의 컨텍스트만 실행&lt;/li&gt;
&lt;li&gt;이 컨텍스트들은 &lt;strong&gt;Stack(스택)&lt;/strong&gt; 구조로 관리하며 이를 **콜 스텍(Call Stack)**이라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;function first() {
	second();
	console.log(&quot;first&quot;);
}

function second() {
	console.log(&quot;second&quot;);
}

first();
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;실행 컨텍스트의 흐름
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;global()&lt;/code&gt; → 가장 먼저 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first()&lt;/code&gt; 실행 → 컨텍스트 push&lt;/li&gt;
&lt;li&gt;&lt;code&gt;second()&lt;/code&gt; 실행 → 컨텍스트 push&lt;/li&gt;
&lt;li&gt;&lt;code&gt;second()&lt;/code&gt;  끝 → 컨텍스트 pop&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first()&lt;/code&gt; 끝 → 컨텍스트 pop&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global()&lt;/code&gt; 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;호이스팅(Hoisiting)이란?&lt;/h2&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;호이스팅이란 자바스크립트의 &lt;strong&gt;변수와 함수 선언이 해당 범위의&lt;/strong&gt; &lt;strong&gt;최상단으로 끌어올려지는 것처럼 동작&lt;/strong&gt;하는 현상&lt;/li&gt;
&lt;li&gt;변수와 함수가 코드에 작성된 위치와 관계없이 &lt;strong&gt;먼저 메모리에 등록되어 참조 가능하게 되는 것&lt;/strong&gt;을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;변수 선언의 호이스팅&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(x); // undefined
var x = 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 코드는 호이스팅을 통해 다음과 같이 해석&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var x; // 선언만 호이스팅 됨
console.log(x); // undefined
x = 10; // 초기화는 호이스팅되지 않음
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;함수 선언의 호이스팅&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sayHi(); // TypeError: sayHi is not a function

var sayHi = function() {
	console.log(&quot;Say, Hi!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 코드는 호이스팅을 통해 다음과 같이 해석&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var sayHi; // 선언 호이스팅
sayHi(); // sayHi는 아직 함수가 아님 -&amp;gt; 에러 발생
sayHi = function() {
	console.log(&quot;Say, Hi!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;var vs. let/const의 호이스팅 차이&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;var&lt;/th&gt;
&lt;th&gt;let/const&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;선언&lt;/td&gt;
&lt;td&gt;호이스팅됨&lt;/td&gt;
&lt;td&gt;호이스팅됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초기화 시점&lt;/td&gt;
&lt;td&gt;undefined로 초기화&lt;/td&gt;
&lt;td&gt;초기화 전까지 접근 불가 (TDZ 발생)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용 가능 시점&lt;/td&gt;
&lt;td&gt;선언 이전에도 가능하지만 undefined&lt;/td&gt;
&lt;td&gt;선언 이전에 Reference Error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;❓ TDZ (Temporal Dead Zone)란?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt;이나 &lt;code&gt;const&lt;/code&gt;로 선언된 변수는 호이스팅되지만&lt;/li&gt;
&lt;li&gt;선언 이전에는 접근이 불가능한 일시적 사각지대(Temporal Dead Zone)에 존재함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;console.log(x); // Reference Error
let x = 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;함수 선언 vs. 표현식 vs. 화살표 함수&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;종류&lt;/th&gt;
&lt;th&gt;호이스팅 여부&lt;/th&gt;
&lt;th&gt;정의 전 호출 가능 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;함수 선언식 (&lt;code&gt;function&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;전체 호이스팅&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;함수 표현식 (&lt;code&gt;var f = function&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;선언만 호이스팅&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화살표 함수 (&lt;code&gt;const f = () =&amp;gt; {}&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;선언만 호이스팅&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;스코프 체인 (Scope Chain)&lt;/h2&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;스코프 체인은 자바스크립트에서 식별자를 찾을 때 현재 스코프뿐만 아니라 &lt;strong&gt;외부(상위) 스코프까지 순차적으로 탐색하는 구조&lt;/strong&gt;를 의미&lt;/li&gt;
&lt;li&gt;즉 어떤 변수를 사용할 때, 현재 스코프에서 찾고 → 없으면 상위 스코프로 올라가서 → 전역까지 찾는 &lt;strong&gt;연결된 검색 과정&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;스코프의 종류&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스코프 종류&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;전역 스코프&lt;/td&gt;
&lt;td&gt;코드 어디서든 접근 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;함수 스코프&lt;/td&gt;
&lt;td&gt;함수 내부에서만 접근 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;블록 스코프&lt;/td&gt;
&lt;td&gt;{} 내부 (ES6 이후 let, const만)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;const a = 1;

function outer() {
	const b = 2;
	function inner() {
		const c = 3;
		console.log(a, b, c);
	}
	
	inner();
}

outer(); // 1, 2, 3
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;a는 전역에서, b는 outer에서, c는 inner에서 찾는 이 참조 경로가 스코프 체인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;실행 컨텍스트와의 관계&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;실행 컨텍스트는 Lexical Environment 정보를 갖고 있고 이 내부에는,
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Environment Record&lt;/strong&gt;: 현재 스코프의 변수/함수 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outer Environment Reference:&lt;/strong&gt; 상위 스코프에 대한 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;를 가지고 있으며 이 Outer Reference를 따라 올라가는 구조가 &lt;strong&gt;스코프 체인&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;스코프 체인 탐색 시 주의 사항&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;하위 → 상위 방향으로만 탐색
&lt;ul&gt;
&lt;li&gt;상위 스코프에서 하위 스코프는 알 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변수가 shadowing되면 가장 가까운 것을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;const a = 1;

function test() {
	const a = 2;
	console.log(a); // 2가 가까우므로 2
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;클로저에서 활용됨
&lt;ul&gt;
&lt;li&gt;함수가 종료되어도 상위 스코프 참조가 유지 → 클로저 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>