<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>THE 1995 DevOps Note</title>
    <link>https://the1995-dev-note.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 20:18:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NellKiM</managingEditor>
    <image>
      <title>THE 1995 DevOps Note</title>
      <url>https://tistory1.daumcdn.net/tistory/7054506/attach/9e351036cf77470fb8e239c4a116c861</url>
      <link>https://the1995-dev-note.tistory.com</link>
    </image>
    <item>
      <title>Thundering Herd 란?</title>
      <link>https://the1995-dev-note.tistory.com/259</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;0&quot;&gt;Thundering Herd(우르르 몰려드는 소떼) 문제&lt;/b&gt;는 컴퓨터 과학 및 시스템 엔지니어링에서 발생하는 고전적인 성능 병목 현상이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;말 그대로 수많은 프로세스나 스레드가 어떤 이벤트(예: 락 해제, 서비스 복구, 캐시 만료 등)를 기다리다가, &lt;b data-index-in-node=&quot;62&quot; data-path-to-node=&quot;1&quot;&gt;이벤트가 발생하는 순간 동시에 깨어나 하나의 리소스를 차지하기 위해 격렬하게 경쟁하는 상황&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;1. 주요 발생 시나리오&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;Thundering Herd 문제는 인프라와 애플리케이션 아키텍처 전반에 걸쳐 다양한 형태로 나타난다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;캐시 스탬피드 (Cache Stampede / Cache Miss Storm):&lt;/b&gt; 가장 흔하게 접할 수 있는 시나리오이다. 트래픽이 매우 높은 특정 데이터(예: 메인 화면의 공지사항)의 캐시 TTL(Time-To-Live)이 만료되었다고 가정하면, 그 순간 수천 개의 요청이 동시에 들어오면, 모든 요청이 '캐시 미스(Cache Miss)'를 겪고 &lt;b data-index-in-node=&quot;200&quot; data-path-to-node=&quot;6,0,0&quot;&gt;동시에 원본 데이터베이스(DB)로 쿼리를 날려&lt;/b&gt; DB가 과부하로 다운될 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;프로세스/스레드 웨이크업 (Process Wake-up):&lt;/b&gt; 전통적인 운영체제 수준의 문제이다. 여러 개의 워커 프로세스가 하나의 소켓을 감시(accept())하고 있을 때, 새로운 연결이 들어오면 대기 중이던 &lt;b data-index-in-node=&quot;118&quot; data-path-to-node=&quot;6,1,0&quot;&gt;모든 프로세스가 동시에 깨어나며,&lt;/b&gt; 하지만 연결을 가져가는 것은 단 하나의 프로세스뿐이다. 나머지는 다시 수면 상태로 돌아가는데, 이 과정에서 불필요한 컨텍스트 스위칭과 CPU 리소스 낭비가 발생한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;서버 재시작 및 Retry 폭주 (Microservices / API):&lt;/b&gt; 특정 마이크로서비스나 DB가 일시적인 장애로 다운되었다가 복구되는 순간, 타임아웃을 겪고 대기하던 수많은 클라이언트들이 **동시에 재시도(Retry)**를 요청하면서 갓 복구된 서버를 다시 다운시키는 현상이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 시스템에 미치는 영향&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이 문제가 발생하면 시스템은 리소스를 유용한 작업이 아닌 '경쟁 상태를 처리하는 데' 모두 소모하게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;CPU 스파이크(Spike):&lt;/b&gt; 수많은 프로세스가 동시에 깨어나며 컨텍스트 스위칭 비용이 급증하여 CPU 사용률이 100%를 찍습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;메모리 및 네트워크 병목:&lt;/b&gt; 동시에 많은 커넥션이 생성되고 데이터를 요청하면서 메모리가 고갈되거나 네트워크 대역폭이 포화 상태가 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;연쇄 장애 (Cascading Failure):&lt;/b&gt; 타임아웃이 발생하고, 재시도가 반복되면서 하나의 작은 지연이 전체 시스템의 장애로 번지게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;3. 해결 및 완화 전략&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;Thundering Herd 현상을 방지하기 위해서는 '분산'과 '통제'가 핵심입니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;A. Jitter (지터) 및 Exponential Backoff 도입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트가 재시도를 할 때 똑같은 주기로 요청하지 않도록, &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;14&quot;&gt;재시도 간격에 무작위성(Random Jitter)을 부여&lt;/b&gt;하는 방식입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;적용 예:&lt;/i&gt; 서비스 장애 복구 시, 클라이언트 A는 1.1초 후, 클라이언트 B는 2.3초 후, 클라이언트 C는 1.5초 후에 재시도하도록 분산시켜 트래픽 충격을 완화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16&quot;&gt;B. 분산 락 (Distributed Lock) / Mutex 사용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;캐시가 만료되었을 때, 캐시를 갱신할 수 있는 권한(Lock)을 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;17&quot;&gt;단 하나의 요청(스레드)에게만 부여&lt;/b&gt;합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0,0&quot;&gt;적용 예:&lt;/i&gt; 캐시 미스가 발생하면 첫 번째 요청이 락을 획득하여 DB에서 데이터를 조회하고 캐시를 갱신합니다. 락을 얻지 못한 나머지 대기 요청들은 잠시 대기하다가 갱신된 캐시 데이터를 읽어가거나, 시스템 설정에 따라 과거의 데이터(Stale Data)를 반환받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;C. Request Coalescing (요청 병합)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;동일한 데이터에 대한 여러 요청이 들어왔을 때, 이를 개별적으로 처리하지 않고 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;20&quot;&gt;하나의 백엔드 요청으로 병합&lt;/b&gt;하는 방법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0,0&quot;&gt;적용 예:&lt;/i&gt; Nginx의 proxy_cache_lock 지시어나 API Gateway의 쿼리 병합 기능을 사용하면, 100개의 동일한 캐시 미스 요청이 들어와도 백엔드로는 단 1개의 요청만 전달됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;D. Stale-While-Revalidate 패턴&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;캐시 만료 시간을 두 가지로 관리하는 방법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시가 만료되었더라도 즉시 삭제하지 않고, 클라이언트에게는 일단 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;24,0,0&quot;&gt;약간 오래된(Stale) 데이터를 먼저 빠르게 반환&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;그와 동시에 백그라운드에서는 비동기적으로 단일 스레드가 DB를 조회하여 최신 데이터로 캐시를 조용히 갱신(Revalidate)합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;E. OS/인프라 레벨의 최적화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;현대의 커널 및 웹 서버(예: Nginx)에서는 이 문제를 방지하기 위해 여러 워커가 동시에 깨어나지 않도록 EPOLLEXCLUSIVE 플래그를 사용하거나, SO_REUSEPORT 소켓 옵션을 통해 커널 단위에서 트래픽을 분산시키는 기술을 기본적으로 적용하고 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기초기술&amp;amp;토픽</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/259</guid>
      <comments>https://the1995-dev-note.tistory.com/259#entry259comment</comments>
      <pubDate>Thu, 23 Apr 2026 11:12:58 +0900</pubDate>
    </item>
    <item>
      <title>코스모스 네트워크(Cosmos Network)</title>
      <link>https://the1995-dev-note.tistory.com/258</link>
      <description>&lt;h1 data-end=&quot;115&quot; data-start=&quot;98&quot; data-section-id=&quot;1tv6t4d&quot;&gt;코스모스 네트워크란 무엇인가&lt;/h1&gt;
&lt;p data-end=&quot;409&quot; data-start=&quot;117&quot; data-ke-size=&quot;size16&quot;&gt;코스모스 네트워크(Cosmos Network)는 흔히 &lt;b&gt;&amp;ldquo;블록체인의 인터넷(Internet of Blockchains)&amp;rdquo;&lt;/b&gt; 이라고 불립니다. 핵심 목표는 하나의 체인 위에 모든 것을 몰아넣는 것이 아니라, &lt;b&gt;각 목적에 맞는 독립 블록체인들을 만들고, 그 체인들이 서로 안전하게 통신하게 하는 것&lt;/b&gt;입니다. 코스모스 공식 문서도 Cosmos Hub를 CometBFT, Cosmos SDK, IBC로 구성된 상호연결 블록체인 생태계의 일부로 설명한다&lt;/p&gt;
&lt;p data-end=&quot;409&quot; data-start=&quot;117&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;758&quot; data-start=&quot;744&quot; data-section-id=&quot;mcv6mi&quot;&gt;그럼 코스모스 네트워크 가 왜 필요한가?&lt;/h1&gt;
&lt;p data-end=&quot;785&quot; data-start=&quot;760&quot; data-ke-size=&quot;size16&quot;&gt;코스모스가 등장한 배경은 크게 세 가지다.&lt;/p&gt;
&lt;p data-end=&quot;1018&quot; data-start=&quot;787&quot; data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;상호운용성 부족&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1018&quot; data-start=&quot;787&quot; data-ke-size=&quot;size16&quot;&gt;전통적인 블록체인 구조에서는 체인 A의 자산이나 메시지를 체인 B로 자연스럽게 옮기기 어렵습니다. 이 문제를 해결하려면 보통 별도의 브리지, 커스터디 서비스, 래핑 토큰이 필요했고, 이 과정에서 보안 리스크와 운영 복잡도가 커졌습니다. IBC는 체인 간 메시지 전달을 표준화해 이 문제를 줄이려는 접근이다.&lt;/p&gt;
&lt;p data-end=&quot;1297&quot; data-start=&quot;1020&quot; data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;확장성 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1297&quot; data-start=&quot;1020&quot; data-ke-size=&quot;size16&quot;&gt;모든 애플리케이션이 하나의 체인에 몰리면 처리량, 수수료, 실행 환경 제한이 커집니다. 코스모스는 애플리케이션별로 독립 체인을 두고, 필요한 경우에만 서로 통신하게 하므로 병목을 분산시키는 구조를 지향합니다. Cosmos SDK 문서는 SDK가 CometBFT 위에서 보안성 있는 상태 머신을 만들기 위한 프레임워크라고 설명하며, 이는 곧 목적별 체인 설계라는 코스모스 철학과 맞닿아 있다.&lt;/p&gt;
&lt;p data-end=&quot;1512&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;주권성(Sovereignty)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1512&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size16&quot;&gt;많은 블록체인 플랫폼은 애플리케이션이 상위 체인의 규칙, 수수료 정책, 실행 환경에 종속됩니다. 반면 코스모스에서는 각 체인이 자체 토큰 경제, 수수료 체계, 거버넌스, 모듈 구성을 선택할 수 있습니다. 이 점이 &amp;ldquo;앱체인(appchain)&amp;rdquo; 모델의 핵심이다.&lt;/p&gt;
&lt;h1 data-end=&quot;1532&quot; data-start=&quot;1519&quot; data-section-id=&quot;1w8ha9a&quot;&gt;코스모스의 전체 구조&lt;/h1&gt;
&lt;p data-end=&quot;1685&quot; data-start=&quot;1534&quot; data-ke-size=&quot;size16&quot;&gt;코스모스는 단일 네트워크라기보다, &lt;b&gt;공통 기술 스택과 통신 규약을 공유하는 상호연결 체인 집합&lt;/b&gt;으로 이해하는 게 정확합니다. 그 구조를 설명할 때 자주 나오는 개념이 Hub, Zone, IBC이다.&lt;/p&gt;
&lt;h2 data-end=&quot;1696&quot; data-start=&quot;1687&quot; data-section-id=&quot;z04bgl&quot; data-ke-size=&quot;size26&quot;&gt;1. Hub&lt;/h2&gt;
&lt;p data-end=&quot;1885&quot; data-start=&quot;1698&quot; data-ke-size=&quot;size16&quot;&gt;Hub는 여러 체인을 연결하는 중심 역할의 체인입니다. 대표적인 예가 &lt;b&gt;Cosmos Hub&lt;/b&gt;이며, 기본 토큰은 &lt;b&gt;ATOM&lt;/b&gt;입니다. Cosmos Hub 공식 문서는 이를 &amp;ldquo;first of many interconnected blockchains&amp;rdquo;라고 설명합니다.&lt;/p&gt;
&lt;p data-end=&quot;2135&quot; data-start=&quot;1887&quot; data-ke-size=&quot;size16&quot;&gt;중요한 점은 Hub가 인터넷의 중앙 서버 같은 절대적 통제자가 아니라는 것입니다. 코스모스 생태계는 처음에는 허브 중심 비유로 많이 설명됐지만, 실제 IBC는 &lt;b&gt;허브를 거치지 않고 체인 간 직접 연결&lt;/b&gt;도 가능합니다. 즉, 허브는 연결의 중심점이 될 수는 있어도 반드시 모든 통신의 단일 관문은 아닙니다. 이 점 때문에 &amp;ldquo;코스모스 = 하나의 메인체인&amp;rdquo;으로 이해하면 틀린다.&lt;/p&gt;
&lt;h2 data-end=&quot;2147&quot; data-start=&quot;2137&quot; data-section-id=&quot;1ehhqvb&quot; data-ke-size=&quot;size26&quot;&gt;2. Zone&lt;/h2&gt;
&lt;p data-end=&quot;2354&quot; data-start=&quot;2149&quot; data-ke-size=&quot;size16&quot;&gt;Zone은 코스모스 생태계에 연결되는 개별 블록체인입니다. 각 Zone은 독립적인 합의, 검증자 세트, 애플리케이션 로직, 토큰 경제를 가질 수 있습니다. 쉽게 말하면, 게임 서비스면 게임용 체인, 디파이면 디파이용 체인, 프라이버시 기능이 필요하면 프라이버시 체인을 따로 만들 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2354&quot; data-start=&quot;2149&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773971233498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;           ┌───────────────┐
           │   Cosmos Hub  │
           │    (ATOM)     │
           └──────┬────────┘
                  │
     ┌────────────┼────────────┐
     │            │            │
┌────▼────┐  ┌────▼────┐  ┌────▼────┐
│ Zone A  │  │ Zone B  │  │ Zone C  │
│ (DeFi)  │  │ (Game)  │  │ (NFT)   │
└─────────┘  └─────────┘  └─────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;487&quot; data-start=&quot;478&quot; data-section-id=&quot;1b8ewl8&quot; data-ke-size=&quot;size23&quot;&gt;✔️ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;560&quot; data-start=&quot;488&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;503&quot; data-start=&quot;488&quot; data-section-id=&quot;1slmhud&quot;&gt;Hub: 중간 연결 역할&lt;/li&gt;
&lt;li data-end=&quot;522&quot; data-start=&quot;504&quot; data-section-id=&quot;oxma0h&quot;&gt;Zone: 각각 독립 블록체인&lt;/li&gt;
&lt;li data-end=&quot;560&quot; data-start=&quot;523&quot; data-section-id=&quot;zajf3x&quot;&gt;각 Zone은 서로 다른 서비스 (DeFi, 게임, NFT 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;589&quot; data-start=&quot;562&quot; data-ke-size=&quot;size16&quot;&gt;  핵심: &lt;b&gt;각 체인은 독립적이지만 연결됨&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;2365&quot; data-start=&quot;2356&quot; data-section-id=&quot;107ze9c&quot; data-ke-size=&quot;size26&quot;&gt;3. IBC&lt;/h2&gt;
&lt;p data-end=&quot;2603&quot; data-start=&quot;2367&quot; data-ke-size=&quot;size16&quot;&gt;IBC는 코스모스의 핵심입니다. IBC는 체인 간에 토큰만 옮기는 기능이 아니라, &lt;b&gt;검증 가능한 메시지 전달 규약&lt;/b&gt;입니다. 공식 문서는 IBC에서 relayer가 오프체인 프로세스로서 양 체인의 상태를 읽고, 반대편 체인에 증명과 함께 메시지를 전달한다고 설명합니다. 또한 각 체인은 상대 체인의 라이트 클라이언트를 사용해 들어온 메시지를 검증한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773971288496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Chain A]                         [Chain B]

 ┌──────────┐                ┌──────────┐
 │ Light    │◀──────────────▶│ Light    │
 │ Client   │                │ Client   │
 └────┬─────┘                └────┬─────┘
      │                             │
      │   (Proof + Packet)          │
      │                             │
      ▼                             ▼
 ┌──────────┐   Relayer   ┌──────────┐
 │ State    │────────────▶│ State    │
 │ Change   │             │ Update   │
 └──────────┘             └──────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1166&quot; data-start=&quot;1157&quot; data-section-id=&quot;1b8ewl8&quot; data-ke-size=&quot;size23&quot;&gt;✔️ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1251&quot; data-start=&quot;1167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1202&quot; data-start=&quot;1167&quot; data-section-id=&quot;7zf34r&quot;&gt;각 체인은 상대 체인의 &lt;b&gt;Light Client&lt;/b&gt;를 가짐&lt;/li&gt;
&lt;li data-end=&quot;1229&quot; data-start=&quot;1203&quot; data-section-id=&quot;1ouqph&quot;&gt;Relayer가 메시지 전달 (중계자 역할)&lt;/li&gt;
&lt;li data-end=&quot;1251&quot; data-start=&quot;1230&quot; data-section-id=&quot;653l4p&quot;&gt;하지만 검증은 각 체인이 직접 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1280&quot; data-start=&quot;1253&quot; data-ke-size=&quot;size16&quot;&gt;  핵심: &lt;b&gt;중앙 없이도 신뢰 가능한 통신&lt;/b&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;2631&quot; data-start=&quot;2610&quot; data-section-id=&quot;1wq96v&quot;&gt;코스모스를 구성하는 핵심 기술 스택&lt;/h1&gt;
&lt;h1 data-end=&quot;2631&quot; data-start=&quot;2610&quot; data-section-id=&quot;1wq96v&quot;&gt;1. CometBFT&lt;/h1&gt;
&lt;p data-end=&quot;2988&quot; data-start=&quot;2677&quot; data-ke-size=&quot;size16&quot;&gt;CometBFT는 코스모스 생태계의 합의 엔진 계열입니다. 원래 Tendermint Core로 널리 알려졌고, 현재 공식 문서에서는 CometBFT로 설명됩니다. CometBFT는 두 가지 핵심 요소를 제공합니다. 하나는 &lt;b&gt;BFT 합의 엔진&lt;/b&gt;, 다른 하나는 &lt;b&gt;ABCI(Application Blockchain Interface)&lt;/b&gt; 입니다. CometBFT 공식 문서는 이를 &amp;ldquo;consensus engine + generic application interface&amp;rdquo;로 설명한다.&lt;/p&gt;
&lt;p data-end=&quot;3220&quot; data-start=&quot;2990&quot; data-ke-size=&quot;size16&quot;&gt;이 의미를 쉽게 풀면&lt;br /&gt;CometBFT는 &amp;ldquo;네트워크 합의와 블록 생성&amp;rdquo;을 담당하고, 애플리케이션은 &amp;ldquo;이 트랜잭션이 유효한가, 상태를 어떻게 바꿀 것인가&amp;rdquo;를 담당합니다. 즉, 블록체인 엔진과 비즈니스 로직이 비교적 깔끔하게 분리됩니다. 이 구조는 개발자가 합의 알고리즘을 직접 구현하지 않고도 앱체인을 만들 수 있게 해 준다.&lt;/p&gt;
&lt;h2 data-end=&quot;3238&quot; data-start=&quot;3222&quot; data-section-id=&quot;19gam8b&quot; data-ke-size=&quot;size26&quot;&gt;2. Cosmos SDK&lt;/h2&gt;
&lt;p data-end=&quot;3448&quot; data-start=&quot;3240&quot; data-ke-size=&quot;size16&quot;&gt;Cosmos SDK는 코스모스 체인을 만들기 위한 프레임워크입니다. 공식 문서는 이를 CometBFT 위에서 안전한 상태 머신을 개발하기 위한 프레임워크라고 설명합니다. 개발자는 계정, 스테이킹, 거버넌스, 슬래싱 같은 기본 모듈을 조립하고, 필요한 비즈니스 모듈을 추가해 체인을 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3731&quot; data-start=&quot;3450&quot; data-ke-size=&quot;size16&quot;&gt;기술블로그에서 강조하면 좋은 포인트는, Cosmos SDK가 단순 라이브러리가 아니라 &lt;b&gt;모듈형 블록체인 운영체제에 가깝다&lt;/b&gt;는 점입니다. 예를 들어 웹 개발에서 스프링 부트가 기본 보안, 설정, MVC 틀을 제공하듯, Cosmos SDK는 블록체인에 필요한 기본 기능을 모듈 단위로 제공합니다. 다만 스프링 부트가 애플리케이션 프레임워크라면, Cosmos SDK는 합의 엔진과 결합된 상태 머신 프레임워크라는 점이 더 무겁다.&lt;/p&gt;
&lt;h2 data-end=&quot;3747&quot; data-start=&quot;3733&quot; data-section-id=&quot;1nipqt0&quot; data-ke-size=&quot;size26&quot;&gt;3. IBC 프로토콜&lt;/h2&gt;
&lt;p data-end=&quot;3944&quot; data-start=&quot;3749&quot; data-ke-size=&quot;size16&quot;&gt;IBC는 체인 간 상호작용을 정의합니다. 단순 API 호출과 달리, IBC는 &lt;b&gt;상대 체인의 상태 증명을 기반으로 패킷을 전달하고 검증&lt;/b&gt;합니다. 각 체인은 상대 체인에 대한 라이트 클라이언트를 유지하고, relayer가 가져온 증명이 유효한지 검증한 뒤에만 상태를 변경합니다.&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-section-id=&quot;1wq96v&quot; data-start=&quot;2610&quot; data-end=&quot;2631&quot;&gt;⚙️ 코스모스 기술 스택 구조&lt;/h1&gt;
&lt;pre id=&quot;code_1773971801113&quot; class=&quot;less&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;┌──────────────────────────────┐
│        Application           │
│   (DeFi / Game / NFT 등)     │
├──────────────────────────────┤
│        Cosmos SDK            │
│   (계정, 스테이킹, 거버넌스)   │
├──────────────────────────────┤
│        CometBFT              │
│   (합의 + 네트워크 엔진)      │
└──────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-section-id=&quot;1b8ewl8&quot; data-start=&quot;1909&quot; data-end=&quot;1918&quot; data-ke-size=&quot;size23&quot;&gt;✔️ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1919&quot; data-end=&quot;1976&quot;&gt;
&lt;li data-section-id=&quot;tmenej&quot; data-start=&quot;1919&quot; data-end=&quot;1937&quot;&gt;CometBFT &amp;rarr; 합의 엔진&lt;/li&gt;
&lt;li data-section-id=&quot;srswxn&quot; data-start=&quot;1938&quot; data-end=&quot;1953&quot;&gt;SDK &amp;rarr; 비즈니스 로직&lt;/li&gt;
&lt;li data-section-id=&quot;d9x0sk&quot; data-start=&quot;1954&quot; data-end=&quot;1976&quot;&gt;Application &amp;rarr; 실제 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;3971&quot; data-start=&quot;3951&quot; data-section-id=&quot;1ci8z09&quot;&gt;IBC는 실제로 어떻게 동작하는가&lt;/h1&gt;
&lt;p data-end=&quot;4185&quot; data-start=&quot;4011&quot; data-ke-size=&quot;size16&quot;&gt;IBC를 이해하려면 네 가지 요소를 기억하면 좋다.&lt;br /&gt;&lt;b&gt;클라이언트(client), 연결(connection), 채널(channel), 패킷(packet)&lt;/b&gt; 입니다. 공식 문서도 IBC 스펙에서 채널과 패킷의 의미를 별도로 설명하겠다.&lt;/p&gt;
&lt;h2 data-end=&quot;4202&quot; data-start=&quot;4187&quot; data-section-id=&quot;xl2brq&quot; data-ke-size=&quot;size26&quot;&gt;1. 라이트 클라이언트&lt;/h2&gt;
&lt;p data-end=&quot;4391&quot; data-start=&quot;4204&quot; data-ke-size=&quot;size16&quot;&gt;체인 A는 체인 B 전체를 다시 실행하지 않는다, 대신 체인 B의 헤더와 증명을 검증할 수 있는 &lt;b&gt;라이트 클라이언트&lt;/b&gt;를 체인 내부에 유지합니다. 코스모스 문서는 Tendermint/CometBFT 라이트 클라이언트가 상대 체인의 합의를 추적한다고 설명한다.&lt;/p&gt;
&lt;p data-end=&quot;4475&quot; data-start=&quot;4393&quot; data-ke-size=&quot;size16&quot;&gt;즉, 체인 A는 &amp;ldquo;체인 B가 정말 이 상태를 가졌는지&amp;rdquo;를 직접 검증할 수 있습니다. 이 구조가 중앙 브리지 운영자 없이도 신뢰를 줄이는 핵심이다.&lt;/p&gt;
&lt;h2 data-end=&quot;4493&quot; data-start=&quot;4477&quot; data-section-id=&quot;b09ir3&quot; data-ke-size=&quot;size26&quot;&gt;2. Connection&lt;/h2&gt;
&lt;p data-end=&quot;4641&quot; data-start=&quot;4495&quot; data-ke-size=&quot;size16&quot;&gt;두 체인은 먼저 서로의 라이트 클라이언트를 기반으로 연결 관계를 맺습니다. 이것은 TCP 연결과 비슷한 개념적 단계라고 볼 수 있지만, 실제로는 온체인 상태와 증명에 기반한 신뢰 연결이다.&lt;/p&gt;
&lt;h2 data-end=&quot;4656&quot; data-start=&quot;4643&quot; data-section-id=&quot;1q7cs9n&quot; data-ke-size=&quot;size26&quot;&gt;3. Channel&lt;/h2&gt;
&lt;p data-end=&quot;4932&quot; data-start=&quot;4658&quot; data-ke-size=&quot;size16&quot;&gt;Connection 위에는 애플리케이션 목적에 맞는 Channel이 열립니다. 예를 들어 토큰 전송용 채널, 인터체인 계정용 채널처럼 목적별로 채널을 둘 수 있습니다. 채널은 ordered/unordered 특성을 가질 수 있고, 전달 순서 보장 여부도 여기에 달려 있습니다. 공식 스펙은 IBC가 ordered channel에서 순서 보장과 exactly-once delivery를 지원하도록 설계되었다고 설명합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;4946&quot; data-start=&quot;4934&quot; data-section-id=&quot;17q04pj&quot; data-ke-size=&quot;size26&quot;&gt;4. Packet&lt;/h2&gt;
&lt;p data-end=&quot;5200&quot; data-start=&quot;4948&quot; data-ke-size=&quot;size16&quot;&gt;실제 메시지는 Packet 형태로 전송된다. 체인 A가 체인 B로 어떤 메시지를 보내면, 그 사실이 체인 A 상태에 기록됩니다. 이후 relayer가 그 이벤트와 증명을 읽어 체인 B에 제출하고, 체인 B는 자체 라이트 클라이언트로 이를 검증한 뒤 패킷을 처리합니다. IBC 공식 사이트와 문서는 relayer가 체인 상태를 스캔하고 패킷을 반대 체인으로 운반한다고 설명합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;5219&quot; data-start=&quot;5202&quot; data-section-id=&quot;ouykv3&quot; data-ke-size=&quot;size26&quot;&gt;5. Relayer의 역할&lt;/h2&gt;
&lt;p data-end=&quot;5498&quot; data-start=&quot;5221&quot; data-ke-size=&quot;size16&quot;&gt;Relayer는 IBC의 매우 중요한 구성요소이다. 다만 Relayer는 &amp;ldquo;신뢰해야 하는 중앙 운영자&amp;rdquo;는 아니고, Relayer가 패킷을 전달하더라도 최종 검증은 체인이 자체 라이트 클라이언트로 수행하기 때문에, 따라서 relayer는 &lt;b&gt;데이터 운반자&lt;/b&gt;에 가깝고, 보안의 최종 책임은 체인의 검증 로직에 있습니다. Cosmos 문서도 relayer를 &amp;ldquo;physical connection layer&amp;rdquo;로 설명한다.&lt;/p&gt;
&lt;p data-end=&quot;5581&quot; data-start=&quot;5500&quot; data-ke-size=&quot;size16&quot;&gt;이 구조를 IT 시스템에 비유하면, IBC는 단순 REST 호출보다 &lt;b&gt;메시지 브로커 + 증명 검증 + 상태 동기화 프로토콜&lt;/b&gt;에 더 가깝다.&lt;/p&gt;
&lt;h1 data-end=&quot;5610&quot; data-start=&quot;5588&quot; data-section-id=&quot;18lsmol&quot;&gt;  IBC Packet 흐름 (실제 동작)&lt;/h1&gt;
&lt;pre id=&quot;code_1773971365962&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. Chain A에서 토큰 전송 요청

   User &amp;rarr; Chain A
         &amp;darr;
   Packet 생성

2. Relayer가 감지

   Chain A 상태 읽음
         &amp;darr;
   Proof 포함해서 전달

3. Chain B에서 검증

   Light Client로 검증
         &amp;darr;
   성공 시 상태 반영

4. Ack 반환

   Chain B &amp;rarr; Chain A&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;5610&quot; data-start=&quot;5588&quot; data-section-id=&quot;18lsmol&quot;&gt;Cosmos Hub와 ATOM의 역할&lt;/h1&gt;
&lt;p data-end=&quot;5752&quot; data-start=&quot;5612&quot; data-ke-size=&quot;size16&quot;&gt;Cosmos Hub는 코스모스 생태계의 대표적인 허브 체인이고, ATOM은 그 기본 토큰이며, 공식 문서는 ATOM이 Cosmos Hub의 보안과 거버넌스에 쓰인다고 설명합니다.&lt;/p&gt;
&lt;p data-end=&quot;5785&quot; data-start=&quot;5754&quot; data-ke-size=&quot;size16&quot;&gt;ATOM의 역할은 대체로 세 가지로 요약할 수 있으며,&lt;/p&gt;
&lt;p data-end=&quot;6033&quot; data-start=&quot;5787&quot; data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;스테이킹&lt;/b&gt;입니다. 검증자와 위임자는 ATOM을 스테이킹해 네트워크 보안에 참여&lt;br /&gt;둘째, &lt;b&gt;거버넌스&lt;/b&gt;입니다. 체인 업그레이드, 파라미터 변경, 정책 의사결정에 투표할 수 있다.&lt;br /&gt;셋째, &lt;b&gt;인터체인 서비스의 기반 자산&lt;/b&gt;입니다. 최근 Cosmos Hub는 단순 연결 허브를 넘어 Interchain Security 같은 서비스도 제공한다.&lt;/p&gt;
&lt;h1 data-end=&quot;6069&quot; data-start=&quot;6040&quot; data-section-id=&quot;1b4x7uw&quot;&gt;Interchain Security는 왜 중요한가&lt;/h1&gt;
&lt;p data-end=&quot;6172&quot; data-start=&quot;6071&quot; data-ke-size=&quot;size16&quot;&gt;코스모스 생태계의 약점 중 하나는 각 체인이 독립적이라는 점, 독립성은 장점이지만, 반대로 말하면 &lt;b&gt;작은 체인은 충분한 검증자와 보안을 확보하기 어렵다&lt;/b&gt;는 뜻이기도 합니다.&lt;/p&gt;
&lt;p data-end=&quot;6356&quot; data-start=&quot;6174&quot; data-ke-size=&quot;size16&quot;&gt;이를 보완하기 위한 개념 중 하나가 &lt;b&gt;Interchain Security&lt;/b&gt;입니다. Cosmos Hub 공식 문서는 이를 Hub가 제공하는 주요 인터체인 서비스 중 하나로 소개하며, 소비자 체인이 Hub의 보안 자원을 활용할 수 있게 한다고 설명한다.&lt;/p&gt;
&lt;p data-end=&quot;6513&quot; data-start=&quot;6358&quot; data-ke-size=&quot;size16&quot;&gt;초기 앱체인은 기능은 훌륭해도 자체 토큰 시가총액과 검증자 생태계가 약하면 공격 비용이 낮아질 수 있으며, Interchain Security는 이를 줄이기 위해 &lt;b&gt;기존 강한 허브 체인의 보안을 공유하는 모델&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h1 data-end=&quot;6530&quot; data-start=&quot;6520&quot; data-section-id=&quot;hif5vb&quot;&gt;코스모스의 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;6544&quot; data-start=&quot;6532&quot; data-section-id=&quot;1y8n3yh&quot; data-ke-size=&quot;size26&quot;&gt;1. 높은 주권성&lt;/h2&gt;
&lt;p data-end=&quot;6711&quot; data-start=&quot;6546&quot; data-ke-size=&quot;size16&quot;&gt;각 체인이 독립적으로 정책을 설계할 수 있습니다. 실행 환경, 수수료 구조, 토큰 경제, 거버넌스, 기능 모듈 구성이 자유롭습니다. 이는 &amp;ldquo;남의 메인넷 위에서 돌아가는 dApp&amp;rdquo;과 구별되는 앱체인 모델의 가장 큰 장점&lt;/p&gt;
&lt;h2 data-end=&quot;6722&quot; data-start=&quot;6713&quot; data-section-id=&quot;12xjss8&quot; data-ke-size=&quot;size26&quot;&gt;2. 확장성&lt;/h2&gt;
&lt;p data-end=&quot;6877&quot; data-start=&quot;6724&quot; data-ke-size=&quot;size16&quot;&gt;애플리케이션을 별도 체인으로 분리하면 처리량 병목을 완화할 수 있습니다. 모든 앱이 하나의 글로벌 상태를 두고 경쟁하는 구조보다, 목적별 체인으로 분산하는 쪽이 성능과 정책 측면에서 유리하다.&lt;/p&gt;
&lt;h2 data-end=&quot;6890&quot; data-start=&quot;6879&quot; data-section-id=&quot;1t4bb4d&quot; data-ke-size=&quot;size26&quot;&gt;3. 상호운용성&lt;/h2&gt;
&lt;p data-end=&quot;7014&quot; data-start=&quot;6892&quot; data-ke-size=&quot;size16&quot;&gt;IBC 덕분에 체인 간 토큰 이동, 메시지 전달, 인터체인 계정 같은 기능이 가능합니다. 이는 단순 브리지보다 더 일반화된 메시지 전송 모델이다.&lt;/p&gt;
&lt;h2 data-end=&quot;7028&quot; data-start=&quot;7016&quot; data-section-id=&quot;ikm9hf&quot; data-ke-size=&quot;size26&quot;&gt;4. 개발 생산성&lt;/h2&gt;
&lt;p data-end=&quot;7174&quot; data-start=&quot;7030&quot; data-ke-size=&quot;size16&quot;&gt;Cosmos SDK와 CometBFT를 이용하면 합의 엔진부터 처음부터 구현하지 않고도 블록체인을 구축할 수 있습니다. 즉, 개발자는 비즈니스 로직과 체인 설계에 더 집중할 수 있습니다.&lt;/p&gt;
&lt;h1 data-end=&quot;7199&quot; data-start=&quot;7181&quot; data-section-id=&quot;7u8xu&quot;&gt;코스모스의 한계와 비판 포인트&lt;/h1&gt;
&lt;h2 data-end=&quot;7213&quot; data-start=&quot;7201&quot; data-section-id=&quot;16ibc22&quot; data-ke-size=&quot;size26&quot;&gt;1. 보안의 분산&lt;/h2&gt;
&lt;p data-end=&quot;7399&quot; data-start=&quot;7215&quot; data-ke-size=&quot;size16&quot;&gt;코스모스는 체인별 주권이 강한 만큼, &lt;b&gt;보안도 체인별로 다릅니다&lt;/b&gt;. 이는 이더리움처럼 강력한 단일 보안 풀을 공유하는 모델과 대비됩니다. Interchain Security가 이를 보완하지만, 모든 체인이 동일한 보안 수준을 자동으로 갖는 것은 아닙니다.&lt;/p&gt;
&lt;h2 data-end=&quot;7413&quot; data-start=&quot;7401&quot; data-section-id=&quot;mjzqxo&quot; data-ke-size=&quot;size26&quot;&gt;2. 운영 복잡도&lt;/h2&gt;
&lt;p data-end=&quot;7578&quot; data-start=&quot;7415&quot; data-ke-size=&quot;size16&quot;&gt;독립 체인을 운영한다는 것은 인프라, 검증자, 업그레이드, 거버넌스, 경제 설계를 모두 자체적으로 관리해야 함을 뜻합니다. &amp;ldquo;체인을 만들 자유&amp;rdquo;는 동시에 &amp;ldquo;체인을 운영할 책임&amp;rdquo;도 함께 줍니다. 이건 장점이면서 부담입니다.&lt;/p&gt;
&lt;h2 data-end=&quot;7601&quot; data-start=&quot;7580&quot; data-section-id=&quot;peslqp&quot; data-ke-size=&quot;size26&quot;&gt;3. IBC도 운영 주체가 필요함&lt;/h2&gt;
&lt;p data-end=&quot;7756&quot; data-start=&quot;7603&quot; data-ke-size=&quot;size16&quot;&gt;IBC 자체는 무신뢰에 가깝게 설계되지만, relayer 운영, 채널 관리, 앱 레벨 호환성은 여전히 실무 영역입니다. 즉 프로토콜이 있다고 해서 자동으로 모든 체인 간 UX가 완벽해지는 것은 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;8244&quot; data-start=&quot;8141&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1512&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기초기술&amp;amp;토픽/블록체인</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/258</guid>
      <comments>https://the1995-dev-note.tistory.com/258#entry258comment</comments>
      <pubDate>Mon, 23 Mar 2026 15:49:05 +0900</pubDate>
    </item>
    <item>
      <title>PL/SQL 이란?</title>
      <link>https://the1995-dev-note.tistory.com/41</link>
      <description>&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;/figure&gt;
&lt;p data-end=&quot;57&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL은 오라클 데이터베이스에서 쓰는 &lt;b&gt;절차형 SQL 언어&lt;/b&gt;다.&lt;br /&gt;이름도 그대로 보면 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;145&quot; data-start=&quot;59&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;85&quot; data-start=&quot;59&quot; data-section-id=&quot;1s7u6iv&quot;&gt;&lt;b&gt;SQL&lt;/b&gt;: 데이터 조회/입력/수정/삭제&lt;/li&gt;
&lt;li data-end=&quot;145&quot; data-start=&quot;86&quot; data-section-id=&quot;16kx8ue&quot;&gt;&lt;b&gt;PL/SQL&lt;/b&gt;: SQL에다가 &lt;b&gt;변수, 조건문, 반복문, 예외처리, 함수, 프로시저&lt;/b&gt;를 붙인 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;149&quot; data-start=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;p data-end=&quot;184&quot; data-start=&quot;151&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;오라클 DB 안에서 동작하는 프로그래밍 언어&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;209&quot; data-start=&quot;191&quot; data-section-id=&quot;ycw1i0&quot;&gt;1. 왜 PL/SQL을 쓰는가&lt;/h1&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;211&quot; data-ke-size=&quot;size16&quot;&gt;일반 SQL은 보통 한 번에 한 문장씩 처리한다.&lt;/p&gt;
&lt;p data-end=&quot;246&quot; data-start=&quot;240&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;pre id=&quot;code_1773973151969&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM EMP;
UPDATE EMP SET SAL = SAL * 1.1 WHERE DEPTNO = 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;363&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;363&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;이건 단순 조회/수정은 잘하지만, 아래 같은 로직은 불편하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;453&quot; data-start=&quot;365&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;380&quot; data-start=&quot;365&quot; data-section-id=&quot;qyu2wo&quot;&gt;조건에 따라 다르게 처리&lt;/li&gt;
&lt;li data-end=&quot;402&quot; data-start=&quot;381&quot; data-section-id=&quot;9wvqj9&quot;&gt;여러 SQL을 묶어서 한 번에 실행&lt;/li&gt;
&lt;li data-end=&quot;418&quot; data-start=&quot;403&quot; data-section-id=&quot;10hezm5&quot;&gt;오류 발생 시 예외 처리&lt;/li&gt;
&lt;li data-end=&quot;426&quot; data-start=&quot;419&quot; data-section-id=&quot;7i554h&quot;&gt;반복 처리&lt;/li&gt;
&lt;li data-end=&quot;441&quot; data-start=&quot;427&quot; data-section-id=&quot;1sm9bki&quot;&gt;값을 변수에 담아 계산&lt;/li&gt;
&lt;li data-end=&quot;453&quot; data-start=&quot;442&quot; data-section-id=&quot;1ay1hgh&quot;&gt;업무 로직 캡슐화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;455&quot; data-ke-size=&quot;size16&quot;&gt;그래서 PL/SQL을 쓴다.&lt;/p&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;455&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;478&quot; data-start=&quot;472&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;562&quot; data-start=&quot;480&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;502&quot; data-start=&quot;480&quot; data-section-id=&quot;13vocew&quot;&gt;급여가 특정 금액 이하인 직원만 인상&lt;/li&gt;
&lt;li data-end=&quot;515&quot; data-start=&quot;503&quot; data-section-id=&quot;1d793a4&quot;&gt;부서별 보너스 계산&lt;/li&gt;
&lt;li data-end=&quot;533&quot; data-start=&quot;516&quot; data-section-id=&quot;qeqq36&quot;&gt;입력값 검증 후 데이터 저장&lt;/li&gt;
&lt;li data-end=&quot;546&quot; data-start=&quot;534&quot; data-section-id=&quot;velosx&quot;&gt;배치성 데이터 처리&lt;/li&gt;
&lt;li data-end=&quot;562&quot; data-start=&quot;547&quot; data-section-id=&quot;1ibc1ps&quot;&gt;트랜잭션 단위 업무 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;584&quot; data-start=&quot;569&quot; data-section-id=&quot;blzt5f&quot;&gt;2. PL/SQL의 특징&lt;/h1&gt;
&lt;h2 data-end=&quot;598&quot; data-start=&quot;586&quot; data-section-id=&quot;88qse4&quot; data-ke-size=&quot;size26&quot;&gt;1) 오라클 전용&lt;/h2&gt;
&lt;p data-end=&quot;667&quot; data-start=&quot;599&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL은 기본적으로 &lt;b&gt;Oracle Database용&lt;/b&gt;이다.&lt;br /&gt;다른 DB에도 비슷한 개념은 있지만 문법이 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;669&quot; data-section-id=&quot;1r05tbl&quot;&gt;Oracle &amp;rarr; PL/SQL&lt;/li&gt;
&lt;li data-end=&quot;707&quot; data-start=&quot;687&quot; data-section-id=&quot;nwmqli&quot;&gt;SQL Server &amp;rarr; T-SQL&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;708&quot; data-section-id=&quot;dylsvq&quot;&gt;PostgreSQL &amp;rarr; PL/pgSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;756&quot; data-start=&quot;738&quot; data-section-id=&quot;1r0rk5e&quot; data-ke-size=&quot;size26&quot;&gt;2) SQL + 절차형 언어&lt;/h2&gt;
&lt;p data-end=&quot;785&quot; data-start=&quot;757&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL 안에서는 SQL을 그대로 쓸 수 있다&lt;/p&gt;
&lt;pre id=&quot;code_1773973440454&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
    UPDATE EMP
       SET SAL = SAL + 100
     WHERE EMPNO = 7369;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;893&quot; data-start=&quot;879&quot; data-ke-size=&quot;size16&quot;&gt;SQL만 있는 게 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;932&quot; data-start=&quot;895&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;895&quot; data-section-id=&quot;yhmtl3&quot;&gt;IF&lt;/li&gt;
&lt;li data-end=&quot;906&quot; data-start=&quot;900&quot; data-section-id=&quot;1j3vdp0&quot;&gt;LOOP&lt;/li&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;907&quot; data-section-id=&quot;17am8qf&quot;&gt;WHILE&lt;/li&gt;
&lt;li data-end=&quot;920&quot; data-start=&quot;915&quot; data-section-id=&quot;1o4j83&quot;&gt;FOR&lt;/li&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;921&quot; data-section-id=&quot;1842ydb&quot;&gt;EXCEPTION&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;948&quot; data-start=&quot;934&quot; data-ke-size=&quot;size16&quot;&gt;이런 것도 사용 가능&lt;/p&gt;
&lt;h2 data-end=&quot;966&quot; data-start=&quot;955&quot; data-section-id=&quot;1r63j1m&quot; data-ke-size=&quot;size26&quot;&gt;3) 블록 구조&lt;/h2&gt;
&lt;p data-end=&quot;999&quot; data-start=&quot;967&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL은 기본적으로 &lt;b&gt;블록(Block)&lt;/b&gt; 구조다.&lt;/p&gt;
&lt;p data-end=&quot;1007&quot; data-start=&quot;1001&quot; data-ke-size=&quot;size16&quot;&gt;기본 형태:&lt;/p&gt;
&lt;pre id=&quot;code_1773973881821&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
   -- 변수 선언부
BEGIN
   -- 실행부
EXCEPTION
   -- 예외 처리부
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;948&quot; data-start=&quot;934&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1122&quot; data-start=&quot;1104&quot; data-section-id=&quot;1nrvfe2&quot;&gt;DECLARE: 변수 선언&lt;/li&gt;
&lt;li data-end=&quot;1145&quot; data-start=&quot;1123&quot; data-section-id=&quot;f15xm9&quot;&gt;BEGIN ~ END: 실제 실행&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1146&quot; data-section-id=&quot;u73o25&quot;&gt;EXCEPTION: 오류 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;1190&quot; data-start=&quot;1173&quot; data-section-id=&quot;16emk1e&quot;&gt;3. PL/SQL 기본 구조&lt;/h1&gt;
&lt;h2 data-end=&quot;1210&quot; data-start=&quot;1192&quot; data-section-id=&quot;lkx7ku&quot; data-ke-size=&quot;size26&quot;&gt;예제 1: 가장 단순한 블록&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773973988598&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO PL/SQL');
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1282&quot; data-start=&quot;1279&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1371&quot; data-start=&quot;1283&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1322&quot; data-start=&quot;1283&quot; data-section-id=&quot;8ogodx&quot;&gt;DBMS_OUTPUT.PUT_LINE = 콘솔 출력 비슷한 개념&lt;/li&gt;
&lt;li data-end=&quot;1371&quot; data-start=&quot;1323&quot; data-section-id=&quot;199ympd&quot;&gt;/ = SQL*Plus, SQL Developer 같은 도구에서 블록 실행 신호&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1376&quot; data-start=&quot;1373&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1392&quot; data-start=&quot;1378&quot; data-section-id=&quot;8721kp&quot; data-ke-size=&quot;size26&quot;&gt;예제 2: 변수 선언&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974152600&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_NAME VARCHAR2(50);
BEGIN
V_NAME := 'KIM';
DBMS_OUTPUT.PUT_LINE(V_NAME);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1511&quot; data-start=&quot;1507&quot; data-ke-size=&quot;size16&quot;&gt;여기서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1554&quot; data-start=&quot;1513&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1538&quot; data-start=&quot;1513&quot; data-section-id=&quot;1csvcze&quot;&gt;VARCHAR2(50) = 문자열 변수&lt;/li&gt;
&lt;li data-end=&quot;1554&quot; data-start=&quot;1539&quot; data-section-id=&quot;8jnfrb&quot;&gt;:= = 대입 연산자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1595&quot; data-start=&quot;1556&quot; data-ke-size=&quot;size16&quot;&gt;주의:&lt;br /&gt;PL/SQL에서는 변수 대입을 =가 아니라 :=로 한다.&lt;/p&gt;
&lt;h1 data-end=&quot;1613&quot; data-start=&quot;1602&quot; data-section-id=&quot;4be0lp&quot;&gt;4. 데이터 타입&lt;/h1&gt;
&lt;p data-end=&quot;1637&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL은 오라클 타입을 주로 쓴다.&lt;/p&gt;
&lt;h2 data-end=&quot;1650&quot; data-start=&quot;1639&quot; data-section-id=&quot;rwusyw&quot; data-ke-size=&quot;size26&quot;&gt;자주 쓰는 타입&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1793&quot; data-start=&quot;1652&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1667&quot; data-start=&quot;1652&quot; data-section-id=&quot;1xzvt6y&quot;&gt;NUMBER : 숫자&lt;/li&gt;
&lt;li data-end=&quot;1689&quot; data-start=&quot;1668&quot; data-section-id=&quot;iyovhq&quot;&gt;VARCHAR2(n) : 문자열&lt;/li&gt;
&lt;li data-end=&quot;1703&quot; data-start=&quot;1690&quot; data-section-id=&quot;ri0eey&quot;&gt;DATE : 날짜&lt;/li&gt;
&lt;li data-end=&quot;1727&quot; data-start=&quot;1704&quot; data-section-id=&quot;1e34cn4&quot;&gt;CHAR(n) : 고정 길이 문자열&lt;/li&gt;
&lt;li data-end=&quot;1759&quot; data-start=&quot;1728&quot; data-section-id=&quot;1nhkj0j&quot;&gt;BOOLEAN : 참/거짓 (PL/SQL 내부용)&lt;/li&gt;
&lt;li data-end=&quot;1777&quot; data-start=&quot;1760&quot; data-section-id=&quot;1ijmoo&quot;&gt;CLOB : 대용량 문자&lt;/li&gt;
&lt;li data-end=&quot;1793&quot; data-start=&quot;1778&quot; data-section-id=&quot;1nojaut&quot;&gt;BLOB : 바이너리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1797&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974164525&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_NUM NUMBER := 100;
V_NAME VARCHAR2(20) := 'LEE';
V_DATE DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE(V_NUM);
DBMS_OUTPUT.PUT_LINE(V_NAME);
DBMS_OUTPUT.PUT_LINE(V_DATE);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;2045&quot; data-start=&quot;2029&quot; data-section-id=&quot;14sqw6h&quot;&gt;5. SELECT INTO&lt;/h1&gt;
&lt;p data-end=&quot;2078&quot; data-start=&quot;2047&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL에서 조회 결과를 변수에 담을 때 자주 쓴다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974177835&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL
INTO V_ENAME, V_SAL
FROM EMP
WHERE EMPNO = 7369;

DBMS_OUTPUT.PUT_LINE('이름: ' || V_ENAME);
DBMS_OUTPUT.PUT_LINE('급여: ' || V_SAL);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;2352&quot; data-start=&quot;2344&quot; data-section-id=&quot;1q0y1t8&quot; data-ke-size=&quot;size26&quot;&gt;중요한 점&lt;/h2&gt;
&lt;p data-end=&quot;2389&quot; data-start=&quot;2353&quot; data-ke-size=&quot;size16&quot;&gt;SELECT INTO는 &lt;b&gt;반드시 1건만 조회&lt;/b&gt;되어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;2401&quot; data-start=&quot;2391&quot; data-ke-size=&quot;size16&quot;&gt;문제가 되는 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2457&quot; data-start=&quot;2403&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2428&quot; data-start=&quot;2403&quot; data-section-id=&quot;1vgz2fp&quot;&gt;결과 0건 &amp;rarr; NO_DATA_FOUND&lt;/li&gt;
&lt;li data-end=&quot;2457&quot; data-start=&quot;2429&quot; data-section-id=&quot;19f7ooj&quot;&gt;결과 2건 이상 &amp;rarr; TOO_MANY_ROWS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2482&quot; data-start=&quot;2459&quot; data-ke-size=&quot;size16&quot;&gt;그래서 실무에서는 예외처리를 같이 넣는다.&lt;/p&gt;
&lt;h1 data-end=&quot;2509&quot; data-start=&quot;2489&quot; data-section-id=&quot;1xmeoig&quot;&gt;6. %TYPE, %ROWTYPE&lt;/h1&gt;
&lt;p data-end=&quot;2527&quot; data-start=&quot;2511&quot; data-ke-size=&quot;size16&quot;&gt;이건 실무에서 매우 중요하다.&lt;/p&gt;
&lt;h2 data-end=&quot;2540&quot; data-start=&quot;2529&quot; data-section-id=&quot;1xf8zgg&quot; data-ke-size=&quot;size26&quot;&gt;1) %TYPE&lt;/h2&gt;
&lt;p data-end=&quot;2561&quot; data-start=&quot;2541&quot; data-ke-size=&quot;size16&quot;&gt;테이블 컬럼 타입을 그대로 따라간다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974218619&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_ENAME EMP.ENAME%TYPE;
BEGIN
...
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2635&quot; data-start=&quot;2632&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2681&quot; data-start=&quot;2636&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2670&quot; data-start=&quot;2636&quot; data-section-id=&quot;8jsat0&quot;&gt;EMP.ENAME 타입이 바뀌어도 변수 타입이 자동 반영됨&lt;/li&gt;
&lt;li data-end=&quot;2681&quot; data-start=&quot;2671&quot; data-section-id=&quot;wql02v&quot;&gt;하드코딩 줄어듦&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2702&quot; data-start=&quot;2688&quot; data-section-id=&quot;ro1nzd&quot; data-ke-size=&quot;size26&quot;&gt;2) %ROWTYPE&lt;/h2&gt;
&lt;p data-end=&quot;2723&quot; data-start=&quot;2703&quot; data-ke-size=&quot;size16&quot;&gt;한 행 전체 구조를 그대로 가져온다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974228775&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_EMP EMP%ROWTYPE;
BEGIN
SELECT *
INTO V_EMP
FROM EMP
WHERE EMPNO = 7369;

DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
DBMS_OUTPUT.PUT_LINE(V_EMP.SAL);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2931&quot; data-start=&quot;2928&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2950&quot; data-start=&quot;2932&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2950&quot; data-start=&quot;2932&quot; data-section-id=&quot;1qrfqr7&quot;&gt;컬럼 하나씩 선언할 필요 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2955&quot; data-start=&quot;2952&quot; data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2999&quot; data-start=&quot;2956&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2999&quot; data-start=&quot;2956&quot; data-section-id=&quot;wghlm8&quot;&gt;SELECT * INTO는 컬럼 변경 영향 받을 수 있어서 조심해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;3014&quot; data-start=&quot;3006&quot; data-section-id=&quot;lme29v&quot;&gt;7. 조건문&lt;/h1&gt;
&lt;h2 data-end=&quot;3023&quot; data-start=&quot;3016&quot; data-section-id=&quot;1xw7ljm&quot; data-ke-size=&quot;size26&quot;&gt;IF 문&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974239777&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_SAL NUMBER := 3000;
BEGIN
IF V_SAL &amp;gt;= 5000 THEN
DBMS_OUTPUT.PUT_LINE('고액 연봉');
ELSIF V_SAL &amp;gt;= 3000 THEN
DBMS_OUTPUT.PUT_LINE('중간 연봉');
ELSE
DBMS_OUTPUT.PUT_LINE('낮은 연봉');
END IF;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;3290&quot; data-start=&quot;3282&quot; data-section-id=&quot;v6bylh&quot;&gt;8. 반복문&lt;/h1&gt;
&lt;h2 data-end=&quot;3308&quot; data-start=&quot;3292&quot; data-section-id=&quot;1c2h34r&quot; data-ke-size=&quot;size26&quot;&gt;1) BASIC LOOP&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974247902&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_CNT NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(V_CNT);
V_CNT := V_CNT + 1;

EXIT WHEN V_CNT &amp;gt; 5;
END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;3505&quot; data-start=&quot;3489&quot; data-section-id=&quot;z3krr1&quot; data-ke-size=&quot;size26&quot;&gt;2) WHILE LOOP&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974257576&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_CNT NUMBER := 1;
BEGIN
WHILE V_CNT &amp;lt;= 5 LOOP
DBMS_OUTPUT.PUT_LINE(V_CNT);
V_CNT := V_CNT + 1;
END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;3687&quot; data-start=&quot;3673&quot; data-section-id=&quot;zq9hw8&quot; data-ke-size=&quot;size26&quot;&gt;3) FOR LOOP&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974275232&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
FOR I IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(I);
END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3814&quot; data-start=&quot;3784&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 FOR LOOP가 간단해서 많이 쓰인다.&lt;/p&gt;
&lt;h1 data-end=&quot;3832&quot; data-start=&quot;3821&quot; data-section-id=&quot;w5l4dt&quot;&gt;9. DML 사용&lt;/h1&gt;
&lt;p data-end=&quot;3881&quot; data-start=&quot;3834&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL 안에서는 INSERT, UPDATE, DELETE를 그대로 쓸 수 있다.&lt;/p&gt;
&lt;h2 data-end=&quot;3892&quot; data-start=&quot;3883&quot; data-section-id=&quot;14bigky&quot; data-ke-size=&quot;size26&quot;&gt;INSERT&lt;/h2&gt;
&lt;pre id=&quot;code_1773974289120&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
INSERT INTO EMP_TEMP(EMPNO, ENAME, SAL)
VALUES (9999, 'KIM', 3000);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;4004&quot; data-start=&quot;3995&quot; data-section-id=&quot;16pkz9w&quot; data-ke-size=&quot;size26&quot;&gt;UPDATE&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974296399&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
UPDATE EMP
SET SAL = SAL + 500
WHERE DEPTNO = 10;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;4106&quot; data-start=&quot;4097&quot; data-section-id=&quot;xdi058&quot; data-ke-size=&quot;size26&quot;&gt;DELETE&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974304621&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
DELETE FROM EMP_TEMP
WHERE EMPNO = 9999;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;4201&quot; data-start=&quot;4188&quot; data-section-id=&quot;pzsre4&quot;&gt;10. 트랜잭션 처리&lt;/h1&gt;
&lt;p data-end=&quot;4227&quot; data-start=&quot;4203&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL에서도 트랜잭션 개념은 동일하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4262&quot; data-start=&quot;4229&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4244&quot; data-start=&quot;4229&quot; data-section-id=&quot;1d5tjk3&quot;&gt;COMMIT : 확정&lt;/li&gt;
&lt;li data-end=&quot;4262&quot; data-start=&quot;4245&quot; data-section-id=&quot;t6b4u8&quot;&gt;ROLLBACK : 취소&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974316368&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
UPDATE ACCOUNT
SET BALANCE = BALANCE - 1000
WHERE ACC_NO = 'A001';

UPDATE ACCOUNT
SET BALANCE = BALANCE + 1000
WHERE ACC_NO = 'A002';

COMMIT;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4495&quot; data-start=&quot;4469&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 이체, 정산 같은 업무에서 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;4572&quot; data-start=&quot;4497&quot; data-ke-size=&quot;size16&quot;&gt;다만 프로시저 내부에서 무조건 COMMIT을 수행하면&lt;br /&gt;호출한 쪽에서 트랜잭션 제어가 어려워질 수 있어서 설계에 따라 조심한다.&lt;/p&gt;
&lt;h1 data-end=&quot;4590&quot; data-start=&quot;4579&quot; data-section-id=&quot;pozc30&quot;&gt;11. 예외 처리&lt;/h1&gt;
&lt;p data-end=&quot;4609&quot; data-start=&quot;4592&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL의 강점 중 하나다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974388395&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
V_ENAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME
INTO V_ENAME
FROM EMP
WHERE EMPNO = 9999;

DBMS_OUTPUT.PUT_LINE(V_ENAME);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('데이터 없음');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('데이터가 여러 건임');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('기타 오류 발생');
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;5009&quot; data-start=&quot;4998&quot; data-section-id=&quot;rwsen1&quot; data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예외&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5110&quot; data-start=&quot;5011&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5028&quot; data-start=&quot;5011&quot; data-section-id=&quot;1ucjj8v&quot;&gt;NO_DATA_FOUND&lt;/li&gt;
&lt;li data-end=&quot;5046&quot; data-start=&quot;5029&quot; data-section-id=&quot;12gxe5a&quot;&gt;TOO_MANY_ROWS&lt;/li&gt;
&lt;li data-end=&quot;5062&quot; data-start=&quot;5047&quot; data-section-id=&quot;1xrmvza&quot;&gt;ZERO_DIVIDE&lt;/li&gt;
&lt;li data-end=&quot;5083&quot; data-start=&quot;5063&quot; data-section-id=&quot;uoehg2&quot;&gt;DUP_VAL_ON_INDEX&lt;/li&gt;
&lt;li data-end=&quot;5099&quot; data-start=&quot;5084&quot; data-section-id=&quot;qeq1w&quot;&gt;VALUE_ERROR&lt;/li&gt;
&lt;li data-end=&quot;5110&quot; data-start=&quot;5100&quot; data-section-id=&quot;1o48av3&quot;&gt;OTHERS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5143&quot; data-start=&quot;5112&quot; data-ke-size=&quot;size16&quot;&gt;WHEN OTHERS는 마지막에 두는 게 일반적이다.&lt;/p&gt;
&lt;h1 data-end=&quot;5162&quot; data-start=&quot;5150&quot; data-section-id=&quot;1rqdqkh&quot;&gt;12. CURSOR&lt;/h1&gt;
&lt;p data-end=&quot;5182&quot; data-start=&quot;5164&quot; data-ke-size=&quot;size16&quot;&gt;조회 결과가 여러 건일 때 쓴다.&lt;/p&gt;
&lt;h2 data-end=&quot;5196&quot; data-start=&quot;5184&quot; data-section-id=&quot;14u1nw1&quot; data-ke-size=&quot;size26&quot;&gt;명시적 커서 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974407648&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
CURSOR C_EMP IS
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO = 10;

V_EMPNO EMP.EMPNO%TYPE;
V_ENAME EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
BEGIN
OPEN C_EMP;

LOOP
FETCH C_EMP INTO V_EMPNO, V_ENAME, V_SAL;
EXIT WHEN C_EMP%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(V_EMPNO || ' / ' || V_ENAME || ' / ' || V_SAL);
END LOOP;

CLOSE C_EMP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;5653&quot; data-start=&quot;5639&quot; data-section-id=&quot;1fjrvfe&quot; data-ke-size=&quot;size26&quot;&gt;커서 FOR LOOP&lt;/h2&gt;
&lt;p data-end=&quot;5668&quot; data-start=&quot;5654&quot; data-ke-size=&quot;size16&quot;&gt;더 많이 쓰임&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974417628&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
FOR REC IN (
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO = 10
) LOOP
DBMS_OUTPUT.PUT_LINE(REC.EMPNO || ' / ' || REC.ENAME || ' / ' || REC.SAL);
END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5923&quot; data-start=&quot;5899&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 여러 건 읽어 처리할 때 많이 씀.&lt;/p&gt;
&lt;h1 data-end=&quot;5945&quot; data-start=&quot;5930&quot; data-section-id=&quot;5ytvvr&quot;&gt;13. PROCEDURE&lt;/h1&gt;
&lt;p data-end=&quot;5971&quot; data-start=&quot;5947&quot; data-ke-size=&quot;size16&quot;&gt;프로시저는 &lt;b&gt;반환값 없는 실행 단위&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;6006&quot; data-start=&quot;5973&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &amp;ldquo;사원 급여 인상 처리&amp;rdquo; 같은 업무를 묶어놓는다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974519509&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE UPD_SALARY (
P_EMPNO IN EMP.EMPNO%TYPE,
P_INC IN NUMBER
)
IS
BEGIN
UPDATE EMP
SET SAL = SAL + P_INC
WHERE EMPNO = P_EMPNO;
END;
/

실행:


BEGIN
UPD_SALARY(7369, 500);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;6280&quot; data-start=&quot;6266&quot; data-section-id=&quot;1tpbrlb&quot;&gt;14. FUNCTION&lt;/h1&gt;
&lt;p data-end=&quot;6307&quot; data-start=&quot;6282&quot; data-ke-size=&quot;size16&quot;&gt;함수는 &lt;b&gt;반환값이 있는 프로그램 단위&lt;/b&gt;다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974531135&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION GET_ANNUAL_SAL (
P_EMPNO IN EMP.EMPNO%TYPE
)
RETURN NUMBER
IS
V_SAL EMP.SAL%TYPE;
BEGIN
SELECT SAL
INTO V_SAL
FROM EMP
WHERE EMPNO = P_EMPNO;

RETURN V_SAL * 12;
END;
/

사용:


SELECT GET_ANNUAL_SAL(7369)
FROM DUAL;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;6627&quot; data-start=&quot;6613&quot; data-section-id=&quot;88ecbx&quot; data-ke-size=&quot;size26&quot;&gt;프로시저와 함수 차이&lt;/h2&gt;
&lt;h3 data-end=&quot;6637&quot; data-start=&quot;6629&quot; data-section-id=&quot;mg9l8i&quot; data-ke-size=&quot;size23&quot;&gt;프로시저&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6678&quot; data-start=&quot;6638&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6649&quot; data-start=&quot;6638&quot; data-section-id=&quot;w0gmlg&quot;&gt;반환값 없어도 됨&lt;/li&gt;
&lt;li data-end=&quot;6658&quot; data-start=&quot;6650&quot; data-section-id=&quot;1ctl5l0&quot;&gt;업무 처리용&lt;/li&gt;
&lt;li data-end=&quot;6678&quot; data-start=&quot;6659&quot; data-section-id=&quot;t3yx19&quot;&gt;OUT 파라미터로 값 전달 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;6686&quot; data-start=&quot;6680&quot; data-section-id=&quot;1hrnmpi&quot; data-ke-size=&quot;size23&quot;&gt;함수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6738&quot; data-start=&quot;6687&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6704&quot; data-start=&quot;6687&quot; data-section-id=&quot;1bb6gq2&quot;&gt;반드시 RETURN 필요&lt;/li&gt;
&lt;li data-end=&quot;6715&quot; data-start=&quot;6705&quot; data-section-id=&quot;dc06hc&quot;&gt;계산 결과 반환&lt;/li&gt;
&lt;li data-end=&quot;6738&quot; data-start=&quot;6716&quot; data-section-id=&quot;hsu4w7&quot;&gt;SQL 안에서 호출 가능(제약 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;6773&quot; data-start=&quot;6745&quot; data-section-id=&quot;14onxhw&quot;&gt;15. IN / OUT / IN OUT 파라미터&lt;/h1&gt;
&lt;h2 data-end=&quot;6780&quot; data-start=&quot;6775&quot; data-section-id=&quot;1mnyo2&quot; data-ke-size=&quot;size26&quot;&gt;IN&lt;/h2&gt;
&lt;p data-end=&quot;6784&quot; data-start=&quot;6781&quot; data-ke-size=&quot;size16&quot;&gt;입력용&lt;/p&gt;
&lt;h2 data-end=&quot;6792&quot; data-start=&quot;6786&quot; data-section-id=&quot;1hrynu3&quot; data-ke-size=&quot;size26&quot;&gt;OUT&lt;/h2&gt;
&lt;p data-end=&quot;6796&quot; data-start=&quot;6793&quot; data-ke-size=&quot;size16&quot;&gt;출력용&lt;/p&gt;
&lt;h2 data-end=&quot;6807&quot; data-start=&quot;6798&quot; data-section-id=&quot;14aide4&quot; data-ke-size=&quot;size26&quot;&gt;IN OUT&lt;/h2&gt;
&lt;p data-end=&quot;6812&quot; data-start=&quot;6808&quot; data-ke-size=&quot;size16&quot;&gt;입출력용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974546604&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE GET_EMP_INFO (
P_EMPNO IN EMP.EMPNO%TYPE,
P_ENAME OUT EMP.ENAME%TYPE,
P_SAL OUT EMP.SAL%TYPE
)
IS
BEGIN
SELECT ENAME, SAL
INTO P_ENAME, P_SAL
FROM EMP
WHERE EMPNO = P_EMPNO;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;7092&quot; data-start=&quot;7079&quot; data-section-id=&quot;1dtv2mt&quot;&gt;16. PACKAGE&lt;/h1&gt;
&lt;p data-end=&quot;7130&quot; data-start=&quot;7094&quot; data-ke-size=&quot;size16&quot;&gt;패키지는 관련된 프로시저, 함수, 변수, 커서 등을 묶는 단위다.&lt;/p&gt;
&lt;p data-end=&quot;7139&quot; data-start=&quot;7132&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말하면:&lt;/p&gt;
&lt;p data-end=&quot;7160&quot; data-start=&quot;7141&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;PL/SQL 모듈 묶음&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;7167&quot; data-start=&quot;7162&quot; data-section-id=&quot;1mbdrk&quot; data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;7208&quot; data-start=&quot;7168&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;7173&quot; data-start=&quot;7168&quot; data-section-id=&quot;23h4gw&quot;&gt;구조화&lt;/li&gt;
&lt;li data-end=&quot;7183&quot; data-start=&quot;7174&quot; data-section-id=&quot;1nz0sb8&quot;&gt;유지보수 편함&lt;/li&gt;
&lt;li data-end=&quot;7197&quot; data-start=&quot;7184&quot; data-section-id=&quot;121agt0&quot;&gt;공통 로직 묶기 좋음&lt;/li&gt;
&lt;li data-end=&quot;7208&quot; data-start=&quot;7198&quot; data-section-id=&quot;rkl5hg&quot;&gt;권한 관리 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;7218&quot; data-start=&quot;7210&quot; data-ke-size=&quot;size16&quot;&gt;패키지는 보통:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;7276&quot; data-start=&quot;7220&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;7249&quot; data-start=&quot;7220&quot; data-section-id=&quot;1cznap0&quot;&gt;&lt;b&gt;PACKAGE SPEC&lt;/b&gt;: 외부 공개 선언부&lt;/li&gt;
&lt;li data-end=&quot;7276&quot; data-start=&quot;7250&quot; data-section-id=&quot;fggifc&quot;&gt;&lt;b&gt;PACKAGE BODY&lt;/b&gt;: 실제 구현부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;7284&quot; data-start=&quot;7278&quot; data-ke-size=&quot;size16&quot;&gt;로 나뉜다.&lt;/p&gt;
&lt;h2 data-end=&quot;7296&quot; data-start=&quot;7291&quot; data-section-id=&quot;1maz01&quot; data-ke-size=&quot;size26&quot;&gt;예시&lt;/h2&gt;
&lt;h3 data-end=&quot;7306&quot; data-start=&quot;7298&quot; data-section-id=&quot;ynoxqb&quot; data-ke-size=&quot;size23&quot;&gt;SPEC&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974560312&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PACKAGE PKG_EMP IS
PROCEDURE UPD_SALARY(P_EMPNO IN NUMBER, P_INC IN NUMBER);
FUNCTION GET_SAL(P_EMPNO IN NUMBER) RETURN NUMBER;
END PKG_EMP;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;7497&quot; data-start=&quot;7489&quot; data-section-id=&quot;yncdw6&quot; data-ke-size=&quot;size23&quot;&gt;BODY&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974570931&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PACKAGE BODY PKG_EMP IS

PROCEDURE UPD_SALARY(P_EMPNO IN NUMBER, P_INC IN NUMBER) IS
BEGIN
UPDATE EMP
SET SAL = SAL + P_INC
WHERE EMPNO = P_EMPNO;
END;

FUNCTION GET_SAL(P_EMPNO IN NUMBER) RETURN NUMBER IS
V_SAL NUMBER;
BEGIN
SELECT SAL INTO V_SAL
FROM EMP
WHERE EMPNO = P_EMPNO;
RETURN V_SAL;
END;

END PKG_EMP;
/

호출:


BEGIN
PKG_EMP.UPD_SALARY(7369, 300);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;8022&quot; data-start=&quot;8009&quot; data-section-id=&quot;k0byae&quot;&gt;17. TRIGGER&lt;/h1&gt;
&lt;p data-end=&quot;8061&quot; data-start=&quot;8024&quot; data-ke-size=&quot;size16&quot;&gt;트리거는 특정 이벤트가 발생했을 때 자동 실행되는 PL/SQL이다.&lt;/p&gt;
&lt;p data-end=&quot;8065&quot; data-start=&quot;8063&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8117&quot; data-start=&quot;8066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8085&quot; data-start=&quot;8066&quot; data-section-id=&quot;1ds66mj&quot;&gt;INSERT 시 자동 로그 저장&lt;/li&gt;
&lt;li data-end=&quot;8105&quot; data-start=&quot;8086&quot; data-section-id=&quot;1jp4gxw&quot;&gt;UPDATE 시 변경 이력 기록&lt;/li&gt;
&lt;li data-end=&quot;8117&quot; data-start=&quot;8106&quot; data-section-id=&quot;zu1cu0&quot;&gt;DELETE 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974583361&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER TRG_EMP_LOG
AFTER INSERT ON EMP
FOR EACH ROW
BEGIN
INSERT INTO EMP_LOG(LOG_MSG, LOG_DATE)
VALUES('사원 등록: ' || :NEW.EMPNO, SYSDATE);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;8309&quot; data-start=&quot;8304&quot; data-section-id=&quot;1me329&quot; data-ke-size=&quot;size26&quot;&gt;주의&lt;/h2&gt;
&lt;p data-end=&quot;8333&quot; data-start=&quot;8310&quot; data-ke-size=&quot;size16&quot;&gt;트리거는 편하지만 남발하면 운영이 힘들다.&lt;/p&gt;
&lt;p data-end=&quot;8338&quot; data-start=&quot;8335&quot; data-ke-size=&quot;size16&quot;&gt;이유:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8378&quot; data-start=&quot;8339&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8360&quot; data-start=&quot;8339&quot; data-section-id=&quot;1whdpw9&quot;&gt;어디서 자동 실행되는지 추적 어려움&lt;/li&gt;
&lt;li data-end=&quot;8368&quot; data-start=&quot;8361&quot; data-section-id=&quot;wx1it4&quot;&gt;성능 영향&lt;/li&gt;
&lt;li data-end=&quot;8378&quot; data-start=&quot;8369&quot; data-section-id=&quot;1ufcr2l&quot;&gt;디버깅 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;8397&quot; data-start=&quot;8385&quot; data-section-id=&quot;xajb93&quot;&gt;18. 동적 SQL&lt;/h1&gt;
&lt;p data-end=&quot;8433&quot; data-start=&quot;8399&quot; data-ke-size=&quot;size16&quot;&gt;실행 시점에 SQL 문장을 문자열로 만들어 실행하는 방식이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974590121&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
EXECUTE IMMEDIATE 'UPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = 7369';
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;8543&quot; data-start=&quot;8535&quot; data-ke-size=&quot;size16&quot;&gt;사용하는 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8578&quot; data-start=&quot;8544&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8567&quot; data-start=&quot;8544&quot; data-section-id=&quot;jmqtjq&quot;&gt;테이블명/컬럼명이 동적으로 바뀌는 경우&lt;/li&gt;
&lt;li data-end=&quot;8578&quot; data-start=&quot;8568&quot; data-section-id=&quot;1sz2hpc&quot;&gt;동적 조건 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;8583&quot; data-start=&quot;8580&quot; data-ke-size=&quot;size16&quot;&gt;주의:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8619&quot; data-start=&quot;8584&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8599&quot; data-start=&quot;8584&quot; data-section-id=&quot;1rg9kvl&quot;&gt;SQL Injection&lt;/li&gt;
&lt;li data-end=&quot;8608&quot; data-start=&quot;8600&quot; data-section-id=&quot;1rmop8k&quot;&gt;가독성 저하&lt;/li&gt;
&lt;li data-end=&quot;8619&quot; data-start=&quot;8609&quot; data-section-id=&quot;1p6nnis&quot;&gt;유지보수 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;8654&quot; data-start=&quot;8626&quot; data-section-id=&quot;17x04gl&quot;&gt;19. PL/SQL에서 자주 보는 시스템 패키지&lt;/h1&gt;
&lt;h2 data-end=&quot;8670&quot; data-start=&quot;8656&quot; data-section-id=&quot;1endy4d&quot; data-ke-size=&quot;size26&quot;&gt;DBMS_OUTPUT&lt;/h2&gt;
&lt;p data-end=&quot;8674&quot; data-start=&quot;8671&quot; data-ke-size=&quot;size16&quot;&gt;출력용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;DBMS_OUTPUT.PUT_LINE(&lt;/span&gt;&lt;span&gt;'TEST'&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;8735&quot; data-start=&quot;8718&quot; data-section-id=&quot;vsfmid&quot; data-ke-size=&quot;size26&quot;&gt;DBMS_SCHEDULER&lt;/h2&gt;
&lt;p data-end=&quot;8745&quot; data-start=&quot;8736&quot; data-ke-size=&quot;size16&quot;&gt;배치/스케줄 작업&lt;/p&gt;
&lt;h2 data-end=&quot;8758&quot; data-start=&quot;8747&quot; data-section-id=&quot;1dp8wh&quot; data-ke-size=&quot;size26&quot;&gt;UTL_FILE&lt;/h2&gt;
&lt;p data-end=&quot;8767&quot; data-start=&quot;8759&quot; data-ke-size=&quot;size16&quot;&gt;파일 읽기/쓰기&lt;/p&gt;
&lt;h2 data-end=&quot;8780&quot; data-start=&quot;8769&quot; data-section-id=&quot;tf78y4&quot; data-ke-size=&quot;size26&quot;&gt;DBMS_SQL&lt;/h2&gt;
&lt;p data-end=&quot;8790&quot; data-start=&quot;8781&quot; data-ke-size=&quot;size16&quot;&gt;동적 SQL 처리&lt;/p&gt;
&lt;h2 data-end=&quot;8803&quot; data-start=&quot;8792&quot; data-section-id=&quot;tf6ymd&quot; data-ke-size=&quot;size26&quot;&gt;DBMS_JOB&lt;/h2&gt;
&lt;p data-end=&quot;8812&quot; data-start=&quot;8804&quot; data-ke-size=&quot;size16&quot;&gt;구버전 잡 관리&lt;/p&gt;
&lt;h1 data-end=&quot;8837&quot; data-start=&quot;8819&quot; data-section-id=&quot;n9uqjg&quot;&gt;20. 실무에서 많이 하는 일&lt;/h1&gt;
&lt;p data-end=&quot;8858&quot; data-start=&quot;8839&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL은 보통 이런 데 쓴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8945&quot; data-start=&quot;8860&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8869&quot; data-start=&quot;8860&quot; data-section-id=&quot;3h917s&quot;&gt;배치 프로그램&lt;/li&gt;
&lt;li data-end=&quot;8884&quot; data-start=&quot;8870&quot; data-section-id=&quot;1gjwvip&quot;&gt;인터페이스 데이터 적재&lt;/li&gt;
&lt;li data-end=&quot;8895&quot; data-start=&quot;8885&quot; data-section-id=&quot;gjh2a2&quot;&gt;정산/집계 로직&lt;/li&gt;
&lt;li data-end=&quot;8907&quot; data-start=&quot;8896&quot; data-section-id=&quot;1ekpakh&quot;&gt;이력 데이터 관리&lt;/li&gt;
&lt;li data-end=&quot;8916&quot; data-start=&quot;8908&quot; data-section-id=&quot;1n8sc0a&quot;&gt;검증/후처리&lt;/li&gt;
&lt;li data-end=&quot;8933&quot; data-start=&quot;8917&quot; data-section-id=&quot;19ewxt9&quot;&gt;프로시저 기반 업무 API&lt;/li&gt;
&lt;li data-end=&quot;8945&quot; data-start=&quot;8934&quot; data-section-id=&quot;1w1uw5d&quot;&gt;대량 데이터 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;8971&quot; data-start=&quot;8947&quot; data-ke-size=&quot;size16&quot;&gt;특히 금융/공공/레거시 SI에서 많이 본다.&lt;/p&gt;
&lt;p data-end=&quot;8979&quot; data-start=&quot;8973&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;9037&quot; data-start=&quot;8980&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8990&quot; data-start=&quot;8980&quot; data-section-id=&quot;aor0fk&quot;&gt;거래 마감 배치&lt;/li&gt;
&lt;li data-end=&quot;8999&quot; data-start=&quot;8991&quot; data-section-id=&quot;1hmmfqo&quot;&gt;수수료 계산&lt;/li&gt;
&lt;li data-end=&quot;9007&quot; data-start=&quot;9000&quot; data-section-id=&quot;poocl&quot;&gt;일별 집계&lt;/li&gt;
&lt;li data-end=&quot;9024&quot; data-start=&quot;9008&quot; data-section-id=&quot;rjzrpl&quot;&gt;전문 수신 후 테이블 적재&lt;/li&gt;
&lt;li data-end=&quot;9037&quot; data-start=&quot;9025&quot; data-section-id=&quot;k52w&quot;&gt;에러 데이터 재처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;9052&quot; data-start=&quot;9044&quot; data-section-id=&quot;nxqny6&quot;&gt;21. 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;9068&quot; data-start=&quot;9054&quot; data-section-id=&quot;rd5mrm&quot; data-ke-size=&quot;size26&quot;&gt;1) DB 내부 실행&lt;/h2&gt;
&lt;p data-end=&quot;9089&quot; data-start=&quot;9069&quot; data-ke-size=&quot;size16&quot;&gt;애플리케이션 서버를 거치지 않아도 됨&lt;/p&gt;
&lt;h2 data-end=&quot;9110&quot; data-start=&quot;9091&quot; data-section-id=&quot;1yf2thu&quot; data-ke-size=&quot;size26&quot;&gt;2) 성능상 유리한 경우 있음&lt;/h2&gt;
&lt;p data-end=&quot;9138&quot; data-start=&quot;9111&quot; data-ke-size=&quot;size16&quot;&gt;SQL과 가까워서 대량 처리에 강한 케이스가 있음&lt;/p&gt;
&lt;h2 data-end=&quot;9156&quot; data-start=&quot;9140&quot; data-section-id=&quot;ebg9rv&quot; data-ke-size=&quot;size26&quot;&gt;3) 트랜잭션 제어 용이&lt;/h2&gt;
&lt;p data-end=&quot;9175&quot; data-start=&quot;9157&quot; data-ke-size=&quot;size16&quot;&gt;업무 로직을 한 단위로 묶기 쉬움&lt;/p&gt;
&lt;h2 data-end=&quot;9191&quot; data-start=&quot;9177&quot; data-section-id=&quot;2ztrxz&quot; data-ke-size=&quot;size26&quot;&gt;4) 보안/권한 관리&lt;/h2&gt;
&lt;p data-end=&quot;9224&quot; data-start=&quot;9192&quot; data-ke-size=&quot;size16&quot;&gt;테이블 직접 권한 대신 프로시저 실행 권한만 줄 수도 있음&lt;/p&gt;
&lt;h1 data-end=&quot;9239&quot; data-start=&quot;9231&quot; data-section-id=&quot;ny9dhs&quot;&gt;22. 단점&lt;/h1&gt;
&lt;h2 data-end=&quot;9254&quot; data-start=&quot;9241&quot; data-section-id=&quot;1mx5cq0&quot; data-ke-size=&quot;size26&quot;&gt;1) 오라클 종속성&lt;/h2&gt;
&lt;p data-end=&quot;9268&quot; data-start=&quot;9255&quot; data-ke-size=&quot;size16&quot;&gt;다른 DB로 이관 어려움&lt;/p&gt;
&lt;h2 data-end=&quot;9301&quot; data-start=&quot;9270&quot; data-section-id=&quot;rld713&quot; data-ke-size=&quot;size26&quot;&gt;2) 복잡한 비즈니스 로직은 가독성 떨어질 수 있음&lt;/h2&gt;
&lt;p data-end=&quot;9328&quot; data-start=&quot;9302&quot; data-ke-size=&quot;size16&quot;&gt;너무 많은 로직이 DB에 들어가면 관리가 어려움&lt;/p&gt;
&lt;h2 data-end=&quot;9342&quot; data-start=&quot;9330&quot; data-section-id=&quot;1h6plru&quot; data-ke-size=&quot;size26&quot;&gt;3) 디버깅 불편&lt;/h2&gt;
&lt;p data-end=&quot;9368&quot; data-start=&quot;9343&quot; data-ke-size=&quot;size16&quot;&gt;일반 애플리케이션 언어보다 추적이 번거로운 편&lt;/p&gt;
&lt;h2 data-end=&quot;9387&quot; data-start=&quot;9370&quot; data-section-id=&quot;zouhtr&quot; data-ke-size=&quot;size26&quot;&gt;4) 잘못 짜면 성능 저하&lt;/h2&gt;
&lt;p data-end=&quot;9407&quot; data-start=&quot;9388&quot; data-ke-size=&quot;size16&quot;&gt;특히 한 건씩 처리하는 로직이 문제&lt;/p&gt;
&lt;h1 data-end=&quot;9434&quot; data-start=&quot;9414&quot; data-section-id=&quot;1652s0&quot;&gt;23. 성능에서 매우 중요한 개념&lt;/h1&gt;
&lt;p data-end=&quot;9452&quot; data-start=&quot;9436&quot; data-ke-size=&quot;size16&quot;&gt;이건 실무에서 진짜 중요하다.&lt;/p&gt;
&lt;h2 data-end=&quot;9473&quot; data-start=&quot;9454&quot; data-section-id=&quot;7dxb23&quot; data-ke-size=&quot;size26&quot;&gt;Row-by-Row 처리 지양&lt;/h2&gt;
&lt;p data-end=&quot;9513&quot; data-start=&quot;9474&quot; data-ke-size=&quot;size16&quot;&gt;PL/SQL 루프 돌면서 한 건씩 UPDATE 하는 건 느릴 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;9527&quot; data-start=&quot;9515&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 이런 방식:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974668406&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOR REC IN (SELECT EMPNO FROM EMP) LOOP
UPDATE EMP
SET SAL = SAL + 100
WHERE EMPNO = REC.EMPNO;
END LOOP;

이건 비효율적일 수 있다.

차라리 SQL 한 번으로:


UPDATE EMP
SET SAL = SAL + 100;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;9751&quot; data-start=&quot;9742&quot; data-ke-size=&quot;size16&quot;&gt;이게 훨씬 낫다.&lt;/p&gt;
&lt;p data-end=&quot;9755&quot; data-start=&quot;9753&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;p data-end=&quot;9810&quot; data-start=&quot;9757&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;할 수 있으면 SQL로 한 번에 처리&lt;/b&gt;&lt;br /&gt;  꼭 필요할 때만 PL/SQL 제어문 사용&lt;/p&gt;
&lt;h1 data-end=&quot;9837&quot; data-start=&quot;9817&quot; data-section-id=&quot;m5hr25&quot;&gt;24. SQL과 PL/SQL 차이&lt;/h1&gt;
&lt;h2 data-end=&quot;9845&quot; data-start=&quot;9839&quot; data-section-id=&quot;1hryx0r&quot; data-ke-size=&quot;size26&quot;&gt;SQL&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;9881&quot; data-start=&quot;9846&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;9854&quot; data-start=&quot;9846&quot; data-section-id=&quot;s6fq7d&quot;&gt;선언형 언어&lt;/li&gt;
&lt;li data-end=&quot;9870&quot; data-start=&quot;9855&quot; data-section-id=&quot;gymsy&quot;&gt;&amp;ldquo;무엇을 원하는지&amp;rdquo; 기술&lt;/li&gt;
&lt;li data-end=&quot;9881&quot; data-start=&quot;9871&quot; data-section-id=&quot;1umudyz&quot;&gt;조회/변경 중심&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;9892&quot; data-start=&quot;9883&quot; data-section-id=&quot;1ae0j88&quot; data-ke-size=&quot;size26&quot;&gt;PL/SQL&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;9933&quot; data-start=&quot;9893&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;9901&quot; data-start=&quot;9893&quot; data-section-id=&quot;1a4hes1&quot;&gt;절차형 언어&lt;/li&gt;
&lt;li data-end=&quot;9917&quot; data-start=&quot;9902&quot; data-section-id=&quot;1yzpbwu&quot;&gt;&amp;ldquo;어떻게 처리할지&amp;rdquo; 기술&lt;/li&gt;
&lt;li data-end=&quot;9933&quot; data-start=&quot;9918&quot; data-section-id=&quot;3w2y58&quot;&gt;로직/제어/예외처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;9937&quot; data-start=&quot;9935&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;10001&quot; data-start=&quot;9939&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;9960&quot; data-start=&quot;9939&quot; data-section-id=&quot;2709r9&quot;&gt;SQL: &amp;ldquo;10번 부서 급여 올려&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;10001&quot; data-start=&quot;9961&quot; data-section-id=&quot;qnefcr&quot;&gt;PL/SQL: &amp;ldquo;조건 확인하고, 로그 남기고, 예외 처리하고, 올려&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;10026&quot; data-start=&quot;10008&quot; data-section-id=&quot;17fpgm7&quot;&gt;25. 자주 나오는 문법 정리&lt;/h1&gt;
&lt;h2 data-end=&quot;10037&quot; data-start=&quot;10028&quot; data-section-id=&quot;uykm55&quot; data-ke-size=&quot;size26&quot;&gt;문자열 연결&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974644971&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;V_MSG := '이름: ' || V_NAME;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;10082&quot; data-start=&quot;10077&quot; data-section-id=&quot;1m4vzl&quot; data-ke-size=&quot;size26&quot;&gt;비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773974652403&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF V_NUM = 10 THEN&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;10124&quot; data-start=&quot;10114&quot; data-section-id=&quot;yl0idi&quot; data-ke-size=&quot;size26&quot;&gt;NULL 체크&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;IF&lt;/span&gt;&lt;span&gt; V_NAME &lt;/span&gt;&lt;span&gt;IS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;10175&quot; data-start=&quot;10160&quot; data-ke-size=&quot;size16&quot;&gt;주의: = NULL 아님&lt;/p&gt;
&lt;h2 data-end=&quot;10187&quot; data-start=&quot;10182&quot; data-section-id=&quot;1me4as&quot; data-ke-size=&quot;size26&quot;&gt;주석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974635315&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 한 줄 주석

/*
여러 줄 주석
*/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-end=&quot;10244&quot; data-start=&quot;10230&quot; data-section-id=&quot;wudlyg&quot;&gt;26. 실무 예제 하나&lt;/h1&gt;
&lt;p data-end=&quot;10290&quot; data-start=&quot;10246&quot; data-ke-size=&quot;size16&quot;&gt;사번을 받아 직원 급여를 10% 인상하고, 없으면 에러 메시지 출력하는 예제다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773974614651&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_INC_SAL (
P_EMPNO IN EMP.EMPNO%TYPE
)
IS
V_CNT NUMBER;
BEGIN
SELECT COUNT(*)
INTO V_CNT
FROM EMP
WHERE EMPNO = P_EMPNO;

IF V_CNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('해당 사원이 없습니다.');
ELSE
UPDATE EMP
SET SAL = SAL * 1.1
WHERE EMPNO = P_EMPNO;

DBMS_OUTPUT.PUT_LINE('급여 인상 완료');
END IF;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('오류: ' || SQLERRM);
ROLLBACK;
END;
/

실행:


BEGIN
PRC_INC_SAL(7369);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;11884&quot; data-start=&quot;11770&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DataBase</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/41</guid>
      <comments>https://the1995-dev-note.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 20 Mar 2026 11:45:07 +0900</pubDate>
    </item>
    <item>
      <title>Ant 빌드와 MAVEN 빌드 차이</title>
      <link>https://the1995-dev-note.tistory.com/257</link>
      <description>&lt;h2 data-end=&quot;114&quot; data-start=&quot;91&quot; data-ke-size=&quot;size26&quot;&gt;1) 빌드 철학: 선언형 vs 절차형&lt;/h2&gt;
&lt;h3 data-end=&quot;141&quot; data-start=&quot;116&quot; data-ke-size=&quot;size23&quot;&gt;Ant = 절차형(Imperative)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;259&quot; data-start=&quot;142&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;180&quot; data-start=&quot;142&quot;&gt;개발자가 **빌드 과정(절차)**을 &amp;ldquo;순서대로&amp;rdquo; 직접 작성합니다.&lt;/li&gt;
&lt;li data-end=&quot;259&quot; data-start=&quot;181&quot;&gt;즉, &amp;ldquo;컴파일하려면 폴더 만들고 &amp;rarr; 소스 모으고 &amp;rarr; javac 실행하고 &amp;rarr; jar 만들고 &amp;rarr; 복사하고 &amp;hellip;&amp;rdquo; 를 &lt;b&gt;스크립트처럼&lt;/b&gt; 작성.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;267&quot; data-start=&quot;261&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;319&quot; data-start=&quot;268&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;293&quot; data-start=&quot;268&quot;&gt;원하는 대로 커스터마이징이 매우 자유롭다.&lt;/li&gt;
&lt;li data-end=&quot;319&quot; data-start=&quot;294&quot;&gt;작은 작업 자동화에 빠르게 붙일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;321&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;401&quot; data-start=&quot;328&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;369&quot; data-start=&quot;328&quot;&gt;프로젝트마다 build.xml 스타일이 제각각이라 &lt;b&gt;표준화가 약함&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;401&quot; data-start=&quot;370&quot;&gt;유지보수 시 &amp;ldquo;이 빌드가 뭘 하는지&amp;rdquo; 이해 비용이 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;436&quot; data-start=&quot;408&quot; data-ke-size=&quot;size23&quot;&gt;Maven = 선언형(Declarative)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;542&quot; data-start=&quot;437&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;492&quot; data-start=&quot;437&quot;&gt;개발자는 &amp;ldquo;무엇을 만들지(결과물)&amp;rdquo; + &amp;ldquo;의존성(라이브러리)&amp;rdquo; + &amp;ldquo;플러그인 설정&amp;rdquo;을 선언하면,&lt;/li&gt;
&lt;li data-end=&quot;542&quot; data-start=&quot;493&quot;&gt;Maven이 정해진 &lt;b&gt;Lifecycle(생명주기)&lt;/b&gt; 에 따라 자동으로 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;550&quot; data-start=&quot;544&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;640&quot; data-start=&quot;551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;595&quot; data-start=&quot;551&quot;&gt;표준 Lifecycle + 표준 디렉토리 구조로 &lt;b&gt;협업/유지보수에 강함&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;596&quot;&gt;의존성 관리가 내장되어 있어 &lt;b&gt;빌드 재현성&lt;/b&gt;이 좋음(누가 빌드해도 동일)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;648&quot; data-start=&quot;642&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;713&quot; data-start=&quot;649&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;649&quot;&gt;Maven 방식에 맞추는 학습이 필요&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;672&quot;&gt;극단적으로 커스텀한 빌드 파이프라인은 플러그인/설정이 복잡해질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;770&quot; data-start=&quot;720&quot; data-ke-size=&quot;size26&quot;&gt;2) 의존성(Dependency) 관리 차이: &amp;ldquo;Maven이 실무 표준인 핵심 이유&amp;rdquo;&lt;/h2&gt;
&lt;h3 data-end=&quot;779&quot; data-start=&quot;772&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;900&quot; data-start=&quot;780&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;808&quot; data-start=&quot;780&quot;&gt;기본적으로 &lt;b&gt;의존성 관리 기능이 없습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;854&quot; data-start=&quot;809&quot;&gt;보통 /lib 폴더에 jar를 수동으로 넣고 classpath에 붙여야한다.&lt;/li&gt;
&lt;li data-end=&quot;900&quot; data-start=&quot;855&quot;&gt;버전 충돌/전이 의존성(라이브러리가 또 다른 라이브러리 요구) 관리가 어려움.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;904&quot; data-start=&quot;902&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;969&quot; data-start=&quot;905&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;922&quot; data-start=&quot;905&quot;&gt;A.jar가 B 1.0 필요&lt;/li&gt;
&lt;li data-end=&quot;969&quot; data-start=&quot;923&quot;&gt;C.jar가 B 2.0 필요&lt;br /&gt;&amp;rarr; Ant는 사람이 판단해서 jar 정리해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1032&quot; data-start=&quot;971&quot; data-ke-size=&quot;size16&quot;&gt;(참고: Ivy 같은 외부 도구로 보완은 가능하지만, Ant 자체의 기본 철학은 &amp;ldquo;직접 관리&amp;rdquo;에 가깝습니다.)&lt;/p&gt;
&lt;h3 data-end=&quot;1043&quot; data-start=&quot;1034&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1197&quot; data-start=&quot;1044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1063&quot; data-start=&quot;1044&quot;&gt;의존성 관리가 핵심 기능입니다.&lt;/li&gt;
&lt;li data-end=&quot;1127&quot; data-start=&quot;1064&quot;&gt;pom.xml에 선언하면 Maven Central/사내 Nexus(Artifactory)에서 자동 다운로드&lt;/li&gt;
&lt;li data-end=&quot;1175&quot; data-start=&quot;1128&quot;&gt;&lt;b&gt;Transitive Dependency(전이 의존성)&lt;/b&gt; 를 자동으로 끌고 옴&lt;/li&gt;
&lt;li data-end=&quot;1197&quot; data-start=&quot;1176&quot;&gt;의존성 트리/충돌 해결 규칙이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1235&quot; data-start=&quot;1199&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;내 PC에는 되는데 서버에서는 안 된다&amp;rdquo; 같은 상황이 줄어듦&lt;/p&gt;
&lt;h2 data-end=&quot;1271&quot; data-start=&quot;1242&quot; data-ke-size=&quot;size26&quot;&gt;3) 빌드 라이프사이클(Lifecycle) 유무&lt;/h2&gt;
&lt;h3 data-end=&quot;1280&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1343&quot; data-start=&quot;1281&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1281&quot;&gt;lifecycle이 없습니다.&lt;/li&gt;
&lt;li data-end=&quot;1343&quot; data-start=&quot;1300&quot;&gt;target을 만들고, target 간 의존관계를 수동으로 연결한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1357&quot; data-start=&quot;1345&quot; data-ke-size=&quot;size16&quot;&gt;즉, 각 프로젝트마다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1427&quot; data-start=&quot;1358&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1374&quot; data-start=&quot;1358&quot;&gt;compile target&lt;/li&gt;
&lt;li data-end=&quot;1388&quot; data-start=&quot;1375&quot;&gt;test target&lt;/li&gt;
&lt;li data-end=&quot;1427&quot; data-start=&quot;1389&quot;&gt;package target&lt;br /&gt;이런 이름/순서가 다 다를 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1438&quot; data-start=&quot;1429&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1462&quot; data-start=&quot;1439&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1462&quot; data-start=&quot;1439&quot;&gt;정해진 lifecycle이 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1470&quot; data-start=&quot;1464&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1614&quot; data-start=&quot;1471&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1492&quot; data-start=&quot;1471&quot;&gt;clean : 이전 산출물 삭제&lt;/li&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1493&quot;&gt;compile : 컴파일&lt;/li&gt;
&lt;li data-end=&quot;1528&quot; data-start=&quot;1511&quot;&gt;test : 테스트 실행&lt;/li&gt;
&lt;li data-end=&quot;1554&quot; data-start=&quot;1529&quot;&gt;package : jar/war 패키징&lt;/li&gt;
&lt;li data-end=&quot;1579&quot; data-start=&quot;1555&quot;&gt;install : 로컬 저장소에 설치&lt;/li&gt;
&lt;li data-end=&quot;1614&quot; data-start=&quot;1580&quot;&gt;deploy : 원격 저장소(사내 repo 등)에 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1654&quot; data-start=&quot;1616&quot; data-ke-size=&quot;size16&quot;&gt;mvn install 한 줄이면 &amp;ldquo;표준 순서&amp;rdquo;로 전체 수행된다.&lt;/p&gt;
&lt;h2 data-end=&quot;1678&quot; data-start=&quot;1661&quot; data-ke-size=&quot;size26&quot;&gt;4) 프로젝트 구조 표준화&lt;/h2&gt;
&lt;h3 data-end=&quot;1687&quot; data-start=&quot;1680&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1757&quot; data-start=&quot;1688&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1701&quot; data-start=&quot;1688&quot;&gt;소스 구조가 자유로움&lt;/li&gt;
&lt;li data-end=&quot;1757&quot; data-start=&quot;1702&quot;&gt;src가 어디인지, 리소스가 어디인지, 테스트가 어디인지 전부 build.xml에 직접 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1796&quot; data-start=&quot;1759&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 팀/프로젝트마다 구조가 달라져 새로 투입된 사람이 적응하기 힘들다.&lt;/p&gt;
&lt;h3 data-end=&quot;1807&quot; data-start=&quot;1798&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1834&quot; data-start=&quot;1808&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1834&quot; data-start=&quot;1808&quot;&gt;표준 디렉토리 구조가 사실상 &amp;ldquo;규격&amp;rdquo;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1842&quot; data-start=&quot;1836&quot; data-ke-size=&quot;size16&quot;&gt;대표 구조:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1924&quot; data-start=&quot;1843&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1860&quot; data-start=&quot;1843&quot;&gt;src/main/java&lt;/li&gt;
&lt;li data-end=&quot;1883&quot; data-start=&quot;1861&quot;&gt;src/main/resources&lt;/li&gt;
&lt;li data-end=&quot;1901&quot; data-start=&quot;1884&quot;&gt;src/test/java&lt;/li&gt;
&lt;li data-end=&quot;1924&quot; data-start=&quot;1902&quot;&gt;src/test/resources&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1962&quot; data-start=&quot;1926&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;처음 보는 프로젝트라도 어디에 뭐가 있는지&amp;rdquo; 바로 예측 가능&lt;/p&gt;
&lt;h2 data-end=&quot;1996&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size26&quot;&gt;5) 확장 방식: Task vs Plugin&lt;/h2&gt;
&lt;h3 data-end=&quot;2005&quot; data-start=&quot;1998&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2106&quot; data-start=&quot;2006&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2050&quot; data-start=&quot;2006&quot;&gt;task 중심: javac, copy, jar 같은 태스크를 조합&lt;/li&gt;
&lt;li data-end=&quot;2106&quot; data-start=&quot;2051&quot;&gt;고급 기능은 custom task를 추가해야 하고, 경우에 따라 Java로 task를 직접 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2117&quot; data-start=&quot;2108&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2241&quot; data-start=&quot;2118&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2155&quot; data-start=&quot;2118&quot;&gt;plugin 중심: 빌드의 대부분 기능이 plugin으로 제공됨&lt;/li&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2156&quot;&gt;예: 컴파일, 테스트, 패키징, shading(uber-jar), 코드 품질(SpotBugs/Checkstyle), 커버리지(JaCoCo), 배포 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2275&quot; data-start=&quot;2243&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;표준 plugin + 설정&amp;rdquo;으로 해결되는 범위가 넓음&lt;/p&gt;
&lt;h2 data-end=&quot;2305&quot; data-start=&quot;2282&quot; data-ke-size=&quot;size26&quot;&gt;6) 멀티모듈/대규모 프로젝트 적합성&lt;/h2&gt;
&lt;h3 data-end=&quot;2314&quot; data-start=&quot;2307&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2373&quot; data-start=&quot;2315&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2346&quot; data-start=&quot;2315&quot;&gt;멀티모듈 구성은 가능하지만 보통 스크립트가 복잡해지고&lt;/li&gt;
&lt;li data-end=&quot;2373&quot; data-start=&quot;2347&quot;&gt;의존성/버전 관리가 사람 손을 많이 거치게된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2384&quot; data-start=&quot;2375&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2462&quot; data-start=&quot;2385&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2435&quot; data-start=&quot;2385&quot;&gt;멀티모듈에 매우 강함 (parent pom, dependencyManagement 등)&lt;/li&gt;
&lt;li data-end=&quot;2462&quot; data-start=&quot;2436&quot;&gt;버전 통합 관리, 공통 플러그인 관리가 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2507&quot; data-start=&quot;2464&quot; data-ke-size=&quot;size16&quot;&gt;대기업 SI/플랫폼에서 Maven을 많이 쓰는 이유 중 하나&lt;/p&gt;
&lt;h2 data-end=&quot;2528&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size26&quot;&gt;7) CI/CD 관점&lt;/h2&gt;
&lt;h3 data-end=&quot;2537&quot; data-start=&quot;2530&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2616&quot; data-start=&quot;2538&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2574&quot; data-start=&quot;2538&quot;&gt;환경 의존적이 되기 쉬움(경로, lib, 특정 서버 설정 등)&lt;/li&gt;
&lt;li data-end=&quot;2616&quot; data-start=&quot;2575&quot;&gt;빌드 재현성(reproducible build)을 맞추려면 규율이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2627&quot; data-start=&quot;2618&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2731&quot; data-start=&quot;2628&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2646&quot; data-start=&quot;2628&quot;&gt;의존성/빌드 단계가 표준화되어&lt;/li&gt;
&lt;li data-end=&quot;2690&quot; data-start=&quot;2647&quot;&gt;CI 파이프라인이 단순해짐 (mvn clean verify 같은 방식)&lt;/li&gt;
&lt;li data-end=&quot;2731&quot; data-start=&quot;2691&quot;&gt;사내 저장소(Nexus/Artifactory)와 연동해 운영하기 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2756&quot; data-start=&quot;2738&quot; data-ke-size=&quot;size26&quot;&gt;8) 산출물/버전 관리 방식&lt;/h2&gt;
&lt;h3 data-end=&quot;2765&quot; data-start=&quot;2758&quot; data-ke-size=&quot;size23&quot;&gt;Ant&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2818&quot; data-start=&quot;2766&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2791&quot; data-start=&quot;2766&quot;&gt;버전 관리 체계가 빌드 스크립트에서 제각각&lt;/li&gt;
&lt;li data-end=&quot;2818&quot; data-start=&quot;2792&quot;&gt;jar/war 이름 규칙도 프로젝트마다 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2829&quot; data-start=&quot;2820&quot; data-ke-size=&quot;size23&quot;&gt;Maven&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2905&quot; data-start=&quot;2830&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2873&quot; data-start=&quot;2830&quot;&gt;groupId:artifactId:version 좌표로 아티팩트를 관리&lt;/li&gt;
&lt;li data-end=&quot;2905&quot; data-start=&quot;2874&quot;&gt;배포/저장소 관리까지 빌드 프로세스에 자연스럽게 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2925&quot; data-start=&quot;2912&quot; data-ke-size=&quot;size26&quot;&gt;9)&amp;nbsp; Ant 와 Maven 비교표&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3205&quot; data-start=&quot;2927&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ant&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Maven&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2991&quot; data-start=&quot;2962&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2967&quot; data-start=&quot;2962&quot;&gt;철학&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2978&quot; data-start=&quot;2967&quot;&gt;절차형(How)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2991&quot; data-start=&quot;2978&quot;&gt;선언형(What)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3024&quot; data-start=&quot;2992&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3000&quot; data-start=&quot;2992&quot;&gt;표준 구조&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3009&quot; data-start=&quot;3000&quot;&gt;없음(자유)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3024&quot; data-start=&quot;3009&quot;&gt;있음(강제에 가까움)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3064&quot; data-start=&quot;3025&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3034&quot; data-start=&quot;3025&quot;&gt;의존성 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3046&quot; data-start=&quot;3034&quot;&gt;기본 없음(수동)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3064&quot; data-start=&quot;3046&quot;&gt;내장(자동, 전이 의존성)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3099&quot; data-start=&quot;3065&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3074&quot; data-start=&quot;3065&quot;&gt;라이프사이클&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3086&quot; data-start=&quot;3074&quot;&gt;없음(직접 구성)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3099&quot; data-start=&quot;3086&quot;&gt;있음(표준 단계)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3138&quot; data-start=&quot;3100&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3105&quot; data-start=&quot;3100&quot;&gt;확장&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3124&quot; data-start=&quot;3105&quot;&gt;task/custom task&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3138&quot; data-start=&quot;3124&quot;&gt;plugin 생태계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3171&quot; data-start=&quot;3139&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3150&quot; data-start=&quot;3139&quot;&gt;대규모/멀티모듈&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3162&quot; data-start=&quot;3150&quot;&gt;관리 난이도 상승&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3171&quot; data-start=&quot;3162&quot;&gt;강력 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3205&quot; data-start=&quot;3172&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3185&quot; data-start=&quot;3172&quot;&gt;재현성/CI 친화성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3193&quot; data-start=&quot;3185&quot;&gt;규율 필요&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3205&quot; data-start=&quot;3193&quot;&gt;기본적으로 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>Back-End/Java</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/257</guid>
      <comments>https://the1995-dev-note.tistory.com/257#entry257comment</comments>
      <pubDate>Wed, 25 Feb 2026 17:49:42 +0900</pubDate>
    </item>
    <item>
      <title>JKS(Java KeyStore) 파일 과 JKS 의 키체인</title>
      <link>https://the1995-dev-note.tistory.com/238</link>
      <description>&lt;h2 data-end=&quot;111&quot; data-start=&quot;94&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ JKS 파일이 뭐냐&lt;/h2&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;112&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JKS = Java KeyStore&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;248&quot; data-start=&quot;137&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;173&quot; data-start=&quot;137&quot;&gt;자바 기반 시스템에서 &lt;b&gt;인증서와 개인키를 저장하는 보관소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;203&quot; data-start=&quot;174&quot;&gt;파일 하나에 여러 개의 인증서/키를 담을 수 있음&lt;/li&gt;
&lt;li data-end=&quot;248&quot; data-start=&quot;204&quot;&gt;주로 &lt;b&gt;SSL/TLS(HTTPS), 서버 인증, 클라이언트 인증&lt;/b&gt;에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770255276818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server.jks
truststore.jks
keystore.jks&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;342&quot; data-start=&quot;316&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ JKS 안에 들어가는 것들 (핵심)&lt;/h2&gt;
&lt;p data-end=&quot;379&quot; data-start=&quot;343&quot; data-ke-size=&quot;size16&quot;&gt;JKS에는 &lt;b&gt;엔트리(entry)&lt;/b&gt; 가 있고, 타입이 다릅니다.&lt;/p&gt;
&lt;h3 data-end=&quot;414&quot; data-start=&quot;381&quot; data-ke-size=&quot;size23&quot;&gt;  1) PrivateKeyEntry (가장 중요)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;461&quot; data-start=&quot;415&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;442&quot; data-start=&quot;415&quot;&gt;&lt;b&gt;개인키 + 서버 인증서 + 인증서 체인&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;461&quot; data-start=&quot;443&quot;&gt;HTTPS 서버 구동 시 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770255454166&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[개인키]
[서버 인증서]
[중간 CA]
[루트 CA]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;keystore&lt;/b&gt; 용도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;561&quot; data-start=&quot;528&quot; data-ke-size=&quot;size23&quot;&gt;  2) TrustedCertificateEntry&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;605&quot; data-start=&quot;562&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;562&quot;&gt;&lt;b&gt;CA 인증서(신뢰용)&lt;/b&gt; 만 들어 있음&lt;/li&gt;
&lt;li data-end=&quot;605&quot; data-start=&quot;588&quot;&gt;상대 서버를 믿기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;627&quot; data-start=&quot;607&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;truststore&lt;/b&gt; 용도&lt;/p&gt;
&lt;h2 data-end=&quot;676&quot; data-start=&quot;634&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ Keystore vs Truststore (무조건 구분해야 함)&lt;/h2&gt;
&lt;p data-end=&quot;702&quot; data-start=&quot;677&quot; data-ke-size=&quot;size16&quot;&gt;이거 헷갈리면 SSL 문제 100% 터집니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;885&quot; data-start=&quot;704&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt; KeystoreTruststore &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Truststore&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;792&quot; data-start=&quot;752&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;757&quot; data-start=&quot;752&quot;&gt;역할&lt;/td&gt;
&lt;td data-end=&quot;774&quot; data-start=&quot;757&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;내가 누구인지 증명&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;792&quot; data-start=&quot;774&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;상대를 믿을지 결정&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;820&quot; data-start=&quot;793&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;798&quot; data-start=&quot;793&quot;&gt;포함&lt;/td&gt;
&lt;td data-end=&quot;810&quot; data-start=&quot;798&quot; data-col-size=&quot;sm&quot;&gt;개인키 + 인증서&lt;/td&gt;
&lt;td data-end=&quot;820&quot; data-start=&quot;810&quot; data-col-size=&quot;sm&quot;&gt;CA 인증서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;852&quot; data-start=&quot;821&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;828&quot; data-start=&quot;821&quot;&gt;사용 예&lt;/td&gt;
&lt;td data-end=&quot;839&quot; data-start=&quot;828&quot; data-col-size=&quot;sm&quot;&gt;HTTPS 서버&lt;/td&gt;
&lt;td data-end=&quot;852&quot; data-start=&quot;839&quot; data-col-size=&quot;sm&quot;&gt;외부 API 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;885&quot; data-start=&quot;853&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;859&quot; data-start=&quot;853&quot;&gt;파일명&lt;/td&gt;
&lt;td data-end=&quot;872&quot; data-start=&quot;859&quot; data-col-size=&quot;sm&quot;&gt;server.jks&lt;/td&gt;
&lt;td data-end=&quot;885&quot; data-start=&quot;872&quot; data-col-size=&quot;sm&quot;&gt;trust.jks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;929&quot; data-start=&quot;887&quot; data-ke-size=&quot;size16&quot;&gt;  한 파일에 둘 다 넣을 수도 있지만&lt;br /&gt;  &lt;b&gt;운영에선 보통 분리&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;960&quot; data-start=&quot;936&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 인증서 흐름 (HTTPS 기준)&lt;/h2&gt;
&lt;h3 data-end=&quot;978&quot; data-start=&quot;961&quot; data-ke-size=&quot;size23&quot;&gt;서버 HTTPS 띄울 때&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1075&quot; data-start=&quot;979&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1016&quot; data-start=&quot;979&quot;&gt;서버가 &lt;b&gt;자기 인증서 + 개인키&lt;/b&gt; 보유 (keystore)&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;1017&quot;&gt;클라이언트 접속&lt;/li&gt;
&lt;li data-end=&quot;1041&quot; data-start=&quot;1029&quot;&gt;서버 인증서 전달&lt;/li&gt;
&lt;li data-end=&quot;1075&quot; data-start=&quot;1042&quot;&gt;클라이언트는 &lt;b&gt;truststore&lt;/b&gt; 에서 CA 검증&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;1099&quot; data-start=&quot;1077&quot; data-ke-size=&quot;size23&quot;&gt;API Gateway / APIM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1174&quot; data-start=&quot;1100&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1135&quot; data-start=&quot;1100&quot;&gt;인바운드 HTTPS &amp;rarr; &lt;b&gt;Gateway keystore&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1174&quot; data-start=&quot;1136&quot;&gt;아웃바운드 HTTPS &amp;rarr; &lt;b&gt;Gateway truststore&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1211&quot; data-start=&quot;1181&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ JKS 관련 필수 명령어 (keytool)&lt;/h2&gt;
&lt;h3 data-end=&quot;1228&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;  JKS 내용 보기&lt;/h3&gt;
&lt;pre id=&quot;code_1770255512393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -list -v -keystore server.jks&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특정 alias 보기&lt;/p&gt;
&lt;pre id=&quot;code_1770255525303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -list -keystore server.jks -alias apim_ssl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  CA 인증서 추가 (truststore)&lt;/p&gt;
&lt;pre id=&quot;code_1770255535416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -import -alias rootca \
 -file rootca.crt \
 -keystore trust.jks&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1522&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ JKS &amp;harr; PEM &amp;harr; PKCS12 관계 (실무에서 중요)&lt;/h2&gt;
&lt;p data-end=&quot;1563&quot; data-start=&quot;1523&quot; data-ke-size=&quot;size16&quot;&gt;요즘은 JKS보다 &lt;b&gt;PKCS12(.p12/.pfx)&lt;/b&gt; 가 표준입니다&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-end=&quot;1658&quot; data-start=&quot;1565&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;포맷&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1604&quot; data-start=&quot;1589&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1595&quot; data-start=&quot;1589&quot;&gt;JKS&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1604&quot; data-start=&quot;1595&quot;&gt;자바 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1631&quot; data-start=&quot;1605&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1614&quot; data-start=&quot;1605&quot;&gt;PKCS12&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1631&quot; data-start=&quot;1614&quot;&gt;범용(자바/웹서버 공용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1658&quot; data-start=&quot;1632&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1638&quot; data-start=&quot;1632&quot;&gt;PEM&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1658&quot; data-start=&quot;1638&quot;&gt;텍스트(cert/key 분리)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  P12 &amp;rarr; JKS&lt;/p&gt;
&lt;pre id=&quot;code_1770255570349&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -importkeystore \
 -srckeystore cert.p12 -srcstoretype PKCS12 \
 -destkeystore server.jks -deststoretype JKS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;165&quot; data-start=&quot;135&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ JKS에서 &amp;ldquo;키체인&amp;rdquo;이 실제로 의미하는 것&lt;/h2&gt;
&lt;p data-end=&quot;173&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;보통 누가&lt;/p&gt;
&lt;blockquote data-end=&quot;194&quot; data-start=&quot;174&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;194&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이 JKS에 키체인 들어있어?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;196&quot; data-ke-size=&quot;size16&quot;&gt;라고 하면 &lt;b&gt;99% 이걸 묻는 겁니다  &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;266&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;PrivateKeyEntry 안에 인증서 체인이 제대로 들어있냐&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;308&quot; data-start=&quot;273&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 인증서 체인(Certificate Chain)이란?&lt;/h2&gt;
&lt;p data-end=&quot;365&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;서버 인증서는 &lt;b&gt;혼자 신뢰되지 않습니다.&lt;/b&gt;&lt;br /&gt;항상 &lt;b&gt;신뢰 사슬(chain)&lt;/b&gt; 로 검증됩니다.&lt;/p&gt;
&lt;p data-end=&quot;365&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770255646349&quot; class=&quot;cs&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[서버 인증서]
   &amp;darr;
[중간 CA 인증서]
   &amp;darr;
[루트 CA 인증서]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;365&quot; data-start=&quot;309&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;447&quot; data-start=&quot;419&quot; data-ke-size=&quot;size16&quot;&gt;이 묶음 전체를 흔히 &lt;b&gt;키체인&lt;/b&gt;이라고 부릅니다.&lt;/p&gt;
&lt;p data-end=&quot;458&quot; data-start=&quot;449&quot; data-ke-size=&quot;size16&quot;&gt;  정확한 용어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;549&quot; data-start=&quot;459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;478&quot; data-start=&quot;459&quot;&gt;개인키 (Private Key)&lt;/li&gt;
&lt;li data-end=&quot;505&quot; data-start=&quot;479&quot;&gt;서버 인증서 (End-Entity Cert)&lt;/li&gt;
&lt;li data-end=&quot;531&quot; data-start=&quot;506&quot;&gt;중간 CA (Intermediate CA)&lt;/li&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;532&quot;&gt;루트 CA (Root CA)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;582&quot; data-start=&quot;556&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ JKS 구조에서 어디에 들어가 있나&lt;/h2&gt;
&lt;h3 data-end=&quot;608&quot; data-start=&quot;583&quot; data-ke-size=&quot;size23&quot;&gt;  PrivateKeyEntry 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1770255667699&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Alias: apim_ssl
Entry type: PrivateKeyEntry
Certificate chain length: 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;717&quot; data-start=&quot;694&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;717&quot; data-start=&quot;694&quot; data-ke-size=&quot;size16&quot;&gt;이게 바로 &lt;b&gt;키체인 있음&lt;/b&gt; 상태입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;734&quot; data-start=&quot;719&quot; data-ke-size=&quot;size23&quot;&gt;  체인 길이 의미&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;805&quot; data-start=&quot;735&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;735&quot;&gt;1 &amp;rarr; 서버 인증서만 있음 ❌&lt;/li&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;754&quot;&gt;2 &amp;rarr; 서버 + 중간 CA&lt;/li&gt;
&lt;li data-end=&quot;805&quot; data-start=&quot;771&quot;&gt;3 이상 &amp;rarr; 서버 + 중간 CA + 루트 CA ⭕ (권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;836&quot; data-start=&quot;812&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 키체인 없으면 무슨 일이 생기냐&lt;/h2&gt;
&lt;p data-end=&quot;852&quot; data-start=&quot;837&quot; data-ke-size=&quot;size16&quot;&gt;아주 흔한 장애 패턴입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;871&quot; data-start=&quot;854&quot; data-ke-size=&quot;size23&quot;&gt;❌ 키체인 누락 시 증상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1042&quot; data-start=&quot;872&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;913&quot; data-start=&quot;872&quot;&gt;브라우저: NET::ERR_CERT_AUTHORITY_INVALID&lt;/li&gt;
&lt;li data-end=&quot;1005&quot; data-start=&quot;914&quot;&gt;Java:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770255690060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PKIX path building failed
unable to find valid certification path&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-End/Java</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/238</guid>
      <comments>https://the1995-dev-note.tistory.com/238#entry238comment</comments>
      <pubDate>Mon, 9 Feb 2026 09:09:48 +0900</pubDate>
    </item>
    <item>
      <title>AWS-EC2(Elastic Compute Cloud)</title>
      <link>https://the1995-dev-note.tistory.com/240</link>
      <description>&lt;h2 data-end=&quot;44&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;EC2란? (Amazon EC2: Elastic Compute Cloud)&lt;/h2&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;EC2는 AWS에서 제공하는 &lt;b&gt;가상 서버(=클라우드 VM) 서비스&lt;/b&gt;야.&lt;br /&gt;필요할 때 몇 분 안에 서버를 만들고, 필요 없으면 끌 수 있고, 트래픽이 늘면 서버 수를 늘려 **수평 확장(scale-out)**도 가능해.&lt;/p&gt;
&lt;h2 data-end=&quot;202&quot; data-start=&quot;177&quot; data-ke-size=&quot;size26&quot;&gt;1) EC2가 해결하는 문제 (왜 쓰나)&lt;/h2&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;204&quot; data-ke-size=&quot;size16&quot;&gt;온프레미스에서 서버 한 대 운영하려면 보통 이런 일이 필요해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;338&quot; data-start=&quot;239&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;257&quot; data-start=&quot;239&quot;&gt;물리 서버 구매/납품/랙 장착&lt;/li&gt;
&lt;li data-end=&quot;282&quot; data-start=&quot;258&quot;&gt;OS 설치, 네트워크 구성, 방화벽 설정&lt;/li&gt;
&lt;li data-end=&quot;309&quot; data-start=&quot;283&quot;&gt;장애 시 부품 교체, 백업/복구, 용량 증설&lt;/li&gt;
&lt;li data-end=&quot;338&quot; data-start=&quot;310&quot;&gt;트래픽 증가 시 서버 추가 구매(시간/비용 큼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;395&quot; data-start=&quot;340&quot; data-ke-size=&quot;size16&quot;&gt;EC2는 이걸 &lt;b&gt;&amp;ldquo;클릭 몇 번(또는 IaC)&amp;rdquo;으로 서버를 생성/확장/폐기&lt;/b&gt;할 수 있게 만들어서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;450&quot; data-start=&quot;396&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;407&quot; data-start=&quot;396&quot;&gt;&lt;b&gt;빠른 배포&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;420&quot; data-start=&quot;408&quot;&gt;&lt;b&gt;유연한 확장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;450&quot; data-start=&quot;421&quot;&gt;&lt;b&gt;비용 효율(사용한 만큼)&lt;/b&gt;&lt;br /&gt;을 가능하게 해.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;481&quot; data-start=&quot;457&quot; data-ke-size=&quot;size26&quot;&gt;2) EC2의 핵심 개념 (구성 요소)&lt;/h2&gt;
&lt;h3 data-end=&quot;517&quot; data-start=&quot;483&quot; data-ke-size=&quot;size23&quot;&gt;(1) AMI (Amazon Machine Image)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;647&quot; data-start=&quot;518&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;550&quot; data-start=&quot;518&quot;&gt;EC2 인스턴스를 만들 때 사용하는 &lt;b&gt;서버 이미지&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;601&quot; data-start=&quot;551&quot;&gt;OS(예: Amazon Linux, Ubuntu, Windows) + 초기 설정 템플릿&lt;/li&gt;
&lt;li data-end=&quot;647&quot; data-start=&quot;602&quot;&gt;기업에서는 &amp;ldquo;표준 AMI&amp;rdquo;를 만들어서 보안 설정/에이전트 등을 포함시키기도 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;679&quot; data-start=&quot;649&quot; data-ke-size=&quot;size23&quot;&gt;(2) 인스턴스 타입(Instance Type)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;746&quot; data-start=&quot;680&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;700&quot; data-start=&quot;680&quot;&gt;CPU/메모리/네트워크 성능 스펙&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;701&quot;&gt;예) t3/t4g(범용), c계열(CPU), r계열(메모리), m계열(밸런스)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;827&quot; data-start=&quot;748&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;827&quot; data-start=&quot;750&quot; data-ke-size=&quot;size16&quot;&gt;블로그 포인트: &amp;ldquo;워크로드에 따라 타입 선택 기준&amp;rdquo;을 적으면 실무감 올라감&lt;br /&gt;예: WAS는 m/c계열, 캐시는 r계열, 빌드는 c계열 등&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;862&quot; data-start=&quot;829&quot; data-ke-size=&quot;size23&quot;&gt;(3) EBS (Elastic Block Store)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;935&quot; data-start=&quot;863&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;891&quot; data-start=&quot;863&quot;&gt;EC2에 붙는 &lt;b&gt;디스크(블록 스토리지)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;921&quot; data-start=&quot;892&quot;&gt;루트 디스크(부팅 디스크)도 EBS인 경우가 많음&lt;/li&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;922&quot;&gt;스냅샷으로 백업 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;963&quot; data-start=&quot;937&quot; data-ke-size=&quot;size23&quot;&gt;(4) 네트워크: VPC / Subnet&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1051&quot; data-start=&quot;964&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1000&quot; data-start=&quot;964&quot;&gt;EC2는 반드시 &lt;b&gt;VPC(가상 네트워크)&lt;/b&gt; 안에서 만들어짐&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;1001&quot;&gt;Public Subnet / Private Subnet에 따라 외부 접근 여부가 달라짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1075&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size23&quot;&gt;(5) Security Group&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1146&quot; data-start=&quot;1076&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1102&quot; data-start=&quot;1076&quot;&gt;EC2 앞단에서 동작하는 &lt;b&gt;가상 방화벽&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1146&quot; data-start=&quot;1103&quot;&gt;인바운드/아웃바운드 규칙으로 포트 오픈 관리 (예: 22, 80, 443)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1199&quot; data-start=&quot;1148&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1199&quot; data-start=&quot;1150&quot; data-ke-size=&quot;size16&quot;&gt;실무 포인트: &amp;ldquo;SG는 Allow만 있고 Deny는 없다&amp;rdquo; 같은 특징도 같이 적으면 좋음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1225&quot; data-start=&quot;1201&quot; data-ke-size=&quot;size23&quot;&gt;(6) Key Pair (SSH 키)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1294&quot; data-start=&quot;1226&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1256&quot; data-start=&quot;1226&quot;&gt;리눅스 EC2에 SSH 접속할 때 쓰는 키(개인키)&lt;/li&gt;
&lt;li data-end=&quot;1294&quot; data-start=&quot;1257&quot;&gt;기업은 보안상 Bastion/SSM으로 직접 SSH를 막기도 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1325&quot; data-start=&quot;1301&quot; data-ke-size=&quot;size26&quot;&gt;3) EC2는 어떻게 동작하나 (흐름)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1440&quot; data-start=&quot;1327&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1338&quot; data-start=&quot;1327&quot;&gt;AMI 선택&lt;/li&gt;
&lt;li data-end=&quot;1354&quot; data-start=&quot;1339&quot;&gt;인스턴스 타입 선택&lt;/li&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1355&quot;&gt;VPC/Subnet 선택&lt;/li&gt;
&lt;li data-end=&quot;1396&quot; data-start=&quot;1374&quot;&gt;보안그룹 설정(포트/접근 IP)&lt;/li&gt;
&lt;li data-end=&quot;1417&quot; data-start=&quot;1397&quot;&gt;스토리지(EBS) 크기 설정&lt;/li&gt;
&lt;li data-end=&quot;1440&quot; data-start=&quot;1418&quot;&gt;생성 후 접속(SSH) &amp;rarr; 앱 배포&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;1480&quot; data-start=&quot;1447&quot; data-ke-size=&quot;size26&quot;&gt;4) EC2를 실무에서 어떤 용도로 쓰나 (대표 사례)&lt;/h2&gt;
&lt;h3 data-end=&quot;1500&quot; data-start=&quot;1482&quot; data-ke-size=&quot;size23&quot;&gt;✅ (1) 웹/WAS 서버&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1546&quot; data-start=&quot;1501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1546&quot; data-start=&quot;1501&quot;&gt;Spring Boot, Node.js, Tomcat 등 애플리케이션 서버 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1568&quot; data-start=&quot;1548&quot; data-ke-size=&quot;size23&quot;&gt;✅ (2) 배치/스케줄러 서버&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1589&quot; data-start=&quot;1569&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1569&quot;&gt;정산, 통계, ETL, 로그 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1620&quot; data-start=&quot;1591&quot; data-ke-size=&quot;size23&quot;&gt;✅ (3) Bastion Host(점프 서버)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1662&quot; data-start=&quot;1621&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1662&quot; data-start=&quot;1621&quot;&gt;외부에서 바로 내부 서버 접근을 막고, &lt;b&gt;중간 관문 서버&lt;/b&gt;로만 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1684&quot; data-start=&quot;1664&quot; data-ke-size=&quot;size23&quot;&gt;✅ (4) 레거시 마이그레이션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1723&quot; data-start=&quot;1685&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1723&quot; data-start=&quot;1685&quot;&gt;&amp;ldquo;온프레미스 VM&amp;rdquo;을 거의 그대로 옮기고 싶을 때 가장 쉬운 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1750&quot; data-start=&quot;1730&quot; data-ke-size=&quot;size26&quot;&gt;5) 장점 / 단점 (냉정하게)&lt;/h2&gt;
&lt;h3 data-end=&quot;1758&quot; data-start=&quot;1752&quot; data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1848&quot; data-start=&quot;1759&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1790&quot; data-start=&quot;1759&quot;&gt;서버를 직접 다루는 자유도 최고(설치/설정 마음대로)&lt;/li&gt;
&lt;li data-end=&quot;1815&quot; data-start=&quot;1791&quot;&gt;기존 리눅스 운영 경험 그대로 활용 가능&lt;/li&gt;
&lt;li data-end=&quot;1848&quot; data-start=&quot;1816&quot;&gt;Auto Scaling/ALB 붙이면 탄력적 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1856&quot; data-start=&quot;1850&quot; data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2013&quot; data-start=&quot;1857&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1921&quot; data-start=&quot;1857&quot;&gt;&lt;b&gt;운영 책임이 크다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1921&quot; data-start=&quot;1875&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1882&quot; data-start=&quot;1875&quot;&gt;OS 패치&lt;/li&gt;
&lt;li data-end=&quot;1896&quot; data-start=&quot;1885&quot;&gt;보안 취약점 조치&lt;/li&gt;
&lt;li data-end=&quot;1911&quot; data-start=&quot;1899&quot;&gt;로그/모니터링 구성&lt;/li&gt;
&lt;li data-end=&quot;1921&quot; data-start=&quot;1914&quot;&gt;장애 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2013&quot; data-start=&quot;1922&quot;&gt;서버 수가 늘면 &amp;ldquo;서버 팜&amp;rdquo;이 되어 운영 복잡도가 급증&lt;br /&gt;&amp;rarr; 그래서 보통 **Auto Scaling + ALB + IaC(Terraform 등)**로 표준화함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2052&quot; data-start=&quot;2020&quot; data-ke-size=&quot;size26&quot;&gt;6) EC2는 언제 쓰고 언제 안 쓰나 (선택 기준)&lt;/h2&gt;
&lt;h3 data-end=&quot;2068&quot; data-start=&quot;2054&quot; data-ke-size=&quot;size23&quot;&gt;EC2가 좋은 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2145&quot; data-start=&quot;2069&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2069&quot;&gt;커스터마이징이 필요한 서버(특정 라이브러리/에이전트/설정)&lt;/li&gt;
&lt;li data-end=&quot;2118&quot; data-start=&quot;2104&quot;&gt;레거시 앱 마이그레이션&lt;/li&gt;
&lt;li data-end=&quot;2145&quot; data-start=&quot;2119&quot;&gt;컨테이너/서버리스 이전 전 단계(중간 단계)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2163&quot; data-start=&quot;2147&quot; data-ke-size=&quot;size23&quot;&gt;EC2가 덜 좋은 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2237&quot; data-start=&quot;2164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2237&quot; data-start=&quot;2164&quot;&gt;&amp;ldquo;서버 운영 자체를 최소화&amp;rdquo;하고 싶을 때&lt;br /&gt;&amp;rarr; ECS/Fargate, Lambda, App Runner 같은 관리형이 더 적합&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Infra&amp;amp;Cloud/AWS</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/240</guid>
      <comments>https://the1995-dev-note.tistory.com/240#entry240comment</comments>
      <pubDate>Mon, 9 Feb 2026 09:09:22 +0900</pubDate>
    </item>
    <item>
      <title>AWS-S3(Amazon Simple Storage Service)</title>
      <link>https://the1995-dev-note.tistory.com/241</link>
      <description>&lt;h2 data-end=&quot;43&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;AWS S3란? (Amazon Simple Storage Service)&lt;/h2&gt;
&lt;p data-end=&quot;141&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;S3는 AWS에서 제공하는 &lt;b&gt;객체 스토리지(Object Storage) 서비스&lt;/b&gt;다.&lt;br /&gt;쉽게 말해 **&amp;ldquo;서버 관리가 필요 없는 초대용량 파일 저장소&amp;rdquo;**라고 보면 된다.&lt;/p&gt;
&lt;h2 data-end=&quot;169&quot; data-start=&quot;148&quot; data-ke-size=&quot;size26&quot;&gt;1) S3가 왜 나왔는가 (배경)&lt;/h2&gt;
&lt;p data-end=&quot;188&quot; data-start=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;기존에 파일을 저장하려면 보통:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;251&quot; data-start=&quot;189&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;202&quot; data-start=&quot;189&quot;&gt;서버에 디스크 붙이고&lt;/li&gt;
&lt;li data-end=&quot;213&quot; data-start=&quot;203&quot;&gt;NAS 구성하고&lt;/li&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;214&quot;&gt;이중화/백업 직접 설계하고&lt;/li&gt;
&lt;li data-end=&quot;251&quot; data-start=&quot;231&quot;&gt;디스크 장애 나면 복구 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;279&quot; data-start=&quot;253&quot; data-ke-size=&quot;size16&quot;&gt;이 과정이 &lt;b&gt;비용도 크고 운영 부담도 큼&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;281&quot; data-ke-size=&quot;size16&quot;&gt;S3는 이런 문제를 해결하기 위해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;348&quot; data-start=&quot;301&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;313&quot; data-start=&quot;301&quot;&gt;저장 용량 제한 ❌&lt;/li&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;314&quot;&gt;서버 관리 ❌&lt;/li&gt;
&lt;li data-end=&quot;334&quot; data-start=&quot;324&quot;&gt;자동 이중화 ⭕&lt;/li&gt;
&lt;li data-end=&quot;348&quot; data-start=&quot;335&quot;&gt;매우 높은 내구성 ⭕&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;350&quot; data-ke-size=&quot;size16&quot;&gt;을 목표로 만들어진 서비스다.&lt;/p&gt;
&lt;h2 data-end=&quot;398&quot; data-start=&quot;373&quot; data-ke-size=&quot;size26&quot;&gt;2) S3 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-end=&quot;483&quot; data-start=&quot;400&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;483&quot; data-start=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S3는 무한 확장 가능한 객체(Object) 기반 스토리지 서비스로,&lt;br /&gt;파일을 Key-Value 형태로 저장하고 높은 내구성을 제공한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;505&quot; data-start=&quot;490&quot; data-ke-size=&quot;size26&quot;&gt;3) S3의 핵심 개념&lt;/h2&gt;
&lt;h3 data-end=&quot;521&quot; data-start=&quot;507&quot; data-ke-size=&quot;size23&quot;&gt;(1) Bucket&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;577&quot; data-start=&quot;522&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;536&quot; data-start=&quot;522&quot;&gt;S3의 최상위 컨테이너&lt;/li&gt;
&lt;li data-end=&quot;561&quot; data-start=&quot;537&quot;&gt;&lt;b&gt;전 세계적으로 이름이 유일&lt;/b&gt;해야 함&lt;/li&gt;
&lt;li data-end=&quot;577&quot; data-start=&quot;562&quot;&gt;Region 단위로 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770271759989&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s3://my-service-bucket/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;626&quot; data-start=&quot;612&quot; data-ke-size=&quot;size23&quot;&gt;(2) Object&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;703&quot; data-start=&quot;627&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;627&quot;&gt;실제 저장되는 파일 단위&lt;/li&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;643&quot;&gt;구성:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;703&quot; data-start=&quot;651&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;673&quot; data-start=&quot;651&quot;&gt;Key (파일 경로처럼 보이는 이름)&lt;/li&gt;
&lt;li data-end=&quot;690&quot; data-start=&quot;676&quot;&gt;Data (파일 내용)&lt;/li&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;693&quot;&gt;Metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;750&quot; data-start=&quot;705&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;750&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ S3에는 &lt;b&gt;폴더 개념이 없음&lt;/b&gt;&lt;br /&gt;/는 단순히 Key 이름의 일부&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) Key&lt;/p&gt;
&lt;pre id=&quot;code_1770271777922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;images/2026/profile.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;854&quot; data-start=&quot;805&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;831&quot; data-start=&quot;805&quot;&gt;디렉터리처럼 보이지만 실제로는 하나의 문자열&lt;/li&gt;
&lt;li data-end=&quot;854&quot; data-start=&quot;832&quot;&gt;이 구조를 잘 설계해야 관리가 편해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;876&quot; data-start=&quot;861&quot; data-ke-size=&quot;size26&quot;&gt;4) S3의 동작 방식&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;960&quot; data-start=&quot;878&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;878&quot;&gt;클라이언트 또는 서버가 S3 API 호출&lt;/li&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;904&quot;&gt;S3는 Object를 &lt;b&gt;여러 AZ에 자동 복제&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;960&quot; data-start=&quot;936&quot;&gt;저장 완료 후 Object URL 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;987&quot; data-start=&quot;967&quot; data-ke-size=&quot;size26&quot;&gt;5) S3의 주요 특징 (중요)&lt;/h2&gt;
&lt;h3 data-end=&quot;1007&quot; data-start=&quot;989&quot; data-ke-size=&quot;size23&quot;&gt;(1) 내구성 vs 가용성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1062&quot; data-start=&quot;1008&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1043&quot; data-start=&quot;1008&quot;&gt;&lt;b&gt;내구성&lt;/b&gt;: 99.999999999% (11 nines)&lt;/li&gt;
&lt;li data-end=&quot;1062&quot; data-start=&quot;1044&quot;&gt;&lt;b&gt;가용성&lt;/b&gt;: 약 99.9%&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1118&quot; data-start=&quot;1064&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1118&quot; data-start=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;블로그 포인트&lt;br /&gt;&amp;ldquo;S3는 거의 절대 안 날아가지만, 순간적으로 접근이 안 될 수는 있다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1141&quot; data-start=&quot;1125&quot; data-ke-size=&quot;size23&quot;&gt;(2) 스토리지 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1260&quot; data-start=&quot;1142&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1163&quot; data-start=&quot;1142&quot;&gt;&lt;b&gt;Standard&lt;/b&gt;: 자주 접근&lt;/li&gt;
&lt;li data-end=&quot;1199&quot; data-start=&quot;1164&quot;&gt;&lt;b&gt;IA (Infrequent Access)&lt;/b&gt;: 가끔 접근&lt;/li&gt;
&lt;li data-end=&quot;1224&quot; data-start=&quot;1200&quot;&gt;&lt;b&gt;One Zone-IA&lt;/b&gt;: 단일 AZ&lt;/li&gt;
&lt;li data-end=&quot;1260&quot; data-start=&quot;1225&quot;&gt;&lt;b&gt;Glacier / Deep Archive&lt;/b&gt;: 장기 보관&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1294&quot; data-start=&quot;1262&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1294&quot; data-start=&quot;1264&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 Lifecycle 정책으로 자동 이동 설정함&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1322&quot; data-start=&quot;1301&quot; data-ke-size=&quot;size26&quot;&gt;6) S3를 실무에서 어떻게 쓰나&lt;/h2&gt;
&lt;h3 data-end=&quot;1347&quot; data-start=&quot;1324&quot; data-ke-size=&quot;size23&quot;&gt;✅ (1) 첨부파일 / 이미지 저장&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1770271791957&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Client]
   &amp;darr;
[Presigned URL]
   &amp;darr;
[S3]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1420&quot; data-start=&quot;1396&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1420&quot; data-start=&quot;1396&quot;&gt;서버 부하 없이 클라이언트가 직접 업로드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1448&quot; data-start=&quot;1427&quot; data-ke-size=&quot;size23&quot;&gt;✅ (2) 로그 / 백업 저장소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1483&quot; data-start=&quot;1449&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1460&quot; data-start=&quot;1449&quot;&gt;애플리케이션 로그&lt;/li&gt;
&lt;li data-end=&quot;1471&quot; data-start=&quot;1461&quot;&gt;DB 백업 파일&lt;/li&gt;
&lt;li data-end=&quot;1483&quot; data-start=&quot;1472&quot;&gt;장기 보관 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1508&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size23&quot;&gt;✅ (3) 정적 웹 호스팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1552&quot; data-start=&quot;1509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1526&quot; data-start=&quot;1509&quot;&gt;HTML / CSS / JS&lt;/li&gt;
&lt;li data-end=&quot;1552&quot; data-start=&quot;1527&quot;&gt;CloudFront와 연계해서 CDN 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1581&quot; data-start=&quot;1559&quot; data-ke-size=&quot;size26&quot;&gt;7) EC2 + S3 아키텍처 예시&lt;/h2&gt;
&lt;pre id=&quot;code_1770271805719&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[EC2 (WAS)]
   &amp;darr; 파일 업로드
[S3]

[Client]
   &amp;darr; 다운로드
[S3 or CloudFront]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;1685&quot; data-start=&quot;1665&quot; data-ke-size=&quot;size26&quot;&gt;8) S3 보안 (중요 포인트)&lt;/h2&gt;
&lt;h3 data-end=&quot;1708&quot; data-start=&quot;1687&quot; data-ke-size=&quot;size23&quot;&gt;(1) Bucket Policy&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1748&quot; data-start=&quot;1709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1709&quot;&gt;Bucket 단위 접근 제어&lt;/li&gt;
&lt;li data-end=&quot;1748&quot; data-start=&quot;1727&quot;&gt;IP, IAM 조건 기반 제어 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1768&quot; data-start=&quot;1750&quot; data-ke-size=&quot;size23&quot;&gt;(2) IAM Policy&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1791&quot; data-start=&quot;1769&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1791&quot; data-start=&quot;1769&quot;&gt;사용자/Role 기준 접근 권한 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1820&quot; data-start=&quot;1793&quot; data-ke-size=&quot;size23&quot;&gt;(3) Public Access Block&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1854&quot; data-start=&quot;1821&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1836&quot; data-start=&quot;1821&quot;&gt;실수로 공개되는 것 방지&lt;/li&gt;
&lt;li data-end=&quot;1854&quot; data-start=&quot;1837&quot;&gt;&lt;b&gt;실무에서는 기본 ON&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1923&quot; data-start=&quot;1856&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1858&quot; data-ke-size=&quot;size16&quot;&gt;면접에서 자주 나오는 질문:&lt;br /&gt;&amp;ldquo;S3 공개 사고를 막는 방법은?&amp;rdquo; &amp;rarr; Public Access Block + IAM&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1947&quot; data-start=&quot;1930&quot; data-ke-size=&quot;size26&quot;&gt;9) S3의 장점 / 단점&lt;/h2&gt;
&lt;h3 data-end=&quot;1955&quot; data-start=&quot;1949&quot; data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1985&quot; data-start=&quot;1956&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1967&quot; data-start=&quot;1956&quot;&gt;서버 관리 불필요&lt;/li&gt;
&lt;li data-end=&quot;1976&quot; data-start=&quot;1968&quot;&gt;높은 내구성&lt;/li&gt;
&lt;li data-end=&quot;1985&quot; data-start=&quot;1977&quot;&gt;비용 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1993&quot; data-start=&quot;1987&quot; data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2062&quot; data-start=&quot;1994&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2018&quot; data-start=&quot;1994&quot;&gt;실시간 파일 수정 불가 (부분 수정 ❌)&lt;/li&gt;
&lt;li data-end=&quot;2042&quot; data-start=&quot;2019&quot;&gt;파일 시스템 대용 불가 (NFS 아님)&lt;/li&gt;
&lt;li data-end=&quot;2062&quot; data-start=&quot;2043&quot;&gt;지연 시간은 로컬 디스크보다 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2089&quot; data-start=&quot;2069&quot; data-ke-size=&quot;size26&quot;&gt;10) 언제 쓰고 언제 안 쓰나&lt;/h2&gt;
&lt;h3 data-end=&quot;2105&quot; data-start=&quot;2091&quot; data-ke-size=&quot;size23&quot;&gt;S3를 써야 할 때&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2134&quot; data-start=&quot;2106&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2117&quot; data-start=&quot;2106&quot;&gt;이미지, 첨부파일&lt;/li&gt;
&lt;li data-end=&quot;2125&quot; data-start=&quot;2118&quot;&gt;로그/백업&lt;/li&gt;
&lt;li data-end=&quot;2134&quot; data-start=&quot;2126&quot;&gt;정적 리소스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2154&quot; data-start=&quot;2136&quot; data-ke-size=&quot;size23&quot;&gt;S3를 쓰면 안 되는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2187&quot; data-start=&quot;2155&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2166&quot; data-start=&quot;2155&quot;&gt;DB 파일 저장소&lt;/li&gt;
&lt;li data-end=&quot;2187&quot; data-start=&quot;2167&quot;&gt;잦은 파일 수정/잠금 필요한 경우&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Infra&amp;amp;Cloud/AWS</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/241</guid>
      <comments>https://the1995-dev-note.tistory.com/241#entry241comment</comments>
      <pubDate>Sun, 8 Feb 2026 17:34:29 +0900</pubDate>
    </item>
    <item>
      <title>AWS-IAM(Identity and Access Management)</title>
      <link>https://the1995-dev-note.tistory.com/242</link>
      <description>&lt;h2 data-end=&quot;46&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;AWS IAM이란? (Identity and Access Management)&lt;/h2&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;48&quot; data-ke-size=&quot;size16&quot;&gt;IAM은 AWS에서 &lt;b&gt;&amp;ldquo;누가(Who) 어떤 리소스에(What) 어떤 권한으로(How)&amp;rdquo;&lt;/b&gt; 접근할 수 있는지를 제어하는 &lt;b&gt;보안의 핵심 서비스&lt;/b&gt;다.&lt;br /&gt;AWS를 제대로 쓴다고 하면 &lt;b&gt;IAM을 이해했는지부터 본다&lt;/b&gt;고 해도 과언이 아니다.&lt;/p&gt;
&lt;h2 data-end=&quot;215&quot; data-start=&quot;190&quot; data-ke-size=&quot;size26&quot;&gt;1) IAM이 왜 중요한가 (왜 나왔나)&lt;/h2&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;217&quot; data-ke-size=&quot;size16&quot;&gt;AWS는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;239&quot; data-start=&quot;223&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;227&quot; data-start=&quot;223&quot;&gt;콘솔&lt;/li&gt;
&lt;li data-end=&quot;233&quot; data-start=&quot;228&quot;&gt;CLI&lt;/li&gt;
&lt;li data-end=&quot;239&quot; data-start=&quot;234&quot;&gt;API&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;273&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;모두 &lt;b&gt;권한이 있으면 무엇이든 할 수 있는 환경&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;277&quot; data-start=&quot;275&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;343&quot; data-start=&quot;278&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;343&quot; data-start=&quot;278&quot;&gt;권한 관리가 허술하면&lt;br /&gt;&amp;rarr; S3 전체 삭제&lt;br /&gt;&amp;rarr; EC2 종료&lt;br /&gt;&amp;rarr; 비용 폭탄&lt;br /&gt;&amp;rarr; 보안 사고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;382&quot; data-start=&quot;345&quot; data-ke-size=&quot;size16&quot;&gt;그래서 AWS는 &lt;b&gt;모든 접근을 IAM으로 통제&lt;/b&gt;하도록 설계했다.&lt;/p&gt;
&lt;blockquote data-end=&quot;421&quot; data-start=&quot;384&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;421&quot; data-start=&quot;386&quot; data-ke-size=&quot;size16&quot;&gt;  핵심 원칙&lt;br /&gt;&lt;b&gt;&amp;ldquo;권한 없으면 아무것도 못 한다&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;454&quot; data-start=&quot;428&quot; data-ke-size=&quot;size26&quot;&gt;2) IAM 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-end=&quot;515&quot; data-start=&quot;456&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;515&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IAM은 AWS 리소스에 대한 접근을 사용자&amp;middot;역할&amp;middot;정책 기반으로 제어하는 인증/인가 서비스이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;579&quot; data-start=&quot;517&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;545&quot; data-start=&quot;517&quot;&gt;인증(Authentication): 너 누구냐?&lt;/li&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;546&quot;&gt;인가(Authorization): 너 뭐까지 해도 되냐?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;605&quot; data-start=&quot;586&quot; data-ke-size=&quot;size26&quot;&gt;3) IAM의 핵심 구성 요소&lt;/h2&gt;
&lt;h3 data-end=&quot;629&quot; data-start=&quot;607&quot; data-ke-size=&quot;size23&quot;&gt;(1) User (IAM 사용자)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;684&quot; data-start=&quot;630&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;656&quot; data-start=&quot;630&quot;&gt;&lt;b&gt;사람(개발자, 운영자)&lt;/b&gt; 을 위한 계정&lt;/li&gt;
&lt;li data-end=&quot;684&quot; data-start=&quot;657&quot;&gt;콘솔 로그인 / Access Key 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;694&quot; data-start=&quot;686&quot; data-ke-size=&quot;size16&quot;&gt;❌ 실무에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;738&quot; data-start=&quot;695&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;695&quot;&gt;EC2에 IAM User Access Key를 박아두는 건 &lt;b&gt;안티패턴&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;763&quot; data-start=&quot;745&quot; data-ke-size=&quot;size23&quot;&gt;(2) Group (그룹)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;833&quot; data-start=&quot;764&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;784&quot; data-start=&quot;764&quot;&gt;여러 User를 묶어서 권한 관리&lt;/li&gt;
&lt;li data-end=&quot;833&quot; data-start=&quot;785&quot;&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;833&quot; data-start=&quot;792&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;802&quot; data-start=&quot;792&quot;&gt;DevGroup&lt;/li&gt;
&lt;li data-end=&quot;815&quot; data-start=&quot;805&quot;&gt;OpsGroup&lt;/li&gt;
&lt;li data-end=&quot;833&quot; data-start=&quot;818&quot;&gt;ReadOnlyGroup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;878&quot; data-start=&quot;835&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;878&quot; data-start=&quot;837&quot; data-ke-size=&quot;size16&quot;&gt;실무 팁:&lt;br /&gt;&amp;ldquo;User에 직접 정책 붙이지 말고 Group으로 관리&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;914&quot; data-start=&quot;885&quot; data-ke-size=&quot;size23&quot;&gt;(3) Role (역할)&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;990&quot; data-start=&quot;916&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;953&quot; data-start=&quot;916&quot;&gt;&lt;b&gt;AWS 리소스가 AWS 리소스에 접근할 때 사용하는 권한&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;954&quot;&gt;Access Key 없이 동작&lt;/li&gt;
&lt;li data-end=&quot;990&quot; data-start=&quot;973&quot;&gt;임시 자격증명(STS) 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1002&quot; data-start=&quot;992&quot; data-ke-size=&quot;size20&quot;&gt;대표 예시&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1057&quot; data-start=&quot;1003&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1016&quot; data-start=&quot;1003&quot;&gt;EC2 &amp;rarr; S3 접근&lt;/li&gt;
&lt;li data-end=&quot;1039&quot; data-start=&quot;1017&quot;&gt;Lambda &amp;rarr; DynamoDB 접근&lt;/li&gt;
&lt;li data-end=&quot;1057&quot; data-start=&quot;1040&quot;&gt;EKS Pod &amp;rarr; S3 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770272412964&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[EC2]
  └─ IAM Role (S3 접근 권한)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;1138&quot; data-start=&quot;1099&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1138&quot; data-start=&quot;1101&quot; data-ke-size=&quot;size16&quot;&gt;  실무 핵심&lt;br /&gt;&lt;b&gt;&amp;ldquo;사람은 User, 서버는 Role&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1164&quot; data-start=&quot;1145&quot; data-ke-size=&quot;size23&quot;&gt;(4) Policy (정책)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1208&quot; data-start=&quot;1166&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1186&quot; data-start=&quot;1166&quot;&gt;권한을 정의하는 문서 (JSON)&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1187&quot;&gt;&lt;b&gt;Allow / Deny&lt;/b&gt; 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1220&quot; data-start=&quot;1210&quot; data-ke-size=&quot;size20&quot;&gt;기본 구조&lt;/h4&gt;
&lt;pre id=&quot;code_1770272423963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Effect&quot;: &quot;Allow&quot;,
  &quot;Action&quot;: &quot;s3:GetObject&quot;,
  &quot;Resource&quot;: &quot;arn:aws:s3:::my-bucket/*&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1380&quot; data-start=&quot;1328&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1345&quot; data-start=&quot;1328&quot;&gt;Effect: 허용 / 거부&lt;/li&gt;
&lt;li data-end=&quot;1361&quot; data-start=&quot;1346&quot;&gt;Action: 어떤 행동&lt;/li&gt;
&lt;li data-end=&quot;1380&quot; data-start=&quot;1362&quot;&gt;Resource: 어떤 리소스&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1406&quot; data-start=&quot;1387&quot; data-ke-size=&quot;size26&quot;&gt;4) IAM Policy 종류&lt;/h2&gt;
&lt;h3 data-end=&quot;1430&quot; data-start=&quot;1408&quot; data-ke-size=&quot;size23&quot;&gt;(1) Managed Policy&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1486&quot; data-start=&quot;1431&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1468&quot; data-start=&quot;1431&quot;&gt;AWS가 제공 (예: AmazonS3ReadOnlyAccess)&lt;/li&gt;
&lt;li data-end=&quot;1486&quot; data-start=&quot;1469&quot;&gt;빠르지만 &lt;b&gt;권한이 넓음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1509&quot; data-start=&quot;1488&quot; data-ke-size=&quot;size23&quot;&gt;(2) Inline Policy&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1540&quot; data-start=&quot;1510&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1531&quot; data-start=&quot;1510&quot;&gt;특정 User/Role에 직접 붙임&lt;/li&gt;
&lt;li data-end=&quot;1540&quot; data-start=&quot;1532&quot;&gt;재사용성 ❌&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1575&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size23&quot;&gt;(3) Customer Managed Policy ⭐&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1611&quot; data-start=&quot;1576&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1588&quot; data-start=&quot;1576&quot;&gt;실무에서 가장 권장&lt;/li&gt;
&lt;li data-end=&quot;1611&quot; data-start=&quot;1589&quot;&gt;재사용 가능 + 최소 권한 설계 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1641&quot; data-start=&quot;1618&quot; data-ke-size=&quot;size26&quot;&gt;5) IAM 권한 평가 로직 (중요)&lt;/h2&gt;
&lt;p data-end=&quot;1660&quot; data-start=&quot;1643&quot; data-ke-size=&quot;size16&quot;&gt;AWS는 권한을 이렇게 판단함:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1723&quot; data-start=&quot;1662&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1686&quot; data-start=&quot;1662&quot;&gt;&lt;b&gt;명시적 Deny&lt;/b&gt; &amp;rarr; 무조건 거부&lt;/li&gt;
&lt;li data-end=&quot;1703&quot; data-start=&quot;1687&quot;&gt;Allow가 있으면 허용&lt;/li&gt;
&lt;li data-end=&quot;1723&quot; data-start=&quot;1704&quot;&gt;아무것도 없으면 기본 Deny&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-end=&quot;1751&quot; data-start=&quot;1725&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1751&quot; data-start=&quot;1727&quot; data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;Deny가 Allow보다 항상 우선&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1776&quot; data-start=&quot;1758&quot; data-ke-size=&quot;size26&quot;&gt;6) 실무 IAM 설계 예시&lt;/h2&gt;
&lt;h3 data-end=&quot;1809&quot; data-start=&quot;1778&quot; data-ke-size=&quot;size23&quot;&gt;EC2가 S3에 업로드해야 할 때 ❌ 잘못된 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1851&quot; data-start=&quot;1810&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1810&quot;&gt;IAM User 생성&lt;/li&gt;
&lt;li data-end=&quot;1839&quot; data-start=&quot;1824&quot;&gt;Access Key 발급&lt;/li&gt;
&lt;li data-end=&quot;1851&quot; data-start=&quot;1840&quot;&gt;EC2에 키 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1865&quot; data-start=&quot;1853&quot; data-ke-size=&quot;size23&quot;&gt;✅ 올바른 방식&lt;/h3&gt;
&lt;pre id=&quot;code_1770272438605&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;S3UploadRole
  └─ s3:PutObject 권한

EC2
  └─ S3UploadRole 연결&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1956&quot; data-start=&quot;1935&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1943&quot; data-start=&quot;1935&quot;&gt;키 관리 ❌&lt;/li&gt;
&lt;li data-end=&quot;1956&quot; data-start=&quot;1944&quot;&gt;보안 사고 위험 &amp;darr;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1986&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size26&quot;&gt;7) IAM 보안 베스트 프랙티스 ⭐&lt;/h2&gt;
&lt;h3 data-end=&quot;2003&quot; data-start=&quot;1988&quot; data-ke-size=&quot;size23&quot;&gt;(1) Root 계정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2022&quot; data-start=&quot;2004&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2012&quot; data-start=&quot;2004&quot;&gt;MFA 필수&lt;/li&gt;
&lt;li data-end=&quot;2022&quot; data-start=&quot;2013&quot;&gt;일상 사용 ❌&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2058&quot; data-start=&quot;2024&quot; data-ke-size=&quot;size23&quot;&gt;(2) 최소 권한 원칙 (Least Privilege)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2083&quot; data-start=&quot;2059&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2071&quot; data-start=&quot;2059&quot;&gt;필요한 권한만 부여&lt;/li&gt;
&lt;li data-end=&quot;2083&quot; data-start=&quot;2072&quot;&gt;* 남발 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2096&quot; data-start=&quot;2085&quot; data-ke-size=&quot;size23&quot;&gt;(3) MFA&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2113&quot; data-start=&quot;2097&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2113&quot; data-start=&quot;2097&quot;&gt;콘솔 접근 User는 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2136&quot; data-start=&quot;2115&quot; data-ke-size=&quot;size23&quot;&gt;(4) Access Key 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2175&quot; data-start=&quot;2137&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2147&quot; data-start=&quot;2137&quot;&gt;정기적 로테이션&lt;/li&gt;
&lt;li data-end=&quot;2175&quot; data-start=&quot;2148&quot;&gt;가능하면 사용 자체를 줄이기 (Role 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2207&quot; data-start=&quot;2182&quot; data-ke-size=&quot;size26&quot;&gt;8) IAM + 다른 AWS 서비스 연계&lt;/h2&gt;
&lt;h3 data-end=&quot;2222&quot; data-start=&quot;2209&quot; data-ke-size=&quot;size23&quot;&gt;EC2 + IAM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2260&quot; data-start=&quot;2223&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2235&quot; data-start=&quot;2223&quot;&gt;Role 기반 접근&lt;/li&gt;
&lt;li data-end=&quot;2260&quot; data-start=&quot;2236&quot;&gt;S3, CloudWatch, SSM 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2274&quot; data-start=&quot;2262&quot; data-ke-size=&quot;size23&quot;&gt;S3 + IAM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2306&quot; data-start=&quot;2275&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2306&quot; data-start=&quot;2275&quot;&gt;Bucket Policy + IAM Policy 조합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2321&quot; data-start=&quot;2308&quot; data-ke-size=&quot;size23&quot;&gt;ALB / RDS&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2357&quot; data-start=&quot;2322&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2322&quot;&gt;직접 IAM 사용 X&lt;/li&gt;
&lt;li data-end=&quot;2357&quot; data-start=&quot;2336&quot;&gt;간접적으로 서비스 접근 제어에 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra&amp;amp;Cloud/AWS</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/242</guid>
      <comments>https://the1995-dev-note.tistory.com/242#entry242comment</comments>
      <pubDate>Sun, 8 Feb 2026 17:34:16 +0900</pubDate>
    </item>
    <item>
      <title>AWS-ALB(Application Load Balancer)</title>
      <link>https://the1995-dev-note.tistory.com/244</link>
      <description>&lt;h2 data-end=&quot;36&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;ALB란? (Application Load Balancer)&lt;/h2&gt;
&lt;p data-end=&quot;152&quot; data-start=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;ALB는 AWS에서 제공하는 &lt;b&gt;L7(Application Layer) 로드 밸런서&lt;/b&gt;로,&lt;br /&gt;HTTP/HTTPS 트래픽을 여러 대상(Target)으로 분산시켜 &lt;b&gt;가용성과 확장성&lt;/b&gt;을 높여주는 서비스다.&lt;/p&gt;
&lt;h2 data-end=&quot;181&quot; data-start=&quot;159&quot; data-ke-size=&quot;size26&quot;&gt;1) ALB가 왜 나왔는가 (배경)&lt;/h2&gt;
&lt;p data-end=&quot;196&quot; data-start=&quot;183&quot; data-ke-size=&quot;size16&quot;&gt;단일 서버 구조의 문제:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;253&quot; data-start=&quot;197&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;214&quot; data-start=&quot;197&quot;&gt;트래픽 증가 &amp;rarr; 서버 과부하&lt;/li&gt;
&lt;li data-end=&quot;234&quot; data-start=&quot;215&quot;&gt;서버 장애 &amp;rarr; 서비스 전체 다운&lt;/li&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;235&quot;&gt;배포 중 장애 &amp;rarr; 사용자 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;275&quot; data-start=&quot;255&quot; data-ke-size=&quot;size16&quot;&gt;ALB는 이런 문제를 해결하기 위해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;315&quot; data-start=&quot;276&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;284&quot; data-start=&quot;276&quot;&gt;트래픽 분산&lt;/li&gt;
&lt;li data-end=&quot;298&quot; data-start=&quot;285&quot;&gt;서버 장애 자동 감지&lt;/li&gt;
&lt;li data-end=&quot;315&quot; data-start=&quot;299&quot;&gt;서버 증설/축소 자동 연계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;330&quot; data-start=&quot;317&quot; data-ke-size=&quot;size16&quot;&gt;를 목적으로 만들어졌다.&lt;/p&gt;
&lt;h2 data-end=&quot;363&quot; data-start=&quot;337&quot; data-ke-size=&quot;size26&quot;&gt;2) ALB 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-end=&quot;434&quot; data-start=&quot;365&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;434&quot; data-start=&quot;367&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ALB는 HTTP/HTTPS 요청을 분석해 여러 백엔드 서버로 분산하는 애플리케이션 계층(L7) 로드 밸런서이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;460&quot; data-start=&quot;441&quot; data-ke-size=&quot;size26&quot;&gt;3) ALB의 핵심 구성 요소&lt;/h2&gt;
&lt;h3 data-end=&quot;478&quot; data-start=&quot;462&quot; data-ke-size=&quot;size23&quot;&gt;(1) Listener&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;529&quot; data-start=&quot;479&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;493&quot; data-start=&quot;479&quot;&gt;ALB가 수신하는 포트&lt;/li&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;494&quot;&gt;보통:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;529&quot; data-start=&quot;502&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;513&quot; data-start=&quot;502&quot;&gt;80 (HTTP)&lt;/li&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;516&quot;&gt;443 (HTTPS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;552&quot; data-start=&quot;531&quot; data-ke-size=&quot;size23&quot;&gt;(2) Listener Rule&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;637&quot; data-start=&quot;553&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;553&quot;&gt;요청을 어떻게 분기할지 정의&lt;/li&gt;
&lt;li data-end=&quot;637&quot; data-start=&quot;571&quot;&gt;기준:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;637&quot; data-start=&quot;579&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;608&quot; data-start=&quot;579&quot;&gt;URL Path (/api, /admin)&lt;/li&gt;
&lt;li data-end=&quot;637&quot; data-start=&quot;611&quot;&gt;Host (api.example.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;659&quot; data-start=&quot;639&quot; data-ke-size=&quot;size23&quot;&gt;(3) Target Group&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;711&quot; data-start=&quot;660&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;676&quot; data-start=&quot;660&quot;&gt;트래픽을 전달할 대상 묶음&lt;/li&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;677&quot;&gt;대상 타입:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;711&quot; data-start=&quot;688&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;693&quot; data-start=&quot;688&quot;&gt;EC2&lt;/li&gt;
&lt;li data-end=&quot;700&quot; data-start=&quot;696&quot;&gt;IP&lt;/li&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;703&quot;&gt;Lambda&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;733&quot; data-start=&quot;713&quot; data-ke-size=&quot;size23&quot;&gt;(4) Health Check&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;768&quot; data-start=&quot;734&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;747&quot; data-start=&quot;734&quot;&gt;대상 서버 상태 확인&lt;/li&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;748&quot;&gt;정상(Target)만 트래픽 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;791&quot; data-start=&quot;775&quot; data-ke-size=&quot;size26&quot;&gt;4) ALB의 동작 흐름&lt;/h2&gt;
&lt;pre id=&quot;code_1770272561569&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Client]
   &amp;darr; 443
[Route 53]
   &amp;darr;
[ALB Listener]
   &amp;darr;
[Target Group]
   &amp;darr;
[EC2 #1] [EC2 #2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;950&quot; data-start=&quot;894&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;908&quot; data-start=&quot;894&quot;&gt;클라이언트 요청 수신&lt;/li&gt;
&lt;li data-end=&quot;928&quot; data-start=&quot;909&quot;&gt;Listener Rule 확인&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;929&quot;&gt;정상 상태 Target으로만 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;981&quot; data-start=&quot;957&quot; data-ke-size=&quot;size26&quot;&gt;5) ALB의 주요 기능 (실무 핵심)&lt;/h2&gt;
&lt;h3 data-end=&quot;998&quot; data-start=&quot;983&quot; data-ke-size=&quot;size23&quot;&gt;✅ L7 기반 라우팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1023&quot; data-start=&quot;999&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1010&quot; data-start=&quot;999&quot;&gt;경로 기반 라우팅&lt;/li&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;1011&quot;&gt;도메인 기반 라우팅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1054&quot; data-start=&quot;1025&quot; data-ke-size=&quot;size23&quot;&gt;✅ SSL 종료(SSL Termination)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1088&quot; data-start=&quot;1055&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1055&quot;&gt;인증서(ALB에 설치)&lt;/li&gt;
&lt;li data-end=&quot;1088&quot; data-start=&quot;1070&quot;&gt;백엔드는 HTTP로 통신 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1111&quot; data-start=&quot;1090&quot; data-ke-size=&quot;size23&quot;&gt;✅ Auto Scaling 연계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1141&quot; data-start=&quot;1112&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1141&quot; data-start=&quot;1112&quot;&gt;EC2 증설/축소 시 자동 Target 등록/해제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1155&quot; data-start=&quot;1143&quot; data-ke-size=&quot;size23&quot;&gt;✅ 무중단 배포&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1175&quot; data-start=&quot;1156&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1175&quot; data-start=&quot;1156&quot;&gt;서버 일부만 교체하며 배포 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1210&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size26&quot;&gt;6) ALB vs NLB vs CLB (비교)&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-end=&quot;1374&quot; data-start=&quot;1212&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody data-end=&quot;1374&quot; data-start=&quot;1259&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ALB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;NLB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;CLB&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1283&quot; data-start=&quot;1259&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1264&quot; data-start=&quot;1259&quot;&gt;계층&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1269&quot; data-start=&quot;1264&quot; data-col-size=&quot;sm&quot;&gt;L7&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1274&quot; data-start=&quot;1269&quot; data-col-size=&quot;sm&quot;&gt;L4&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1283&quot; data-start=&quot;1274&quot; data-col-size=&quot;sm&quot;&gt;L4/L7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1326&quot; data-start=&quot;1284&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1291&quot; data-start=&quot;1284&quot;&gt;프로토콜&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1304&quot; data-start=&quot;1291&quot; data-col-size=&quot;sm&quot;&gt;HTTP/HTTPS&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1314&quot; data-start=&quot;1304&quot; data-col-size=&quot;sm&quot;&gt;TCP/UDP&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1326&quot; data-start=&quot;1314&quot; data-col-size=&quot;sm&quot;&gt;HTTP/TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1349&quot; data-start=&quot;1327&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1336&quot; data-start=&quot;1327&quot;&gt;경로 라우팅&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1340&quot; data-start=&quot;1336&quot; data-col-size=&quot;sm&quot;&gt;⭕&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1344&quot; data-start=&quot;1340&quot; data-col-size=&quot;sm&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1349&quot; data-start=&quot;1344&quot; data-col-size=&quot;sm&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1374&quot; data-start=&quot;1350&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1355&quot; data-start=&quot;1350&quot;&gt;지연&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1360&quot; data-start=&quot;1355&quot; data-col-size=&quot;sm&quot;&gt;보통&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1368&quot; data-start=&quot;1360&quot; data-col-size=&quot;sm&quot;&gt;매우 낮음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1374&quot; data-start=&quot;1368&quot; data-col-size=&quot;sm&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1400&quot; data-start=&quot;1376&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1400&quot; data-start=&quot;1378&quot; data-ke-size=&quot;size16&quot;&gt;일반 웹 서비스 &amp;rarr; &lt;b&gt;ALB가 정답&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1422&quot; data-start=&quot;1407&quot; data-ke-size=&quot;size26&quot;&gt;7) ALB 보안 구조&lt;/h2&gt;
&lt;h3 data-end=&quot;1446&quot; data-start=&quot;1424&quot; data-ke-size=&quot;size23&quot;&gt;(1) Security Group&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1481&quot; data-start=&quot;1447&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1465&quot; data-start=&quot;1447&quot;&gt;ALB 앞단에서 트래픽 필터링&lt;/li&gt;
&lt;li data-end=&quot;1481&quot; data-start=&quot;1466&quot;&gt;보통 80/443만 오픈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1500&quot; data-start=&quot;1483&quot; data-ke-size=&quot;size23&quot;&gt;(2) 백엔드 서버 보호&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1536&quot; data-start=&quot;1501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1522&quot; data-start=&quot;1501&quot;&gt;EC2는 &lt;b&gt;ALB SG만 허용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1536&quot; data-start=&quot;1523&quot;&gt;외부 직접 접근 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1567&quot; data-start=&quot;1543&quot; data-ke-size=&quot;size26&quot;&gt;8) 실무 아키텍처 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1770272575720&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[User]
   &amp;darr;
[Route 53]
   &amp;darr;
[ALB]
   &amp;darr;
[EC2 (WAS) x N]
   &amp;darr;
[RDS]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1708&quot; data-start=&quot;1644&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1664&quot; data-start=&quot;1644&quot;&gt;ALB는 Public Subnet&lt;/li&gt;
&lt;li data-end=&quot;1686&quot; data-start=&quot;1665&quot;&gt;EC2는 Private Subnet&lt;/li&gt;
&lt;li data-end=&quot;1708&quot; data-start=&quot;1687&quot;&gt;RDS는 Private Subnet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1733&quot; data-start=&quot;1715&quot; data-ke-size=&quot;size26&quot;&gt;9) ALB의 장점 / 단점&lt;/h2&gt;
&lt;h3 data-end=&quot;1741&quot; data-start=&quot;1735&quot; data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1784&quot; data-start=&quot;1742&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1759&quot; data-start=&quot;1742&quot;&gt;고가용성 (Multi-AZ)&lt;/li&gt;
&lt;li data-end=&quot;1772&quot; data-start=&quot;1760&quot;&gt;유연한 트래픽 제어&lt;/li&gt;
&lt;li data-end=&quot;1784&quot; data-start=&quot;1773&quot;&gt;서버 확장 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1792&quot; data-start=&quot;1786&quot; data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1845&quot; data-start=&quot;1793&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1807&quot; data-start=&quot;1793&quot;&gt;TCP 레벨 제어 불가&lt;/li&gt;
&lt;li data-end=&quot;1845&quot; data-start=&quot;1808&quot;&gt;고정 IP 제공 ❌ (&amp;rarr; Route 53 + ALIAS로 해결)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1872&quot; data-start=&quot;1852&quot; data-ke-size=&quot;size26&quot;&gt;10) 언제 ALB를 써야 하나&lt;/h2&gt;
&lt;h3 data-end=&quot;1891&quot; data-start=&quot;1874&quot; data-ke-size=&quot;size23&quot;&gt;ALB를 써야 하는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1932&quot; data-start=&quot;1892&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1902&quot; data-start=&quot;1892&quot;&gt;웹/API 서버&lt;/li&gt;
&lt;li data-end=&quot;1914&quot; data-start=&quot;1903&quot;&gt;무중단 배포 필요&lt;/li&gt;
&lt;li data-end=&quot;1932&quot; data-start=&quot;1915&quot;&gt;Auto Scaling 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1953&quot; data-start=&quot;1934&quot; data-ke-size=&quot;size23&quot;&gt;ALB를 안 써도 되는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1986&quot; data-start=&quot;1954&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1965&quot; data-start=&quot;1954&quot;&gt;단일 내부 서비스&lt;/li&gt;
&lt;li data-end=&quot;1986&quot; data-start=&quot;1966&quot;&gt;TCP 기반 서비스 (&amp;rarr; NLB)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Infra&amp;amp;Cloud/AWS</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/244</guid>
      <comments>https://the1995-dev-note.tistory.com/244#entry244comment</comments>
      <pubDate>Sun, 8 Feb 2026 17:34:06 +0900</pubDate>
    </item>
    <item>
      <title>AWS-RDS(Relational Database Service)</title>
      <link>https://the1995-dev-note.tistory.com/245</link>
      <description>&lt;h2 data-end=&quot;42&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;AWS RDS란? (Relational Database Service)&lt;/h2&gt;
&lt;p data-end=&quot;140&quot; data-start=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;RDS는 AWS에서 제공하는 &lt;b&gt;관리형 관계형 데이터베이스 서비스&lt;/b&gt;다.&lt;br /&gt;DB를 직접 설치&amp;middot;운영하지 않고도 &lt;b&gt;백업, 장애 대응, 패치까지 AWS가 대신 관리&lt;/b&gt;해준다.&lt;/p&gt;
&lt;h2 data-end=&quot;169&quot; data-start=&quot;147&quot; data-ke-size=&quot;size26&quot;&gt;1) RDS가 왜 나왔는가 (배경)&lt;/h2&gt;
&lt;p data-end=&quot;188&quot; data-start=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;기존에 DB 서버를 운영하려면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;261&quot; data-start=&quot;189&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;204&quot; data-start=&quot;189&quot;&gt;DB 설치 및 초기 설정&lt;/li&gt;
&lt;li data-end=&quot;216&quot; data-start=&quot;205&quot;&gt;백업 스케줄 관리&lt;/li&gt;
&lt;li data-end=&quot;229&quot; data-start=&quot;217&quot;&gt;장애 발생 시 복구&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;230&quot;&gt;복제(Replication) 구성&lt;/li&gt;
&lt;li data-end=&quot;261&quot; data-start=&quot;251&quot;&gt;OS/DB 패치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;295&quot; data-start=&quot;263&quot; data-ke-size=&quot;size16&quot;&gt;DB는 &lt;b&gt;서비스의 핵심&lt;/b&gt;인데, 운영 부담이 매우 크다.&lt;/p&gt;
&lt;p data-end=&quot;317&quot; data-start=&quot;297&quot; data-ke-size=&quot;size16&quot;&gt;RDS는 이런 문제를 해결하기 위해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;354&quot; data-start=&quot;318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;329&quot; data-start=&quot;318&quot;&gt;DB 설치 자동화&lt;/li&gt;
&lt;li data-end=&quot;341&quot; data-start=&quot;330&quot;&gt;백업/복구 자동화&lt;/li&gt;
&lt;li data-end=&quot;354&quot; data-start=&quot;342&quot;&gt;고가용성 구조 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;368&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;을 목표로 만들어졌다.&lt;/p&gt;
&lt;h2 data-end=&quot;401&quot; data-start=&quot;375&quot; data-ke-size=&quot;size26&quot;&gt;2) RDS 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-end=&quot;459&quot; data-start=&quot;403&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;459&quot; data-start=&quot;405&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RDS는 관계형 데이터베이스를 관리형으로 제공하여 운영 부담을 줄여주는 AWS 서비스이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;488&quot; data-start=&quot;466&quot; data-ke-size=&quot;size26&quot;&gt;3) RDS에서 지원하는 DB 엔진&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;542&quot; data-start=&quot;490&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;490&quot;&gt;MySQL&lt;/li&gt;
&lt;li data-end=&quot;510&quot; data-start=&quot;498&quot;&gt;PostgreSQL&lt;/li&gt;
&lt;li data-end=&quot;520&quot; data-start=&quot;511&quot;&gt;MariaDB&lt;/li&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;521&quot;&gt;Oracle&lt;/li&gt;
&lt;li data-end=&quot;542&quot; data-start=&quot;530&quot;&gt;SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;586&quot; data-start=&quot;544&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;586&quot; data-start=&quot;546&quot; data-ke-size=&quot;size16&quot;&gt;  특징&lt;br /&gt;&lt;b&gt;엔진은 선택하지만, OS 레벨은 직접 접근 불가&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;612&quot; data-start=&quot;593&quot; data-ke-size=&quot;size26&quot;&gt;4) RDS의 핵심 구성 요소&lt;/h2&gt;
&lt;h3 data-end=&quot;633&quot; data-start=&quot;614&quot; data-ke-size=&quot;size23&quot;&gt;(1) DB Instance&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;679&quot; data-start=&quot;634&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;650&quot; data-start=&quot;634&quot;&gt;실제 DB가 실행되는 단위&lt;/li&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;651&quot;&gt;EC2 위에서 동작하지만 &lt;b&gt;직접 제어 불가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;696&quot; data-start=&quot;681&quot; data-ke-size=&quot;size23&quot;&gt;(2) Storage&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;742&quot; data-start=&quot;697&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;705&quot; data-start=&quot;697&quot;&gt;EBS 기반&lt;/li&gt;
&lt;li data-end=&quot;742&quot; data-start=&quot;706&quot;&gt;General Purpose / Provisioned IOPS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;760&quot; data-start=&quot;744&quot; data-ke-size=&quot;size23&quot;&gt;(3) Endpoint&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;805&quot; data-start=&quot;761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;778&quot; data-start=&quot;761&quot;&gt;애플리케이션이 접속하는 주소&lt;/li&gt;
&lt;li data-end=&quot;805&quot; data-start=&quot;779&quot;&gt;장애 시에도 &lt;b&gt;Endpoint는 유지됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;836&quot; data-start=&quot;812&quot; data-ke-size=&quot;size26&quot;&gt;5) RDS의 주요 기능 (실무 핵심)&lt;/h2&gt;
&lt;h3 data-end=&quot;849&quot; data-start=&quot;838&quot; data-ke-size=&quot;size23&quot;&gt;✅ 자동 백업&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;878&quot; data-start=&quot;850&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;858&quot; data-start=&quot;850&quot;&gt;자동 스냅샷&lt;/li&gt;
&lt;li data-end=&quot;878&quot; data-start=&quot;859&quot;&gt;특정 시점 복구(PITR) 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;901&quot; data-start=&quot;880&quot; data-ke-size=&quot;size23&quot;&gt;✅ Multi-AZ (고가용성)&lt;/h3&gt;
&lt;pre id=&quot;code_1770272750746&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Primary]
   &amp;darr; 동기 복제
[Standby]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;980&quot; data-start=&quot;941&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;962&quot; data-start=&quot;941&quot;&gt;장애 발생 시 자동 Failover&lt;/li&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;963&quot;&gt;애플리케이션 수정 거의 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1000&quot; data-start=&quot;982&quot; data-ke-size=&quot;size23&quot;&gt;✅ Read Replica&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1023&quot; data-start=&quot;1001&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1012&quot; data-start=&quot;1001&quot;&gt;읽기 트래픽 분산&lt;/li&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;1013&quot;&gt;조회 성능 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1047&quot; data-start=&quot;1030&quot; data-ke-size=&quot;size26&quot;&gt;6) RDS 동작 아키텍처&lt;/h2&gt;
&lt;pre id=&quot;code_1770272776230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[EC2 (WAS)]
   &amp;darr;
[RDS (Primary)]
   &amp;darr;
[Read Replica]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1158&quot; data-start=&quot;1111&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1144&quot; data-start=&quot;1111&quot;&gt;EC2와 RDS는 보통 &lt;b&gt;Private Subnet&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1158&quot; data-start=&quot;1145&quot;&gt;외부 직접 접근 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1180&quot; data-start=&quot;1165&quot; data-ke-size=&quot;size26&quot;&gt;7) RDS 보안 구조&lt;/h2&gt;
&lt;h3 data-end=&quot;1197&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size23&quot;&gt;(1) 네트워크 보안&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1237&quot; data-start=&quot;1198&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1212&quot; data-start=&quot;1198&quot;&gt;VPC 내부에서만 접근&lt;/li&gt;
&lt;li data-end=&quot;1237&quot; data-start=&quot;1213&quot;&gt;Security Group으로 접근 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1249&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;(2) 인증&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1282&quot; data-start=&quot;1250&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1250&quot;&gt;DB 계정 기반 인증&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1264&quot;&gt;IAM 인증(일부 엔진 지원)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1295&quot; data-start=&quot;1284&quot; data-ke-size=&quot;size23&quot;&gt;(3) 암호화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1323&quot; data-start=&quot;1296&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1312&quot; data-start=&quot;1296&quot;&gt;저장 시 암호화 (KMS)&lt;/li&gt;
&lt;li data-end=&quot;1323&quot; data-start=&quot;1313&quot;&gt;전송 시 SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1348&quot; data-start=&quot;1330&quot; data-ke-size=&quot;size26&quot;&gt;8) RDS의 장점 / 단점&lt;/h2&gt;
&lt;h3 data-end=&quot;1356&quot; data-start=&quot;1350&quot; data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1397&quot; data-start=&quot;1357&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1371&quot; data-start=&quot;1357&quot;&gt;DB 운영 부담 최소화&lt;/li&gt;
&lt;li data-end=&quot;1384&quot; data-start=&quot;1372&quot;&gt;안정적인 백업/복구&lt;/li&gt;
&lt;li data-end=&quot;1397&quot; data-start=&quot;1385&quot;&gt;고가용성 기본 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1405&quot; data-start=&quot;1399&quot; data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1460&quot; data-start=&quot;1406&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1416&quot; data-start=&quot;1406&quot;&gt;OS 접근 불가&lt;/li&gt;
&lt;li data-end=&quot;1434&quot; data-start=&quot;1417&quot;&gt;DB 튜닝/커스터마이징 제한&lt;/li&gt;
&lt;li data-end=&quot;1460&quot; data-start=&quot;1435&quot;&gt;비용이 EC2 직접 구성보다 높을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1491&quot; data-start=&quot;1467&quot; data-ke-size=&quot;size26&quot;&gt;9) RDS를 언제 쓰고 언제 안 쓰나&lt;/h2&gt;
&lt;h3 data-end=&quot;1508&quot; data-start=&quot;1493&quot; data-ke-size=&quot;size23&quot;&gt;RDS가 적합한 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1554&quot; data-start=&quot;1509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1522&quot; data-start=&quot;1509&quot;&gt;일반적인 서비스 DB&lt;/li&gt;
&lt;li data-end=&quot;1538&quot; data-start=&quot;1523&quot;&gt;운영 인력이 제한적일 때&lt;/li&gt;
&lt;li data-end=&quot;1554&quot; data-start=&quot;1539&quot;&gt;고가용성이 필요한 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1572&quot; data-start=&quot;1556&quot; data-ke-size=&quot;size23&quot;&gt;RDS가 부적합한 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1635&quot; data-start=&quot;1573&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1583&quot; data-start=&quot;1573&quot;&gt;커널 튜닝 필수&lt;/li&gt;
&lt;li data-end=&quot;1596&quot; data-start=&quot;1584&quot;&gt;특수 플러그인 필요&lt;/li&gt;
&lt;li data-end=&quot;1635&quot; data-start=&quot;1597&quot;&gt;완전한 제어가 필요한 경우&lt;br /&gt;&amp;rarr; 이때는 EC2에 DB 직접 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1670&quot; data-start=&quot;1642&quot; data-ke-size=&quot;size26&quot;&gt;10) EC2 + ALB + RDS 전체 구조&lt;/h2&gt;
&lt;pre id=&quot;code_1770272799417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[User]
   &amp;darr;
[Route 53]
   &amp;darr;
[ALB]
   &amp;darr;
[EC2 (WAS)]
   &amp;darr;
[RDS (Multi-AZ)]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Infra&amp;amp;Cloud/AWS</category>
      <author>NellKiM</author>
      <guid isPermaLink="true">https://the1995-dev-note.tistory.com/245</guid>
      <comments>https://the1995-dev-note.tistory.com/245#entry245comment</comments>
      <pubDate>Sun, 8 Feb 2026 17:30:11 +0900</pubDate>
    </item>
  </channel>
</rss>