<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Chadoll</title>
    <link>https://bu119.tistory.com/</link>
    <description>Backend developer  &amp;zwj; </description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 07:59:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bu119</managingEditor>
    <image>
      <title>Chadoll</title>
      <url>https://tistory1.daumcdn.net/tistory/6419406/attach/df2fffc67b2f4416bccdec15f4136de0</url>
      <link>https://bu119.tistory.com</link>
    </image>
    <item>
      <title>[AI] 제미나이(Gemini) API 키 발급받기</title>
      <link>https://bu119.tistory.com/170</link>
      <description>&lt;p data-end=&quot;346&quot; data-start=&quot;187&quot; data-ke-size=&quot;size16&quot;&gt;AI 기능을 서비스에 적용하려면,&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;187&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Google의 Gemini API&lt;/b&gt;를 통해 자연어 생성, 요약, 번역, 코드 생성 등 다양한 기능을 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;187&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 음식점 메뉴 설명을 자동으로 만들어주거나, 고객 질문에 대한 자동 답변을 구성하는 등의 서비스가 가능합니다.&lt;/p&gt;
&lt;p data-end=&quot;459&quot; data-start=&quot;348&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;459&quot; data-start=&quot;348&quot; data-ke-size=&quot;size16&quot;&gt;이때 Gemini API를 사용하려면 &lt;b&gt;API 키(API Key)&lt;/b&gt; 를 발급받아야 합니다.&lt;br /&gt;이 글에서는 &lt;b&gt;제미나이(Gemini) API 키 발급 과정&lt;/b&gt;을 정리했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;477&quot; data-start=&quot;466&quot; data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;628&quot; data-start=&quot;479&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;479&quot;&gt;&lt;b&gt;Gemini API란 무엇인가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;539&quot; data-start=&quot;505&quot;&gt;&lt;b&gt;Google AI Studio 접속 및 로그인&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;566&quot; data-start=&quot;540&quot;&gt;&lt;b&gt;Gemini API 키 발급하기&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;595&quot; data-start=&quot;567&quot;&gt;&lt;b&gt;API 키 확인 및 보안 관리 방법&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;628&quot; data-start=&quot;596&quot;&gt;&lt;b&gt;테스트 예시 (Postman)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;654&quot; data-start=&quot;635&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ Gemini API란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;762&quot; data-start=&quot;656&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;762&quot; data-start=&quot;658&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemini API&lt;/b&gt;는 Google이 제공하는 최신 인공지능 모델 API입니다.&lt;br /&gt;텍스트, 이미지, 코드, 음성 등 다양한 형태의 입력을 이해하고, 결과를 생성할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;954&quot; data-start=&quot;764&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;826&quot; data-start=&quot;764&quot;&gt;&lt;b&gt;제공 플랫폼&lt;/b&gt;: &lt;a data-end=&quot;826&quot; data-start=&quot;778&quot;&gt;Google AI Studio&lt;span aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;954&quot; data-start=&quot;877&quot;&gt;&lt;b&gt;활용 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;954&quot; data-start=&quot;893&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;911&quot; data-start=&quot;893&quot;&gt;텍스트 요약 / 문서 생성&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;914&quot;&gt;챗봇 구현&lt;/li&gt;
&lt;li data-end=&quot;939&quot; data-start=&quot;926&quot;&gt;이미지 설명 생성&lt;/li&gt;
&lt;li data-end=&quot;954&quot; data-start=&quot;942&quot;&gt;코드 자동 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;993&quot; data-start=&quot;961&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ Google AI Studio 접속 및 로그인&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;Google AI Studio&lt;/b&gt; 홈페이지 접속합니다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ai.google.dev/aistudio?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ai.google.dev/aistudio?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1759822266638&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Google AI Studio | Gemini API &amp;nbsp;|&amp;nbsp; Google AI for Developers&quot; data-og-description=&quot;Google AI Studio에서 Gemini API를 시작해 보세요.&quot; data-og-host=&quot;ai.google.dev&quot; data-og-source-url=&quot;https://ai.google.dev/aistudio?hl=ko&quot; data-og-url=&quot;https://ai.google.dev/aistudio?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHXcyg/hyZKmv12d6/Yu0zNKHHA8tFihfeYEkeIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ai.google.dev/aistudio?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ai.google.dev/aistudio?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHXcyg/hyZKmv12d6/Yu0zNKHHA8tFihfeYEkeIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Google AI Studio | Gemini API &amp;nbsp;|&amp;nbsp; Google AI for Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google AI Studio에서 Gemini API를 시작해 보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ai.google.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Google 계정으로 &lt;b&gt;로그인&lt;/b&gt;합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4Vd6x/btsQ2PUUnWg/PCZu07U3Nq6dKFHqziSl90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4Vd6x/btsQ2PUUnWg/PCZu07U3Nq6dKFHqziSl90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4Vd6x/btsQ2PUUnWg/PCZu07U3Nq6dKFHqziSl90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4Vd6x%2FbtsQ2PUUnWg%2FPCZu07U3Nq6dKFHqziSl90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 로그인 후 왼쪽 메뉴 하단의 &lt;b&gt;&amp;ldquo;Get API key&amp;rdquo; (API 키 받기)&lt;/b&gt;를 클릭합니다.&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsVoxo/btsQ4Dy4Vk1/l4K0s4qhxKH2pLQdzhkpe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsVoxo/btsQ4Dy4Vk1/l4K0s4qhxKH2pLQdzhkpe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsVoxo/btsQ4Dy4Vk1/l4K0s4qhxKH2pLQdzhkpe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsVoxo%2FbtsQ4Dy4Vk1%2Fl4K0s4qhxKH2pLQdzhkpe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;1326&quot; data-end=&quot;1350&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ Gemini API 키 발급하기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. API 키 대시보드의 우측 상단 &lt;b&gt;&quot;API 키 만들기&lt;/b&gt;&quot; 버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NdDG1/btsQSQmb5l3/b0ElPIAFwCSOI165T7eye0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NdDG1/btsQSQmb5l3/b0ElPIAFwCSOI165T7eye0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NdDG1/btsQSQmb5l3/b0ElPIAFwCSOI165T7eye0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNdDG1%2FbtsQSQmb5l3%2Fb0ElPIAFwCSOI165T7eye0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;팝업창이 열리면, &lt;span&gt;&lt;b&gt;키 이름을 지정&lt;/b&gt;하고&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;, &lt;/span&gt;&lt;b&gt;프로젝트 선택 &lt;/b&gt;&lt;/b&gt;또는 &lt;b&gt;&lt;b&gt;새 프로젝트 생성&lt;/b&gt;&lt;/b&gt;합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우리는 생성된 프로젝트가 없으므로 프로젝트를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&lt;b&gt;Create project&lt;/b&gt;&quot; 를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNvpmv/btsQ2Ql0SLg/iKCA712kLHpa3WlkDiK1H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNvpmv/btsQ2Ql0SLg/iKCA712kLHpa3WlkDiK1H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNvpmv/btsQ2Ql0SLg/iKCA712kLHpa3WlkDiK1H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNvpmv%2FbtsQ2Ql0SLg%2FiKCA712kLHpa3WlkDiK1H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;567&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 프로젝트 만들기 팝업 창이 열리면, &lt;b&gt;프로젝트 이름을 지정&lt;/b&gt;하고, 우측 하단의 &quot;&lt;b&gt;프로젝트 만들기&lt;/b&gt;&quot; 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CuXot/btsQ2rtevFc/8pdQVh83bSUKv4nKt7UcWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CuXot/btsQ2rtevFc/8pdQVh83bSUKv4nKt7UcWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CuXot/btsQ2rtevFc/8pdQVh83bSUKv4nKt7UcWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCuXot%2FbtsQ2rtevFc%2F8pdQVh83bSUKv4nKt7UcWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;454&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &quot;&lt;b&gt;키 만들기&lt;/b&gt;&quot; 버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfeyi2/btsQ5FXjYAo/6UYOO1W7P2FrN4iJG0zZT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfeyi2/btsQ5FXjYAo/6UYOO1W7P2FrN4iJG0zZT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfeyi2/btsQ5FXjYAo/6UYOO1W7P2FrN4iJG0zZT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfeyi2%2FbtsQ5FXjYAo%2F6UYOO1W7P2FrN4iJG0zZT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;486&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 생성 완료 후, &lt;b&gt;API 키 대시보드에 생성된 API 키가 &lt;/b&gt;표시됩니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9KTWG/btsQ3jO1eVW/VUdCCYlTgK9IZqguHh6fXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9KTWG/btsQ3jO1eVW/VUdCCYlTgK9IZqguHh6fXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9KTWG/btsQ3jO1eVW/VUdCCYlTgK9IZqguHh6fXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9KTWG%2FbtsQ3jO1eVW%2FVUdCCYlTgK9IZqguHh6fXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;728&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. API 키를 누르면,&amp;nbsp; &lt;b&gt;API 키 세부정보&lt;/b&gt;를 알 수 있습니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR1inF/btsQ4l6kBsr/qGQp04G2bPhJUT0GEy0MOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR1inF/btsQ4l6kBsr/qGQp04G2bPhJUT0GEy0MOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR1inF/btsQ4l6kBsr/qGQp04G2bPhJUT0GEy0MOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR1inF%2FbtsQ4l6kBsr%2FqGQp04G2bPhJUT0GEy0MOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;705&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1674&quot; data-start=&quot;1654&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ API 키 관리 및 보안&lt;/h2&gt;
&lt;p data-end=&quot;1734&quot; data-start=&quot;1676&quot; data-ke-size=&quot;size16&quot;&gt;API 키는 &lt;b&gt;비밀번호와 같은 민감 정보&lt;/b&gt;입니다.&lt;br /&gt;절대 깃허브나 코드에 직접 노출되면 안 됩니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1754&quot; data-start=&quot;1736&quot; data-ke-size=&quot;size23&quot;&gt;✅ 안전하게 관리하는 방법&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 101px;&quot; border=&quot;1&quot; data-end=&quot;2016&quot; data-start=&quot;1756&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1837&quot; data-start=&quot;1784&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1799&quot; data-start=&quot;1784&quot;&gt;&lt;b&gt;로컬 개발 환경&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;1837&quot; data-start=&quot;1799&quot;&gt;.env 파일에 GEMINI_API_KEY=발급키 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1915&quot; data-start=&quot;1838&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1863&quot; data-start=&quot;1838&quot;&gt;&lt;b&gt;Spring Boot (Java)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;1915&quot; data-start=&quot;1863&quot;&gt;application-sample.yml에 ${GEMINI_API_KEY} 참조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1971&quot; data-start=&quot;1916&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1936&quot; data-start=&quot;1916&quot;&gt;&lt;b&gt;배포 환경 (AWS 등)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;1971&quot; data-start=&quot;1936&quot;&gt;환경 변수(Environment Variable)로 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2016&quot; data-start=&quot;1972&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1986&quot; data-start=&quot;1972&quot;&gt;&lt;b&gt;공유 시 주의&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;2016&quot; data-start=&quot;1986&quot;&gt;협업자는 &lt;b&gt;별도의 키를 발급받는 것&lt;/b&gt;을 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2037&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size16&quot;&gt;  예시 (Spring Boot)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759822146060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gemini:
  api-key: ${GEMINI_API_KEY}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2122&quot; data-start=&quot;2093&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ Postman 으로 테스트하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키가 정상 작동하는지 테스트해봅시다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Gemini API 공식 문서를 통해 &lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;Gemini API 키 사용 방법을 확인합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1759822340675&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Gemini API 키 사용 &amp;nbsp;|&amp;nbsp; Google AI for Developers&quot; data-og-description=&quot;Gemini API 키를 가져와 5분 이내에 빌드를 시작하세요.&quot; data-og-host=&quot;ai.google.dev&quot; data-og-source-url=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot; data-og-url=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j71VL/hyZKiUbhYj/4dNKjmkEiSHFw18PHIp9v1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j71VL/hyZKiUbhYj/4dNKjmkEiSHFw18PHIp9v1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gemini API 키 사용 &amp;nbsp;|&amp;nbsp; Google AI for Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Gemini API 키를 가져와 5분 이내에 빌드를 시작하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ai.google.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-end=&quot;2170&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size20&quot;&gt;2. 다음은&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gemini API 공식 문서의&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt; &quot;&lt;b&gt;API 키를 명시적으로 제공하는 방법의 예&lt;/b&gt;&quot;입니다.&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1759822431630&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl &quot;https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent&quot; \
  -H 'Content-Type: application/json' \
  -H &quot;x-goog-api-key: YOUR_API_KEY&quot; \
  -X POST \
  -d '{
    &quot;contents&quot;: [
      {
        &quot;parts&quot;: [
          {
            &quot;text&quot;: &quot;Explain how AI works in a few words&quot;
          }
        ]
      }
    ]
  }'&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Postman을 활용하여 테스트하겠습니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Do3rM/btsQ5EqySbC/bLHhOksUSaZnWXgna14kqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Do3rM/btsQ5EqySbC/bLHhOksUSaZnWXgna14kqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Do3rM/btsQ5EqySbC/bLHhOksUSaZnWXgna14kqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDo3rM%2FbtsQ5EqySbC%2FbLHhOksUSaZnWXgna14kqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;352&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0WDF/btsQ2gd9uEC/fI5qdLRnpeckHGB5pTcvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0WDF/btsQ2gd9uEC/fI5qdLRnpeckHGB5pTcvK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0WDF/btsQ2gd9uEC/fI5qdLRnpeckHGB5pTcvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0WDF%2FbtsQ2gd9uEC%2FfI5qdLRnpeckHGB5pTcvK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;535&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7H4ha/btsQ4lebV4V/5K3Un5kgPPKNG4zdb6VjgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7H4ha/btsQ4lebV4V/5K3Un5kgPPKNG4zdb6VjgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7H4ha/btsQ4lebV4V/5K3Un5kgPPKNG4zdb6VjgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7H4ha%2FbtsQ4lebV4V%2F5K3Un5kgPPKNG4zdb6VjgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;770&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2640&quot; data-start=&quot;2630&quot; data-ke-size=&quot;size26&quot;&gt;  정리하며&lt;/h2&gt;
&lt;p data-end=&quot;2726&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;이제 &lt;b&gt;Gemini API 키 발급&lt;/b&gt;이 완료되었습니다.&lt;br /&gt;이 키를 이용하면 여러분의 서비스에서 Google의 AI를 자유롭게 활용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2847&quot; data-start=&quot;2836&quot; data-ke-size=&quot;size26&quot;&gt;  참고 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ai.google.dev/aistudio?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ai.google.dev/aistudio?hl=ko&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;3047&quot; data-start=&quot;2985&quot;&gt;&lt;a href=&quot;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ai.google.dev/gemini-api/docs/api-key?hl=ko&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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>내맘대로 개발 일기/Ai</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/170</guid>
      <comments>https://bu119.tistory.com/170#entry170comment</comments>
      <pubDate>Mon, 13 Oct 2025 18:00:58 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 영속성 컨텍스트의 기능</title>
      <link>https://bu119.tistory.com/169</link>
      <description>&lt;p data-end=&quot;210&quot; data-start=&quot;129&quot; data-ke-size=&quot;size16&quot;&gt;  TIL (Today I Learned) &amp;mdash; 2025.09.25. 목요일&lt;br /&gt;✍️ 내일배움캠프에서 Spring 학습 중 정리한 내용입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;221&quot; data-start=&quot;207&quot; data-ke-size=&quot;size26&quot;&gt;왜 알아야 할까?&lt;/h2&gt;
&lt;p data-end=&quot;271&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;JPA의 핵심은 &lt;b&gt;영속성 컨텍스트(Persistence Context)&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-end=&quot;271&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;297&quot; data-start=&quot;263&quot; data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 단순히 엔티티를 보관하는 공간이 아니라,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;398&quot; data-start=&quot;298&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;298&quot;&gt;&lt;b&gt;조회 최적화 (캐시 제공)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;335&quot; data-start=&quot;321&quot;&gt;&lt;b&gt;동일성 보장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;364&quot; data-start=&quot;336&quot;&gt;&lt;b&gt;SQL 실행 시점 제어 (쓰기 지연)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;365&quot;&gt;&lt;b&gt;변경 자동 감지 (Dirty Checking)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;504&quot; data-start=&quot;400&quot; data-ke-size=&quot;size16&quot;&gt;와 같은 기능을 통해 개발자가 SQL을 직접 관리하지 않아도 안정적이고 효율적인 데이터 처리를 가능하게 합니다.&lt;br /&gt;즉, 성능 최적화와 개발 생산성을 동시에 돕는 핵심 메커니즘입니다.&lt;/p&gt;
&lt;p data-end=&quot;516&quot; data-start=&quot;411&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;549&quot; data-start=&quot;506&quot; data-ke-size=&quot;size16&quot;&gt;  이번 글에서는 영속성 컨텍스트가 제공하는 주요 기능을 살펴보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;605&quot; data-start=&quot;572&quot; data-ke-size=&quot;size26&quot;&gt;1. 1차 캐시 (First-Level Cache)&lt;/h2&gt;
&lt;p data-end=&quot;662&quot; data-start=&quot;606&quot; data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 내부적으로 &lt;b&gt;Map&amp;lt;Id, Entity&amp;gt;&lt;/b&gt; 형태의 &lt;b&gt;1차 캐시&lt;/b&gt;를 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;516&quot; data-start=&quot;466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;692&quot; data-start=&quot;664&quot;&gt;&lt;b&gt;Key&lt;/b&gt;: @Id 로 매핑된 식별자 값&lt;/li&gt;
&lt;li data-end=&quot;714&quot; data-start=&quot;693&quot;&gt;&lt;b&gt;Value&lt;/b&gt;: 엔티티 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;518&quot; data-ke-size=&quot;size16&quot;&gt;  동작 방식&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758791656852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;em.persist(entity); // 엔티티 &amp;rarr; 1차 캐시에 저장
em.find(Entity.class, id); // 캐시에 있으면 DB 조회 없이 반환&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;829&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758793593121&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo1 = em.find(Memo.class, 1L); // 캐시에 없으면 DB 조회 후 캐시에 저장
Memo memo2 = em.find(Memo.class, 1L); // 캐시에 있으므로 DB 조회 없음

System.out.println(memo1 == memo2); // true (동일 객체 보장)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1078&quot; data-start=&quot;1011&quot; data-ke-size=&quot;size16&quot;&gt;  같은 데이터를 반복 조회할 때 DB 부하를 줄이고, 항상 같은 객체를 반환하여 &lt;b&gt;객체 동일성&lt;/b&gt;을 보장합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;967&quot; data-start=&quot;949&quot; data-ke-size=&quot;size26&quot;&gt;2. 엔티티 저장과 조회&lt;/h2&gt;
&lt;h3 data-end=&quot;974&quot; data-start=&quot;968&quot; data-ke-size=&quot;size23&quot;&gt;저장&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758791679557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo = new Memo();
memo.setId(1L);
memo.setUsername(&quot;Robbie&quot;);
memo.setContents(&quot;1차 캐시 테스트&quot;);

em.persist(memo); // 1차 캐시에 저장됨&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1128&quot; data-start=&quot;1120&quot; data-ke-size=&quot;size23&quot;&gt;조회&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1187&quot; data-start=&quot;1129&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1310&quot; data-start=&quot;1284&quot;&gt;캐시에 없으면 DB 조회 후 캐시에 저장&lt;/li&gt;
&lt;li data-end=&quot;1331&quot; data-start=&quot;1311&quot;&gt;캐시에 있으면 DB 조회 생략&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758791690137&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo1 = em.find(Memo.class, 1L); // DB 조회 &amp;rarr; 캐시에 저장
Memo memo2 = em.find(Memo.class, 1L); // 캐시에서 바로 조회&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1335&quot; data-start=&quot;1321&quot; data-ke-size=&quot;size26&quot;&gt;3. 엔티티 삭제&lt;/h2&gt;
&lt;p data-end=&quot;1360&quot; data-start=&quot;1336&quot; data-ke-size=&quot;size16&quot;&gt;엔티티를 삭제할 때도 캐시를 활용합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1490&quot; data-start=&quot;1362&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1498&quot; data-start=&quot;1459&quot;&gt;삭제 대상 엔티티 조회 (캐시에 없으면 DB에서 불러와 저장)&lt;/li&gt;
&lt;li data-end=&quot;1552&quot; data-start=&quot;1499&quot;&gt;em.remove(entity) 호출 &amp;rarr; 엔티티 상태가 &lt;b&gt;DELETED&lt;/b&gt;로 변경&lt;/li&gt;
&lt;li data-end=&quot;1585&quot; data-start=&quot;1553&quot;&gt;트랜잭션 commit 시 DELETE SQL 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1758791704511&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo = em.find(Memo.class, 2L); // MANAGED 상태
em.remove(memo);                     // DELETED 상태
tx.commit();                         // DELETE SQL 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1797&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 삭제하려는 엔티티는 반드시 &lt;b&gt;MANAGED 상태&lt;/b&gt;여야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1646&quot; data-start=&quot;1614&quot; data-ke-size=&quot;size26&quot;&gt;4. 쓰기 지연 저장소 (Write-Behind)&lt;/h2&gt;
&lt;p data-end=&quot;1708&quot; data-start=&quot;1647&quot; data-ke-size=&quot;size16&quot;&gt;JPA는 SQL을 곧바로 실행하지 않고, &lt;b&gt;쓰기 지연 저장소(Action Queue)&lt;/b&gt; 에 모아둡니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758791717712&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo m1 = new Memo(2L, &quot;Robbert&quot;, &quot;쓰기 지연 저장소&quot;);
em.persist(m1);

Memo m2 = new Memo(3L, &quot;Bob&quot;, &quot;SQL 모으기&quot;);
em.persist(m2);

// 아직 INSERT SQL 실행되지 않음
tx.commit(); // commit 시점에 INSERT SQL 2개 한 번에 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2112&quot; data-ke-size=&quot;size16&quot;&gt;  SQL을 모았다가 한 번에 실행함으로써 &lt;b&gt;성능 최적화&lt;/b&gt;가 가능합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2195&quot; data-start=&quot;2180&quot; data-ke-size=&quot;size26&quot;&gt;5. flush()&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; flush()&lt;/b&gt;는 영속성 컨텍스트의 변경 내용을 &lt;b&gt;쓰기 지연 저장소에 쌓인 SQL을 DB에 반영&lt;/b&gt;하는 역할을 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2397&quot; data-start=&quot;2239&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2316&quot; data-start=&quot;2239&quot;&gt;&lt;b&gt;자동 실행 시점&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2316&quot; data-start=&quot;2258&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2273&quot; data-start=&quot;2258&quot;&gt;트랜잭션 커밋 직전&lt;/li&gt;
&lt;li data-end=&quot;2316&quot; data-start=&quot;2276&quot;&gt;JPQL 실행 직전 (FlushModeType.AUTO일 경우)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2397&quot; data-start=&quot;2318&quot;&gt;&lt;b&gt;수동 실행&lt;/b&gt;&lt;br /&gt;필요하다면 &lt;b&gt;em.flush()&lt;/b&gt;를 직접 호출할 수도 있습니다.&lt;br /&gt;(단, 트랜잭션 내부에서만 호출 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758793743699&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo = new Memo(4L, &quot;Flush&quot;, &quot;flush 직접 호출&quot;);
em.persist(memo);

em.flush(); // 즉시 INSERT SQL 실행&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2093&quot; data-start=&quot;2063&quot; data-ke-size=&quot;size26&quot;&gt;6. 변경 감지 (Dirty Checking)&lt;/h2&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2094&quot; data-ke-size=&quot;size16&quot;&gt;JPA에는&lt;b&gt; em.update()&lt;/b&gt; 메서드가 없습니다.&lt;/p&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2094&quot; data-ke-size=&quot;size16&quot;&gt;대신 &lt;b&gt;변경 감지(Dirty Checking)&lt;/b&gt; 로 UPDATE를 처리합니다.&lt;/p&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2169&quot; data-start=&quot;2159&quot; data-ke-size=&quot;size16&quot;&gt;  동작 방식&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2311&quot; data-start=&quot;2170&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2703&quot; data-start=&quot;2655&quot;&gt;엔티티를 영속성 컨텍스트에 저장할 때 최초 상태(Snapshot)를 함께 보관&lt;/li&gt;
&lt;li data-end=&quot;2727&quot; data-start=&quot;2704&quot;&gt;트랜잭션 커밋 시 flush 실행&lt;/li&gt;
&lt;li data-end=&quot;2746&quot; data-start=&quot;2728&quot;&gt;현재 상태와 스냅샷 비교&lt;/li&gt;
&lt;li data-end=&quot;2773&quot; data-start=&quot;2747&quot;&gt;변경이 있으면 UPDATE SQL 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758791743986&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Memo memo = em.find(Memo.class, 4L); // 최초 상태 스냅샷 저장
memo.setUsername(&quot;Update&quot;);
memo.setContents(&quot;변경 감지 확인&quot;);

tx.commit(); // UPDATE SQL 자동 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3003&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size16&quot;&gt;  엔티티의 값을 바꾸는 것만으로 SQL이 자동 실행되므로, 개발자가 직접 UPDATE SQL을 작성할 필요가 없습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;3018&quot; data-start=&quot;3010&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;3044&quot; data-start=&quot;3020&quot; data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 단순 저장소가 아니라,&lt;/p&gt;
&lt;blockquote data-end=&quot;3094&quot; data-start=&quot;3045&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3094&quot; data-start=&quot;3047&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1차 캐시, 동일성 보장, 삭제 관리, 쓰기 지연, flush, 변경 감지&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3130&quot; data-start=&quot;3096&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3130&quot; data-start=&quot;3096&quot; data-ke-size=&quot;size16&quot;&gt;를 통해 SQL 작성 부담을 줄이고 성능까지 최적화합니다.&lt;/p&gt;
&lt;p data-end=&quot;3130&quot; data-start=&quot;3096&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3230&quot; data-start=&quot;3132&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 환경에서는&lt;b&gt; @Transactional&lt;/b&gt;만 올바르게 선언해도 이 모든 기능이 자동으로 동작하므로, 개발자는 &lt;b&gt;비즈니스 로직&lt;/b&gt;에 집중할 수 있습니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/169</guid>
      <comments>https://bu119.tistory.com/169#entry169comment</comments>
      <pubDate>Thu, 25 Sep 2025 18:20:11 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 영속성 컨텍스트란?</title>
      <link>https://bu119.tistory.com/168</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;159&quot; data-end=&quot;240&quot;&gt;  TIL (Today I Learned) &amp;mdash; 2025.09.24. 수요일&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot; data-start=&quot;159&quot; data-end=&quot;240&quot;&gt;✍️ 내일배움캠프에서 Spring 학습 중 정리한 내용입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;276&quot; data-start=&quot;262&quot; data-ke-size=&quot;size26&quot;&gt;왜 알아야 할까?&lt;/h2&gt;
&lt;p data-end=&quot;371&quot; data-start=&quot;277&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발에서는 항상 &lt;b&gt;자바 객체와 데이터베이스 행(Row)&lt;/b&gt; 사이를 오가야 합니다.&lt;br /&gt;매번 SQL을 직접 작성하면 코드가 복잡해지고 유지보수가 어려워집니다.&lt;/p&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;373&quot; data-ke-size=&quot;size16&quot;&gt;  이 과정을 단순화해 주는 것이 JPA이며, 그 핵심에 &lt;b&gt;영속성 컨텍스트(Persistence Context)&lt;/b&gt; 가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;373&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;507&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 &lt;b&gt;엔티티(Entity)를 보관하고 상태를 추적하는 공간&lt;/b&gt;입니다.&lt;br /&gt;덕분에,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;627&quot; data-start=&quot;508&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;508&quot;&gt;같은 데이터를 반복 조회해도 DB를 다시 찍지 않고 캐시에서 가져올 수 있고,&lt;/li&gt;
&lt;li data-end=&quot;589&quot; data-start=&quot;556&quot;&gt;엔티티 변경을 자동으로 감지해서 SQL을 만들어주며,&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;590&quot;&gt;여러 SQL을 모아 효율적으로 한 번에 전송할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;652&quot; data-start=&quot;634&quot; data-ke-size=&quot;size26&quot;&gt;1. 영속성 컨텍스트란?&lt;/h2&gt;
&lt;p data-end=&quot;667&quot; data-start=&quot;653&quot; data-ke-size=&quot;size16&quot;&gt;한 문장으로 정리하면,&lt;/p&gt;
&lt;blockquote data-end=&quot;726&quot; data-start=&quot;668&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;726&quot; data-start=&quot;670&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;JPA가 엔티티를 캐싱하고, 변경을 추적하며, DB 반영 시점을 관리하는 작업 공간&amp;rdquo;입니다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;709&quot; data-start=&quot;690&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;709&quot; data-start=&quot;690&quot; data-ke-size=&quot;size16&quot;&gt;  영속성 컨텍스트 주요 기능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1036&quot; data-start=&quot;761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;762&quot; data-start=&quot;710&quot;&gt;&lt;b&gt;1차 캐시&lt;/b&gt;: 동일한 엔티티를 여러 번 조회해도 DB가 아닌 캐시에서 반환합니다.&lt;/li&gt;
&lt;li data-end=&quot;815&quot; data-start=&quot;763&quot;&gt;&lt;b&gt;동일성 보장&lt;/b&gt;: 같은 영속성 컨텍스트 내에서는 == 비교가 true입니다.&lt;/li&gt;
&lt;li data-end=&quot;943&quot; data-start=&quot;867&quot;&gt;&lt;b&gt;변경 감지(Dirty Checking)&lt;/b&gt;: 엔티티의 필드를 바꾸면 커밋 시점에 자동으로 UPDATE SQL이 생성됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1036&quot; data-start=&quot;944&quot;&gt;&lt;b&gt;쓰기 지연(Write-Behind)&lt;/b&gt;: INSERT, UPDATE, DELETE SQL을 모아 두었다가 트랜잭션 커밋 시 한 번에 실행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1065&quot; data-start=&quot;1043&quot; data-ke-size=&quot;size26&quot;&gt;2. JPA와 데이터베이스 관계&lt;/h2&gt;
&lt;p data-end=&quot;1156&quot; data-start=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;JPA는 &lt;b&gt;애플리케이션 &amp;harr; 데이터베이스&lt;/b&gt; 사이의 중간 계층 역할을 합니다.&lt;br /&gt;개발자는 엔티티만 다루면 되고, JPA가 SQL로 변환해 DB와 통신합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1206&quot; data-start=&quot;1163&quot; data-ke-size=&quot;size26&quot;&gt;3. EntityManager와 EntityManagerFactory&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1453&quot; data-start=&quot;1207&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1308&quot; data-start=&quot;1207&quot;&gt;&lt;b&gt;EntityManagerFactory (EMF)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1308&quot; data-start=&quot;1244&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1262&quot; data-start=&quot;1244&quot;&gt;무겁고 스레드 안전합니다.&lt;/li&gt;
&lt;li data-end=&quot;1308&quot; data-start=&quot;1265&quot;&gt;보통 애플리케이션 시작 시 DB당 하나만 생성해서 전체에서 공유합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1453&quot; data-start=&quot;1310&quot;&gt;&lt;b&gt;EntityManager (EM)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1453&quot; data-start=&quot;1339&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1349&quot; data-start=&quot;1339&quot;&gt;가볍습니다.&lt;/li&gt;
&lt;li data-end=&quot;1374&quot; data-start=&quot;1352&quot;&gt;요청/트랜잭션 단위로 생성합니다.&lt;/li&gt;
&lt;li data-end=&quot;1419&quot; data-start=&quot;1377&quot;&gt;하나의 EntityManager는 하나의 영속성 컨텍스트를 가집니다.&lt;/li&gt;
&lt;li data-end=&quot;1453&quot; data-start=&quot;1422&quot;&gt;스레드 안전하지 않으므로 사용 후 닫아야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758717365468&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;memo&quot;);
EntityManager em = emf.createEntityManager();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1733&quot; data-start=&quot;1589&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1733&quot; data-start=&quot;1589&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Spring Boot에서는?&lt;/b&gt;&lt;br /&gt;이 과정을 직접 하지 않습니다.&lt;br /&gt;&lt;b&gt;spring-boot-starter-data-jpa&lt;/b&gt;가 자동으로 EMF를 만들고, 요청마다 EM을 주입합니다.&lt;br /&gt;개발자는 &lt;b&gt;@Transactional&lt;/b&gt;만 선언하면 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1858&quot; data-start=&quot;1824&quot; data-ke-size=&quot;size26&quot;&gt;4. EntityManagerFactory 생성 과정&lt;/h2&gt;
&lt;p data-end=&quot;1916&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size16&quot;&gt;EntityManagerFactory는 persistence.xml 설정을 기반으로 생성됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758717784082&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;persistence-unit name=&quot;memo&quot;&amp;gt;
    &amp;lt;class&amp;gt;com.sparta.entity.Memo&amp;lt;/class&amp;gt;
    &amp;lt;properties&amp;gt;
        &amp;lt;property name=&quot;jakarta.persistence.jdbc.driver&quot; value=&quot;com.mysql.cj.jdbc.Driver&quot;/&amp;gt;
        &amp;lt;property name=&quot;jakarta.persistence.jdbc.url&quot; value=&quot;jdbc:mysql://localhost:3306/memo&quot;/&amp;gt;
        &amp;lt;property name=&quot;jakarta.persistence.jdbc.user&quot; value=&quot;root&quot;/&amp;gt;
        &amp;lt;property name=&quot;jakarta.persistence.jdbc.password&quot; value=&quot;비밀번호&quot;/&amp;gt;
        &amp;lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;update&quot;/&amp;gt;
        &amp;lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot;/&amp;gt;
    &amp;lt;/properties&amp;gt;
&amp;lt;/persistence-unit&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1759&quot; data-start=&quot;1740&quot; data-ke-size=&quot;size26&quot;&gt;5. 트랜잭션과 쓰기 지연&lt;/h2&gt;
&lt;p data-end=&quot;1807&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션은 &lt;b&gt;&quot;전부 성공하거나 전부 실패해야 하는 하나의 작업 단위&quot;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1807&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1930&quot; data-start=&quot;1809&quot; data-ke-size=&quot;size16&quot;&gt;JPA는 엔티티 변경 내용을 즉시 DB에 보내지 않고, &lt;b&gt;쓰기 지연 저장소(Action Queue)&lt;/b&gt; 에 쌓아둡니다.&lt;br /&gt;그리고 트랜잭션이 커밋될 때&lt;b&gt; flush()&lt;/b&gt;가 발생하면서 SQL이 한 번에 실행됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1930&quot; data-start=&quot;1809&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1959&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size16&quot;&gt;flush가 발생하는 시점은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2042&quot; data-start=&quot;1960&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1980&quot; data-start=&quot;1960&quot;&gt;트랜잭션 커밋 직전 (자동)&lt;/li&gt;
&lt;li data-end=&quot;2009&quot; data-start=&quot;1981&quot;&gt;명시적으로 &lt;b&gt;em.flush()&lt;/b&gt; 호출 시&lt;/li&gt;
&lt;li data-end=&quot;2042&quot; data-start=&quot;2010&quot;&gt;JPQL 실행 직전 (기본 AUTO 모드일 경우)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2066&quot; data-start=&quot;2049&quot; data-ke-size=&quot;size26&quot;&gt;6. 저장과 롤백 예제&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758717426664&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EntityTransaction tx = em.getTransaction();
tx.begin();

try {
    Memo memo = new Memo();
    memo.setId(1L); // @GeneratedValue 사용 시에는 직접 지정하지 않습니다.
    memo.setUsername(&quot;Robbie&quot;);
    memo.setContents(&quot;영속성 컨텍스트 테스트&quot;);

    em.persist(memo); // DB에는 즉시 반영되지 않음
    tx.commit();      // commit 시점에 INSERT SQL 실행
} catch (Exception e) {
    tx.rollback();    // 오류 발생 시 되돌림
} finally {
    em.close();
    emf.close();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2646&quot; data-start=&quot;2502&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2542&quot; data-start=&quot;2502&quot;&gt;&lt;b&gt;em.persist()&lt;/b&gt; 호출만으로는 DB에 반영되지 않습니다.&lt;/li&gt;
&lt;li data-end=&quot;2604&quot; data-start=&quot;2543&quot;&gt;&lt;b&gt;tx.commit()&lt;/b&gt; 시점에 flush()가 실행되며, INSERT SQL이 DB에 전달됩니다.&lt;/li&gt;
&lt;li data-end=&quot;2646&quot; data-start=&quot;2605&quot;&gt;오류가 발생하면&lt;b&gt; rollback()&lt;/b&gt;으로 모든 변경이 취소됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2676&quot; data-start=&quot;2653&quot; data-ke-size=&quot;size26&quot;&gt;7. 실무에서는 이렇게 사용합니다&lt;/h2&gt;
&lt;p data-end=&quot;2750&quot; data-start=&quot;2678&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 환경에서는 &lt;b&gt;@Transactional&lt;/b&gt;만 붙이면 영속성 컨텍스트와 트랜잭션이 자동으로 열리고 닫힙니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758717437702&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class MemoService {
    private final EntityManager em;

    @Transactional
    public void save(Memo memo) {
        em.persist(memo); // commit 시점에 DB 반영
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3060&quot; data-start=&quot;2970&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3060&quot; data-start=&quot;2970&quot;&gt;조회 전용 메서드에는 &lt;b&gt;@Transactional(readOnly = true)&lt;/b&gt;를 붙이면 &lt;b&gt;불필요한 flush 방지&lt;/b&gt;로 성능 최적화에 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;3075&quot; data-start=&quot;3067&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;3106&quot; data-start=&quot;3076&quot; data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 JPA의 가장 중요한 개념입니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;3165&quot; data-start=&quot;3108&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3165&quot; data-start=&quot;3110&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;트랜잭션 동안 엔티티를 캐시하고, 변경을 추적하며, SQL 실행 시점을 조절하는 공간&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3235&quot; data-start=&quot;3167&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3235&quot; data-start=&quot;3167&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 환경에서는&lt;b&gt; @Transactional&lt;/b&gt;만 올바르게 사용해도 이 모든 기능이 자동으로 동작합니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/168</guid>
      <comments>https://bu119.tistory.com/168#entry168comment</comments>
      <pubDate>Wed, 24 Sep 2025 21:45:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] IoC 컨테이너와 Bean &amp;mdash; 객체를 관리하는 Spring의 방식</title>
      <link>https://bu119.tistory.com/167</link>
      <description>&lt;p data-end=&quot;240&quot; data-start=&quot;159&quot; data-ke-size=&quot;size16&quot;&gt;  TIL (Today I Learned) &amp;mdash; 2025.09.23. 화요일&lt;/p&gt;
&lt;blockquote data-end=&quot;240&quot; data-start=&quot;159&quot; data-ke-style=&quot;style2&quot;&gt;✍️ 내일배움캠프에서 Spring 학습 중 정리한 내용입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;270&quot; data-start=&quot;247&quot; data-ke-size=&quot;size26&quot;&gt;1. IoC 컨테이너와 Bean이란?&lt;/h2&gt;
&lt;p data-end=&quot;376&quot; data-start=&quot;271&quot; data-ke-size=&quot;size16&quot;&gt;앞서 1편에서 &lt;b&gt;IoC(제어의 역전)와 DI(의존성 주입)&lt;/b&gt;를 살펴봤습니다.&lt;br /&gt;그렇다면 &amp;ldquo;필요한 객체를 누가 생성하고, 어디에 보관하며, 어떻게 주입해줄까?&amp;rdquo;라는 질문이 생깁니다.&lt;/p&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;378&quot; data-ke-size=&quot;size16&quot;&gt;이 역할을 담당하는 것이 바로 &lt;b&gt;Spring IoC 컨테이너&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;496&quot; data-start=&quot;422&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;459&quot; data-start=&quot;422&quot;&gt;&lt;b&gt;Bean&lt;/b&gt;: Spring이 대신 생성하고 관리하는 객체&lt;/li&gt;
&lt;li data-end=&quot;496&quot; data-start=&quot;460&quot;&gt;&lt;b&gt;IoC 컨테이너&lt;/b&gt;: Bean을 모아두고 관리하는 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;498&quot; data-ke-size=&quot;size16&quot;&gt;  개발자가 직접 객체를 만들지 않아도, Spring이 알아서 Bean을 준비하고 필요한 곳에 주입해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;584&quot; data-start=&quot;568&quot; data-ke-size=&quot;size26&quot;&gt;2. Bean 등록 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;605&quot; data-start=&quot;586&quot; data-ke-size=&quot;size23&quot;&gt;@Component&lt;/h3&gt;
&lt;p data-end=&quot;659&quot; data-start=&quot;606&quot; data-ke-size=&quot;size16&quot;&gt;클래스 위에 @Component를 붙이면 Spring이 자동으로 Bean으로 등록합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758604608872&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class MemoService { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;729&quot; data-start=&quot;718&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;729&quot; data-start=&quot;718&quot; data-ke-size=&quot;size16&quot;&gt;서버가 시작될 때&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;802&quot; data-start=&quot;730&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;763&quot; data-start=&quot;730&quot;&gt;Spring이 MemoService 객체를 생성&lt;/li&gt;
&lt;li data-end=&quot;802&quot; data-start=&quot;764&quot;&gt;IoC 컨테이너에 memoService라는 이름으로 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1758604815738&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. MemoService 객체 생성
MemoService memoService = new MemoService();

// 2. Spring IoC 컨테이너에 Bean (memoService) 저장
// memoService -&amp;gt; Spring IoC 컨테이너&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;832&quot; data-start=&quot;809&quot; data-ke-size=&quot;size23&quot;&gt;@ComponentScan&lt;/h3&gt;
&lt;p data-end=&quot;919&quot; data-start=&quot;833&quot; data-ke-size=&quot;size16&quot;&gt;@ComponentScan을 사용하면 지정된 패키지와 그 하위 패키지를 뒤져서 @Component가 붙은 클래스를 모두 Bean으로 등록합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758604631047&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@ComponentScan(basePackages = &quot;com.sparta.memo&quot;)
class BeanConfig { }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1166&quot; data-start=&quot;1019&quot; data-ke-size=&quot;size16&quot;&gt;  Spring Boot에서는 @SpringBootApplication에 기본적으로 @ComponentScan이 포함되어 있습니다.&lt;br /&gt;따라서 별도 설정이 없어도 com.sparta.memo 패키지 하위 클래스들은 자동으로 Bean으로 등록됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1200&quot; data-start=&quot;1173&quot; data-ke-size=&quot;size23&quot;&gt;3 Layer Annotation&lt;/h3&gt;
&lt;p data-end=&quot;1249&quot; data-start=&quot;1201&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 단순히 @Component 대신 역할에 맞는 애너테이션을 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1370&quot; data-start=&quot;1251&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1304&quot; data-start=&quot;1251&quot;&gt;&lt;b&gt;@Controller / @RestController&lt;/b&gt; &amp;rarr; Controller 계층&lt;/li&gt;
&lt;li data-end=&quot;1334&quot; data-start=&quot;1305&quot;&gt;&lt;b&gt;@Service&lt;/b&gt; &amp;rarr; Service 계층&lt;/li&gt;
&lt;li data-end=&quot;1370&quot; data-start=&quot;1335&quot;&gt;&lt;b&gt;@Repository&lt;/b&gt; &amp;rarr; Repository 계층&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1473&quot; data-start=&quot;1372&quot; data-ke-size=&quot;size16&quot;&gt;  이들은 내부적으로 모두 @Component를 포함하고 있어, 자동으로 Bean으로 등록됩니다.&lt;br /&gt;하지만 &lt;b&gt;역할을 명확하게 구분&lt;/b&gt;할 수 있다는 점에서 더 권장됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1496&quot; data-start=&quot;1480&quot; data-ke-size=&quot;size26&quot;&gt;3. Bean 사용 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;1528&quot; data-start=&quot;1498&quot; data-ke-size=&quot;size23&quot;&gt;@Autowired (DI 자동 주입)&lt;/h3&gt;
&lt;p data-end=&quot;1578&quot; data-start=&quot;1529&quot; data-ke-size=&quot;size16&quot;&gt;Spring IoC 컨테이너에서 관리 중인 Bean을 자동으로 주입받을 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758604674358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class MemoService {

    private final MemoRepository memoRepository;

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1849&quot; data-start=&quot;1707&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1771&quot; data-start=&quot;1707&quot;&gt;MemoRepository Bean이 IoC 컨테이너에 존재한다면, Spring이 자동으로 주입해줍니다.&lt;/li&gt;
&lt;li data-end=&quot;1849&quot; data-start=&quot;1772&quot;&gt;@RequiredArgsConstructor는 Lombok을 이용해 생성자 코드를 줄여주는 방식으로, 실무에서 자주 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1893&quot; data-start=&quot;1856&quot; data-ke-size=&quot;size23&quot;&gt;ApplicationContext (직접 가져오기)&lt;/h3&gt;
&lt;p data-end=&quot;1931&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;IoC 컨테이너에 저장된 Bean을 직접 꺼내올 수도 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758604692854&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public MemoService(ApplicationContext context) {
    MemoRepository repo = context.getBean(MemoRepository.class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2190&quot; data-start=&quot;2062&quot; data-ke-size=&quot;size16&quot;&gt;  하지만 Spring 철학은 &amp;ldquo;직접 가져오기보다 자동 주입(@Autowired) 사용&amp;rdquo;입니다.&lt;br /&gt;ApplicationContext 접근은 **특수한 경우(예: 테스트, 동적 Bean 탐색)**에만 쓰는 것이 일반적입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2205&quot; data-start=&quot;2197&quot; data-ke-size=&quot;size26&quot;&gt;4. 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2451&quot; data-start=&quot;2207&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2244&quot; data-start=&quot;2207&quot;&gt;&lt;b&gt;Bean&lt;/b&gt;: Spring이 대신 생성하고 관리하는 객체&lt;/li&gt;
&lt;li data-end=&quot;2282&quot; data-start=&quot;2245&quot;&gt;&lt;b&gt;IoC 컨테이너&lt;/b&gt;: Bean을 모아두고 관리하는 저장소&lt;/li&gt;
&lt;li data-end=&quot;2369&quot; data-start=&quot;2283&quot;&gt;&lt;b&gt;등록 방법&lt;/b&gt;: @Component, @ComponentScan, 3 Layer Annotation(@Service, @Repository 등)&lt;/li&gt;
&lt;li data-end=&quot;2451&quot; data-start=&quot;2370&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;: @Autowired로 주입받는 것이 일반적, ApplicationContext로 직접 꺼내는 것은 특수한 경우에만 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2515&quot; data-start=&quot;2453&quot; data-ke-size=&quot;size16&quot;&gt;  결론적으로, 개발자는 객체 생성과 관리에 신경 쓰지 않고 &lt;b&gt;비즈니스 로직에만 집중&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2520&quot; data-start=&quot;2517&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2533&quot; data-start=&quot;2522&quot; data-ke-size=&quot;size26&quot;&gt;✨ 최종 한 줄&lt;/h2&gt;
&lt;p data-end=&quot;2639&quot; data-start=&quot;2534&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IoC 컨테이너와 Bean은 Spring의 심장과 같은 존재&lt;/b&gt;입니다.&lt;br /&gt;이 덕분에 개발자는 &amp;ldquo;무엇을 만들까?&amp;rdquo;에 집중하고, &amp;ldquo;어떻게 만들지?&amp;rdquo;는 Spring에 맡길 수 있습니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/167</guid>
      <comments>https://bu119.tistory.com/167#entry167comment</comments>
      <pubDate>Tue, 23 Sep 2025 18:00:20 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] IoC와 DI &amp;mdash; 좋은 코드의 핵심 원칙</title>
      <link>https://bu119.tistory.com/166</link>
      <description>&lt;p data-end=&quot;228&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;   TIL (Today I Learned) &amp;mdash; 2025.09.22. 월요일&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;228&quot; data-start=&quot;152&quot; data-ke-style=&quot;style2&quot;&gt;✍️ 내일배움캠프에서 Spring 학습 중 정리한 내용입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;250&quot; data-start=&quot;235&quot; data-ke-size=&quot;size26&quot;&gt;1. IoC와 DI란?&lt;/h2&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;251&quot; data-ke-size=&quot;size16&quot;&gt;Spring을 배우면 가장 먼저 접하는 단어가 &lt;b&gt;IoC&lt;/b&gt;와 &lt;b&gt;DI&lt;/b&gt;입니다.&lt;br /&gt;많은 분들이 &amp;ldquo;Spring에서만 쓰는 기능&amp;rdquo;으로 오해하지만, 사실은 &lt;b&gt;객체지향 설계 원칙&lt;/b&gt;에서 비롯된 개념입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;709&quot; data-start=&quot;368&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;561&quot; data-start=&quot;368&quot;&gt;&lt;b&gt;IoC (Inversion of Control, 제어의 역전)&lt;/b&gt;&lt;br /&gt;객체 생성과 제어 권한을 개발자가 아닌 &lt;b&gt;외부(Spring IoC 컨테이너)&lt;/b&gt;에 맡기는 개념 &lt;br /&gt;&amp;rarr; Spring IoC 컨테이너가 객체 생성, 의존성 연결, 생명주기 관리까지 담당합니다. &lt;br /&gt;  &amp;ldquo;내가 직접 만들지 말고, 대신 해줄 사람에게 맡기자&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;709&quot; data-start=&quot;563&quot;&gt;&lt;b&gt;DI (Dependency Injection, 의존성 주입)&lt;/b&gt;&lt;br /&gt;IoC 원칙을 구현하는 대표적인 방법&lt;br /&gt;객체가 필요한 다른 객체를 직접 생성하지 않고, &lt;b&gt;외부에서 주입받아 사용&lt;/b&gt;합니다.&lt;br /&gt;  &amp;ldquo;필요한 걸 외부에서 갖다 넣어주자&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;806&quot; data-start=&quot;759&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;IoC&lt;/b&gt;는 &lt;b&gt;큰 설계 개념&lt;/b&gt;이고, &lt;b&gt;DI&lt;/b&gt;는 이를 &lt;b&gt;구현하는 방법&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;777&quot; data-start=&quot;764&quot; data-ke-size=&quot;size26&quot;&gt;2. 왜 필요한가?&lt;/h2&gt;
&lt;p data-end=&quot;786&quot; data-start=&quot;778&quot; data-ke-size=&quot;size16&quot;&gt;좋은 코드는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;853&quot; data-start=&quot;787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;798&quot; data-start=&quot;787&quot;&gt;중복이 적고,&lt;/li&gt;
&lt;li data-end=&quot;811&quot; data-start=&quot;799&quot;&gt;이해하기 쉽고,&lt;/li&gt;
&lt;li data-end=&quot;827&quot; data-start=&quot;812&quot;&gt;유지보수가 편리하며,&lt;/li&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;828&quot;&gt;다른 코드와의 결합도가 낮아야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;892&quot; data-start=&quot;855&quot; data-ke-size=&quot;size16&quot;&gt;IoC와 DI는 이 중 &lt;b&gt;결합도를 낮추는 핵심 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;913&quot; data-start=&quot;899&quot; data-ke-size=&quot;size26&quot;&gt;3. 의존성과 결합도&lt;/h2&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;의존성이란 &amp;ldquo;A가 B 없이는 동작할 수 없는 상태&amp;rdquo;를 의미합니다.&lt;/p&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;954&quot; data-ke-size=&quot;size16&quot;&gt;아래 코드를 보면, Consumer는 Chicken에 강하게 의존합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758542115508&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Consumer {
    void eat() {
        Chicken chicken = new Chicken();
        chicken.eat();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  문제점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1240&quot; data-start=&quot;1137&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1171&quot; data-start=&quot;1137&quot;&gt;Consumer는 무조건 Chicken만 먹습니다.&lt;/li&gt;
&lt;li data-end=&quot;1214&quot; data-start=&quot;1172&quot;&gt;만약 피자를 먹고 싶다면 Consumer 코드를 수정해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1214&quot; data-start=&quot;1172&quot;&gt;즉, 코드가 특정 클래스(Chicken)에 강하게 결합되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1075&quot; data-start=&quot;1057&quot; data-ke-size=&quot;size26&quot;&gt;4. 결합도 낮추기 &amp;rarr; 인터페이스 도입&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;p data-end=&quot;368&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결하려면 &lt;b&gt;구체적인 클래스가 아니라 추상적인 개념(인터페이스)에 의존&lt;/b&gt;하도록 바꿔야 합니다.&lt;br /&gt;Chicken, Pizza 같은 개별 음식 대신, &lt;b&gt;음식(Food)&lt;/b&gt;이라는 공통 인터페이스를 정의하는 방식입니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758544090431&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Food { void eat(); }

class Chicken implements Food {
    public void eat() { System.out.println(&quot;치킨을 먹는다.&quot;); }
}
class Pizza implements Food {
    public void eat() { System.out.println(&quot;피자를 먹는다.&quot;); }
}

public class Consumer {
    void eat(Food food) {
        food.eat();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Consumer는 Food라는 추상화에만 의존합니다.&lt;br /&gt;  Chicken이든 Pizza든 자유롭게 교체 가능하며, 새로운 음식 클래스를 추가해도 Consumer 코드를 수정할 필요가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1904&quot; data-start=&quot;1896&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;1936&quot; data-start=&quot;1905&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1914&quot; data-start=&quot;1905&quot;&gt;결합도 &amp;darr;&lt;/li&gt;
&lt;li data-end=&quot;1924&quot; data-start=&quot;1915&quot;&gt;유연성 &amp;uarr;&lt;/li&gt;
&lt;li data-end=&quot;1936&quot; data-start=&quot;1925&quot;&gt;유지보수성 &amp;uarr;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1531&quot; data-start=&quot;1508&quot; data-ke-size=&quot;size26&quot;&gt;5. 주입(Injection)의 방법&lt;/h2&gt;
&lt;p data-end=&quot;1754&quot; data-start=&quot;1707&quot; data-ke-size=&quot;size16&quot;&gt;외부에서 필요한 객체를 넣어주는 걸 &lt;b&gt;주입(Injection)&lt;/b&gt;이라고 합니다.&lt;/p&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;필드 주입 (실무에서는 권장되지 않음)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1758544121951&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;consumer.food = new Chicken();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편리해 보이지만 테스트가 어렵고 순환 참조 문제도 발생하기 때문에 &lt;b&gt;실무에서 거의 사용되지 않습니다.&lt;/b&gt;&lt;/p&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Setter 주입&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758544148948&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;consumer.setFood(new Pizza());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택적으로 교체 가능하지만, 객체가 불변하지 않게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; 생성자 주입 (Spring 권장 방식) &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758544156078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Consumer consumer = new Consumer(new Chicken());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불변성 보장 + 테스트 용이성 확보 &amp;rarr; &lt;b&gt;Spring에서 가장 권장되는 주입 방법&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1877&quot; data-start=&quot;1860&quot; data-ke-size=&quot;size26&quot;&gt;6. 제어의 역전(IoC)&lt;/h2&gt;
&lt;p data-end=&quot;1958&quot; data-start=&quot;1878&quot; data-ke-size=&quot;size16&quot;&gt;원래는 Consumer가 직접 Chicken을 생성했지만,&lt;br /&gt;이제는 &lt;b&gt;외부에서 만들어진 객체(Food)를 주입받아 사용&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;1958&quot; data-start=&quot;1878&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2286&quot; data-start=&quot;2272&quot; data-ke-size=&quot;size16&quot;&gt;즉, 객체 제어 흐름이&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2371&quot; data-start=&quot;2287&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2322&quot; data-start=&quot;2287&quot;&gt;예전: Consumer &amp;rarr; Food (내가 직접 만든다)&lt;/li&gt;
&lt;li data-end=&quot;2371&quot; data-start=&quot;2323&quot;&gt;지금: Spring IoC 컨테이너 &amp;rarr; Consumer (외부가 대신 넣어준다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2404&quot; data-start=&quot;2373&quot; data-ke-size=&quot;size16&quot;&gt;  이것이 바로 &lt;b&gt;제어의 역전(IoC)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2418&quot; data-start=&quot;2411&quot; data-ke-size=&quot;size26&quot;&gt;✨ 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2595&quot; data-start=&quot;2419&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2477&quot; data-start=&quot;2419&quot;&gt;&lt;b&gt;IoC&lt;/b&gt; = 객체 생성&amp;middot;관리 책임을 개발자가 아닌 &lt;b&gt;Spring IoC 컨테이너&lt;/b&gt;에 위임&lt;/li&gt;
&lt;li data-end=&quot;2527&quot; data-start=&quot;2478&quot;&gt;&lt;b&gt;DI&lt;/b&gt; = IoC를 실현하는 대표적인 방법, 필요한 객체를 외부에서 주입받음&lt;/li&gt;
&lt;li data-end=&quot;2560&quot; data-start=&quot;2528&quot;&gt;&lt;b&gt;Spring 권장 주입 방식&lt;/b&gt; = 생성자 주입&lt;/li&gt;
&lt;li data-end=&quot;2595&quot; data-start=&quot;2561&quot;&gt;&lt;b&gt;효과&lt;/b&gt; = 결합도 &amp;darr;, 확장성 &amp;uarr;, 유지보수성 &amp;uarr;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2665&quot; data-start=&quot;2597&quot; data-ke-size=&quot;size16&quot;&gt;Spring은 IoC와 DI를 기반으로, 개발자가 객체 생성이 아닌 &lt;b&gt;비즈니스 로직&lt;/b&gt;에 집중할 수 있도록 돕습니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <category>Di</category>
      <category>IOC</category>
      <category>Sparta</category>
      <category>spring</category>
      <category>SPRING 입문</category>
      <category>Til</category>
      <category>내일배움캠프</category>
      <category>스파르타</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/166</guid>
      <comments>https://bu119.tistory.com/166#entry166comment</comments>
      <pubDate>Mon, 22 Sep 2025 22:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 문자열 다루기 &amp;mdash; String, StringBuffer, StringBuilder 차이</title>
      <link>https://bu119.tistory.com/165</link>
      <description>&lt;p data-end=&quot;242&quot; data-start=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;TIL (Today I Learned) &amp;mdash; 2025.09.19.금요일&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;242&quot; data-start=&quot;167&quot; data-ke-style=&quot;style2&quot;&gt;✍️ 이 글은 내일배움캠프에서 Java 알고리즘 학습 중 문자열 관련 개념을 정리한 TIL입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;294&quot; data-start=&quot;271&quot; data-ke-size=&quot;size26&quot;&gt;1. 왜 문자열 처리가 중요할까?&lt;/h2&gt;
&lt;p data-end=&quot;421&quot; data-start=&quot;295&quot; data-ke-size=&quot;size16&quot;&gt;Java에서 문자열은 단순 출력뿐 아니라 &lt;b&gt;알고리즘 문제 풀이, 웹 개발, 실무 애플리케이션&lt;/b&gt;에서 가장 자주 쓰이는 데이터 타입입니다.&lt;br /&gt;하지만 같은 문자열 연산이라도 어떤 클래스를 선택하느냐에 따라 &lt;b&gt;성능과 안정성&lt;/b&gt;이 크게 달라집니다.&lt;/p&gt;
&lt;p data-end=&quot;421&quot; data-start=&quot;295&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;421&quot; data-start=&quot;385&quot; data-ke-size=&quot;size16&quot;&gt;Java는 문자열 처리를 위해 크게 세 가지 클래스를 제공합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;545&quot; data-start=&quot;423&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;457&quot; data-start=&quot;423&quot;&gt;&lt;b&gt;String&lt;/b&gt; &amp;mdash; 불변(Immutable) 문자열&lt;/li&gt;
&lt;li data-end=&quot;501&quot; data-start=&quot;458&quot;&gt;&lt;b&gt;StringBuffer&lt;/b&gt; &amp;mdash; 가변(Mutable) + 스레드 안전&lt;/li&gt;
&lt;li data-end=&quot;545&quot; data-start=&quot;502&quot;&gt;&lt;b&gt;StringBuilder&lt;/b&gt; &amp;mdash; 가변(Mutable) + 빠른 성능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;String&lt;/b&gt; &amp;mdash; 불변(Immutable)&lt;/h2&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;String str = &quot;Hello&quot;;
str += &quot; World&quot;;  // 새로운 객체 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;654&quot; data-start=&quot;648&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;726&quot; data-start=&quot;655&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;693&quot; data-start=&quot;655&quot;&gt;불변(Immutable) &amp;rarr; 수정 시마다 &lt;b&gt;새로운 객체 생성&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;726&quot; data-start=&quot;694&quot;&gt;동일한 리터럴은 &lt;b&gt;String Pool&lt;/b&gt;에서 재사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;735&quot; data-start=&quot;728&quot; data-ke-size=&quot;size23&quot;&gt;장단점&lt;/h3&gt;
&lt;p data-end=&quot;828&quot; data-start=&quot;736&quot; data-ke-size=&quot;size16&quot;&gt;✅ 안정적 (값 변경 불가 &amp;rarr; 멀티스레드 환경에서 안전)&lt;br /&gt;✅ Map / Set의 키로 적합&lt;br /&gt;❌ 문자열 연결/수정이 잦으면 매번 객체 생성 &amp;rarr; &lt;b&gt;성능 저하&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;828&quot; data-start=&quot;736&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;830&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;언제 사용?&lt;/b&gt;&lt;br /&gt;문자열 변경이 거의 없을 때, Map/Set의 키로 활용할 때&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;StringBuffer&lt;/b&gt; &amp;mdash; 가변(Mutable) + 쓰레드 안전&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuffer sb = new StringBuffer(&quot;Hello&quot;);
sb.append(&quot; World&quot;);  // 같은 객체 내부에서 수정
System.out.println(sb); // &quot;Hello World&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1056&quot; data-start=&quot;1050&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1127&quot; data-start=&quot;1057&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1089&quot; data-start=&quot;1057&quot;&gt;가변(Mutable) &amp;rarr; 같은 객체 안에서 문자열 수정&lt;/li&gt;
&lt;li data-end=&quot;1127&quot; data-start=&quot;1090&quot;&gt;&lt;b&gt;synchronized 지원&lt;/b&gt; &amp;rarr; 멀티스레드 환경에서 안전&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1136&quot; data-start=&quot;1129&quot; data-ke-size=&quot;size23&quot;&gt;장단점&lt;/h3&gt;
&lt;p data-end=&quot;1201&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size16&quot;&gt;✅ 새 객체 생성 없음 &amp;rarr; 효율적&lt;br /&gt;✅ 멀티스레드 환경에서 안전&lt;br /&gt;❌ 단일 스레드에서는 동기화 때문에 성능 손해&lt;/p&gt;
&lt;p data-end=&quot;1201&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1251&quot; data-start=&quot;1203&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;언제 사용?&lt;/b&gt;&lt;br /&gt;멀티스레드 환경에서 여러 스레드가 같은 문자열을 수정할 때&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;b&gt;StringBuilder&lt;/b&gt; &amp;mdash; 가변(Mutable) + 빠른 성능&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder();
String result = sb.append(&quot;Hello&quot;)
                  .append(&quot; &quot;)
                  .append(&quot;World&quot;)
                  .toString();
System.out.println(result); // Hello World&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1535&quot; data-start=&quot;1529&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1590&quot; data-start=&quot;1536&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1572&quot; data-start=&quot;1536&quot;&gt;StringBuffer와 거의 동일하지만 &lt;b&gt;동기화 미지원&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1590&quot; data-start=&quot;1573&quot;&gt;단일 스레드 환경에서 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1599&quot; data-start=&quot;1592&quot; data-ke-size=&quot;size23&quot;&gt;장단점&lt;/h3&gt;
&lt;p data-end=&quot;1649&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size16&quot;&gt;✅ 불필요한 동기화 없음 &amp;rarr; &lt;b&gt;가장 빠름&lt;/b&gt;&lt;br /&gt;❌ 멀티스레드 환경에서는 안전하지 않음&lt;/p&gt;
&lt;p data-end=&quot;1649&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1698&quot; data-start=&quot;1651&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;언제 사용?&lt;/b&gt;&lt;br /&gt;단일 스레드 환경에서 반복적인 문자열 조작이 필요한 경우&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 성능 비교 테스트&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class StringPerformanceTest {
    public static void main(String[] args) {
        int iterations = 100000;

        // String 연결 테스트
        long start = System.currentTimeMillis();
        String str = &quot;&quot;;
        for (int i = 0; i &amp;lt; iterations; i++) {
            str += &quot;a&quot;;
        }
        long stringTime = System.currentTimeMillis() - start;

        // StringBuffer 테스트
        start = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i &amp;lt; iterations; i++) {
            sb.append(&quot;a&quot;);
        }
        long stringBufferTime = System.currentTimeMillis() - start;

        // StringBuilder 테스트
        start = System.currentTimeMillis();
        StringBuilder sBuilder = new StringBuilder();
        for (int i = 0; i &amp;lt; iterations; i++) {
            sBuilder.append(&quot;a&quot;);
        }
        long stringBuilderTime = System.currentTimeMillis() - start;

        System.out.println(&quot;String: &quot; + stringTime + &quot;ms&quot;);
        System.out.println(&quot;StringBuffer: &quot; + stringBufferTime + &quot;ms&quot;);  
        System.out.println(&quot;StringBuilder: &quot; + stringBuilderTime + &quot;ms&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2858&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2858&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;실행 결과 (100,000회 반복)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;클래스&lt;/td&gt;
&lt;td&gt;실행 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;1161ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StringBuffer&lt;/td&gt;
&lt;td&gt;3ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StringBuilder&lt;/td&gt;
&lt;td&gt;4ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡️ 문자열 연결이 많을 때 &lt;b&gt;String은 압도적으로 느리다&lt;/b&gt;는 걸 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 문자열 수정이 많은 상황에서는 String 대신 StringBuilder나 StringBuffer를 선택해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 언제 무엇을 써야 할까?&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;클래스&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;특징&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;스레드 안전성&lt;/td&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;추천 시나리오&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;불변&lt;/td&gt;
&lt;td&gt;✅ O&lt;/td&gt;
&lt;td&gt;❌ 낮음&lt;/td&gt;
&lt;td&gt;변경 거의 없음, Map/Set 키&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StringBuffer&lt;/td&gt;
&lt;td&gt;가변&lt;/td&gt;
&lt;td&gt;✅ O&lt;/td&gt;
&lt;td&gt;⚖️ 중간&lt;/td&gt;
&lt;td&gt;멀티스레드 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StringBuilder&lt;/td&gt;
&lt;td&gt;가변&lt;/td&gt;
&lt;td&gt;❌ X&lt;/td&gt;
&lt;td&gt;  빠름&lt;/td&gt;
&lt;td&gt;단일 스레드, 반복문에서 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p 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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;선택&amp;nbsp;가이드라인&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;548&quot; data-start=&quot;521&quot;&gt;✅ 변경 거의 없음 &amp;rarr; &lt;b&gt;String&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;586&quot; data-start=&quot;549&quot;&gt;✅ 단일 스레드 + 성능 &amp;rarr; &lt;b&gt;StringBuilder&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;620&quot; data-start=&quot;587&quot;&gt;✅ 멀티스레드 + 안전 &amp;rarr; &lt;b&gt;StringBuffer&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ 오늘의 인사이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 무심코 &lt;b&gt;String&lt;/b&gt;을 사용했지만, 문자열 연결이 많은 경우 성능 저하가 발생할 수 있다는 걸 알게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 알고리즘 문제를 풀 때 문자열 조작이 빈번하게 일어나는 경우, &lt;b&gt;StringBuilder&lt;/b&gt;를 활용하면 시간 초과를 피할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 상황에 맞게 String, StringBuffer, StringBuilder를 선택해서 더 효율적인 코드를 작성하겠습니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <category>Java</category>
      <category>Sparta</category>
      <category>string</category>
      <category>StringBuffer</category>
      <category>StringBuilder</category>
      <category>Til</category>
      <category>내일배움캠프</category>
      <category>문자열</category>
      <category>스파르타</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/165</guid>
      <comments>https://bu119.tistory.com/165#entry165comment</comments>
      <pubDate>Fri, 19 Sep 2025 18:00:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 자바 웹 개발 흐름 정리 &amp;mdash; Servlet부터 Spring Boot까지</title>
      <link>https://bu119.tistory.com/164</link>
      <description>&lt;p data-end=&quot;310&quot; data-start=&quot;188&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;  TIL (Today I Learned) &amp;mdash; 2025.09.18. 목요일&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;310&quot; data-start=&quot;188&quot; data-ke-style=&quot;style2&quot;&gt;✍️ 이 글은 내일배움캠프에서 Spring 입문 강의를 들으며 학습한 내용을 정리한 TIL입니다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;460&quot; data-end=&quot;477&quot;&gt;자바 웹 개발의 발전 과정&lt;/h2&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;294&quot; data-ke-size=&quot;size16&quot;&gt;오늘날 자바 웹 개발에서 &lt;b&gt;Spring Boot는 사실상 표준&lt;/b&gt;입니다.&lt;br /&gt;하지만 Spring Boot가 갑자기 등장한 것이 아니라, 기존 기술의 한계를 보완하고 발전한 끝에 나온 결과물이라는 점을 알면 훨씬 더 깊이 이해할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;294&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;465&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;자바 웹 개발은 다음과 같은 단계를 거쳐 발전했습니다.&lt;/p&gt;
&lt;p data-end=&quot;524&quot; data-start=&quot;467&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;스파게티 코드 &amp;rarr; JSP/Servlet &amp;rarr; Spring MVC &amp;rarr; Spring Boot&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;512&quot; data-start=&quot;488&quot; data-ke-size=&quot;size23&quot;&gt;1. 스파게티 코드 (초기 웹 개발)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;600&quot; data-start=&quot;557&quot;&gt;화면, 비즈니스 로직, 데이터베이스 코드가 한 파일에 뒤섞여 있던 시기&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;601&quot;&gt;유지보수 어려움, 작은 수정도 큰 리스크&lt;/li&gt;
&lt;li data-end=&quot;684&quot; data-start=&quot;628&quot;&gt;기능 확장이 사실상 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;655&quot; data-start=&quot;615&quot; data-ke-size=&quot;size16&quot;&gt;  코드가 얽히고설켜 &amp;ldquo;스파게티 코드&amp;rdquo;라는 이름이 붙었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;696&quot; data-start=&quot;662&quot; data-ke-size=&quot;size23&quot;&gt;2. JSP + Servlet 조합 &amp;rarr; 사실상의 MVC&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;779&quot; data-start=&quot;697&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;733&quot; data-start=&quot;697&quot;&gt;JSP: 화면을 렌더링하는 데 주로 사용 (View 역할)&lt;/li&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;734&quot;&gt;Servlet: 요청을 받아 처리하는 데 사용 (Controller 역할)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;859&quot; data-start=&quot;781&quot; data-ke-size=&quot;size16&quot;&gt;  MVC 패턴을 강제로 적용한 것은 아니었지만, 개발자들이 역할을 나누어 사용하면서 &lt;b&gt;사실상의 MVC 구조&lt;/b&gt;가 자리잡기 시작했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;872&quot; data-start=&quot;843&quot; data-ke-size=&quot;size23&quot;&gt;3. Servlet 중심 개발 &amp;rarr; 복잡성 증가&lt;/h3&gt;
&lt;p data-end=&quot;953&quot; data-start=&quot;908&quot; data-ke-size=&quot;size16&quot;&gt;Servlet만으로 대규모 웹 애플리케이션을 만들다 보니 한계가 드러났습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1049&quot; data-start=&quot;955&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;978&quot; data-start=&quot;955&quot;&gt;요청 파라미터를 일일이 처리해야 함&lt;/li&gt;
&lt;li data-end=&quot;1012&quot; data-start=&quot;979&quot;&gt;인증, 로깅 같은 공통 기능을 매번 직접 구현해야 함&lt;/li&gt;
&lt;li data-end=&quot;1049&quot; data-start=&quot;1013&quot;&gt;Servlet 클래스가 기하급수적으로 늘어나 유지보수 악화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1078&quot; data-start=&quot;1051&quot; data-ke-size=&quot;size16&quot;&gt;  규모가 커질수록 불편함이 명확해졌습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1083&quot; data-start=&quot;1049&quot; data-ke-size=&quot;size23&quot;&gt;4. Spring MVC &amp;rarr; 구조화된 MVC 프레임워크&lt;/h3&gt;
&lt;p data-end=&quot;1114&quot; data-start=&quot;1084&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 등장한 것이 &lt;b&gt;Spring MVC&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1164&quot;&gt;핵심: &lt;b&gt;DispatcherServlet&lt;/b&gt; (Servlet 기반)&lt;/li&gt;
&lt;li data-end=&quot;1227&quot; data-start=&quot;1207&quot;&gt;요청을 표준화된 방식으로 처리&lt;/li&gt;
&lt;li data-end=&quot;1288&quot; data-start=&quot;1228&quot;&gt;HandlerMapping, HandlerAdapter, ViewResolver 등과 협력&lt;/li&gt;
&lt;li data-end=&quot;1328&quot; data-start=&quot;1289&quot;&gt;Controller / Service / DAO 계층 구조 지원&lt;/li&gt;
&lt;li data-end=&quot;1360&quot; data-start=&quot;1329&quot;&gt;공통 기능(AOP, 트랜잭션, 의존성 주입) 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1394&quot; data-start=&quot;1319&quot; data-ke-size=&quot;size16&quot;&gt;  덕분에 개발자는 반복 작업에서 벗어나 비즈니스 로직에 집중할 수 있게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1448&quot; data-start=&quot;1412&quot; data-ke-size=&quot;size23&quot;&gt;5. Spring Boot &amp;rarr; 설정 자동화 &amp;amp; 생산성 향상&lt;/h3&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1449&quot; data-ke-size=&quot;size16&quot;&gt;Spring MVC도 강력했지만, 설정이 복잡했습니다. (특히 XML  )&lt;br /&gt;이 불편함을 해결하기 위해 &lt;b&gt;Spring Boot&lt;/b&gt;가 등장했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1732&quot; data-start=&quot;1516&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1600&quot; data-start=&quot;1537&quot;&gt;&lt;b&gt;자동 설정(Auto Configuration)&lt;/b&gt; &amp;rarr; XML 대신 application.yml 중심&lt;/li&gt;
&lt;li data-end=&quot;1641&quot; data-start=&quot;1601&quot;&gt;&lt;b&gt;Starter 의존성&lt;/b&gt; &amp;rarr; 필요한 기능을 한 줄로 추가 가능&lt;/li&gt;
&lt;li data-end=&quot;1690&quot; data-start=&quot;1642&quot;&gt;&lt;b&gt;내장 서버(Tomcat, Jetty 등)&lt;/b&gt; &amp;rarr; 실행만 하면 바로 서버 구동&lt;/li&gt;
&lt;li data-end=&quot;1733&quot; data-start=&quot;1691&quot;&gt;&lt;b&gt;운영 편의 기능(Actuator, 외부 설정 관리)&lt;/b&gt; 기본 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1794&quot; data-start=&quot;1734&quot; data-ke-size=&quot;size16&quot;&gt;  Spring Boot 덕분에 개발자는 환경 세팅보다 &lt;b&gt;핵심 기능 개발에 집중&lt;/b&gt;할 수 있게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1814&quot; data-start=&quot;1803&quot; data-ke-size=&quot;size26&quot;&gt;오늘의 핵심 ✨&lt;/h2&gt;
&lt;p data-end=&quot;1814&quot; data-start=&quot;1803&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Servlet &amp;rarr; Spring MVC &amp;rarr; Spring Boot&lt;/b&gt; 는 &amp;ldquo;대체 관계&amp;rdquo;가 아닙니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2000&quot; data-start=&quot;1815&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1910&quot; data-start=&quot;1877&quot;&gt;Spring MVC = Servlet 기반 프레임워크&lt;/li&gt;
&lt;li data-end=&quot;1951&quot; data-start=&quot;1913&quot;&gt;Spring Boot = Spring MVC 기반 자동화 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 사용하는 Spring Boot는 &lt;b&gt;자바 웹 기술 발전의 집약체&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2033&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size20&quot;&gt;정리하면,&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2185&quot; data-start=&quot;2034&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2069&quot; data-start=&quot;2034&quot;&gt;&lt;b&gt;스파게티 코드&lt;/b&gt;: 모든 코드가 뒤섞여 유지보수 불가&lt;/li&gt;
&lt;li data-end=&quot;2101&quot; data-start=&quot;2070&quot;&gt;&lt;b&gt;Servlet&lt;/b&gt;: 웹 요청 처리의 기반 기술&lt;/li&gt;
&lt;li data-end=&quot;2136&quot; data-start=&quot;2102&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt;: 구조화된 MVC 프레임워크&lt;/li&gt;
&lt;li data-end=&quot;2185&quot; data-start=&quot;2137&quot;&gt;&lt;b&gt;Spring Boot&lt;/b&gt;: 설정 자동화 + 운영 편의 기능으로 생산성 극대화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2255&quot; data-start=&quot;2187&quot; data-ke-size=&quot;size16&quot;&gt;  오늘날 우리가 손쉽게 쓰는 Spring Boot는, 오랜 시간에 걸쳐 기술적 불편을 해결하며 발전한 결과물입니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <category>SERVLET</category>
      <category>Sparta</category>
      <category>spring</category>
      <category>spring boot</category>
      <category>spring mvc</category>
      <category>SPRING 입문</category>
      <category>Til</category>
      <category>내일배움캠프</category>
      <category>스파르타</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/164</guid>
      <comments>https://bu119.tistory.com/164#entry164comment</comments>
      <pubDate>Thu, 18 Sep 2025 23:30:30 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring MVC란? &amp;mdash; MVC 패턴과 DispatcherServlet 동작 원리</title>
      <link>https://bu119.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;  TIL (Today I Learned) &amp;mdash; 2025.09.17. 수요일&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✍️ 이 글은 내일배움캠프에서 Spring 입문 강의를 들으며 학습한 내용을 정리한 TIL입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바 웹 개발의 발전 과정&lt;/li&gt;
&lt;li&gt;MVC 디자인 패턴이란?&lt;/li&gt;
&lt;li&gt;Servlet의 이해와 동작 원리&lt;/li&gt;
&lt;li&gt;Servlet의 한계점&lt;/li&gt;
&lt;li&gt;Spring MVC와 Front Controller 패턴&lt;/li&gt;
&lt;li&gt;DispatcherServlet 동작 원리&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;163&quot; data-start=&quot;143&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1. 자바 웹 개발의 발전 과정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;318&quot; data-start=&quot;164&quot; data-ke-size=&quot;size16&quot;&gt;자바 웹 개발은 시간이 지남에 따라 &lt;b&gt;코드 구조&lt;/b&gt;와 &lt;b&gt;생산성&lt;/b&gt;을 개선하는 방향으로 발전해 왔습니다.&lt;br /&gt;초기에는 화면, 로직, 데이터베이스 코드가 한 파일에 뒤섞여 있었지만, 지금은 설정 자동화와 내장 서버까지 제공하는 Spring Boot가 사실상 표준이 되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;318&quot; data-start=&quot;164&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;322&quot; data-end=&quot;332&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  발전 단계 흐름&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;390&quot; data-start=&quot;338&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스파게티 코드 &amp;rarr; JSP/Servlet &amp;rarr; Spring MVC &amp;rarr; Spring Boot&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;794&quot; data-start=&quot;392&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단계&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;문제점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;532&quot; data-start=&quot;474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;488&quot; data-start=&quot;474&quot;&gt;&lt;b&gt;스파게티 코드&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;517&quot; data-start=&quot;488&quot;&gt;화면&amp;middot;비즈니스 로직&amp;middot;DB 코드가 한 파일에 섞임&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;532&quot; data-start=&quot;517&quot;&gt;유지보수 거의 불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;626&quot; data-start=&quot;533&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;553&quot; data-start=&quot;533&quot;&gt;&lt;b&gt;JSP + Servlet&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;602&quot; data-start=&quot;553&quot;&gt;View(JSP)와 Controller(Servlet) 분리 &amp;rarr; 사실상 MVC 구조&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;626&quot; data-start=&quot;602&quot;&gt;설정 번거롭고, 요청/응답 코드 중복&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;721&quot; data-start=&quot;627&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;644&quot; data-start=&quot;627&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;702&quot; data-start=&quot;644&quot;&gt;&lt;b&gt;DispatcherServlet&lt;/b&gt; 중심의 체계적 MVC (Front Controller 패턴)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;721&quot; data-start=&quot;702&quot;&gt;초기에는 XML 설정이 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;794&quot; data-start=&quot;722&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;740&quot; data-start=&quot;722&quot;&gt;&lt;b&gt;Spring Boot&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;781&quot; data-start=&quot;740&quot;&gt;자동 설정 + 내장 서버 제공, 개발자가 비즈니스 로직에만 집중 가능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;794&quot; data-start=&quot;781&quot;&gt;현재 사실상 표준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;b&gt;&lt;/b&gt;&lt;/div&gt;
&lt;p data-end=&quot;813&quot; data-start=&quot;801&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;813&quot; data-start=&quot;801&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;961&quot; data-start=&quot;814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;862&quot; data-start=&quot;814&quot;&gt;&lt;b&gt;Servlet&lt;/b&gt; &amp;rarr; 자바 웹의 기반 기술 (HTTP 요청/응답 직접 처리)&lt;/li&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;863&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt; &amp;rarr; Servlet의 한계를 보완한 체계적 MVC 프레임워크&lt;/li&gt;
&lt;li data-end=&quot;961&quot; data-start=&quot;915&quot;&gt;&lt;b&gt;Spring Boot&lt;/b&gt; &amp;rarr; 복잡한 설정을 자동화하여 개발 효율을 극대화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;139&quot; data-end=&quot;158&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2. MVC 디자인 패턴이란?&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;160&quot; data-end=&quot;169&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  MVC란?&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;170&quot; data-end=&quot;269&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MVC = Model + View + Controller&lt;/b&gt;&lt;br /&gt;소프트웨어 설계 패턴 중 하나로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코드를 역할별로 분리&lt;/b&gt;하여 유지보수성과 협업 효율을 높이는 방법입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddpLUX/btsQGDlg2fT/5TYHBexKctKKbNsdB7Fnj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddpLUX/btsQGDlg2fT/5TYHBexKctKKbNsdB7Fnj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddpLUX/btsQGDlg2fT/5TYHBexKctKKbNsdB7Fnj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddpLUX%2FbtsQGDlg2fT%2F5TYHBexKctKKbNsdB7Fnj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;472&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;332&quot; data-start=&quot;322&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  흐름도&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;333&quot; data-ke-size=&quot;size16&quot;&gt;사용자 요청 &amp;rarr; &lt;b&gt;Controller&lt;/b&gt; &amp;rarr; &lt;b&gt;Model&lt;/b&gt; &amp;rarr; &lt;b&gt;View&lt;/b&gt; &amp;rarr; 사용자 응답&lt;/p&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;333&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;362&quot; data-start=&quot;346&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  구성 요소와 역할&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;634&quot; data-start=&quot;363&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구성 요소&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;504&quot; data-start=&quot;447&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;459&quot; data-start=&quot;447&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;477&quot; data-start=&quot;459&quot;&gt;데이터와 비즈니스 로직 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;504&quot; data-start=&quot;477&quot;&gt;Service, Repository, DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;556&quot; data-start=&quot;505&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;516&quot; data-start=&quot;505&quot;&gt;&lt;b&gt;View&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;532&quot; data-start=&quot;516&quot;&gt;사용자 인터페이스(UI)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;556&quot; data-start=&quot;532&quot;&gt;HTML, Thymeleaf, JSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;634&quot; data-start=&quot;557&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;574&quot; data-start=&quot;557&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;600&quot; data-start=&quot;574&quot;&gt;Model &amp;harr; View 사이에서 흐름 제어&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;634&quot; data-start=&quot;600&quot;&gt;UserController, ShopController&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&amp;nbsp;✅ MVC 패턴의 필요성과 해결책&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;  문제 상황 (MVC 도입 전)&lt;/td&gt;
&lt;td&gt;✅ MVC 해결책&lt;/td&gt;
&lt;td&gt;  예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;로그인 화면 수정 시 DB 코드까지 건드려야 함&lt;/td&gt;
&lt;td&gt;관심사 분리 (Separation of Concerns)&lt;/td&gt;
&lt;td&gt;JSP/Thymeleaf 화면만 수정하면 되고, UserService 로직은 그대로 둠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버그 발생 시 원인 찾기 어려움&lt;/td&gt;
&lt;td&gt;독립적 테스트 가능&lt;/td&gt;
&lt;td&gt;Controller 단위 테스트로 요청 흐름만 확인, Service 단위 테스트로 로직만 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;여러 개발자 동시 작업 시 충돌 발생&lt;/td&gt;
&lt;td&gt;협업 효율 &amp;uarr; (View &amp;harr; Model 분리)&lt;/td&gt;
&lt;td&gt;프론트 개발자는 HTML/CSS만 작업, 백엔드 개발자는 Service/Repository만 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 재사용 불가능&lt;/td&gt;
&lt;td&gt;Model 로직을 다른 View에서도 재활용 가능&lt;/td&gt;
&lt;td&gt;UserService.findById() 로직을 웹 화면, API 응답, 관리자 페이지 모두에서 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;801&quot; data-end=&quot;813&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;801&quot; data-end=&quot;813&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  핵심 정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1014&quot; data-start=&quot;938&quot; data-ke-size=&quot;size16&quot;&gt;MVC 패턴은 &lt;b&gt;&amp;ldquo;한 파일에 뒤섞인 코드&amp;rdquo;를 역할별로 나누어&lt;/b&gt;,&lt;br /&gt;  재사용성과 유지보수성을 높이고, 협업을 용이하게 합니다.&lt;/p&gt;
&lt;p data-end=&quot;1014&quot; data-start=&quot;938&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1098&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  실제 코드 예시 (Spring MVC 기반)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1128&quot; data-start=&quot;1100&quot; data-ke-size=&quot;size16&quot;&gt;Controller - 요청 처리 및 연결&lt;/p&gt;
&lt;pre id=&quot;code_1758196512417&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class UserController {
    
    @Autowired
    private UserService userService;  // Model 영역과 연결
    
    @GetMapping(&quot;/users/{id}&quot;)
    public String getUser(@PathVariable Long id, Model model) {
        // 1. Model에서 데이터 가져오기
        User user = userService.findById(id);
        
        // 2. View에 데이터 전달
        model.addAttribute(&quot;user&quot;, user);
        
        // 3. View 이름 반환
        return &quot;user-detail&quot;;  // templates/user-detail.html
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1638&quot; data-start=&quot;1616&quot; data-ke-size=&quot;size16&quot;&gt;Model - 실제 데이터 처리&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758196521440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public User findById(Long id) {
        return userRepository.findById(id)
            .orElseThrow(() -&amp;gt; new UserNotFoundException());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1917&quot; data-start=&quot;1899&quot; data-ke-size=&quot;size16&quot;&gt;View - 사용자 화면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758196549132&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;사용자 정보&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;이름: &amp;lt;span th:text=&quot;${user.name}&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;이메일: &amp;lt;span th:text=&quot;${user.email}&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;114&quot; data-start=&quot;88&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3. Servlet의 이해와 동작 원리&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;169&quot; data-start=&quot;160&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Servlet이란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;136&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Servlet(서블릿&lt;/b&gt;)은 자바 기반 웹의 핵심 기술로,&lt;br /&gt;&lt;b&gt;HTTP 요청을 받아 처리하고 동적으로 페이지를 생성&lt;/b&gt;하는 서버 측 프로그램입니다.&lt;/p&gt;
&lt;p data-end=&quot;294&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;톰캣(Tomcat) 같은 &lt;b&gt;Servlet 컨테이너&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;323&quot; data-start=&quot;301&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Servlet 동작 흐름&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;381&quot; data-start=&quot;325&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 웹 브라우저로 요청을 보냈을 때, Servlet이 동작하는 전체 과정은 다음과 같습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1758201545271&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Client &amp;rarr; Servlet Container &amp;rarr; Servlet &amp;rarr; 응답 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTHQz2/btsQGFDzip6/T4MAkGscQlrzkadpivunO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTHQz2/btsQGFDzip6/T4MAkGscQlrzkadpivunO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTHQz2/btsQGFDzip6/T4MAkGscQlrzkadpivunO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTHQz2%2FbtsQGFDzip6%2FT4MAkGscQlrzkadpivunO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;311&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;437&quot; data-ke-size=&quot;size16&quot;&gt;세부 단계:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1056&quot; data-start=&quot;449&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;534&quot; data-start=&quot;449&quot;&gt;&lt;b&gt;Client HTTP Request &amp;rarr; Servlet Container&lt;/b&gt;&lt;br /&gt;사용자가 브라우저에서 /hello 같은 요청을 보냄.&lt;/li&gt;
&lt;li data-end=&quot;633&quot; data-start=&quot;536&quot;&gt;&lt;b&gt;요청/응답 객체 생성&lt;/b&gt;&lt;br /&gt;컨테이너가 HttpServletRequest, HttpServletResponse 객체를 생성해 요청/응답 정보를 담음.&lt;/li&gt;
&lt;li data-end=&quot;717&quot; data-start=&quot;635&quot;&gt;&lt;b&gt;Servlet 탐색&lt;/b&gt;&lt;br /&gt;web.xml 설정 또는 애노테이션(@WebServlet)에 따라 어떤 Servlet이 처리할지 결정.&lt;/li&gt;
&lt;li data-end=&quot;855&quot; data-start=&quot;719&quot;&gt;&lt;b&gt;service() 메서드 실행&lt;/b&gt;&lt;br /&gt;컨테이너가 해당 Servlet의 service() 메서드를 호출.&lt;br /&gt;&amp;rarr; 내부적으로 HTTP 메서드(GET/POST 등)에 따라 doGet() 또는 doPost()로 분기.&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;857&quot;&gt;&lt;b&gt;doGet() / doPost() 실행&lt;/b&gt;&lt;br /&gt;요청 방식(Method)에 따라 실제 메서드가 실행됨.&lt;/li&gt;
&lt;li data-end=&quot;990&quot; data-start=&quot;925&quot;&gt;&lt;b&gt;응답 반환&lt;/b&gt;&lt;br /&gt;처리 결과를 HttpServletResponse 객체에 담아 브라우저로 전달.&lt;/li&gt;
&lt;li data-end=&quot;1056&quot; data-start=&quot;992&quot;&gt;&lt;b&gt;객체 정리&lt;/b&gt;&lt;br /&gt;요청이 끝나면 컨테이너가 요청/응답 객체를 메모리에서 정리 (GC 대상이 됨).&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1037&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  단계별 정리&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;단계&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;동작&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1단계&lt;/td&gt;
&lt;td&gt;Client &amp;rarr; Servlet Container&lt;/td&gt;
&lt;td&gt;브라우저가 서버에 HTTP 요청 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2단계&lt;/td&gt;
&lt;td&gt;요청/응답 객체 생성&lt;/td&gt;
&lt;td&gt;HttpServletRequest, HttpServletResponse 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3단계&lt;/td&gt;
&lt;td&gt;Servlet 탐색&lt;/td&gt;
&lt;td&gt;매핑 정보(web.xml, @WebServlet) 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4단계&lt;/td&gt;
&lt;td&gt;service() 호출&lt;/td&gt;
&lt;td&gt;모든 요청의 진입점, 내부에서 HTTP 메서드 분기 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5단계&lt;/td&gt;
&lt;td&gt;doGet/doPost 실행&lt;/td&gt;
&lt;td&gt;HTTP Method에 따라 적절한 메서드 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6단계&lt;/td&gt;
&lt;td&gt;응답 반환&lt;/td&gt;
&lt;td&gt;결과를 HttpServletResponse에 담아 브라우저로 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7단계&lt;/td&gt;
&lt;td&gt;객체 정리&lt;/td&gt;
&lt;td&gt;요청 완료 후 컨테이너가 메모리 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;2198&quot; data-end=&quot;2221&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;2198&quot; data-end=&quot;2221&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Servlet의 핵심 특징&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2223&quot; data-end=&quot;2421&quot;&gt;
&lt;li data-start=&quot;2454&quot; data-end=&quot;2497&quot;&gt;&lt;b&gt;HTTP 규격 기반&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청과 응답을 표준 프로토콜에 맞게 처리&lt;/li&gt;
&lt;li data-start=&quot;2498&quot; data-end=&quot;2552&quot;&gt;&lt;b&gt;HttpServletRequest&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청 데이터(파라미터, 헤더, 세션 등) 조회&lt;/li&gt;
&lt;li data-start=&quot;2553&quot; data-end=&quot;2602&quot;&gt;&lt;b&gt;HttpServletResponse&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 상태 코드, 헤더, 응답 본문 작성&lt;/li&gt;
&lt;li data-start=&quot;2603&quot; data-end=&quot;2651&quot;&gt;&lt;b&gt;동적 페이지 생성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 요청마다 다른 HTML/JSON을 생성해 반환 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  코드 예시: HelloServlet (학습용)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1758201782427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = &quot;helloServlet&quot;, urlPatterns = &quot;/hello&quot;)
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 요청 파라미터 가져오기
        String name = request.getParameter(&quot;name&quot;);

        // 2. 응답 타입과 인코딩 설정
        response.setContentType(&quot;text/html;charset=UTF-8&quot;);

        // 3. 응답 작성
        response.getWriter().write(&quot;&amp;lt;h1&amp;gt;Hello, &quot; + name + &quot;!&amp;lt;/h1&amp;gt;&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1594&quot; data-start=&quot;1584&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2355&quot; data-start=&quot;2345&quot; data-ke-size=&quot;size16&quot;&gt;  실행 결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2422&quot; data-start=&quot;2356&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2401&quot; data-start=&quot;2356&quot;&gt;요청: http://localhost:8080/hello?name=차돌&lt;/li&gt;
&lt;li data-end=&quot;2422&quot; data-start=&quot;2402&quot;&gt;응답: &lt;b&gt;Hello, 차돌!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4. Servlet의 한계점&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;121&quot; data-start=&quot;107&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;❌ 주요 문제점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;159&quot; data-start=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;Servlet만으로 개발할 때는 다음과 같은 문제가 발생합니다:&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 94px;&quot; border=&quot;1&quot; data-end=&quot;370&quot; data-start=&quot;161&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문제&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;243&quot; data-start=&quot;189&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;198&quot; data-start=&quot;189&quot;&gt;관리 복잡성&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;243&quot; data-start=&quot;198&quot;&gt;기능마다 별도의 Servlet 클래스 필요 &amp;rarr; 규모가 커질수록 클래스 폭증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;285&quot; data-start=&quot;244&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;254&quot; data-start=&quot;244&quot;&gt;설정 번거로움&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;285&quot; data-start=&quot;254&quot;&gt;web.xml에 모든 매핑을 직접 작성해야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;330&quot; data-start=&quot;286&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;294&quot; data-start=&quot;286&quot;&gt;중복 코드&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;330&quot; data-start=&quot;294&quot;&gt;각 Servlet마다 요청/응답 처리 코드가 비슷하게 반복&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;370&quot; data-start=&quot;331&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;342&quot; data-start=&quot;331&quot;&gt;유지보수 어려움&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;md&quot; data-end=&quot;370&quot; data-start=&quot;342&quot;&gt;URL 하나만 변경해도 여러 파일 수정 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;  결론:&lt;br /&gt;규모가 커질수록 &lt;b&gt;Servlet 수백 개 + 설정 수백 줄&lt;/b&gt;이 필요해져서 유지보수가 사실상 불가능해집니다.&lt;/p&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;488&quot; data-start=&quot;451&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; ️ 실제 예시: 쇼핑몰 만들기 (Servlet 방식)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;501&quot; data-start=&quot;490&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;604&quot; data-start=&quot;502&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;520&quot; data-start=&quot;502&quot;&gt;로그인 (/login)&lt;/li&gt;
&lt;li data-end=&quot;541&quot; data-start=&quot;521&quot;&gt;회원가입 (/signup)&lt;/li&gt;
&lt;li data-end=&quot;565&quot; data-start=&quot;542&quot;&gt;상품 목록 (/products)&lt;/li&gt;
&lt;li data-end=&quot;584&quot; data-start=&quot;566&quot;&gt;장바구니 (/cart)&lt;/li&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;585&quot;&gt;주문하기 (/order)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;625&quot; data-start=&quot;606&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Servlet 파일 구조&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758203579139&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src/main/java/servlets/
├── LoginServlet.java      
├── SignupServlet.java     
├── ProductServlet.java    
├── CartServlet.java       
└── OrderServlet.java&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;819&quot; data-start=&quot;793&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;819&quot; data-start=&quot;793&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;web.xml 설정 (매우 번거로움)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758203588407&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;LoginServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;com.shop.LoginServlet&amp;lt;/servlet-class&amp;gt;
&amp;lt;/servlet&amp;gt;

&amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;LoginServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/login&amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;

&amp;lt;!-- 나머지 기능들도 모두 같은 방식으로 등록해야 함 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1169&quot; data-start=&quot;1115&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1169&quot; data-start=&quot;1115&quot; data-ke-size=&quot;size16&quot;&gt;  기능이 늘어날수록 Servlet과 web.xml 매핑이 기하급수적으로 늘어납니다.&lt;/p&gt;
&lt;p data-end=&quot;1169&quot; data-start=&quot;1115&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1193&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size23&quot;&gt;  해결책의 필요성&lt;/h3&gt;
&lt;p data-end=&quot;1257&quot; data-start=&quot;1194&quot; data-ke-size=&quot;size16&quot;&gt;이런 불편함을 해결하기 위해, &lt;b&gt;Spring MVC의 Front Controller 패턴&lt;/b&gt;이 등장했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1368&quot; data-start=&quot;1258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1314&quot; data-start=&quot;1258&quot;&gt;중앙 진입점인 DispatcherServlet 하나가 모든 요청을 받아 처리 &amp;rarr; 중복 제거&lt;/li&gt;
&lt;li data-end=&quot;1368&quot; data-start=&quot;1315&quot;&gt;애노테이션(@GetMapping, @PostMapping 등) 기반 매핑 &amp;rarr; 설정 간소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;171&quot; data-start=&quot;134&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5. Spring MVC와 Front Controller 패턴&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Spring MVC란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;Spring Web MVC는 &lt;b&gt;Servlet API 기반 웹 프레임워크&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;중앙의 &lt;b&gt;DispatcherServlet&lt;/b&gt;이 모든 요청을 받아 적절한 Controller로 분배하는 &lt;b&gt;Front Controller 패턴&lt;/b&gt;을 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;  덕분에 요청 처리 흐름이 일관되고, 개발자는 &lt;b&gt;비즈니스 로직&lt;/b&gt;에 집중할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;437&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;한 줄 요약&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;437&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;Spring MVC = &lt;b&gt;Servlet의 한계를 보완한, DispatcherServlet 중심 MVC 프레임워크&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;482&quot; data-start=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;519&quot; data-start=&quot;489&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; ️ Front Controller 패턴이란?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;572&quot; data-start=&quot;438&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;429&quot; data-start=&quot;362&quot;&gt;&lt;b&gt;기존 방식 (Servlet)&lt;/b&gt;: 요청마다 별도의 Servlet 클래스 필요 &amp;rarr; 코드와 설정이 폭발적으로 증가&lt;/li&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;430&quot;&gt;&lt;b&gt;개선 방식 (Spring MVC)&lt;/b&gt;: DispatcherServlet 하나가 모든 요청을 받아 내부적으로 Controller 메서드와 매핑&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  즉, 모든 요청이 &lt;b&gt;하나의 입구(DispatcherServlet)&lt;/b&gt; 로 들어와서, 내부에서 &lt;b&gt;여러 출구(Controller 메서드)&lt;/b&gt; 로 분배됩니다.&lt;br /&gt;이 구조 덕분에 관리가 단순해지고, 새로운 기능 추가 시 확장성이 뛰어납니다.&lt;/p&gt;
&lt;p data-end=&quot;735&quot; data-start=&quot;704&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;735&quot; data-start=&quot;704&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Servlet vs Spring MVC 비교&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1069&quot; data-start=&quot;737&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;Servlet 방식&lt;/td&gt;
&lt;td&gt;Spring MVC (Front Controller)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;909&quot; data-start=&quot;845&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;853&quot; data-start=&quot;845&quot;&gt;요청 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;875&quot; data-start=&quot;853&quot;&gt;기능마다 Servlet 클래스 필요&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;909&quot; data-start=&quot;875&quot;&gt;DispatcherServlet 하나가 모든 요청 접수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;966&quot; data-start=&quot;910&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;918&quot; data-start=&quot;910&quot;&gt;매핑 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;936&quot; data-start=&quot;918&quot;&gt;web.xml 직접 등록&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;966&quot; data-start=&quot;936&quot;&gt;애노테이션(@GetMapping 등) 자동 매핑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1014&quot; data-start=&quot;967&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;974&quot; data-start=&quot;967&quot;&gt;유지보수&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;998&quot; data-start=&quot;974&quot;&gt;URL 변경 시 여러 Servlet 수정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1014&quot; data-start=&quot;998&quot;&gt;중앙에서 한 번에 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1069&quot; data-start=&quot;1015&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1023&quot; data-start=&quot;1015&quot;&gt;코드 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1040&quot; data-start=&quot;1023&quot;&gt;요청별 Servlet 분산&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1069&quot; data-start=&quot;1040&quot;&gt;Controller 클래스 단위로 체계적 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1094&quot; data-start=&quot;1076&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1094&quot; data-start=&quot;1076&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  요청 처리 흐름 비교&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1114&quot; data-start=&quot;1095&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Servlet 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758203978899&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/login    &amp;rarr; LoginServlet
/signup   &amp;rarr; SignupServlet
/products &amp;rarr; ProductServlet&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1221&quot; data-start=&quot;1202&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1221&quot; data-start=&quot;1202&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Spring MVC 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758203990793&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/login    ┐
/signup   ├─&amp;rarr; DispatcherServlet &amp;rarr; 적절한 Controller 메서드 호출
/products ┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1368&quot; data-start=&quot;1311&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1368&quot; data-start=&quot;1311&quot; data-ke-size=&quot;size16&quot;&gt;  핵심: &lt;b&gt;Servlet 여러 개 대신, DispatcherServlet 하나로 통합 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1368&quot; data-start=&quot;1311&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1405&quot; data-start=&quot;1375&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; ️ 쇼핑몰 예시 (Spring MVC 방식)&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758204041160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class ShopController {

    @PostMapping(&quot;/login&quot;)   // LoginServlet 대신
    public String login(@RequestParam String username,
                        @RequestParam String password) {
        // 로그인 처리 로직
        return &quot;login-success&quot;;
    }

    @PostMapping(&quot;/signup&quot;)  // SignupServlet 대신
    public String signup(@RequestParam String email) {
        // 회원가입 처리 로직
        return &quot;signup-success&quot;;
    }

    @GetMapping(&quot;/products&quot;) // ProductServlet 대신
    public String products(Model model) {
        List&amp;lt;Product&amp;gt; products = productService.findAll();
        model.addAttribute(&quot;products&quot;, products);
        return &quot;product-list&quot;; // View 이름
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2669&quot; data-start=&quot;2656&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2669&quot; data-start=&quot;2656&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;✅ 개선 효과&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2834&quot; data-start=&quot;2670&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2713&quot; data-start=&quot;2670&quot;&gt;Servlet 클래스 5개 &amp;rarr; Controller 메서드 5개로 단순화&lt;/li&gt;
&lt;li data-end=&quot;2748&quot; data-start=&quot;2714&quot;&gt;web.xml 설정 불필요 (애노테이션 기반 매핑)&lt;/li&gt;
&lt;li data-end=&quot;2785&quot; data-start=&quot;2749&quot;&gt;기능별 Controller로 코드 구조화 &amp;rarr; 유지보수 쉬움&lt;/li&gt;
&lt;li data-end=&quot;2834&quot; data-start=&quot;2786&quot;&gt;✅ &lt;b&gt;생산성 향상&lt;/b&gt; &amp;rarr; 개발자는 설정보다 &lt;b&gt;비즈니스 로직&lt;/b&gt;에만 집중 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;105&quot; data-start=&quot;74&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;6. DispatcherServlet 동작 원리&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;272&quot; data-start=&quot;107&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  Front Controller 패턴의 핵심&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;272&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;DispatcherServlet은 &lt;b&gt;모든 HTTP 요청의 진입점&lt;/b&gt;으로 동작합니다.&lt;/p&gt;
&lt;p data-end=&quot;272&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;모든 HTTP 요청을 가장 먼저 받아서, 적절한 Controller로 전달하는 &lt;b&gt;Front Controller&lt;/b&gt; 역할을 수행합니다.&lt;/p&gt;
&lt;p data-end=&quot;272&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;즉, 클라이언트 요청을 가장 먼저 받아 적절한 &lt;b&gt;Controller&lt;/b&gt;로 전달한 뒤, 응답이 만들어지는 전 과정을 &lt;b&gt;중앙에서 관리&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;   전체 요청 처리 흐름 (7단계)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Spring MVC에서 요청이 처리되는 전체 과정입니다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCDXYi/btsQDVhkLA6/UL1eP532IK9FkQ5SPKRRUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCDXYi/btsQDVhkLA6/UL1eP532IK9FkQ5SPKRRUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCDXYi/btsQDVhkLA6/UL1eP532IK9FkQ5SPKRRUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCDXYi%2FbtsQDVhkLA6%2FUL1eP532IK9FkQ5SPKRRUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;783&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;  단계별 상세 설명&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단계&lt;/td&gt;
&lt;td&gt;구성 요소&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1단계&lt;/td&gt;
&lt;td&gt;Client &amp;rarr; DispatcherServlet&lt;/td&gt;
&lt;td&gt;HTTP 요청이 들어오면 DispatcherServlet이 가장 먼저 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2단계&lt;/td&gt;
&lt;td&gt;DispatcherServlet &amp;rarr; HandlerMapping&lt;/td&gt;
&lt;td&gt;URL, HTTP Method를 기반으로 실행할 Controller 메서드 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3단계&lt;/td&gt;
&lt;td&gt;DispatcherServlet &amp;rarr; Controller&lt;/td&gt;
&lt;td&gt;찾은 Controller 메서드를 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4단계&lt;/td&gt;
&lt;td&gt;Controller &amp;rarr; DispatcherServlet&lt;/td&gt;
&lt;td&gt;처리 결과(Model 데이터 + View 이름) 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5단계&lt;/td&gt;
&lt;td&gt;DispatcherServlet &amp;rarr; ViewResolver&lt;/td&gt;
&lt;td&gt;반환된 View 이름을 실제 뷰 파일 경로로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6단계&lt;/td&gt;
&lt;td&gt;ViewResolver &amp;rarr; View&lt;/td&gt;
&lt;td&gt;View에 Model 데이터를 적용해 화면 완성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7단계&lt;/td&gt;
&lt;td&gt;View &amp;rarr; Client&lt;/td&gt;
&lt;td&gt;최종 HTML(또는 JSON 등)을 클라이언트에 응답&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;  Spring MVC는 이 흐름에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;web.xml 대신 애노테이션 매핑(@GetMapping 등)&lt;/b&gt;을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; ️ 실제 예시: /products 요청 처리 과정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 http://localhost:8080/products에 접속했을 때:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;1. 사용자: &quot;상품 목록을 보여주세요&quot; (/products 요청)
   &amp;darr;
2. DispatcherServlet: &quot;이 요청을 누가 처리하지?&quot;
   &amp;darr;  
3. Handler mapping: &quot;@GetMapping('/products')를 가진 메서드를 찾았어요!&quot;
   &amp;darr;
4. DispatcherServlet: &quot;ShopController.products() 메서드를 실행할게요&quot;
   &amp;darr;  
5. Controller: 비즈니스 로직 실행 &amp;rarr; &quot;product-list&quot; + 상품 데이터 반환
   &amp;darr;
6. ViewResolver: &quot;product-list &amp;rarr; /templates/product-list.html 파일이네요&quot;
   &amp;darr;
7. View: 상품 데이터를 HTML에 채워서 완성된 페이지 생성
   &amp;darr;
8. 사용자: 상품 목록이 표시된 페이지를 브라우저에서 확인
&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;2171&quot; data-start=&quot;2151&quot; data-ke-size=&quot;size23&quot;&gt;  핵심 구성 요소 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2401&quot; data-start=&quot;2173&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3895&quot; data-start=&quot;3854&quot;&gt;DispatcherServlet: 모든 요청의 진입점, 중앙 관리자&lt;/li&gt;
&lt;li data-end=&quot;3938&quot; data-start=&quot;3896&quot;&gt;HandlerMapping: URL과 Controller 메서드 연결&lt;/li&gt;
&lt;li data-end=&quot;3965&quot; data-start=&quot;3939&quot;&gt;Controller: 비즈니스 로직 처리&lt;/li&gt;
&lt;li data-end=&quot;4003&quot; data-start=&quot;3966&quot;&gt;ViewResolver: 논리적 View 이름 &amp;rarr; 실제 파일&lt;/li&gt;
&lt;li data-end=&quot;4040&quot; data-start=&quot;4004&quot;&gt;View: Model 데이터를 사용해 최종 응답 화면 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2295&quot; data-start=&quot;2284&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;✨ 오늘의 결론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2441&quot; data-start=&quot;2296&quot; data-ke-size=&quot;size16&quot;&gt;Spring MVC를 배우며 &lt;b&gt;Servlet이 여전히 기반 기술&lt;/b&gt;임을 알게 되었습니다.&lt;br /&gt;Spring은 단순한 새로운 프레임워크가 아니라, Servlet의 복잡함을 추상화해 개발자가 &lt;b&gt;비즈니스 로직에만 집중할 수 있게 해주는 도구&lt;/b&gt;였습니다.&lt;/p&gt;
&lt;p data-end=&quot;2441&quot; data-start=&quot;2296&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2457&quot; data-start=&quot;2443&quot; data-ke-size=&quot;size16&quot;&gt;  오늘의 핵심 정리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2636&quot; data-start=&quot;2458&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2495&quot; data-start=&quot;2458&quot;&gt;MVC 패턴은 역할을 분리해 협업 효율과 유지보수성을 높인다&lt;/li&gt;
&lt;li data-end=&quot;2541&quot; data-start=&quot;2496&quot;&gt;Servlet은 HTTP 처리의 기반이지만, 직접 사용하면 관리가 복잡하다&lt;/li&gt;
&lt;li data-end=&quot;2596&quot; data-start=&quot;2542&quot;&gt;Spring MVC는 DispatcherServlet을 중심으로 요청을 구조적으로 처리한다&lt;/li&gt;
&lt;li data-end=&quot;2636&quot; data-start=&quot;2597&quot;&gt;Spring Boot는 이 과정을 자동화해 생산성을 크게 높였다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2788&quot; data-start=&quot;2638&quot; data-ke-size=&quot;size16&quot;&gt;앞으로는 단순히 Controller 코드만 보지 않고,&lt;br /&gt;&lt;b&gt;HTTP 요청 &amp;rarr; DispatcherServlet &amp;rarr; HandlerMapping &amp;rarr; Controller &amp;rarr; ViewResolver&lt;/b&gt;&lt;br /&gt;라는 흐름 전체를 이해하며 코드를 바라보려 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>TIL/내일배움캠프</category>
      <category>DispatcherServlet</category>
      <category>MVC 패턴</category>
      <category>SERVLET</category>
      <category>Sparta</category>
      <category>spring</category>
      <category>spring mvc</category>
      <category>SPRING 입문</category>
      <category>Til</category>
      <category>내일배움캠프</category>
      <category>스파르타</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/163</guid>
      <comments>https://bu119.tistory.com/163#entry163comment</comments>
      <pubDate>Wed, 17 Sep 2025 23:10:41 +0900</pubDate>
    </item>
    <item>
      <title>[Spring/Lombok] 생성자 애너테이션 알아보기 &amp;mdash; @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor</title>
      <link>https://bu119.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;   TIL (Today I Learned) &amp;mdash; 2025.09.16. 화요일&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;✍️ 이 글은 내일배움캠프에서 Spring 입문 강의를 들으며 학습한 내용을 정리한 TIL입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;  Lombok을 왜 써야 할까요?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java로 개발하다 보면 &lt;b&gt;같은 패턴의 코드를 반복해서 작성&lt;/b&gt;하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 특히 클래스마다 생성자, getter, setter를 만드는 작업은 &lt;/span&gt; 시간이 많이 들고, 가독성도 떨어집니다.&lt;/p&gt;
&lt;p data-end=&quot;914&quot; data-start=&quot;863&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;914&quot; data-start=&quot;863&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 간단한 상품 클래스를 하나 만든다고 해봅시다:&lt;/p&gt;
&lt;pre id=&quot;code_1758021519087&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//   Lombok 없이 작성하면...
public class Product {
    private String name;
    private int price;
    
    // 기본 생성자
    public Product() {}
    
    // 모든 필드 생성자
    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }
    
    // getter, setter 등등...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;Lombok을 사용하면 단 두 줄로 같은 결과&lt;/b&gt;를 만들 수 있습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1758021531206&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//   Lombok 사용하면...
@NoArgsConstructor
@AllArgsConstructor
public class Product {
    private String name;
    private int price;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1373&quot; data-start=&quot;1319&quot; data-ke-size=&quot;size16&quot;&gt;  Lombok은 이런 반복 코드를 애너테이션 한 줄로 해결해주는 라이브러리입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1414&quot; data-start=&quot;1380&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; ️ @AllArgsConstructor &amp;mdash; &quot;모든 필드를 한 번에!&quot;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p 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;pre id=&quot;code_1758021572326&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AllArgsConstructor
public class Product {
    private String name;
    private int price;
}

// 컴파일하면 이런 생성자가 자동 생성됩니다:
// public Product(String name, int price) {
//     this.name = name;
//     this.price = price;
// }&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;h3 data-ke-size=&quot;size23&quot;&gt;✅ 언제 사용하면 좋을까요?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DTO 클래스&lt;/b&gt;: REST API에서 데이터를 주고받을 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;불변 객체&lt;/b&gt;: 한 번 만들면 값을 바꾸지 않는 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758022942124&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AllArgsConstructor
@Getter
public class ProductDto {
    private String name;
    private int price;
}

// 사용 예시
ProductDto dto = new ProductDto(&quot;맥북 프로&quot;, 2500000);&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;  이렇게 하면 프론트엔드에서 받은 JSON을 객체로 변환하거나, 응답 DTO로 직관적으로 데이터를 담을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 조심해야 할 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA 엔티티에는 사용하지 않는 것이 좋습니다.&lt;/p&gt;
&lt;p data-end=&quot;1713&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size16&quot;&gt;DB가 자동으로 생성하는 &lt;b&gt;id&lt;/b&gt;까지 생성자 매개변수로 받아야 해서 혼란스럽습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758021995867&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ❌ 이렇게 하면 안 됩니다
@AllArgsConstructor
@Entity
public class Product {
    @Id @GeneratedValue
    private Long id;      // DB가 만드는 건데 생성자로 받아야 함
    private String name;
}

// 사용할 때도 이상해집니다
Product product = new Product(null, &quot;맥북&quot;);  // id에 null을 넣어야 함&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2024&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;  @NoArgsConstructor &amp;mdash; &quot;빈 생성자가 필요합니다!&quot;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수가 하나도 없는 &lt;b&gt;기본 생성자&lt;/b&gt;를 만들어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758021646789&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@NoArgsConstructor
public class Product {
    private String name;
    private int price;
}

// 컴파일하면 이런 생성자가 자동 생성됩니다:
// public Product() {}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅&amp;nbsp;언제 반드시 필요할까요?&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1️⃣ JPA 엔티티 (DB와 연결되는 클래스) &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB와 연결되는 객체는 JPA가 내부적으로 자동 생성해야 하기 때문에 &lt;b&gt;반드시 기본 생성자가 필요합니다.&lt;/b&gt;&lt;br /&gt;즉, 개발자가 직접 &lt;b&gt;new&lt;/b&gt;로 만드는 것이 아니라, JPA가 알아서 객체를 만들 수 있도록 준비해두는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758023042283&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {
    @Id @GeneratedValue
    private Long id;
    private String name;
}&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;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;b&gt;&amp;nbsp;왜&amp;nbsp;PROTECTED를&amp;nbsp;사용할까요?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JPA는 내부적으로 리플렉션(자바가 몰래 객체를 생성하는 기술)을 이용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 과정에서는 접근 제어자가 크게 중요하지 않아서 &lt;b&gt;PUBLIC, PROTECTED, PACKAGE, PRIVATE&lt;/b&gt; 모두 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만 실무에서는 &lt;b&gt;PROTECTED&lt;/b&gt;를 가장 많이 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JPA는 객체를 만들 수 있도록 열어두면서,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;외부에서 &lt;b&gt;new Product()&lt;/b&gt;로 무분별하게 생성하는 것을 막기 위해서&lt;/span&gt; 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2786&quot; data-start=&quot;2767&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &amp;nbsp;접근&amp;nbsp;제어자별&amp;nbsp;차이&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2946&quot; data-start=&quot;2787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2812&quot; data-start=&quot;2787&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PUBLIC : 어디서든 호출 가능&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2859&quot; data-start=&quot;2813&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PROTECTED : JPA는 사용 가능, 외부 직접 호출 제한 (권장)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2894&quot; data-start=&quot;2860&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PACKAGE : 같은 패키지 내부에서만 호출 가능&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2946&quot; data-start=&quot;2895&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PRIVATE : JPA는 사용 가능하지만 테스트나 별도 생성 메서드 없이는 불편&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2️⃣ JSON 변환 - REST API 통신할 때&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드와 JSON 데이터를 주고받을 때도 빈 생성자가 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758021710369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AllArgsConstructor
@NoArgsConstructor
@Getter @Setter
public class ProductDto {
    private String name;
    private int price;
}

// JSON &amp;rarr; 객체 변환 과정:
// 1. Jackson이 new ProductDto()로 빈 객체 만듦
// 2. setter로 JSON 값들을 하나씩 넣음&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2805&quot; data-start=&quot;2769&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;  @RequiredArgsConstructor &amp;mdash; &quot;꼭 필요한 것만!&quot;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;final&lt;/b&gt;이나 &lt;b&gt;@NonNull&lt;/b&gt;이 붙은 &lt;b&gt;중요한 필드만&lt;/b&gt; 매개변수로 받는 생성자를 만들어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758021731041&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
public class Product {
    private final String name;   // 필수 - 생성자에 포함 ✅
    private final int price;     // 필수 - 생성자에 포함 ✅
    private String description;  // 선택 - 생성자에 포함 ❌
}

// 컴파일하면 이런 생성자가 자동 생성됩니다:
// public Product(String name, int price) {
//     this.name = name;
//     this.price = price;
// }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 왜 좋을까요?&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;실수 방지&lt;/b&gt;: 중요한 값을 깜빡하고 안 넣는 실수를 막아줍니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전한 객체&lt;/b&gt;: final로 만들면 나중에 값을 바꿀 수 없어서 더 안전합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JPA 권장 패턴&lt;/b&gt;: DB 엔티티 만들 때 가장 많이 사용하는 방식입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 이렇게 활용합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1758022176119&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)  // JPA용
@RequiredArgsConstructor                            // 개발자용
public class Product {
    @Id @GeneratedValue
    private Long id;
    
    private final String name;     // 상품명은 필수
    private final int price;       // 가격도 필수
    private String description;    // 설명은 나중에 추가해도 됩니다
    
    // 나중에 설명을 추가하는 메서드
    public void updateDescription(String description) {
        this.description = description;
    }
}

// 사용할 때
Product product = new Product(&quot;맥북&quot;, 2000000);  // 필수 정보만 넣어서 생성
product.updateDescription(&quot;Apple M3 chip&quot;);      // 부가 정보는 나중에&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;  실무에서는 어떻게 조합할까요? (실무 조합 패턴)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황별로 권장하는 Lombok 애너테이션 조합은 다음과 같습니다:&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;상황&lt;/td&gt;
&lt;td&gt;추천 조합&lt;/td&gt;
&lt;td&gt;이유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;JPA 엔티티&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;@NoArgsConstructor(PROTECTED) + @RequiredArgsConstructor&lt;/td&gt;
&lt;td&gt;JPA 호환성 + 필수값 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;DTO 클래스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;@AllArgsConstructor + @NoArgsConstructor&lt;/td&gt;
&lt;td&gt;JSON 변환 호환성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Service 계층&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;@RequiredArgsConstructor&lt;/td&gt;
&lt;td&gt;의존성 주입 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 예시 &amp;mdash; JPA 엔티티 &lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758021766370&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor
@Getter
public class Product {
    @Id @GeneratedValue
    private Long id;

    private final String name;
    private final int price;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이렇게 하면 JPA가 객체를 만들 때는 문제없고,&lt;br /&gt;개발자는 &lt;b&gt;new Product(&quot;맥북&quot;, 2000000)&lt;/b&gt;처럼 &lt;b&gt;필수값만 넣어 깔끔하게 객체를 생성&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 예시 &amp;mdash; Service 계층 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758026364077&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class ProductService {
    private final ProductRepository productRepository;

    public void save(String name, int price) {
        productRepository.save(new Product(name, price));
    }
}&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;  이렇게 하면 Service 클래스에서 &lt;b&gt;@RequiredArgsConstructor&lt;/b&gt;로 &lt;b&gt;Repository가 자동 주입&lt;/b&gt;되고,&lt;br /&gt;비즈니스 로직에서는 불필요한 setter 없이 &lt;b&gt;new Product(name, price)&lt;/b&gt;로 &lt;b&gt;필수값만 넣어 간결하게 객체를 생성&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;  자주 하는 실수들&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1️⃣ final 필드와 @NoArgsConstructor만 사용&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// ❌ 컴파일 에러 발생!
@NoArgsConstructor
public class Product {
    private final String name;  // final은 반드시 초기화해야 하는데...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 해결: &lt;b&gt;@RequiredArgsConstructor&lt;/b&gt;와 함께 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758028375912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ✅ 이렇게 해결하세요
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor
public class Product {
    private final String name;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2️⃣ JPA 엔티티에 @AllArgsConstructor 사용&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// ❌ 잘못된 패턴
@AllArgsConstructor
@Entity
public class Product {
    @Id @GeneratedValue
    private Long id;  // DB가 만드는 건데 생성자로 받습니다
    private String name;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 해결: 필수 값만 받도록 &lt;b&gt;@RequiredArgsConstructor&lt;/b&gt; 사용&lt;/p&gt;
&lt;pre id=&quot;code_1758028402231&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ✅ 올바른 패턴
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor
public class Product {
    @Id @GeneratedValue
    private Long id;
    private final String name;  // 필수값만 생성자로
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3️⃣ DTO에서 기본 생성자 누락&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// ❌ JSON 변환 시 에러 발생
@RequiredArgsConstructor
public class ProductDto {
    private final String name;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 해결: &lt;b&gt;@AllArgsConstructor&lt;/b&gt; + &lt;b&gt;@NoArgsConstructor&lt;/b&gt; 함께 사용&lt;/p&gt;
&lt;pre id=&quot;code_1758028424992&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ✅ 기본 생성자 추가
@AllArgsConstructor
@NoArgsConstructor
@Getter @Setter
public class ProductDto {
    private String name;  // final 제거
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;49&quot; data-start=&quot;36&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;✨ 오늘의 결론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;143&quot; data-start=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;Lombok은 단순히 반복 코드를 줄여주는 도구가 아니라, &lt;b&gt;클래스의 역할과 객체 생성 방식을 어떻게 설계할 것인지 결정하는 중요한 도구&lt;/b&gt;라는 점을 배웠습니다.&lt;/p&gt;
&lt;p data-end=&quot;280&quot; data-start=&quot;145&quot; data-ke-size=&quot;size16&quot;&gt;특히 엔티티에서는 @NoArgsConstructor(PROTECTED)와 @RequiredArgsConstructor 조합이 사실상 표준처럼 사용되며, DTO나 서비스 계층에서는 다른 조합이 적절할 수 있다는 것을 알게 되었습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 &amp;ldquo;이 클래스는 어떤 역할을 맡고 있으며, 어떤 필드가 필수적인가, 외부에서 객체를 어떻게 생성해야 하는가&amp;rdquo; 를 먼저 고민한 뒤, 상황에 맞는 Lombok 애너테이션을 선택하겠습니다.&lt;/p&gt;</description>
      <category>TIL/내일배움캠프</category>
      <category>AllArgsConstructor</category>
      <category>Lombok</category>
      <category>NoArgsConstructor</category>
      <category>RequiredArgsConstructor</category>
      <category>Sparta</category>
      <category>spring</category>
      <category>SPRING 입문</category>
      <category>Til</category>
      <category>내일배움캠프</category>
      <category>스파르타</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/162</guid>
      <comments>https://bu119.tistory.com/162#entry162comment</comments>
      <pubDate>Tue, 16 Sep 2025 21:00:53 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 접근을 위한 IAM 사용자 액세스 키 만들기</title>
      <link>https://bu119.tistory.com/134</link>
      <description>&lt;p data-end=&quot;331&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/133&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/133&lt;/a&gt;&lt;/p&gt;
&lt;p data-end=&quot;331&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;331&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;앞선 글에서 우리는 Amazon S3를 안전하게 사용하기 위해 &lt;b&gt;IAM 사용자&lt;/b&gt;를 생성했습니다.&lt;br /&gt;하지만 IAM 사용자만 만들어서는 CLI나 애플리케이션에서 S3에 접근할 수 없습니다.&lt;br /&gt;이를 위해서는 &lt;b&gt;액세스 키(Access Key)&lt;/b&gt; 를 발급받아야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;331&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;360&quot; data-start=&quot;333&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;361&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;361&quot;&gt;&lt;b&gt;Access Key ID&lt;/b&gt;: 공개 키 (사용자 식별자)&lt;/li&gt;
&lt;li data-end=&quot;453&quot; data-start=&quot;399&quot;&gt;&lt;b&gt;Secret Access Key&lt;/b&gt;: 비밀 키 (비밀번호 역할, 절대 외부 공개 금지)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;427&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 IAM 사용자 액세스 키 발급 과정을 단계별로 알아보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;550&quot; data-start=&quot;532&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IAM 사용자 액세스 키 발급하기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;572&quot; data-start=&quot;552&quot; data-ke-size=&quot;size23&quot;&gt;1️⃣ IAM 서비스 접속&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;AWS Management Console&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;상단 검색창에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;IAM&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;입력 후 이동합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ky56w/btsQguJVD06/OhAS2kynWxhZLAm1dI0BiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ky56w/btsQguJVD06/OhAS2kynWxhZLAm1dI0BiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ky56w/btsQguJVD06/OhAS2kynWxhZLAm1dI0BiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKy56w%2FbtsQguJVD06%2FOhAS2kynWxhZLAm1dI0BiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;698&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. IAM 대시보드 좌측 메뉴에서&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사용자(Users) ]&lt;/b&gt;&amp;nbsp;탭을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6iUup/btsQd0pKI4p/up1uusS1Sl4M6Rq3cITA4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6iUup/btsQd0pKI4p/up1uusS1Sl4M6Rq3cITA4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6iUup/btsQd0pKI4p/up1uusS1Sl4M6Rq3cITA4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6iUup%2FbtsQd0pKI4p%2Fup1uusS1Sl4M6Rq3cITA4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;661&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;656&quot; data-start=&quot;640&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2️⃣ 사용자 선택&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;656&quot; data-start=&quot;640&quot; data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;사용자(Users) 섹션&lt;/b&gt;에서 액세스 키를 발급할 사용자를 선택합니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;735&quot; data-start=&quot;715&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;735&quot; data-start=&quot;715&quot;&gt;예: s3-uploader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KV49S/btsQguwjKyu/1oK1dlOSKO5ktY2OrKKXwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KV49S/btsQguwjKyu/1oK1dlOSKO5ktY2OrKKXwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KV49S/btsQguwjKyu/1oK1dlOSKO5ktY2OrKKXwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKV49S%2FbtsQguwjKyu%2F1oK1dlOSKO5ktY2OrKKXwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1317&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;742&quot; data-end=&quot;760&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3️⃣ 액세스 키 생성&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 사용자 상세 페이지에서&lt;b&gt;&lt;span&gt; [ &lt;/span&gt;보안 자격 증명(Security credentials)&lt;/b&gt;&lt;span&gt;&lt;b&gt; ]&lt;/b&gt; &lt;/span&gt;탭을 선택합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JX5r8/btsQgqOb8Og/sgFArKrpy6iJK93KK1WXD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JX5r8/btsQgqOb8Og/sgFArKrpy6iJK93KK1WXD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JX5r8/btsQgqOb8Og/sgFArKrpy6iJK93KK1WXD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJX5r8%2FbtsQgqOb8Og%2FsgFArKrpy6iJK93KK1WXD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1319&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;액세스 키(Access keys)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;섹션에서&lt;b&gt;&lt;span&gt; [ &lt;/span&gt;액세스 키 만들기(Create access key)&lt;span&gt; ] &lt;/span&gt;&lt;/b&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqelj6/btsQfad9jNJ/sQ27RBV8qlZKRSijDYaPt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqelj6/btsQfad9jNJ/sQ27RBV8qlZKRSijDYaPt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqelj6/btsQfad9jNJ/sQ27RBV8qlZKRSijDYaPt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqelj6%2FbtsQfad9jNJ%2FsQ27RBV8qlZKRSijDYaPt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;사용 사례&lt;/b&gt; 선택 단계에서는 &lt;b&gt;[ AWS 외부에서 실행되는 애플리케이션 ]&lt;/b&gt;을 선택합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwCM5/btsQhrFHFjj/Pq5hKsTttqnJmzBoR1RBm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwCM5/btsQhrFHFjj/Pq5hKsTttqnJmzBoR1RBm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwCM5/btsQhrFHFjj/Pq5hKsTttqnJmzBoR1RBm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwCM5%2FbtsQhrFHFjj%2FPq5hKsTttqnJmzBoR1RBm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1321&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;625&quot; data-start=&quot;230&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;991&quot; data-start=&quot;920&quot;&gt;Lightsail, 온프레미스 서버, 외부 클라우드 환경 등은 IAM Role을 붙일 수 없으므로 &amp;ldquo;외부&amp;rdquo;로 분류됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;995&quot;&gt;이 선택은 권한 차이를 만드는 것이 아니라, AWS가 보안 가이드를 안내하기 위한 용도입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1067&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size16&quot;&gt;  사용 사례별 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1362&quot; data-start=&quot;1068&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1124&quot; data-start=&quot;1068&quot;&gt;&lt;b&gt;Command Line Interface(CLI)&lt;/b&gt; &amp;rarr; 로컬/서버에서 AWS CLI 실행&lt;/li&gt;
&lt;li data-end=&quot;1160&quot; data-start=&quot;1125&quot;&gt;&lt;b&gt;로컬 코드&lt;/b&gt; &amp;rarr; 로컬 PC에서 실행되는 애플리케이션&lt;/li&gt;
&lt;li data-end=&quot;1221&quot; data-start=&quot;1161&quot;&gt;&lt;b&gt;AWS 컴퓨팅 서비스&lt;/b&gt; &amp;rarr; EC2, ECS, Lambda 등 IAM Role 연동 가능한 서비스&lt;/li&gt;
&lt;li data-end=&quot;1275&quot; data-start=&quot;1222&quot;&gt;&lt;b&gt;서드 파티 서비스&lt;/b&gt; &amp;rarr; GitHub Actions, Datadog 같은 외부 서비스&lt;/li&gt;
&lt;li data-end=&quot;1335&quot; data-start=&quot;1276&quot;&gt;&lt;b&gt;AWS 외부에서 실행되는 애플리케이션&lt;/b&gt; &amp;rarr; Lightsail, 외부 클라우드, 온프레미스 서버&lt;/li&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1336&quot;&gt;&lt;b&gt;기타&lt;/b&gt; &amp;rarr; 위에 해당하지 않는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.&lt;span&gt; &quot;설명 태그 값&quot;은 선택 사항입니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 &lt;b&gt;IAM-user-name-key&lt;/b&gt; 같이 사용자명과 연계된 명확한 이름을 작성하는 것을 권장합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.&lt;b&gt; [&lt;span&gt; 액세스 키 만들기(Create access key)&lt;/span&gt;&amp;nbsp;]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vrPtD/btsQffzMSGF/FYBiiKKsOiN0NAq0xKwN51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vrPtD/btsQffzMSGF/FYBiiKKsOiN0NAq0xKwN51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vrPtD/btsQffzMSGF/FYBiiKKsOiN0NAq0xKwN51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvrPtD%2FbtsQffzMSGF%2FFYBiiKKsOiN0NAq0xKwN51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;551&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1047&quot; data-start=&quot;1028&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4️⃣ 키 확인 및 저장&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1047&quot; data-start=&quot;1028&quot; data-ke-size=&quot;size20&quot;&gt;1. 발급된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Access Key ID&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Secret Access Key&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 확인합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5oGgE/btsQgSqe4mH/zU5Ij8BieuIMX9dPq7khDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5oGgE/btsQgSqe4mH/zU5Ij8BieuIMX9dPq7khDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5oGgE/btsQgSqe4mH/zU5Ij8BieuIMX9dPq7khDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5oGgE%2FbtsQgSqe4mH%2FzU5Ij8BieuIMX9dPq7khDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;1665&quot; data-start=&quot;1601&quot;&gt;⚠️ &lt;b&gt;Secret Access Key는 한 번만 확인 가능&lt;/b&gt;하므로 반드시 안전한 곳에 저장해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1710&quot; data-start=&quot;1666&quot;&gt;분실 시 새 키를 발급하고, 기존 키는 삭제하는 것이 보안상 안전합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1725&quot; data-start=&quot;1717&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;1886&quot; data-start=&quot;1726&quot; data-ke-size=&quot;size16&quot;&gt;IAM 사용자에 액세스 키를 발급하면, 이제 해당 키를 이용해 애플리케이션에서 Amazon S3에 접근할 수 있습니다.&lt;br /&gt;운영 환경에서는 항상 &lt;b&gt;최소 권한 원칙(Principle of Least Privilege)&lt;/b&gt; 을 지키고, 발급된 키는 안전하게 보관하는 습관이 중요합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&quot;&gt;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/134</guid>
      <comments>https://bu119.tistory.com/134#entry134comment</comments>
      <pubDate>Wed, 3 Sep 2025 09:00:27 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 사용을 위한 IAM 사용자 생성하기</title>
      <link>https://bu119.tistory.com/133</link>
      <description>&lt;p data-end=&quot;1083&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3는 파일을 저장하고 관리할 수 있는 AWS의 대표적인 스토리지 서비스입니다.&lt;br /&gt;하지만 &lt;b&gt;루트 계정(root account)&lt;/b&gt; 으로 직접 S3를 사용하는 것은 보안상 매우 위험합니다. 루트 계정은 AWS 전체 권한을 가지고 있어 유출되면 모든 리소스가 노출될 수 있기 때문입니다.&lt;/p&gt;
&lt;p data-end=&quot;1083&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1172&quot; data-start=&quot;1085&quot; data-ke-size=&quot;size16&quot;&gt;따라서 반드시 &lt;b&gt;IAM(Identity and Access Management) 사용자&lt;/b&gt;를 생성하고, 필요한 권한만 부여해 사용하는 것이 안전합니다.&lt;/p&gt;
&lt;p data-end=&quot;1172&quot; data-start=&quot;1085&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1232&quot; data-start=&quot;1174&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;IAM의 개념&lt;/b&gt;을 간단히 살펴보고, S3에 접근할 수 있는 IAM 사용자를 생성하는 방법을 단계별로 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;505&quot; data-start=&quot;463&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Identity and Access Management(IAM)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;549&quot; data-start=&quot;506&quot; data-ke-size=&quot;size16&quot;&gt;IAM은 AWS 리소스에 대한 &lt;b&gt;액세스 권한을 제어하는 서비스&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;724&quot; data-start=&quot;551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;614&quot; data-start=&quot;551&quot;&gt;&lt;b&gt;IAM 사용자&lt;/b&gt;: IAM에서 생성된 개별 계정으로, 각 사용자마다 권한을 다르게 부여할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;615&quot;&gt;&lt;b&gt;루트 계정&lt;/b&gt;: AWS 전체 권한을 가진 최고 권한 계정 (운영에서 직접 사용 금지)&lt;/li&gt;
&lt;li data-end=&quot;724&quot; data-start=&quot;669&quot;&gt;&lt;b&gt;IAM의 역할&lt;/b&gt;: 최소 권한만 부여하여 보안을 강화하고, 리소스별로 접근 권한을 세분화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;805&quot; data-start=&quot;726&quot; data-ke-size=&quot;size16&quot;&gt;즉, IAM 사용자는 &lt;b&gt;리소스 접근 여부가 지정된 계정&lt;/b&gt;으로, 루트 계정 대신 안전하게 S3와 같은 리소스를 관리할 수 있게 해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;728&quot; data-start=&quot;708&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IAM 사용자 생성하기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;750&quot; data-start=&quot;730&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1️⃣ IAM 서비스 접속&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;AWS Management Console &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;상단 검색창에&lt;span&gt; &quot; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;IAM &lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&quot; &lt;/span&gt;입력 후 이동합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oPE0m/btsQe9F7MaK/AMZ0wdnX0O22EBTuLKMUwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPE0m/btsQe9F7MaK/AMZ0wdnX0O22EBTuLKMUwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPE0m/btsQe9F7MaK/AMZ0wdnX0O22EBTuLKMUwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPE0m%2FbtsQe9F7MaK%2FAMZ0wdnX0O22EBTuLKMUwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2️⃣ IAM 대시보드에서 사용자 추가 &lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 좌측 메뉴에서&lt;b&gt; [&lt;/b&gt; &lt;b&gt;사용자(Users) ]&lt;/b&gt;&amp;nbsp;탭을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JLXYZ/btsQhhJV5oz/a393NhGaratwMWJcbi6UxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JLXYZ/btsQhhJV5oz/a393NhGaratwMWJcbi6UxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JLXYZ/btsQhhJV5oz/a393NhGaratwMWJcbi6UxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJLXYZ%2FbtsQhhJV5oz%2Fa393NhGaratwMWJcbi6UxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1322&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 사용자 섹션 우측 상단&lt;b&gt; [ 사용자 추가(Add users) ]&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 버튼 클릭합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vO9jy/btsQf96OG1z/ybOl4zJHVz8kPyE2sc2gVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vO9jy/btsQf96OG1z/ybOl4zJHVz8kPyE2sc2gVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vO9jy/btsQf96OG1z/ybOl4zJHVz8kPyE2sc2gVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvO9jy%2FbtsQf96OG1z%2FybOl4zJHVz8kPyE2sc2gVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1327&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3️⃣ 사용자 생성 단계 &lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;1단계: 사용자 세부 정보 지정&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPNGdv/btsQfd9G0hf/IVbOkOFvzAg4r0dgjISehK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPNGdv/btsQfd9G0hf/IVbOkOFvzAg4r0dgjISehK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPNGdv/btsQfd9G0hf/IVbOkOFvzAg4r0dgjISehK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPNGdv%2FbtsQfd9G0hf%2FIVbOkOFvzAg4r0dgjISehK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;701&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;902&quot; data-end=&quot;921&quot;&gt;1. 사용자 이름을 입력합니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;902&quot; data-end=&quot;921&quot;&gt;실제 용도에 맞는 이름을 입력하는 것이 좋습니다.&lt;/li&gt;
&lt;li data-start=&quot;902&quot; data-end=&quot;921&quot;&gt;예: s3-uploader, s3-reader&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1027&quot; data-start=&quot;1008&quot; data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;[ AWS Management Console 액세스 권한 ]&lt;/b&gt;은 불필요하므로 체크하지 않습니다.&lt;/h4&gt;
&lt;hr data-end=&quot;1210&quot; data-start=&quot;1207&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1227&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;2단계: 권한 설정&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cohAV9/btsQe6vRpan/rFTtiAIbFzi9KMSdXkj4O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cohAV9/btsQe6vRpan/rFTtiAIbFzi9KMSdXkj4O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cohAV9/btsQe6vRpan/rFTtiAIbFzi9KMSdXkj4O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcohAV9%2FbtsQe6vRpan%2FrFTtiAIbFzi9KMSdXkj4O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;971&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1528&quot; data-start=&quot;1506&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;1229&quot; data-end=&quot;1247&quot;&gt;1. &quot;권한 옵션&quot; 섹션에서&lt;b&gt; [ 직접 정책 연결 ]&lt;/b&gt;을 선택합니다.&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-end=&quot;1298&quot; data-start=&quot;1277&quot;&gt;2. &quot;권한 정책&quot; 섹션의 검책 창에 &quot;&lt;b&gt;AmazonS3FullAccess&lt;/b&gt;&quot;을 검색하고, 체크 표시를 클릭합니다&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1846&quot; data-start=&quot;1721&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1766&quot; data-start=&quot;1721&quot;&gt;AmazonS3FullAccess &amp;rarr; 모든 S3 버킷 권한 (테스트용)&lt;/li&gt;
&lt;li data-end=&quot;1803&quot; data-start=&quot;1767&quot;&gt;AmazonS3ReadOnlyAccess &amp;rarr; 읽기 전용&lt;/li&gt;
&lt;li data-end=&quot;1846&quot; data-start=&quot;1804&quot;&gt;&lt;b&gt;운영 환경 권장&lt;/b&gt; &amp;rarr; 특정 버킷 전용 정책(JSON 직접 작성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경 권장 정책 예시(JSON):&lt;/p&gt;
&lt;pre id=&quot;code_1756711465536&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;s3:GetObject&quot;,
        &quot;s3:PutObject&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-s3-bucket/*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&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;1708&quot; data-start=&quot;1681&quot;&gt;s3:GetObject: 파일 다운로드&lt;/li&gt;
&lt;li data-end=&quot;1735&quot; data-start=&quot;1709&quot;&gt;s3:PutObject: 파일 업로드&lt;/li&gt;
&lt;li data-end=&quot;1786&quot; data-start=&quot;1736&quot;&gt;arn:aws:s3:::my-s3-bucket/*: 특정 버킷 내 객체에만 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3.&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;우측 하단의&lt;b&gt; [ 다음 ]&lt;/b&gt; 버튼을 클릭합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;1212&quot; data-end=&quot;1227&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;3단계: 검토 및 생성&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 입력한 정보를 확인하고, &lt;b&gt;[ 사용자 생성 ]&lt;/b&gt;&amp;nbsp;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brGTmp/btsQgMKiTGO/WjdUdrciz7vCoXujrIxY00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brGTmp/btsQgMKiTGO/WjdUdrciz7vCoXujrIxY00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brGTmp/btsQgMKiTGO/WjdUdrciz7vCoXujrIxY00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrGTmp%2FbtsQgMKiTGO%2FWjdUdrciz7vCoXujrIxY00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1322&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. S3 권한을 가진 IAM 사용자 생성이 완료되었습니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhUmrV/btsQeTcGZ21/kmqo84Idzz9unL1Papdhi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhUmrV/btsQeTcGZ21/kmqo84Idzz9unL1Papdhi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhUmrV/btsQeTcGZ21/kmqo84Idzz9unL1Papdhi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhUmrV%2FbtsQeTcGZ21%2Fkmqo84Idzz9unL1Papdhi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1320&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1898&quot; data-start=&quot;1890&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2043&quot; data-start=&quot;1899&quot; data-ke-size=&quot;size16&quot;&gt;IAM 사용자를 생성하고 필요한 권한만 부여하는 것은 &lt;b&gt;AWS 보안의 기본 원칙&lt;/b&gt;입니다.&lt;br /&gt;특히 운영 환경에서는 &lt;b&gt;최소 권한 원칙(Principle of Least Privilege)&lt;/b&gt; 을 지켜 특정 버킷에만 접근하도록 제한하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;2154&quot; data-start=&quot;2045&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Amazon S3 사용을 위한 IAM 사용자 생성 방법을 살펴보았습니다.&lt;/p&gt;
&lt;p data-end=&quot;2154&quot; data-start=&quot;2045&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;  다음 글에서는 &lt;b&gt;IAM 액세스 키 발급 및 AWS CLI 설정 방법&lt;/b&gt;을 이어서 다루겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;2154&quot; data-start=&quot;2045&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/134&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/133</guid>
      <comments>https://bu119.tistory.com/133#entry133comment</comments>
      <pubDate>Tue, 2 Sep 2025 09:00:19 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 버킷 정책(Bucket Policy) 작성 방법 (3가지)</title>
      <link>https://bu119.tistory.com/161</link>
      <description>&lt;p data-end=&quot;359&quot; data-start=&quot;189&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3 버킷 정책은 버킷과 객체에 대한 접근 제어를 세밀하게 설정할 수 있는 핵심 보안 기능입니다. 기본적으로 S3 버킷은 외부 접근이 차단되어 있기 때문에, 웹사이트 호스팅, 특정 사용자 권한 부여, 내부 애플리케이션 접근 제어와 같은 상황에서 반드시 버킷 정책을 적절히 구성해야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;359&quot; data-start=&quot;189&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;439&quot; data-start=&quot;361&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;S3 버킷 정책을 작성하는 3가지 방법&lt;/b&gt;을 비교하고, 상황별로 어떤 방식을 선택해야 하는지 실무 관점에서 정리합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  목차&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;3가지 방법 비교 분석&lt;/li&gt;
&lt;li&gt;방법 1: 직접 JSON 작성&lt;/li&gt;
&lt;li&gt;방법 2: 시각적 편집기 활용&lt;/li&gt;
&lt;li&gt;방법 3: AWS Policy Generator 활용&lt;/li&gt;
&lt;li&gt;상황별 추천 워크플로우&lt;/li&gt;
&lt;li&gt;실무 모범 사례&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3가지 방법 비교 분석&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 213px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&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;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;추천 대상&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;적합한 상황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&lt;b&gt;직접 JSON 작성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; 빠른 작성 가능&lt;br /&gt;&amp;bull; 세밀한 제어&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; JSON 문법 숙지 필요&lt;br /&gt;&amp;bull; 오타/구문 오류 위험&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;개발자, 숙련자&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;복잡한 정책, 빠른 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&lt;b&gt;시각적 편집기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; 직관적인 GUI&lt;br /&gt;&amp;bull; 실시간 JSON 미리보기&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; 복잡한 조건 제한&lt;br /&gt;&amp;bull; 다중 조건 설정 어려움&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;초급자, 일반 사용자&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;간단한 정책, 학습 목적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&lt;b&gt;Policy Generator&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; 문법 오류 방지 &lt;br /&gt;&amp;bull; 단계별 가이드 제공&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;&amp;bull; 별도 화면에서 작성&lt;br /&gt;&amp;bull; 일부 최신 조건 미지원&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;모든 사용자&lt;/td&gt;
&lt;td style=&quot;height: 64px;&quot;&gt;정확성이 중요한 정책, 템플릿 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;방법 1: 직접 JSON 작성&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 개요&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SON 문법을 직접 작성하는 방식입니다. 가장 유연하고 빠르지만 문법 오류 발생 위험이 있으므로, 숙련된 개발자나 긴급 수정이 필요한 상황에서 권장됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  기본 구조&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #383a42; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;PolicyIdentifier&quot;,
      &quot;Effect&quot;: &quot;Allow|Deny&quot;,
      &quot;Principal&quot;: &quot;* 또는 특정 ARN&quot;,
      &quot;Action&quot;: &quot;허용 작업&quot;,
      &quot;Resource&quot;: &quot;대상 리소스&quot;,
      &quot;Condition&quot;: {
        &quot;조건타입&quot;: {
          &quot;조건키&quot;: &quot;조건값&quot;
        }
      }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-end=&quot;565&quot; data-start=&quot;552&quot; data-ke-size=&quot;size20&quot;&gt;구성 요소 설명&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1050&quot; data-start=&quot;566&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;603&quot; data-start=&quot;566&quot;&gt;&lt;b&gt;Version&lt;/b&gt;: &quot;2012-10-17&quot; (고정값)&lt;/li&gt;
&lt;li data-end=&quot;633&quot; data-start=&quot;604&quot;&gt;&lt;b&gt;Statement&lt;/b&gt;: 정책 규칙들의 배열&lt;/li&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;634&quot;&gt;&lt;b&gt;Effect&lt;/b&gt;: &quot;Allow&quot; 또는 &quot;Deny&quot;&lt;/li&gt;
&lt;li data-end=&quot;716&quot; data-start=&quot;672&quot;&gt;&lt;b&gt;Action&lt;/b&gt;: 허용할 작업 (예: &quot;s3:GetObject&quot;)&lt;/li&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;717&quot;&gt;&lt;b&gt;Resource&lt;/b&gt;: 적용 대상 리소스 ARN
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;814&quot; data-start=&quot;751&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;780&quot; data-start=&quot;751&quot;&gt;버킷 자체: arn:aws:s3:::버킷명&lt;/li&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;783&quot;&gt;객체 전체: arn:aws:s3:::버킷명/*&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;959&quot; data-start=&quot;815&quot;&gt;&lt;b&gt;Principal&lt;/b&gt;: 접근 주체 (&lt;b&gt;반드시 명시해야 함&lt;/b&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;959&quot; data-start=&quot;859&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;875&quot; data-start=&quot;859&quot;&gt;* &amp;rarr; 모든 사용자&lt;/li&gt;
&lt;li data-end=&quot;917&quot; data-start=&quot;878&quot;&gt;특정 사용자: arn:aws:iam::계정ID:user/이름&lt;/li&gt;
&lt;li data-end=&quot;959&quot; data-start=&quot;920&quot;&gt;특정 역할: arn:aws:iam::계정ID:role/역할명&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1008&quot; data-start=&quot;960&quot;&gt;&lt;b&gt;Condition (선택)&lt;/b&gt;: IP 제한, HTTPS 강제, 시간 제한 등&lt;/li&gt;
&lt;li data-end=&quot;1050&quot; data-start=&quot;1009&quot;&gt;&lt;b&gt;Sid (선택)&lt;/b&gt;: 정책 문 단위 식별자 (관리&amp;middot;디버깅 목적)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;1069&quot; data-start=&quot;1057&quot; data-ke-size=&quot;size23&quot;&gt;  실전 예제&lt;/h3&gt;
&lt;h4 data-end=&quot;1104&quot; data-start=&quot;1071&quot; data-ke-size=&quot;size20&quot;&gt;예제 1. 웹사이트용 공개 읽기 (HTTPS 강제)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1756374199189&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;PublicReadOverTLS&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-website-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;Bool&quot;: { &quot;aws:SecureTransport&quot;: &quot;true&quot; }
      }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1577&quot; data-start=&quot;1429&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1577&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 주의: 퍼블릭 접근을 허용하려면 버킷의 &amp;lsquo;퍼블릭 액세스 차단(Block Public Access)&amp;rsquo; 설정을 해제해야 정책이 적용됩니다. 보안상 권장되는 방식은 CloudFront + OAC(Origin Access Control)를 통한 공개입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1612&quot; data-start=&quot;1584&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1612&quot; data-start=&quot;1584&quot; data-ke-size=&quot;size20&quot;&gt;예제 2. 특정 사용자에게 전체 권한 부여&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1756374213414&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;UserFullAccess&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:user/developer&quot;
      },
      &quot;Action&quot;: &quot;s3:*&quot;,
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::my-dev-bucket&quot;,      // 버킷 수준
        &quot;arn:aws:s3:::my-dev-bucket/*&quot;     // 객체 수준
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;2071&quot; data-start=&quot;1989&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;2071&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size16&quot;&gt;  버킷 수준(ListBucket)과 객체 수준(GetObject, PutObject 등)을 동시에 지정해야 정상적으로 동작합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2106&quot; data-start=&quot;2078&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2106&quot; data-start=&quot;2078&quot; data-ke-size=&quot;size20&quot;&gt;예제 3. 조건부 접근 제어 (보안 강화)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1756374230626&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;AllowReadOnlyOverTLS&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::secure-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;Bool&quot;: { &quot;aws:SecureTransport&quot;: &quot;true&quot; },
        &quot;IpAddress&quot;: { &quot;aws:SourceIp&quot;: [&quot;203.0.113.0/24&quot;, &quot;198.51.100.0/24&quot;] },
        &quot;DateGreaterThan&quot;: { &quot;aws:CurrentTime&quot;: &quot;2024-01-01T00:00:00Z&quot; }
      }
    },
    {
      &quot;Sid&quot;: &quot;AllowUploadFromAppRole&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/WebAppRole&quot;
      },
      &quot;Action&quot;: &quot;s3:PutObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::secure-bucket/uploads/*&quot;,
      &quot;Condition&quot;: {
        &quot;Bool&quot;: { &quot;aws:SecureTransport&quot;: &quot;true&quot; }
      }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;3014&quot; data-start=&quot;2919&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;3014&quot; data-start=&quot;2921&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ PutObject는 반드시 특정 IAM 사용자&amp;middot;역할로 제한해야 하며, 절대로 Principal: &quot;*&quot; 상태에서 허용하면 안 됩니다. (악성 업로드 위험)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3038&quot; data-start=&quot;3021&quot; data-ke-size=&quot;size23&quot;&gt;⚡ 작성 팁 및 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3412&quot; data-start=&quot;3039&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3086&quot; data-start=&quot;3039&quot;&gt;&lt;b&gt;ARN 형식&lt;/b&gt;: arn:aws:s3:::버킷명/* (콜론 3개 주의)&lt;/li&gt;
&lt;li data-end=&quot;3146&quot; data-start=&quot;3087&quot;&gt;&lt;b&gt;대소문자 구분&lt;/b&gt;: Action, Condition 키 값은 대소문자 정확히 입력해야 함&lt;/li&gt;
&lt;li data-end=&quot;3210&quot; data-start=&quot;3147&quot;&gt;&lt;b&gt;배열 문법&lt;/b&gt;: 단일 값이라도 배열로 작성 가능 &amp;rarr; &quot;Action&quot;: [&quot;s3:GetObject&quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1360&quot; data-start=&quot;1324&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;방법 2: 시각적 편집기 활용 (Edit statement)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1371&quot; data-start=&quot;1362&quot; data-ke-size=&quot;size23&quot;&gt;  개요&lt;/h3&gt;
&lt;p data-end=&quot;1478&quot; data-start=&quot;1372&quot; data-ke-size=&quot;size16&quot;&gt;AWS 콘솔에 내장된 GUI 기반 편집기를 활용하여 정책을 작성하는 방법입니다. 직관적인 화면을 통해 JSON 문법을 몰라도 정책을 쉽게 작성할 수 있어, 초급자나 학습용으로 적합합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;단계별 사용 방법&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;버킷 정책 편집&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;페이지에서&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[ &lt;b&gt;새 명령문 추가&lt;/b&gt;(Add new statement) ]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; data-alt=&quot;영어 버전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgEfBl%2FbtsP35KMD2z%2Fg7B10sEENS514lWXXBYqd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1397&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;영어 버전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; data-alt=&quot;한글 버전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrhjnK%2FbtsP4ZJMgeg%2FY1v28fYPKKzLMpDxkUwsl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1395&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한글 버전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 시각적 편집기에서 다음 항목들을 단계별로 입력합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpjEYk%2FbtsP4bSn7C1%2FOuOKMI57nAdFpVsRekKFu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1268&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Step 1. 기본 정보 설정 &lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;필드&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sid&lt;/td&gt;
&lt;td&gt;PublicWebsiteAccess&lt;/td&gt;
&lt;td&gt;정책 문 단위 식별자 (영문/숫자)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect&lt;/td&gt;
&lt;td&gt;Allow / Deny&lt;/td&gt;
&lt;td&gt;권한 허용 또는 거부 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Step 2. 접근 주체(Principal) 설정&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;옵션&lt;/td&gt;
&lt;td&gt;입력 형식&lt;/td&gt;
&lt;td&gt;사용 사례&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모든 사용자&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;웹사이트 공개 읽기(주의 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 AWS 계정&lt;/td&gt;
&lt;td&gt;arn:aws:iam::123456789012:role/PartnerAccessRole&lt;/td&gt;
&lt;td&gt;파트너 계정 권한 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 사용자&lt;/td&gt;
&lt;td&gt;arn:aws:iam::123456789012:user/app-user&lt;/td&gt;
&lt;td&gt;내부 개발자 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 역할&lt;/td&gt;
&lt;td&gt;arn:aws:iam::123456789012:role/WebAppRole&lt;/td&gt;
&lt;td&gt;애플리케이션 권한 위임&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️ root 계정(:root) 사용은 보안상 지양해야 하며, 반드시 Role/User ARN을 활용하는 것이 안전합니다.&lt;/blockquote&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Step 3. 작업(Actions) 선택&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;권한 그룹&lt;/td&gt;
&lt;td&gt;Actions&lt;/td&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;읽기 권한&lt;/td&gt;
&lt;td&gt;GetObject, GetObjectVersion&lt;/td&gt;
&lt;td&gt;파일 다운로드 및 메타데이터 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;쓰기 권한&lt;/td&gt;
&lt;td&gt;PutObject&lt;/td&gt;
&lt;td&gt;파일 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목록 권한&lt;/td&gt;
&lt;td&gt;ListBucket, ListBucketVersions&lt;/td&gt;
&lt;td&gt;버킷 내 파일 목록 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;삭제 권한&lt;/td&gt;
&lt;td&gt;DeleteObject, DeleteObjectVersion&lt;/td&gt;
&lt;td&gt;객체 및 버전 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전체 권한&lt;/td&gt;
&lt;td&gt;s3:*&lt;/td&gt;
&lt;td&gt;모든 S3 작업 허용 (주의)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️ *Acl 계열 액션은 ACL 비활성(Object Ownership: Bucket owner enforced) 환경에서는 불필요합니다.&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Step 4. 리소스(Resources) 지정&lt;/span&gt; &amp;nbsp;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;패턴&lt;/td&gt;
&lt;td&gt;ARN 형식&lt;/td&gt;
&lt;td&gt;적용 범위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버킷 자체&lt;/td&gt;
&lt;td&gt;arn:aws:s3:::버킷명&lt;/td&gt;
&lt;td&gt;ListBucket 같은 버킷 수준 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모든 객체&lt;/td&gt;
&lt;td&gt;arn:aws:s3:::버킷명/*&lt;/td&gt;
&lt;td&gt;버킷 내 모든 파일 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 폴더&lt;/td&gt;
&lt;td&gt;arn:aws:s3:::버킷명/images/*&lt;/td&gt;
&lt;td&gt;폴더 단위 권한 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특정 파일&lt;/td&gt;
&lt;td&gt;arn:aws:s3:::버킷명/file.jpg&lt;/td&gt;
&lt;td&gt;개별 객체 권한 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; Step 5. 조건(Condition) 설정 (선택 사항)&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;조건 타입&lt;/td&gt;
&lt;td&gt;키&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IpAddress&lt;/td&gt;
&lt;td&gt;aws:SourceIp&lt;/td&gt;
&lt;td&gt;203.0.113.0/24&lt;/td&gt;
&lt;td&gt;특정 IP 대역 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bool&lt;/td&gt;
&lt;td&gt;aws:SecureTransport&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;HTTPS 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StringLike&lt;/td&gt;
&lt;td&gt;s3:prefix&lt;/td&gt;
&lt;td&gt;user-uploads/*&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ListBucket 결과 필터링 전용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DateGreaterThan&lt;/td&gt;
&lt;td&gt;aws:CurrentTime&lt;/td&gt;
&lt;td&gt;2024-01-01T00:00:00Z&lt;/td&gt;
&lt;td&gt;시간 기반 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️ s3:prefix 조건은 ListBucket 액션에서만 동작합니다. GetObject/PutObject 제한은 리소스 ARN을 통해 경로별로 지정해야 합니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2-1. &quot;Sid&quot;, &quot;Principal&quot;, &quot;Effect&quot;을 차례대로 입력합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sid: &lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;ObjectReadWriteAccesss&lt;/span&gt; &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Principal: &lt;b&gt;* &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Effect: &lt;b&gt;Allow &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1mIi/btsP7nSRopR/deKFwJtvbhik6MwboPuZWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1mIi/btsP7nSRopR/deKFwJtvbhik6MwboPuZWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1mIi/btsP7nSRopR/deKFwJtvbhik6MwboPuZWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1mIi%2FbtsP7nSRopR%2FdeKFwJtvbhik6MwboPuZWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;662&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2-2. &quot;Actions&quot;에 &lt;b&gt;GetObject&lt;/b&gt;, &lt;b&gt;PutObject&lt;/b&gt;를 적용합니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우측 &quot;&lt;b&gt;작업 추가&lt;/b&gt;&quot;에서 GetObject을 검색한 뒤, 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2065&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaIlFf%2FbtsP4Tp7du9%2FC5hzekVLzofip15QoIlsQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2065&quot; height=&quot;842&quot; data-origin-width=&quot;2065&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;우측 &quot;&lt;b&gt;작업 추가&lt;/b&gt;&quot;에서&lt;span&gt; &lt;/span&gt;&lt;/span&gt;PutObject을 검색한 뒤, 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKLVw5%2FbtsP6KMMgJ0%2FO25YBQzJm0OgFfaCDRvl5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2062&quot; height=&quot;827&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2-3. &quot;Resource&quot;에 &lt;b&gt;arn:aws:s3:::버킷명/*&lt;/b&gt;을 적용합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷 내 모든 파일 접근할 수 있게 할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 &quot;리소스 추가&quot;에서 추가 버튼을 클릭하여, 아래와 같이 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9fhvG/btsP9Gp7w2u/kyZmGYVaXtkjVi2356y6g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9fhvG/btsP9Gp7w2u/kyZmGYVaXtkjVi2356y6g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9fhvG/btsP9Gp7w2u/kyZmGYVaXtkjVi2356y6g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9fhvG%2FbtsP9Gp7w2u%2FkyZmGYVaXtkjVi2356y6g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;633&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2-4. 조건은 선택 사항이므로 추가하지 않겠습니다.&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. JSON 미리 보기에서 생성된 정책을 확인하고,&amp;nbsp;&lt;b&gt;[&amp;nbsp;&lt;/b&gt;&lt;b&gt;변경 사항 저장(&lt;/b&gt;&lt;b&gt;Save changes) ]&lt;/b&gt;&amp;nbsp;버튼을 클릭합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필요시 추가 statement를 더 생성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwZuFk%2FbtsP5rNVytm%2Fc9KhksTf08uT6uCZaVOBR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1320&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정책 적용이 완료됩니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9laCo%2FbtsP7f0Bh64%2FaoV2IIq5ojc8DAYIxetQxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1334&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실시간 미리 보기 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편집기 좌측의 &lt;b&gt;JSON 미리보기&lt;/b&gt; 영역에서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정 즉시 JSON 코드 확인 가능&lt;/li&gt;
&lt;li&gt;문법 오류 실시간 감지&lt;/li&gt;
&lt;li&gt;완성된 JSON 코드 복사하여 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1169&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;방법 3: AWS Policy Generator 활용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1181&quot; data-start=&quot;1171&quot; data-ke-size=&quot;size23&quot;&gt; ️ 개요&lt;/h3&gt;
&lt;p data-end=&quot;1357&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS Policy Generator&lt;/b&gt;는 공식적으로 제공되는 정책 생성 도구로, JSON 문법에 익숙하지 않은 사용자도 쉽게 정책을 만들 수 있습니다.&lt;br /&gt;문법 오류를 방지할 수 있다는 점에서 안전하지만, &lt;b&gt;최신 조건 키나 세부 기능은 모두 지원하지 않을 수 있으므로 생성 후 반드시 검증이 필요합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  접근 방법&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;S3 콘솔에서&lt;/b&gt;: 버킷 정책 편집 화면 &amp;rarr; &lt;b&gt;정책 생성기(&lt;b&gt;Policy Generator)&lt;/b&gt; 버튼 클릭&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt; &lt;b&gt;직접 접근&lt;/b&gt;: &lt;a href=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot;&gt;AWS Policy Generator&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure id=&quot;og_1756706025279&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;AWS Policy Generator&quot; data-og-description=&quot;&quot; data-og-host=&quot;awspolicygen.s3.amazonaws.com&quot; data-og-source-url=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot; data-og-url=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AWS Policy Generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;awspolicygen.s3.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  단계별 사용 방법&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 버킷 정책 편집 화면에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[ 정책 생성기(Policy Generator) ]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6gDCL/btsP0h4W6VU/BbqVDGJHaj3GxAk4Ke1i6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6gDCL/btsP0h4W6VU/BbqVDGJHaj3GxAk4Ke1i6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6gDCL/btsP0h4W6VU/BbqVDGJHaj3GxAk4Ke1i6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6gDCL%2FbtsP0h4W6VU%2FBbqVDGJHaj3GxAk4Ke1i6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1330&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 새 탭에서 열린 AWS Policy Generator에서 정책을 설정합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dh9Xv/btsPZcDFBqz/ZAKLOJzH4VmbUYbLR91QU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dh9Xv/btsPZcDFBqz/ZAKLOJzH4VmbUYbLR91QU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dh9Xv/btsPZcDFBqz/ZAKLOJzH4VmbUYbLR91QU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDh9Xv%2FbtsPZcDFBqz%2FZAKLOJzH4VmbUYbLR91QU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1394&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 1. 정책 유형 선택&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Select Type of Policy&lt;/b&gt; &amp;rarr; S3 Bucket Policy 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 2. 권한 상세 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;기본 설정&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;필드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;값&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect&lt;/td&gt;
&lt;td&gt;Allow / Deny&lt;/td&gt;
&lt;td&gt;권한 허용/거부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;* 또는 ARN&lt;/td&gt;
&lt;td&gt;접근 주체 (*는 모든 사용자 공개 &amp;rarr; 주의 필요, 일반적으로 IAM Role/User ARN 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Actions 선택&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;읽기 전용&lt;/td&gt;
&lt;td&gt;GetObject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업로드 전용&lt;/td&gt;
&lt;td&gt;PutObject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업로드+읽기&lt;/td&gt;
&lt;td&gt;GetObject, PutObject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목록 조회&lt;/td&gt;
&lt;td&gt;ListBucket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전체 권한&lt;/td&gt;
&lt;td&gt;s3:* (모든 S3 작업)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ARN 입력 예시 &lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 118px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;범위&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;ARN 형식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;버킷 자체&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;arn:aws:s3:::버킷명&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;버킷 수준 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;모든 객체&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;arn:aws:s3:::버킷명/*&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;버킷 내 모든 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;특정 폴더&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;arn:aws:s3:::버킷명/folder/*&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;폴더 단위 접근 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;특정 파일&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;arn:aws:s3:::버킷명/file.jpg&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;개별 객체 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  ARN을 잘못 입력하면 정책이 적용되지 않으므로, 반드시 정확한 형식으로 작성해야 합니다.&lt;/blockquote&gt;
&lt;h4 data-end=&quot;2336&quot; data-start=&quot;2310&quot; data-ke-size=&quot;size20&quot;&gt;Step 3. 조건 설정 (선택 사항)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2425&quot; data-start=&quot;2337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2386&quot; data-start=&quot;2337&quot;&gt;Generator는 제한된 조건만 제공합니다. (IP, HTTPS, Date 등)&lt;/li&gt;
&lt;li data-end=&quot;2425&quot; data-start=&quot;2387&quot;&gt;복잡한 조건은 생성된 JSON을 &lt;b&gt;직접 수정&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2432&quot; data-start=&quot;2427&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2607&quot; data-start=&quot;2433&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2487&quot; data-start=&quot;2433&quot;&gt;IP 제한 &amp;rarr; IpAddress: aws:SourceIp = 203.0.113.0/24&lt;/li&gt;
&lt;li data-end=&quot;2537&quot; data-start=&quot;2488&quot;&gt;HTTPS 강제 &amp;rarr; Bool: aws:SecureTransport = true&lt;/li&gt;
&lt;li data-end=&quot;2607&quot; data-start=&quot;2538&quot;&gt;시간 제한 &amp;rarr; DateGreaterThan: aws:CurrentTime = 2024-01-01T09:00:00Z&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3.&amp;nbsp;&lt;b&gt;[&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Add Statement ]&lt;/b&gt;를 클릭하여 규칙을 추가합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMB2i0/btsP1w8Qntg/VLMkrnPLBstIOxZEODFask/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMB2i0/btsP1w8Qntg/VLMkrnPLBstIOxZEODFask/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMB2i0/btsP1w8Qntg/VLMkrnPLBstIOxZEODFask/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMB2i0%2FbtsP1w8Qntg%2FVLMkrnPLBstIOxZEODFask%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1469&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4.&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Generate Policy ]&lt;/b&gt;를 클릭하여 JSON 정책을 생성합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJJhH/btsP1XSOwpv/K7g13ZVhgMJJIz2mMA6KEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJJhH/btsP1XSOwpv/K7g13ZVhgMJJIz2mMA6KEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJJhH/btsP1XSOwpv/K7g13ZVhgMJJIz2mMA6KEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJJhH%2FbtsP1XSOwpv%2FK7g13ZVhgMJJIz2mMA6KEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;485&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생성된 JSON을 복사합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UO98q/btsP1iv93c2/rxb518nfzK6pTylikqxCO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UO98q/btsP1iv93c2/rxb518nfzK6pTylikqxCO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UO98q/btsP1iv93c2/rxb518nfzK6pTylikqxCO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUO98q%2FbtsP1iv93c2%2Frxb518nfzK6pTylikqxCO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;611&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;6. JSON을 S3 콘솔 정책 편집기에 붙여넣고, &lt;b&gt;[ 변경 사항 저장 ]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE4jiD/btsPZ3zZqMZ/osCIwo65zHOVSroR42SpW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE4jiD/btsPZ3zZqMZ/osCIwo65zHOVSroR42SpW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE4jiD/btsPZ3zZqMZ/osCIwo65zHOVSroR42SpW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE4jiD%2FbtsPZ3zZqMZ%2FosCIwo65zHOVSroR42SpW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;896&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;7. 정책 적용이 완료됩니다.&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebQJoz/btsP2KrQ3UP/bl4fs0OuJH3u31DSGo4QR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebQJoz/btsP2KrQ3UP/bl4fs0OuJH3u31DSGo4QR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebQJoz/btsP2KrQ3UP/bl4fs0OuJH3u31DSGo4QR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebQJoz%2FbtsP2KrQ3UP%2Fbl4fs0OuJH3u31DSGo4QR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;899&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;2806&quot; data-start=&quot;2777&quot; data-ke-size=&quot;size23&quot;&gt;✅ Policy Generator 장점과 한계&lt;/h3&gt;
&lt;p data-end=&quot;2813&quot; data-start=&quot;2807&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;2901&quot; data-start=&quot;2814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2845&quot; data-start=&quot;2814&quot;&gt;JSON 문법 오류 방지 (완벽한 JSON 생성)&lt;/li&gt;
&lt;li data-end=&quot;2876&quot; data-start=&quot;2846&quot;&gt;단계별 가이드 제공 &amp;rarr; 초보자도 쉽게 작성 가능&lt;/li&gt;
&lt;li data-end=&quot;2901&quot; data-start=&quot;2877&quot;&gt;생성된 정책을 템플릿으로 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2909&quot; data-start=&quot;2903&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;2966&quot; data-start=&quot;2910&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2935&quot; data-start=&quot;2910&quot;&gt;최신 IAM/S3 조건 키 일부 미지원&lt;/li&gt;
&lt;li data-end=&quot;2966&quot; data-start=&quot;2936&quot;&gt;복잡한 정책은 생성 후 직접 JSON 수정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정책 생성기에 대한 자세한 설명은 아래 글을 읽어보세요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/159&quot;&gt;https://bu119.tistory.com/159&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756277193771&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] Amazon S3 버킷 정책 생성기 사용 가이드&quot; data-og-description=&quot;AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다. 1. AWS Policy Generator 접근 방법AW&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/159&quot; data-og-url=&quot;https://bu119.tistory.com/159&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/taWw3/hyZCXXd9dp/zVhbWuVIhc2JDP13k3Mnm0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2XVBp/hyZGa8sZa8/HK3oS52meiQvxJlxrNUFUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bh0vkS/hyZC5HI5Wc/H6r9PJu1KFS1DK1gvZ7STK/img.png?width=2560&amp;amp;height=1392&amp;amp;face=0_0_2560_1392&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/159&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/159&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/taWw3/hyZCXXd9dp/zVhbWuVIhc2JDP13k3Mnm0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2XVBp/hyZGa8sZa8/HK3oS52meiQvxJlxrNUFUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bh0vkS/hyZC5HI5Wc/H6r9PJu1KFS1DK1gvZ7STK/img.png?width=2560&amp;amp;height=1392&amp;amp;face=0_0_2560_1392');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] Amazon S3 버킷 정책 생성기 사용 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다. 1. AWS Policy Generator 접근 방법AW&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;94&quot; data-start=&quot;80&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;상황별 추천 워크플로우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;119&quot; data-start=&quot;96&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  긴급 수정 (빠른 대응 필요)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;192&quot; data-start=&quot;120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;145&quot; data-start=&quot;120&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;방법 추천&lt;/b&gt;: 직접 JSON 작성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;192&quot; data-start=&quot;146&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;이유&lt;/b&gt;: 빠르게 정책을 수정할 수 있고, 복잡한 조건도 즉시 반영 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;197&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1756706475637&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::urgent-bucket/*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;433&quot; data-start=&quot;410&quot; data-ke-size=&quot;size23&quot;&gt;  학습 목적 (정책 구조 이해)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;513&quot; data-start=&quot;434&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;434&quot;&gt;&lt;b&gt;방법 추천&lt;/b&gt;: 시각적 편집기&lt;/li&gt;
&lt;li data-end=&quot;513&quot; data-start=&quot;457&quot;&gt;&lt;b&gt;이유&lt;/b&gt;: JSON 문법을 몰라도 GUI로 쉽게 작성 가능, 실시간 JSON 미리보기 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;545&quot; data-start=&quot;520&quot; data-ke-size=&quot;size23&quot;&gt; ️ 프로덕션 환경 (정확성 최우선)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;641&quot; data-start=&quot;546&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;600&quot; data-start=&quot;546&quot;&gt;&lt;b&gt;방법 추천&lt;/b&gt;: Policy Generator &amp;rarr; JSON 검증 &amp;rarr; 동료 리뷰 후 적용&lt;/li&gt;
&lt;li data-end=&quot;641&quot; data-start=&quot;601&quot;&gt;&lt;b&gt;이유&lt;/b&gt;: 문법 오류 방지 + 팀 내 표준화된 정책 관리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;663&quot; data-start=&quot;648&quot; data-ke-size=&quot;size23&quot;&gt;  팀 작업 표준화&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;776&quot; data-start=&quot;679&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;711&quot; data-start=&quot;679&quot;&gt;Policy Generator로 표준 템플릿 생성&lt;/li&gt;
&lt;li data-end=&quot;744&quot; data-start=&quot;714&quot;&gt;팀 정책 라이브러리 관리 (Git 저장소 등)&lt;/li&gt;
&lt;li data-end=&quot;776&quot; data-start=&quot;747&quot;&gt;필요 시 직접 JSON 수정으로 커스터마이징&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;798&quot; data-start=&quot;783&quot; data-ke-size=&quot;size23&quot;&gt;  권장 학습 경로&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1036&quot; data-start=&quot;799&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;수준&lt;/td&gt;
&lt;td&gt;추천 순서&lt;/td&gt;
&lt;td&gt;&amp;nbsp;목적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;911&quot; data-start=&quot;847&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;853&quot; data-start=&quot;847&quot;&gt;초급자&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;892&quot; data-start=&quot;853&quot;&gt;Policy Generator &amp;rarr; 시각적 편집기 &amp;rarr; 직접 JSON&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;911&quot; data-start=&quot;892&quot;&gt;안전하게 학습, 단계적 성장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;977&quot; data-start=&quot;912&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;918&quot; data-start=&quot;912&quot;&gt;중급자&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;962&quot; data-start=&quot;918&quot;&gt;시각적 편집기 &amp;rarr; 직접 JSON &amp;rarr; Policy Generator(검증용)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;977&quot; data-start=&quot;962&quot;&gt;효율성과 정확성 균형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1036&quot; data-start=&quot;978&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;984&quot; data-start=&quot;978&quot;&gt;고급자&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1023&quot; data-start=&quot;984&quot;&gt;직접 JSON &amp;rarr; (복잡한 경우만) Policy Generator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1036&quot; data-start=&quot;1023&quot;&gt;최대 효율성 추구&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1053&quot; data-start=&quot;1043&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;실무 모범 사례&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1070&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  보안 기본 원칙&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1269&quot; data-start=&quot;1071&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1117&quot; data-start=&quot;1071&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;최소 권한 원칙(Principle of Least Privilege)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1118&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;명시적 거부(Explicit Deny)&lt;/b&gt; 활용 &amp;rarr; 불필요한 권한 확장 방지&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1167&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;HTTPS 전송 강제 (aws:SecureTransport)&lt;/b&gt; &amp;rarr; 평문 HTTP 차단&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1269&quot; data-start=&quot;1224&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;퍼블릭 액세스 차단(Block Public Access)&lt;/b&gt; 설정 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-end=&quot;1291&quot; data-start=&quot;1276&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; ️ 정책 관리 팁&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1439&quot; data-start=&quot;1292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1354&quot; data-start=&quot;1292&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Sid 규칙&lt;/b&gt;: 작업_대상_환경 형태 권장 (예: Allow_WebApp_Read_Prod)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1355&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문서화&lt;/b&gt;: 정책에 주석은 불가능하므로, JSON 외부에 설명 파일을 반드시 관리&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1355&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;버전 관리&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: Git 저장소에 정책 파일 보관&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;2424&quot; data-start=&quot;2417&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  결론&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;651&quot; data-start=&quot;494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;539&quot; data-start=&quot;494&quot;&gt;&lt;b&gt;초급자&lt;/b&gt;: Policy Generator 또는 시각적 편집기부터 시작&lt;/li&gt;
&lt;li data-end=&quot;605&quot; data-start=&quot;540&quot;&gt;&lt;b&gt;실무 운영&lt;/b&gt;: Policy Generator + JSON 수동 수정 + Access Analyzer 검증&lt;/li&gt;
&lt;li data-end=&quot;651&quot; data-start=&quot;606&quot;&gt;&lt;b&gt;항상 확인할 것&lt;/b&gt;: 최소 권한, HTTPS 강제, 퍼블릭 액세스 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;817&quot; data-start=&quot;653&quot; data-ke-size=&quot;size16&quot;&gt;각 방법은 고유한 장점과 적절한 사용 상황이 있습니다. &lt;b&gt;처음에는 안전한 도구를 활용해 구조를 익히고, 점차 직접 JSON 작성으로 발전&lt;/b&gt;하는 것을 권장합니다.&lt;/p&gt;
&lt;p data-end=&quot;817&quot; data-start=&quot;653&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;무엇보다 &lt;b&gt;&amp;ldquo;보안과 정확성&amp;rdquo;을 최우선으로 두고, 상황에 맞는 방법을 선택하는 것&lt;/b&gt;이 S3 버킷 정책 작성의 핵심입니다.&lt;/p&gt;
&lt;p data-end=&quot;817&quot; data-start=&quot;653&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/161</guid>
      <comments>https://bu119.tistory.com/161#entry161comment</comments>
      <pubDate>Mon, 1 Sep 2025 15:20:03 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기</title>
      <link>https://bu119.tistory.com/132</link>
      <description>&lt;p data-end=&quot;351&quot; data-start=&quot;185&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3 버킷 정책은 &lt;b&gt;버킷과 객체에 대한 접근 제어를 JSON 형식으로 정의하는 보안 기능&lt;/b&gt;입니다.&lt;br /&gt;S3는 기본적으로 외부 접근이 차단되어 있기 때문에, &lt;b&gt;웹사이트 호스팅, 파일 업로드/다운로드, 특정 사용자 권한 부여&lt;/b&gt; 등의 상황에서 반드시 버킷 정책을 설정해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;AWS 콘솔에서 버킷 정책을 단계별로 설정하는 방법&lt;/b&gt;과 &lt;b&gt;실무에서 자주 사용하는 정책 예제&lt;/b&gt;를 정리합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  목차&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;569&quot; data-start=&quot;470&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;482&quot; data-start=&quot;470&quot;&gt;사전 준비사항&lt;/li&gt;
&lt;li data-end=&quot;499&quot; data-start=&quot;483&quot;&gt;버킷 정책 설정 방법&lt;/li&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;500&quot;&gt;정책 작성 방법 3가지&lt;/li&gt;
&lt;li data-end=&quot;533&quot; data-start=&quot;520&quot;&gt;실전 예제&lt;/li&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;534&quot;&gt;문제 해결 및 모범 사례&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; ️ 사전 준비사항&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;퍼블릭 액세스 차단 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로 생성된 S3 버킷은 기본적으로 &lt;b&gt;퍼블릭 액세스 차단(Block Public Access)&lt;/b&gt; 이 활성화됩니다&lt;/li&gt;
&lt;li&gt;외부 접근이 필요한 경우 이 설정을 해제해야 합니다&lt;/li&gt;
&lt;li&gt;⚠️ 주의&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 보안 위험을 충분히 검토한 후 해제하세요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요 권한 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버킷 정책 설정을 위해서는 s3:PutBucketPolicy 권한이 필요합니다&lt;/li&gt;
&lt;li&gt;버킷 소유자 또는 해당 권한이 있는 IAM 사용자만 수정 가능합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-end=&quot;854&quot; data-start=&quot;739&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⚙️ 버킷 정책 설정 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1️⃣ S3 콘솔 접속 및 버킷 선택 &lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. AWS 콘솔에서 S3 서비스로 이동합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5LRhQ/btsPYJVzWI2/ONSiO097BPr0KNqdcJwgJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5LRhQ/btsPYJVzWI2/ONSiO097BPr0KNqdcJwgJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5LRhQ/btsPYJVzWI2/ONSiO097BPr0KNqdcJwgJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5LRhQ%2FbtsPYJVzWI2%2FONSiO097BPr0KNqdcJwgJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;700&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 정책을 적용할 버킷을 선택합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d34bMn/btsPZjPTohe/ufZ4Vzc8tXxWSArJHsOUsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d34bMn/btsPZjPTohe/ufZ4Vzc8tXxWSArJHsOUsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d34bMn/btsPZjPTohe/ufZ4Vzc8tXxWSArJHsOUsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd34bMn%2FbtsPZjPTohe%2FufZ4Vzc8tXxWSArJHsOUsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1400&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2️⃣ 퍼블릭 액세스 차단 해제 (공개 정책이 필요한 경우) &lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 버킷 상세 페이지에서 &lt;b&gt;[ 권한(Permissions) ]&lt;/b&gt; 탭을 클릭합니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;퍼블릭 액세스 차단(버킷 설정) &lt;/b&gt;섹션에서 &quot;비활성화&quot; 상태로 설정되어있는 지 확인합니다.&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️ 주의: 퍼블릭 액세스 차단을 해제하면 보안 위험이 증가할 수 있습니다. 신중하게 설정하세요.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCllzu/btsP0OH4llO/CQCmKcjtXQNHY3Ouo8FzkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCllzu/btsP0OH4llO/CQCmKcjtXQNHY3Ouo8FzkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCllzu/btsP0OH4llO/CQCmKcjtXQNHY3Ouo8FzkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCllzu%2FbtsP0OH4llO%2FCQCmKcjtXQNHY3Ouo8FzkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1269&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 공개 정책이 필요한 경우 &lt;b&gt;&quot;편집&quot;&lt;/b&gt; 버튼을 클릭하여 차단 해제합니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3️⃣ 버킷 정책 편집 - 시각적 편집기 사용 (Edit statement)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷 정책 편집 화면에서 &lt;b&gt;시각적 편집기&lt;/b&gt;를 사용하여 정책을 설정하는 실습을 진행하겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;버킷 정책(Bucket policy) &lt;/b&gt;섹션에서&lt;b&gt; [ 편집(Edit) ]&lt;/b&gt; 버튼을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MOez9/btsPXHjJPcR/2Jhx4L9ebnLFpasgBNJSl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MOez9/btsPXHjJPcR/2Jhx4L9ebnLFpasgBNJSl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MOez9/btsPXHjJPcR/2Jhx4L9ebnLFpasgBNJSl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMOez9%2FbtsPXHjJPcR%2F2Jhx4L9ebnLFpasgBNJSl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1270&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2.&lt;b&gt; &lt;b&gt;[새 명령문 추가(Add new statement)]&lt;/b&gt; &lt;/b&gt;버튼을 클릭합니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; data-alt=&quot;영어 버전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgEfBl/btsP35KMD2z/g7B10sEENS514lWXXBYqd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgEfBl%2FbtsP35KMD2z%2Fg7B10sEENS514lWXXBYqd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1397&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;영어 버전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; data-alt=&quot;한글 버전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhjnK/btsP4ZJMgeg/Y1v28fYPKKzLMpDxkUwsl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrhjnK%2FbtsP4ZJMgeg%2FY1v28fYPKKzLMpDxkUwsl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1395&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한글 버전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 시각적 편집기에서 다음 항목들을 순서대로 설정합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpjEYk/btsP4bSn7C1/OuOKMI57nAdFpVsRekKFu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpjEYk%2FbtsP4bSn7C1%2FOuOKMI57nAdFpVsRekKFu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1268&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Statement 설정 항목:&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 143px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #2780d4; color: #ffffff;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;background-color: #2780d4; color: #ffffff;&quot;&gt;항목 설명&lt;/td&gt;
&lt;td style=&quot;background-color: #2780d4; color: #ffffff;&quot;&gt;예시&lt;/td&gt;
&lt;td style=&quot;background-color: #2780d4; color: #ffffff;&quot;&gt;예시&amp;nbsp; 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;Sid&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정책 식별자&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;ObjectReadWriteAccesss&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;읽기/쓰기 권한을 통합해서 부여하므로 직관적으로 작성&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;Effect&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;허용/거부 선택&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;Allow&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;허용 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;Principal&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;접근 주체&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;모든 사용자에게 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;Actions&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;S3 작업 선택&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;GetObject, PutObject&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;읽기, 쓰기 권한 부여&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;적용 대상&lt;/td&gt;
&lt;td&gt;arn:aws:s3:::버킷명/*&lt;/td&gt;
&lt;td&gt;버킷 내 모든 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Conditions&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;추가 조건 설정&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;설정 안함&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sid / Principal /&amp;nbsp; Effect을 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img style=&quot;letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/zyoAs/btsP6YcXaYw/AAAAAAAAAAAAAAAAAAAAAIYd58Jsf9OK4LIMDL7cycJHuGQg8HebAUj9X-Dt6f43/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1756652399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=djuG433TlHteBvONDk9Yp%2B1HrJc%3D&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Actions에서 GetObject를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2065&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daIlFf/btsP4Tp7du9/C5hzekVLzofip15QoIlsQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaIlFf%2FbtsP4Tp7du9%2FC5hzekVLzofip15QoIlsQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2065&quot; height=&quot;842&quot; data-origin-width=&quot;2065&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Actions에서 PutObject를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKLVw5/btsP6KMMgJ0/O25YBQzJm0OgFfaCDRvl5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKLVw5%2FbtsP6KMMgJ0%2FO25YBQzJm0OgFfaCDRvl5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2062&quot; height=&quot;827&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resources를 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; font-size: 16px; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/5BGse/btsP4ftNAdo/AAAAAAAAAAAAAAAAAAAAAKWxjK1p_jXHKaBEPJ6ngknql1r4m_C5HVmbgEB4rezw/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1756652399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=CfBNRt5yVej9%2FUSBZu3F0q%2BZiNE%3D&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1266&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. JSON 미리보기에서 생성된 정책을 확인합니다.&lt;/h4&gt;
&lt;pre id=&quot;code_1756282030905&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Sid&quot;: &quot;ObjectReadWriteAccess&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: &quot;*&quot;,
            &quot;Action&quot;: [
                &quot;s3:GetObject&quot;,
                &quot;s3:PutObject&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name/*&quot;
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5. &lt;b&gt;[&amp;nbsp;&lt;/b&gt;&lt;b&gt;변경 사항 저장(&lt;/b&gt;&lt;b&gt;Save changes) ]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필요 시 추가 statement를 더 생성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwZuFk/btsP5rNVytm/c9KhksTf08uT6uCZaVOBR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwZuFk%2FbtsP5rNVytm%2Fc9KhksTf08uT6uCZaVOBR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1320&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;6.&lt;span&gt; &lt;/span&gt;정책 적용이 완료됩니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9laCo/btsP7f0Bh64/aoV2IIq5ojc8DAYIxetQxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9laCo%2FbtsP7f0Bh64%2FaoV2IIq5ojc8DAYIxetQxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1334&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  정책 작성 방법 3가지&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습에서 사용한 시각적 편집기 외에도 다른 방법들도 알아두면 유용합니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1: 직접 JSON 작성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 빠른 작성, 세밀한 제어 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: JSON 문법 숙지 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추천&lt;/b&gt;: JSON에 익숙한 개발자&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 JSON 구조&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;정책식별자&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::버킷명/*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JSON 구성 요소&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Version&lt;/b&gt;: 정책 버전 (고정값: &quot;2012-10-17&quot;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sid&lt;/b&gt;: Statement 식별자 (선택사항)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Effect&lt;/b&gt;: Allow(허용) 또는 Deny(거부)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Principal&lt;/b&gt;: 접근 주체 (&quot;*&quot;는 모든 사용자)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Action&lt;/b&gt;: 허용할 S3 작업 목록&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Resource&lt;/b&gt;: 정책 적용 대상 ARN&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 2: AWS 정책 생성기 (Policy Generator)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: GUI 기반, 문법 오류 방지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 별도 도구 사용 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추천&lt;/b&gt;: 정확한 문법이 중요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷 정책 편집 화면에서 &lt;b&gt;[정책 생성기(Policy Generator)]&lt;/b&gt; 버튼을 클릭하여 외부 도구로 정책을 생성한 후 복사하여 사용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  실전 정책 예제&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 1: 정적 웹사이트용 공개 읽기 정책&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;PublicReadForWebsite&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-website-bucket/*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 2: IP 제한이 있는 읽기/쓰기 정책&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;OfficeIPOnlyAccess&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: [
        &quot;s3:GetObject&quot;,
        &quot;s3:PutObject&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-private-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;IpAddress&quot;: {
          &quot;aws:SourceIp&quot;: &quot;203.0.113.0/24&quot;
        }
      }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 3: HTTPS 연결 강제 정책&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;DenyInsecureConnections&quot;,
      &quot;Effect&quot;: &quot;Deny&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:*&quot;,
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::my-secure-bucket&quot;,
        &quot;arn:aws:s3:::my-secure-bucket/*&quot;
      ],
      &quot;Condition&quot;: {
        &quot;Bool&quot;: {
          &quot;aws:SecureTransport&quot;: &quot;false&quot;
        }
      }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⚠️ 문제 해결 및 보안 모범 사례&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 하는 실수와 해결법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;ARN 형식 오류&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ 잘못된 예: arn:aws:s3::my-bucket/*&lt;/li&gt;
&lt;li&gt;✅ 올바른 예: arn:aws:s3:::my-bucket/* (콜론 3개)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Resource 타입 혼동&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버킷 자체: arn:aws:s3:::my-bucket (ListBucket 작업 시)&lt;/li&gt;
&lt;li&gt;버킷 내 객체: arn:aws:s3:::my-bucket/* (GetObject/PutObject 시)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책이 적용되지 않는 경우&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;퍼블릭 액세스 차단 설정 확인&lt;/li&gt;
&lt;li&gt;JSON 문법 오류 검증&lt;/li&gt;
&lt;li&gt;필요 권한 보유 여부 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정책 테스트 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;브라우저 직접 접근&lt;/b&gt;: &lt;a href=&quot;https://버킷명.s3.amazonaws.com/파일명&quot;&gt;https://버킷명.s3.amazonaws.com/파일명&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AWS CLI 테스트&lt;/b&gt;: aws s3 ls s3://버킷명/&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IAM 정책 시뮬레이터&lt;/b&gt;: AWS 콘솔에서 정책 동작 검증&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안 모범 사례&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;최소 권한 원칙 적용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 최소한의 권한만 부여&lt;/li&gt;
&lt;li&gt;정기적으로 불필요한 권한 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조건부 접근 제어 활용&lt;/b&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;pre class=&quot;1c&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;IpAddress&quot;: {&quot;aws:SourceIp&quot;: &quot;허용할IP대역&quot;},
  &quot;Bool&quot;: {&quot;aws:SecureTransport&quot;: &quot;true&quot;},
  &quot;DateGreaterThan&quot;: {&quot;aws:CurrentTime&quot;: &quot;2024-01-01T00:00:00Z&quot;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정기적인 정책 검토&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분기별 정책 검토 및 업데이트&lt;/li&gt;
&lt;li&gt;CloudTrail 로그를 통한 접근 모니터링&lt;/li&gt;
&lt;li&gt;불필요한 공개 권한 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 정책 설정 체크리스트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 완료 후 다음 사항들을 반드시 확인하세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;퍼블릭 액세스 차단 설정 검토&lt;/li&gt;
&lt;li&gt;JSON 문법 오류 없음&lt;/li&gt;
&lt;li&gt;실제 접근 테스트 수행&lt;/li&gt;
&lt;li&gt;최소 권한 원칙 준수&lt;/li&gt;
&lt;li&gt;조건부 제어 적용 (필요시)&lt;/li&gt;
&lt;li&gt;정책 문서화 및 버전 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 버킷 정책은 &lt;b&gt;누가, 언제, 어떤 조건에서, 어떤 리소스에 접근할 수 있는지&lt;/b&gt;를 제어하는 핵심 보안 도구입니다. 정책 설정 후에는 반드시 실제 테스트를 통해 의도한 대로 동작하는지 확인하고, CloudTrail을 통해 지속적으로 모니터링하는 것이 중요합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot;&gt;AWS S3 Bucket Policies 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot;&gt;AWS Policy Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@leeeeeyeon/AWS-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@leeeeeyeon/AWS-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chobo24.tistory.com/entry/AWS-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chobo24.tistory.com/entry/AWS-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jjinwo0/Spring-Boot-AWS-AWS-S3-bucket%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/132</guid>
      <comments>https://bu119.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 26 Aug 2025 09:00:54 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 버킷 정책(Bucket Policy) 이해하기</title>
      <link>https://bu119.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon S3는 파일(객체)을 저장하는 AWS의 대표적인 클라우드 스토리지 서비스입니다. 하지만 기본적으로 S3 버킷은 보안을 위해 외부에서 접근할 수 없도록 잠겨 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 서비스 운영에서는 상황에 따라 접근 권한을 세밀하게 제어해야 할 때가 있습니다. 이때 필요한 것이 바로 S3 버킷 정책(Bucket Policy)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot;&gt;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&lt;/a&gt; &lt;/p&gt;
&lt;figure id=&quot;og_1755939938803&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bucket policies for Amazon S3 - Amazon Simple Storage Service&quot; data-og-description=&quot;You can't use a bucket policy to prevent deletions or transitions by an S3 Lifecycle rule. For example, even if your bucket policy denies all actions for all principals, your S3 Lifecycle configuration still functions as normal.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bucket policies for Amazon S3 - Amazon Simple Storage Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;You can't use a bucket policy to prevent deletions or transitions by an S3 Lifecycle rule. For example, even if your bucket policy denies all actions for all principals, your S3 Lifecycle configuration still functions as normal.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  언제 버킷 정책이 필요할까요?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정적 웹사이트 호스팅&lt;/b&gt;: 이미지, CSS, JS 파일을 누구나 볼 수 있게 공개&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팀 협업&lt;/b&gt;: 특정 IAM 사용자나 그룹에게만 업로드/다운로드 권한 부여&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 강화&lt;/b&gt;: 특정 IP 주소나 VPC에서만 접근 가능하도록 제한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교차 계정 액세스&lt;/b&gt;: 다른 AWS 계정과 안전하게 리소스 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  S3 버킷 정책이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon S3를 인터넷상의 거대한 창고라고 생각해보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 버킷(Bucket)은 창고 안의 각각의 방이고, 버킷 정책(Bucket Policy)은 누가 이 방에 들어올 수 있는지, 무엇을 할 수 있는지를 정하는 세부 규칙입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON 형식으로 작성되는 권한 제어 문서&lt;/li&gt;
&lt;li&gt;버킷 단위로 적용되는 보안 규칙&lt;/li&gt;
&lt;li&gt;&quot;누가&quot; &amp;rarr; &quot;어떤 작업&quot; &amp;rarr; &quot;어떤 리소스&quot;에 &amp;rarr; &quot;허용/거부&quot;할지를 정의&lt;/li&gt;
&lt;li&gt;IAM 정책과 유사하지만 버킷 자체에 직접 연결되는 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 버킷 정책이 중요한가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;보안&lt;/b&gt;: 민감한 데이터를 무단 접근으로부터 보호&lt;/li&gt;
&lt;li&gt;&lt;b&gt;접근 제어&lt;/b&gt;: 세밀한 권한 관리로 최소 권한 원칙 구현&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 최적화&lt;/b&gt;: 불필요한 접근 차단으로 데이터 전송 비용 절약&lt;/li&gt;
&lt;li&gt;&lt;b&gt;규정 준수&lt;/b&gt;: 기업 보안 정책 및 컴플라이언스 요구사항 충족&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 버킷 정책의 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 버킷 정책은 JSON 형식으로 작성되며, 다음과 같은 기본 구조를 가집니다:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name/*&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 구성 요소&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;요소&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;정책 언어 버전&lt;/td&gt;
&lt;td&gt;AWS 정책 문법 버전 지정&lt;/td&gt;
&lt;td&gt;&quot;2012-10-17&quot; (고정값)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Statement&lt;/td&gt;
&lt;td&gt;규칙 집합&lt;/td&gt;
&lt;td&gt;하나 이상의 권한 규칙 포함&lt;/td&gt;
&lt;td&gt;배열 형태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect&lt;/td&gt;
&lt;td&gt;허용/거부&lt;/td&gt;
&lt;td&gt;명령의 최종 결과&lt;/td&gt;
&lt;td&gt;&quot;Allow&quot; 또는 &quot;Deny&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;접근 주체&lt;/td&gt;
&lt;td&gt;누가 접근할 수 있는지&lt;/td&gt;
&lt;td&gt;&quot;*&quot; (모든 사용자)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;허용할 작업&lt;/td&gt;
&lt;td&gt;어떤 S3 작업을 허용할지&lt;/td&gt;
&lt;td&gt;&quot;s3:GetObject&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource&lt;/td&gt;
&lt;td&gt;대상 리소스&lt;/td&gt;
&lt;td&gt;어떤 버킷/객체에 적용할지&lt;/td&gt;
&lt;td&gt;&quot;arn:aws:s3:::bucket/*&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Condition&lt;/td&gt;
&lt;td&gt;추가 조건&lt;/td&gt;
&lt;td&gt;언제, 어떤 상황에서 적용할지&lt;/td&gt;
&lt;td&gt;IP 제한, 시간 제한 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  각 요소 상세 설명&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Version (버전)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;항상 &quot;2012-10-17&quot; 사용 (최신 정책 언어 버전)&lt;/li&gt;
&lt;li&gt;다른 값 사용 시 일부 기능 제한 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Effect (효과)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;Allow&quot;&lt;/b&gt;: 권한 허용 (일반적 사용)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Deny&quot;&lt;/b&gt;: 권한 거부 (명시적 차단)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;중요&lt;/b&gt;: Deny가 Allow보다 항상 우선순위가 높음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Principal (주체)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;// 모든 사용자 (공개 액세스)
&quot;Principal&quot;: &quot;*&quot;

// 특정 AWS 계정
&quot;Principal&quot;: {&quot;AWS&quot;: &quot;arn:aws:iam::123456789012:root&quot;}

// 특정 IAM 사용자
&quot;Principal&quot;: {&quot;AWS&quot;: &quot;arn:aws:iam::123456789012:user/username&quot;}

// 특정 IAM 역할
&quot;Principal&quot;: {&quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/rolename&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Action (작업)&lt;/span&gt;&lt;/h4&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:GetObject: 파일 다운로드&lt;/li&gt;
&lt;li&gt;s3:ListBucket: 버킷 내용 목록 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:PutObject: 파일 업로드&lt;/li&gt;
&lt;li&gt;s3:DeleteObject: 파일 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:*: 모든 S3 작업 (주의해서 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Resource (리소스)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;smalltalk&quot;&gt;&lt;code&gt;// 버킷 자체 (ListBucket 등)
&quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name&quot;

// 버킷 내 모든 객체
&quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name/*&quot;

// 특정 폴더만
&quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name/images/*&quot;

// 여러 리소스
&quot;Resource&quot;: [
  &quot;arn:aws:s3:::your-bucket-name&quot;,
  &quot;arn:aws:s3:::your-bucket-name/*&quot;
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Condition (조건)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP 주소 제한&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;IpAddress&quot;: {
    &quot;aws:SourceIp&quot;: &quot;203.0.113.0/24&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간 제한&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;DateGreaterThan&quot;: {&quot;aws:CurrentTime&quot;: &quot;2025-01-01T00:00:00Z&quot;},
  &quot;DateLessThan&quot;: {&quot;aws:CurrentTime&quot;: &quot;2025-12-31T23:59:59Z&quot;}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTPS 강제&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;Bool&quot;: {
    &quot;aws:SecureTransport&quot;: &quot;true&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 자주 사용하는 정책 예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot;&gt;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755939967348&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Examples of Amazon S3 bucket policies - Amazon Simple Storage Service&quot; data-og-description=&quot;We recommend that you use caution when using the aws:Referer condition key. It is dangerous to include a publicly known HTTP referer header value. Unauthorized parties can use modified or custom browsers to provide any aws:Referer value that they choose. T&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMUpCI/hyZzx5FDi2/fsLteXD3nnp5Ckei7I1DKK/img.png?width=779&amp;amp;height=587&amp;amp;face=0_0_779_587&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMUpCI/hyZzx5FDi2/fsLteXD3nnp5Ckei7I1DKK/img.png?width=779&amp;amp;height=587&amp;amp;face=0_0_779_587');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Examples of Amazon S3 bucket policies - Amazon Simple Storage Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We recommend that you use caution when using the aws:Referer condition key. It is dangerous to include a publicly known HTTP referer header value. Unauthorized parties can use modified or custom browsers to provide any aws:Referer value that they choose. T&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 정적 웹사이트 공개 정책&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;PublicReadGetObject&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::your-website-bucket/*&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 특정 IP에서만 접근 허용&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;IpAddress&quot;: {
          &quot;aws:SourceIp&quot;: [&quot;203.0.113.0/24&quot;, &quot;198.51.100.0/24&quot;]
        }
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. HTTPS 연결 강제&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Deny&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:*&quot;,
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::your-bucket&quot;,
        &quot;arn:aws:s3:::your-bucket/*&quot;
      ],
      &quot;Condition&quot;: {
        &quot;Bool&quot;: {
          &quot;aws:SecureTransport&quot;: &quot;false&quot;
        }
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 특정 사용자에게 전체 권한 부여&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:user/developer&quot;
      },
      &quot;Action&quot;: [
        &quot;s3:GetObject&quot;,
        &quot;s3:PutObject&quot;,
        &quot;s3:DeleteObject&quot;,
        &quot;s3:ListBucket&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::your-bucket&quot;,
        &quot;arn:aws:s3:::your-bucket/*&quot;
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 주의사항 및 베스트 프랙티스&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;보안 주의사항&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공개 액세스 최소화&lt;/b&gt;: &quot;Principal&quot;: &quot;*&quot; 사용 시 신중하게 검토&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최소 권한 원칙&lt;/b&gt;: 필요한 최소한의 권한만 부여&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Deny 정책 우선&lt;/b&gt;: 보안상 중요한 리소스는 명시적으로 Deny 규칙 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정책 작성 팁&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Sid 추가&lt;/b&gt;: 각 Statement에 설명적인 Sid(Statement ID) 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조건 활용&lt;/b&gt;: IP, 시간, 암호화 등 추가 보안 조건 적극 활용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정기 검토&lt;/b&gt;: 정책을 주기적으로 검토하여 불필요한 권한 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 해결&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정책 충돌&lt;/b&gt;: IAM 정책과 버킷 정책이 충돌할 때는 더 제한적인 정책이 우선&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSON 문법 오류&lt;/b&gt;: AWS Policy Generator 활용으로 문법 오류 방지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 테스트&lt;/b&gt;: 정책 적용 후 실제 접근 테스트로 동작 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 버킷 정책은 클라우드 보안의 핵심 요소입니다. 올바른 정책 설정을 통해 데이터를 안전하게 보호하면서도 필요한 접근성을 확보할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 다룬 기본 구조와 예제들을 참고하여 여러분의 요구사항에 맞는 버킷 정책을 작성해보세요. 항상 최소 권한 원칙을 기억하고, 정기적인 정책 검토를 통해 안전한 AWS 환경을 유지하시기 바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 AWS 콘솔에서 실제로 이러한 정책들을 설정하는 방법을 스크린샷과 함께 자세히 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/132&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755939706875&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기&quot; data-og-description=&quot;Amazon S3는 파일(객체)을 저장하는 AWS의 대표적인 클라우드 스토리지 서비스입니다. 하지만 기본적으로 S3 버킷은 보안을 위해 외부에서 접근할 수 없도록 잠겨 있습니다.실제 서비스 운영에서는 &quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/132&quot; data-og-url=&quot;https://bu119.tistory.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cTP5RF/hyZDceOodk/ZOWTkzo7NP9UKCfmXAJie0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LM343/hyZzIF4NKl/2E3cf7lQOCfgZanH4yNtbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fBAS1/hyZC1Emynu/SahxY4RIbkL98aQipR4Ydk/img.png?width=2560&amp;amp;height=1400&amp;amp;face=0_0_2560_1400&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cTP5RF/hyZDceOodk/ZOWTkzo7NP9UKCfmXAJie0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LM343/hyZzIF4NKl/2E3cf7lQOCfgZanH4yNtbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fBAS1/hyZC1Emynu/SahxY4RIbkL98aQipR4Ydk/img.png?width=2560&amp;amp;height=1400&amp;amp;face=0_0_2560_1400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3는 파일(객체)을 저장하는 AWS의 대표적인 클라우드 스토리지 서비스입니다. 하지만 기본적으로 S3 버킷은 보안을 위해 외부에서 접근할 수 없도록 잠겨 있습니다.실제 서비스 운영에서는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot;&gt;AWS Policy Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&quot;&gt;https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/160</guid>
      <comments>https://bu119.tistory.com/160#entry160comment</comments>
      <pubDate>Sat, 23 Aug 2025 19:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 버킷 정책 생성기 사용 가이드</title>
      <link>https://bu119.tistory.com/159</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. AWS Policy Generator 접근 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AWS Policy Generator는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://awspolicygen.s3.amazonaws.com/policygen.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://awspolicygen.s3.amazonaws.com/policygen.html&lt;/a&gt;에서 접근할 수 있으며, AWS 콘솔 로그인 없이도 사용 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 정책 생성기 구성 요소 설명&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8CuT/btsPXw3Ahfh/L5PkjpmImHtwJkbdpTscek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8CuT/btsPXw3Ahfh/L5PkjpmImHtwJkbdpTscek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8CuT/btsPXw3Ahfh/L5PkjpmImHtwJkbdpTscek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8CuT%2FbtsPXw3Ahfh%2FL5PkjpmImHtwJkbdpTscek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1392&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1️⃣ Step 1: 정책 유형 선택 (Select Policy Type)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2201&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doyTIL/btsPZtymKc7/9lSXFVCwU2HzTqkI3FBZ81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doyTIL/btsPZtymKc7/9lSXFVCwU2HzTqkI3FBZ81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doyTIL/btsPZtymKc7/9lSXFVCwU2HzTqkI3FBZ81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoyTIL%2FbtsPZtymKc7%2F9lSXFVCwU2HzTqkI3FBZ81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2201&quot; height=&quot;285&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2201&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Type of Policy (정책 유형)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정책 생성기에서 지원하는 정책 유형들과 각각의 사용 목적:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. S3 Bucket Policy&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: S3 버킷과 객체에 대한 접근 권한 제어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 대상&lt;/b&gt;: 특정 S3 버킷&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 웹사이트 퍼블릭 액세스&lt;/li&gt;
&lt;li&gt;특정 사용자/역할에게만 버킷 접근 허용&lt;/li&gt;
&lt;li&gt;CloudFront와 연동한 원본 버킷 보안&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. IAM Policy&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 사용자, 그룹, 역할에 부여할 권한 정책&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 대상&lt;/b&gt;: IAM 엔터티&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발팀별 리소스 접근 권한 분리&lt;/li&gt;
&lt;li&gt;최소 권한 원칙 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. SNS Topic Policy&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: SNS 주제에 대한 구독/발행 권한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 대상&lt;/b&gt;: SNS 주제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 AWS 계정과 알림 공유&lt;/li&gt;
&lt;li&gt;애플리케이션 간 메시징&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. SQS Queue Policy&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: SQS 대기열 접근 권한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 대상&lt;/b&gt;: SQS 대기열&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 간 비동기 통신 권한 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. VPC Endpoint Policy&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: VPC 엔드포인트를 통한 서비스 접근 제어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 대상&lt;/b&gt;: VPC 엔드포인트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프라이빗 네트워크에서 AWS 서비스 접근 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2️⃣ Step 2: 정책 명령문 구성 (Add Statements)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2251&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBOhNX/btsPYJVWSS5/AFjQxs7bbo8zk3iNmcpwx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBOhNX/btsPYJVWSS5/AFjQxs7bbo8zk3iNmcpwx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBOhNX/btsPYJVWSS5/AFjQxs7bbo8zk3iNmcpwx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBOhNX%2FbtsPYJVWSS5%2FAFjQxs7bbo8zk3iNmcpwx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2251&quot; height=&quot;926&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2251&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Effect (효과)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정책의 기본 동작을 결정하는 핵심 요소:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Allow (허용)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Effect&quot;: &quot;Allow&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명시적으로 작업을 허용&lt;/li&gt;
&lt;li&gt;기본적으로 모든 작업이 거부되므로 필요한 작업만 허용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;: 읽기 전용 액세스, 특정 폴더 업로드 권한&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Deny (거부)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Effect&quot;: &quot;Deny&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명시적으로 작업을 거부&lt;/li&gt;
&lt;li&gt;Allow보다 우선순위가 높음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시&lt;/b&gt;: 특정 IP 차단, 삭제 작업 금지, 민감한 폴더 접근 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Principal (보안 주체)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정책이 적용될 대상을 지정하는 중요한 필드:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 모든 사용자 (퍼블릭 액세스)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Principal&quot;: &quot;*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주의사항&lt;/b&gt;: 인터넷의 모든 사용자가 접근 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 사례&lt;/b&gt;: 정적 웹사이트, 공개 다운로드 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 특정 AWS 계정&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Principal&quot;: {
  &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:root&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사용 사례&lt;/b&gt;: 다른 AWS 계정과 리소스 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 특정 IAM 사용자&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Principal&quot;: {
  &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:user/username&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 특정 IAM 역할&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Principal&quot;: {
  &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/rolename&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. AWS 서비스&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;&quot;Principal&quot;: {
  &quot;Service&quot;: &quot;cloudfront.amazonaws.com&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Actions (작업)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;S3에서 수행할 수 있는 주요 작업들:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 객체 관련 작업&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:GetObject: 객체 읽기/다운로드&lt;/li&gt;
&lt;li&gt;s3:PutObject: 객체 업로드/생성&lt;/li&gt;
&lt;li&gt;s3:DeleteObject: 객체 삭제&lt;/li&gt;
&lt;li&gt;s3:GetObjectAcl: 객체 ACL 조회&lt;/li&gt;
&lt;li&gt;s3:PutObjectAcl: 객체 ACL 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 버킷 관련 작업&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:ListBucket: 버킷 내용 목록 조회&lt;/li&gt;
&lt;li&gt;s3:GetBucketLocation: 버킷 위치 정보 조회&lt;/li&gt;
&lt;li&gt;s3:GetBucketVersioning: 버킷 버전 관리 상태 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 와일드카드 사용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s3:Get*: 모든 읽기 작업&lt;/li&gt;
&lt;li&gt;s3:Put*: 모든 쓰기 작업&lt;/li&gt;
&lt;li&gt;s3:*: 모든 S3 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Amazon Resource Name (ARN)&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정책이 적용될 리소스를 정확히 지정:&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 버킷 자체&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;arn:aws:s3:::my-bucket
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버킷 속성 관련 작업에 사용 (ListBucket 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 버킷 내 모든 객체&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;arn:aws:s3:::my-bucket/*
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 관련 작업에 사용 (GetObject, PutObject 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 특정 경로의 객체&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;arn:aws:s3:::my-bucket/uploads/*
arn:aws:s3:::my-bucket/public/images/*
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 복수 리소스 지정&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;arn:aws:s3:::my-bucket
arn:aws:s3:::my-bucket/*
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;조건 추가 (Add Conditions) - 선택사항&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건을 통해 더욱 세밀한 접근 제어가 가능합니다. Policy Generator에서는 세 개의 필드로 조건을 설정합니다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2247&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB3uMU/btsPZdWLIp3/WwAbLO1LcPkOe794ye3Qg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB3uMU/btsPZdWLIp3/WwAbLO1LcPkOe794ye3Qg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB3uMU/btsPZdWLIp3/WwAbLO1LcPkOe794ye3Qg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB3uMU%2FbtsPZdWLIp3%2FWwAbLO1LcPkOe794ye3Qg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2247&quot; height=&quot;326&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2247&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;조건 설정 구성 요소&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Condition (조건 연산자)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;StringEquals: 문자열 정확 일치&lt;/li&gt;
&lt;li&gt;StringLike: 와일드카드 패턴 매칭&lt;/li&gt;
&lt;li&gt;IpAddress: IP 주소 범위 내&lt;/li&gt;
&lt;li&gt;DateGreaterThan: 지정 날짜 이후&lt;/li&gt;
&lt;li&gt;Bool: 불린 값 (true/false)&lt;/li&gt;
&lt;li&gt;NumericLessThan: 지정 값보다 작음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Key (조건 키)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;aws:CurrentTime: 현재 시간&lt;/li&gt;
&lt;li&gt;aws:SourceIp: 요청자 IP 주소&lt;/li&gt;
&lt;li&gt;aws:SecureTransport: HTTPS 사용 여부&lt;/li&gt;
&lt;li&gt;s3:x-amz-server-side-encryption: S3 암호화 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Value (조건 값)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건과 비교할 실제 값 입력&lt;/li&gt;
&lt;li&gt;복수 값은 쉼표로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;주요 조건 활용 예시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 1: IP 주소 기반 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Condition: IpAddress&lt;/li&gt;
&lt;li&gt;Key: aws:SourceIp&lt;/li&gt;
&lt;li&gt;Value: 192.168.1.0/24,203.0.113.0/24&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;IpAddress&quot;: {
    &quot;aws:SourceIp&quot;: [&quot;192.168.1.0/24&quot;, &quot;203.0.113.0/24&quot;]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 2: 시간 기반 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Condition: DateGreaterThan&lt;/li&gt;
&lt;li&gt;Key: aws:CurrentTime&lt;/li&gt;
&lt;li&gt;Value: 2024-01-01T00:00:00Z&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;DateGreaterThan&quot;: {
    &quot;aws:CurrentTime&quot;: &quot;2024-01-01T00:00:00Z&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 3: HTTPS 연결만 허용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Condition: Bool&lt;/li&gt;
&lt;li&gt;Key: aws:SecureTransport&lt;/li&gt;
&lt;li&gt;Value: true&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;Bool&quot;: {
    &quot;aws:SecureTransport&quot;: &quot;true&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 4: 특정 암호화 요구&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Condition: StringEquals&lt;/li&gt;
&lt;li&gt;Key: s3:x-amz-server-side-encryption&lt;/li&gt;
&lt;li&gt;Value: AES256&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;StringEquals&quot;: {
    &quot;s3:x-amz-server-side-encryption&quot;: &quot;AES256&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 실용적인 정책 예시&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 정적 웹사이트 호스팅 정책&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-website-bucket/*&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. CloudFront OAC (Origin Access Control) 정책 - 권장&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;Service&quot;: &quot;cloudfront.amazonaws.com&quot;
      },
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-private-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;StringEquals&quot;: {
          &quot;AWS:SourceArn&quot;: &quot;arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE&quot;
        }
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. CloudFront OAI (Origin Access Identity) 정책 - 레거시&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E123456789&quot;
      },
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::my-private-bucket/*&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: OAI는 더 이상 권장되지 않으며, OAC(Origin Access Control) 사용을 권장합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 개발팀 전용 업로드 정책&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/DeveloperRole&quot;
      },
      &quot;Action&quot;: [
        &quot;s3:PutObject&quot;,
        &quot;s3:GetObject&quot;,
        &quot;s3:DeleteObject&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:s3:::dev-bucket/uploads/*&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 읽기 전용 + IP 제한 정책&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: &quot;*&quot;,
      &quot;Action&quot;: &quot;s3:GetObject&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::secure-bucket/*&quot;,
      &quot;Condition&quot;: {
        &quot;IpAddress&quot;: {
          &quot;aws:SourceIp&quot;: &quot;203.0.113.0/24&quot;
        }
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 멀티파트 업로드 지원 정책&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/UploadRole&quot;
      },
      &quot;Action&quot;: [
        &quot;s3:PutObject&quot;,
        &quot;s3:PutObjectAcl&quot;,
        &quot;s3:GetObject&quot;,
        &quot;s3:AbortMultipartUpload&quot;,
        &quot;s3:ListMultipartUploadParts&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:s3:::upload-bucket/*&quot;
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::123456789012:role/UploadRole&quot;
      },
      &quot;Action&quot;: &quot;s3:ListBucket&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::upload-bucket&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 정책 생성 및 적용 과정&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;정책 생성&lt;/b&gt;: &quot;Generate Policy&quot; 버튼 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSON 복사&lt;/b&gt;: 생성된 정책 JSON을 복사&lt;/li&gt;
&lt;li&gt;&lt;b&gt;S3 콘솔 이동&lt;/b&gt;: AWS S3 콘솔로 이동&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버킷 선택&lt;/b&gt;: 정책을 적용할 버킷 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 탭&lt;/b&gt;: &quot;Permissions&quot; 탭 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버킷 정책&lt;/b&gt;: &quot;Bucket Policy&quot; 섹션에서 &quot;Edit&quot; 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책 붙여넣기&lt;/b&gt;: 생성한 JSON 정책 붙여넣기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저장&lt;/b&gt;: &quot;Save changes&quot; 클릭&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 보안 모범 사례&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 최소 권한 원칙&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;꼭 필요한 권한만 부여&lt;/li&gt;
&lt;li&gt;와일드카드(*) 사용 최소화&lt;/li&gt;
&lt;li&gt;정기적인 권한 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Principal 설정 주의사항&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Principal&quot;: &quot;*&quot;는 신중히 사용&lt;/li&gt;
&lt;li&gt;특정 계정이나 역할로 제한 권장&lt;/li&gt;
&lt;li&gt;서비스 간 통신에는 역할 기반 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 조건 활용&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP 주소 제한으로 보안 강화&lt;/li&gt;
&lt;li&gt;SSL/HTTPS 강제로 데이터 보호&lt;/li&gt;
&lt;li&gt;시간 기반 접근 제어로 임시 권한 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 정책 테스트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS IAM Policy Simulator로 사전 테스트&lt;/li&gt;
&lt;li&gt;단계적 적용으로 영향도 확인&lt;/li&gt;
&lt;li&gt;CloudTrail 로그 모니터링으로 정책 효과 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 버킷 퍼블릭 액세스 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 버킷의 &quot;Block Public Access&quot; 설정과 정책이 상충되지 않도록 주의&lt;/li&gt;
&lt;li&gt;퍼블릭 정책 적용 시 해당 설정 해제 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 문제 해결&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 접근 거부 오류 (Access Denied)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;버킷 퍼블릭 액세스 차단 설정 확인&lt;/b&gt;: 버킷 레벨의 &quot;Block Public Access&quot; 설정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책 구문 오류 검사&lt;/b&gt;: JSON 형식 및 구문 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ARN 형식 정확성 확인&lt;/b&gt;: 버킷명, 경로 등 정확성 검증&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Principal과 Actions 일치 여부 확인&lt;/b&gt;: 권한 주체와 작업의 논리적 일치성&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 정책 적용 안 됨&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정책 저장 후 전파 대기&lt;/b&gt;: 정책 변경 사항 전파에 수 분 소요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CloudFront 캐시 무효화&lt;/b&gt;: CDN 캐시로 인한 이전 정책 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브라우저 캐시 삭제&lt;/b&gt;: 클라이언트 측 캐시 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 조건부 정책 작동 안 함&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;조건 키 정확성 확인&lt;/b&gt;: AWS에서 지원하는 조건 키인지 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대소문자 구분&lt;/b&gt;: 조건 연산자와 값의 대소문자 정확성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 타입 일치&lt;/b&gt;: 문자열, 숫자, 불린 등 데이터 타입 정확성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 고급 사용 팁&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 다중 명령문(Statement) 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 정책에 여러 명령문을 포함하여 복잡한 권한 구조 구현 가능&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 정책 크기 제한&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버킷 정책 최대 크기: 20KB&lt;/li&gt;
&lt;li&gt;복잡한 정책의 경우 IAM 정책 분할 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 정책 버전 관리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Version&quot;: &quot;2012-10-17&quot; 사용 권장&lt;/li&gt;
&lt;li&gt;이전 버전 사용 시 일부 기능 제한 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 조건 연산자 활용&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;StringLike, StringNotLike: 와일드카드 패턴 매칭&lt;/li&gt;
&lt;li&gt;NumericLessThan, NumericGreaterThan: 숫자 범위 조건&lt;/li&gt;
&lt;li&gt;DateLessThan, DateGreaterThan: 시간 범위 조건&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Policy Generator를 활용하면 복잡한 S3 버킷 정책도 GUI를 통해 쉽게 생성할 수 있으며, 다양한 보안 요구사항을 효과적으로 구현할 수 있습니다. 정책 생성 후에는 반드시 테스트를 통해 의도한 대로 작동하는지 확인하는 것이 중요합니다.&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/159</guid>
      <comments>https://bu119.tistory.com/159#entry159comment</comments>
      <pubDate>Wed, 20 Aug 2025 19:00:08 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Amazon S3 Bucket 생성하기</title>
      <link>https://bu119.tistory.com/131</link>
      <description>&lt;h2 data-end=&quot;274&quot; data-start=&quot;208&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 버킷(Bucket)이 필요한 이유?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;274&quot; data-start=&quot;208&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3에서 &lt;b&gt;버킷(Bucket)&lt;/b&gt;은 모든 파일(객체)을 담는 &lt;b&gt;최상위 폴더&lt;/b&gt;이자 저장 공간입니다.&lt;/p&gt;
&lt;p data-end=&quot;274&quot; data-start=&quot;208&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &lt;b&gt;&quot;S3에서 나만의 클라우드 하드디스크 폴더&quot;라고&lt;/b&gt; 생각하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 버킷을 사용해야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;458&quot; data-start=&quot;330&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;362&quot; data-start=&quot;330&quot;&gt;이미지, 동영상, 문서, 백업 파일 등을 안전하게 보관&lt;/li&gt;
&lt;li data-end=&quot;412&quot; data-start=&quot;363&quot;&gt;프로젝트별&amp;middot;서비스별로 독립 관리 가능 &amp;rarr; 환경(개발/운영) 별로 분리해서 관리하기 좋음&lt;/li&gt;
&lt;li data-end=&quot;458&quot; data-start=&quot;413&quot;&gt;접근 권한, 버전 관리, 암호화 등 &lt;b&gt;보안 설정을 버킷 단위로 적용&lt;/b&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;459&quot; data-start=&quot;442&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 버킷 생성 절차&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;504&quot; data-start=&quot;480&quot; data-ke-size=&quot;size16&quot;&gt;S3 버킷을 만드는 순서는 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;635&quot; data-start=&quot;506&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;521&quot; data-start=&quot;506&quot;&gt;AWS S3 콘솔 접속&lt;/li&gt;
&lt;li data-end=&quot;553&quot; data-start=&quot;522&quot;&gt;&lt;b&gt;버킷 만들기(Create bucket)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;567&quot; data-start=&quot;554&quot;&gt;이름 / 리전 설정&lt;/li&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;568&quot;&gt;객체 소유권(ACL) 설정&lt;/li&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;586&quot;&gt;퍼블릭 접근 차단 여부 선택&lt;/li&gt;
&lt;li data-end=&quot;623&quot; data-start=&quot;605&quot;&gt;버전 관리&amp;middot;태그&amp;middot;암호화 설정&lt;/li&gt;
&lt;li data-end=&quot;635&quot; data-start=&quot;624&quot;&gt;버킷 생성 완료&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 버킷 생성 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1️⃣ S3 콘솔 접속&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. AWS Management Console 상단 검색창에 &lt;b&gt;S3&lt;/b&gt; 입력 후 서비스에서&lt;b&gt; [ S3 ]&lt;/b&gt;를&amp;nbsp;클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZUBOG/btsPQA5Q8hK/37oeZnDpncoDnd1BPCnoek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZUBOG/btsPQA5Q8hK/37oeZnDpncoDnd1BPCnoek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZUBOG/btsPQA5Q8hK/37oeZnDpncoDnd1BPCnoek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZUBOG%2FbtsPQA5Q8hK%2F37oeZnDpncoDnd1BPCnoek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1400&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. S3 콘솔에서&amp;nbsp;&lt;b&gt;[ 버킷 만들기 (Create bucket) ]&lt;/b&gt;를&amp;nbsp;클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBp8su/btsPS9k4AYu/uEq1wfPa1ygkqe1BiAdzA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBp8su/btsPS9k4AYu/uEq1wfPa1ygkqe1BiAdzA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBp8su/btsPS9k4AYu/uEq1wfPa1ygkqe1BiAdzA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBp8su%2FbtsPS9k4AYu%2FuEq1wfPa1ygkqe1BiAdzA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1330&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2️⃣&amp;nbsp;버킷 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtBkye/btsPR7BzRcm/vV6pV9jzij2d6CmnfSmKy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtBkye/btsPR7BzRcm/vV6pV9jzij2d6CmnfSmKy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtBkye/btsPR7BzRcm/vV6pV9jzij2d6CmnfSmKy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtBkye%2FbtsPR7BzRcm%2FvV6pV9jzij2d6CmnfSmKy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1326&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;961&quot; data-start=&quot;943&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;1.&amp;nbsp; 일반 구성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 세계에서 유일한 버킷 이름을 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbHGxd/btsPRCBOGhI/t8Gphox9i7nLLR0RILIuKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbHGxd/btsPRCBOGhI/t8Gphox9i7nLLR0RILIuKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbHGxd/btsPRCBOGhI/t8Gphox9i7nLLR0RILIuKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbHGxd%2FbtsPRCBOGhI%2Ft8Gphox9i7nLLR0RILIuKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;690&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AWS 리전&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;815&quot; data-end=&quot;932&quot;&gt;
&lt;li data-start=&quot;815&quot; data-end=&quot;832&quot;&gt;데이터를 저장할 물리적 위치&lt;/li&gt;
&lt;li data-start=&quot;835&quot; data-end=&quot;932&quot;&gt;&lt;b&gt;한국 서비스 &amp;rarr; Asia Pacific (Seoul) ap-northeast-2&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;권장&lt;br /&gt;이유: 사용자와 가까울수록 속도가 빠르고 데이터 전송 비용이 절감됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버킷 이름&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;947&quot; data-end=&quot;1076&quot;&gt;
&lt;li data-start=&quot;947&quot; data-end=&quot;962&quot;&gt;전 세계에서 유일해야 함&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;S3는 전 세계적으로 이름이 겹치면 안 되기 때문&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li data-start=&quot;965&quot; data-end=&quot;1040&quot;&gt;소문자, 숫자, 하이픈(-)만 가능 &lt;b&gt;&amp;rarr;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;예) my-service-bucket, project2025-storage&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;2. 객체 소유권 (ACL)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ ACL 비활성화 (AWS 권장) ]&lt;/b&gt;을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2y7u/btsPQxgIrdQ/M55Kl7OKDqx8CHImrqk3O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2y7u/btsPQxgIrdQ/M55Kl7OKDqx8CHImrqk3O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2y7u/btsPQxgIrdQ/M55Kl7OKDqx8CHImrqk3O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2y7u%2FbtsPQxgIrdQ%2FM55Kl7OKDqx8CHImrqk3O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;342&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ACL 비활성화 (AWS 권장)&lt;/b&gt; ✅&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1215&quot; data-start=&quot;1133&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1179&quot; data-start=&quot;1133&quot;&gt;모든 객체를 버킷 소유 계정이 소유하게 하여 &lt;b&gt;권한 관리가 단순해짐&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1215&quot; data-start=&quot;1182&quot;&gt;권한 부여는 &lt;b&gt;IAM 정책 / 버킷 정책&lt;/b&gt;으로만 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2ACL 활성화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1279&quot; data-start=&quot;1232&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1279&quot; data-start=&quot;1232&quot;&gt;업로드하는 계정이 객체를 소유해야 하는 특수 상황(레거시 시스템)에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0f141a; text-align: start;&quot;&gt;3. 이 버킷의 퍼블릭 액세스 차단 설정 (퍼블릭 접근 차단)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 퍼블릭 액세스 차단: 체크해제 &lt;/li&gt;
&lt;li&gt;현재 설정으로 인해 이 버킷과 그 안에 포함된 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다.: 체크✅&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;퍼블릭 액세스 차단을 모두 해제하면, 직접 S3에 접근할 수 있는 URL을 입력하여 이미지가 정상적으로 업로드될 수 있도록 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8KPBu/btsPS0ohGBk/5IbKzkwdKXjG5vuE3km4kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8KPBu/btsPS0ohGBk/5IbKzkwdKXjG5vuE3km4kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8KPBu/btsPS0ohGBk/5IbKzkwdKXjG5vuE3km4kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8KPBu%2FbtsPS0ohGBk%2F5IbKzkwdKXjG5vuE3km4kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;820&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;181&quot; data-start=&quot;151&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모든 퍼블릭 액세스 차단 (기본: 체크)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;354&quot; data-start=&quot;182&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;238&quot; data-start=&quot;182&quot;&gt;&lt;b&gt;기본 상태(체크)&lt;/b&gt;&lt;br /&gt;외부(인터넷)에서 버킷과 객체에 접근 불가능 &amp;rarr; &lt;b&gt;보안 안전&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;354&quot; data-start=&quot;239&quot;&gt;&lt;b&gt;체크 해제 시&lt;/b&gt;&lt;br /&gt;버킷과 객체가 &lt;b&gt;퍼블릭 상태&lt;/b&gt;가 될 수 있음&lt;br /&gt;URL로 직접 접근해 이미지를 불러올 수 있게 됨&lt;br /&gt;&amp;rarr; 정적 웹사이트, 이미지 CDN 등 공개 파일 제공 시 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;361&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;체크 해제 후 나타나는 확인 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;388&quot; data-ke-size=&quot;size16&quot;&gt;체크를 해제하면 AWS가 보안 경고 문구를 보여줍니다.&lt;br /&gt;이때&lt;b&gt; [ 현재 설정으로 인해 퍼블릭 상태가 될 수 있음을 알고 있습니다 ]&lt;/b&gt;에 체크해야 계속 진행할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;388&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모든 퍼블릭 액세스 차단 &amp;ndash; 4가지 세부 옵션 상세 설명&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;388&quot; data-ke-size=&quot;size16&quot;&gt;  핵심 개념&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;196&quot; data-start=&quot;134&quot;&gt;&lt;b&gt;ACL (Access Control List)&lt;/b&gt; &amp;rarr; 객체나 버킷 단위로 접근 권한을 주는 오래된 방식.&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;197&quot;&gt;&lt;b&gt;버킷 정책 (Bucket Policy)&lt;/b&gt; / &lt;b&gt;액세스 지점 정책&lt;/b&gt; &amp;rarr; JSON 형식으로 접근 권한을 정의하는 방식.&lt;/li&gt;
&lt;li data-end=&quot;313&quot; data-start=&quot;269&quot;&gt;&amp;ldquo;퍼블릭&amp;rdquo; &amp;rarr; AWS 계정이 없는 &lt;b&gt;익명 사용자&lt;/b&gt;도 접근 가능하다는 뜻.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;새 ACL을 통한 퍼블릭 액세스 차단&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;새로 설정하는 ACL에서 퍼블릭 권한(AllUsers 또는 AuthenticatedUsers)을 주지 못하게 막음&lt;/td&gt;
&lt;td&gt;새 파일을 올리면서 ACL을 퍼블릭 읽기로 주려고 하면 자동 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기존/임의 ACL을 통한 퍼블릭 액세스 차단&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이미 있는 ACL이나 외부에서 설정된 ACL도 퍼블릭 권한이 있으면 무시&lt;/td&gt;
&lt;td&gt;다른 AWS 계정이 ACL을 변경해 퍼블릭 권한을 주더라도 적용 안 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;새 퍼블릭 버킷/액세스 지점 정책 차단&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;새로 만드는 버킷 정책이나 액세스 지점 정책에서 퍼블릭 허용 조건이 들어가면 거부&lt;/td&gt;
&lt;td&gt;누군가 정책을 만들어 Principal: *(모든 사용자) 허용하려 하면 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기존/임의 퍼블릭 버킷/액세스 지점 정책 차단&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이미 있는 정책이나 외부에서 만든 정책이 퍼블릭 허용이면 무시&lt;/td&gt;
&lt;td&gt;예전에 만든 퍼블릭 정책을 그대로 두더라도 접근 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;897&quot; data-start=&quot;888&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;897&quot; data-start=&quot;888&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;1035&quot; data-start=&quot;898&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;898&quot;&gt;&quot;모든 퍼블릭 액세스 차단&quot;을 켜면 위 4가지가 전부 활성화됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1035&quot; data-start=&quot;938&quot;&gt;&quot;모든 퍼블릭 액세스 차단&quot;을 끄고, 세부 옵션만 골라서 켜면 더 유연하게 제어할 수 있습니다.&lt;br /&gt;예: ACL 기반 퍼블릭은 막지만, 버킷 정책 기반 퍼블릭은 허용.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;4. &lt;span style=&quot;color: #0f141a; text-align: start;&quot;&gt;버킷 버전 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot; data-awsui-analytics-label=&quot;.awsui_label_13tpe_9w8pd_5&quot; data-awsui-analytics=&quot;{&amp;quot;detail&amp;quot;:{&amp;quot;position&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;off&amp;quot;}}&quot;&gt;&lt;span data-awsui-analytics=&quot;{&amp;quot;action&amp;quot;:&amp;quot;select&amp;quot;,&amp;quot;detail&amp;quot;:{&amp;quot;label&amp;quot;:&amp;quot;.awsui_label_13tpe_9w8pd_5&amp;quot;}}&quot;&gt;&lt;span&gt;버킷 버전 관리 &lt;b&gt;[ &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;비활성화 ]&lt;/b&gt;를 선택합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqggCv/btsPS5C6W3h/1K7pKa5nLqhr6XIT5ABdp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqggCv/btsPS5C6W3h/1K7pKa5nLqhr6XIT5ABdp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqggCv/btsPS5C6W3h/1K7pKa5nLqhr6XIT5ABdp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqggCv%2FbtsPS5C6W3h%2F1K7pKa5nLqhr6XIT5ABdp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;304&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;비활성화 (기본)&lt;/b&gt; ✅&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: 비용 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;활성화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1642&quot; data-start=&quot;1572&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1604&quot; data-start=&quot;1572&quot;&gt;장점: 파일이 실수로 삭제/덮어쓰기 된 경우 복원 가능&lt;/li&gt;
&lt;li data-end=&quot;1642&quot; data-start=&quot;1607&quot;&gt;단점: 파일 버전이 누적되므로 저장 용량이 늘어나 비용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;5. 태그 - 선택사항&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버킷이 많아졌을 때 검색&amp;middot;그룹화&amp;middot;비용 분석에 활용할 수 있습니다.&amp;nbsp; &amp;rarr; 예) project: pomorodo, env: production&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IyMR6/btsPRzLRCRQ/QmZ0xcbY5DGTyTgOUqMy0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IyMR6/btsPRzLRCRQ/QmZ0xcbY5DGTyTgOUqMy0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IyMR6/btsPRzLRCRQ/QmZ0xcbY5DGTyTgOUqMy0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIyMR6%2FbtsPRzLRCRQ%2FQmZ0xcbY5DGTyTgOUqMy0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;338&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;6. &lt;span style=&quot;color: #0f141a; text-align: start;&quot;&gt;기본 암호화&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt;[ Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화 ]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt;를 선택합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmDrXg/btsPTxF5dl6/nbsAujiUlvL6vFs4nXQEF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmDrXg/btsPTxF5dl6/nbsAujiUlvL6vFs4nXQEF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmDrXg/btsPTxF5dl6/nbsAujiUlvL6vFs4nXQEF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmDrXg%2FbtsPTxF5dl6%2FnbsAujiUlvL6vFs4nXQEF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;488&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0f141a;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;암호화 유형&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화 ✅
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;설정이 간단하고 추가 비용 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Key Management Service 키를 사용한 서버 측 암호화(SSE-KMS)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;키 접근 권한까지 제어해야 하는 보안&amp;middot;규제 환경에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Key Management Service 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;매우 민감한 데이터의 이중 암호화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1953&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;버킷 키 (Bucket Key)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1953&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size16&quot;&gt;SSE-KMS/DSSE-KMS 사용 시 KMS 호출 비용 절감용 옵션&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비활성화&lt;/li&gt;
&lt;li&gt;활성화 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;7. [ 버킷 만들기 버튼 ] 클릭&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cj9fc/btsPSlsQ5I4/bHzop8qVZ70fDvKGFvSId1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cj9fc/btsPSlsQ5I4/bHzop8qVZ70fDvKGFvSId1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cj9fc/btsPSlsQ5I4/bHzop8qVZ70fDvKGFvSId1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCj9fc%2FbtsPSlsQ5I4%2FbHzop8qVZ70fDvKGFvSId1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1338&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3️⃣ 버킷 생성 완료 &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 S3에서 파일을 업로드하고 관리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coqWls/btsPQBjy36b/SkKDZQIKVA4K2VbCeF4B7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coqWls/btsPQBjy36b/SkKDZQIKVA4K2VbCeF4B7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coqWls/btsPQBjy36b/SkKDZQIKVA4K2VbCeF4B7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoqWls%2FbtsPQBjy36b%2FSkKDZQIKVA4K2VbCeF4B7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1323&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://celdan.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://celdan.tistory.com/36&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@leeeeeyeon/AWS-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@leeeeeyeon/AWS-S3%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/131</guid>
      <comments>https://bu119.tistory.com/131#entry131comment</comments>
      <pubDate>Wed, 13 Aug 2025 18:00:33 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] AWS Lightsail 서버에 가비아 도메인 연결하기 - 2025년 최신 가이드</title>
      <link>https://bu119.tistory.com/157</link>
      <description>&lt;p data-end=&quot;368&quot; data-start=&quot;301&quot; data-ke-size=&quot;size16&quot;&gt;가비아에서 구매한 도메인을 AWS Lightsail 서버에 연결하면, IP 주소 대신 내가 원하는 주소(www.example.com)로 접속할 수 있습니다.&lt;br /&gt;이 글에서는 &lt;b&gt;가비아에서 구매한 도메인을 AWS Lightsail 서버에 연결하는 방법&lt;/b&gt;을 단계별로 설명합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;339&quot; data-start=&quot;331&quot; data-ke-size=&quot;size26&quot;&gt;✅ 준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;570&quot; data-start=&quot;384&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;473&quot; data-start=&quot;384&quot;&gt;&lt;b&gt;가비아에서 구매한 도메인&lt;/b&gt; 1개 (예: mydomain.com)&lt;br /&gt;&amp;rarr; 인터넷 주소 이름입니다. 도메인 등록기관(가비아 등)에서 구매합니다.&lt;/li&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;474&quot;&gt;&lt;b&gt;AWS Lightsail 인스턴스&lt;/b&gt; 1개 (예: Ubuntu + Nginx, Apache 등 서버 환경)&lt;br /&gt;&amp;rarr; 웹사이트나 앱이 실행되는 가상의 서버입니다.&lt;/li&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;474&quot;&gt;Lightsail에서 &lt;b&gt;고정 IP&lt;/b&gt;가 이미 생성되어 인스턴스에 연결되어 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/112&quot;&gt;https://bu119.tistory.com/112&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754972236034&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[인프라 구축] 가비아 도메인 구매하기&quot; data-og-description=&quot;가비아 사이트에 접속하여 도메인을 구매하기1. 가비아 사이트에 접속한다.https://www.gabia.com 웹을 넘어 클라우드로. 가비아그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브www.gabia.com 2. 도&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/112&quot; data-og-url=&quot;https://bu119.tistory.com/112&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl8kds/hyZvsQw8he/6HwUp52K2PCg92c7Hnhk80/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/HkpLy/hyZzE2SErY/J2q7gfuU2wR48OwR3CY6IK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fgbsH/hyZvtWd0eZ/fVVGAPf8hHKK41m1mkUuC0/img.png?width=2560&amp;amp;height=1530&amp;amp;face=0_0_2560_1530&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/112&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl8kds/hyZvsQw8he/6HwUp52K2PCg92c7Hnhk80/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/HkpLy/hyZzE2SErY/J2q7gfuU2wR48OwR3CY6IK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fgbsH/hyZvtWd0eZ/fVVGAPf8hHKK41m1mkUuC0/img.png?width=2560&amp;amp;height=1530&amp;amp;face=0_0_2560_1530');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[인프라 구축] 가비아 도메인 구매하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가비아 사이트에 접속하여 도메인을 구매하기1. 가비아 사이트에 접속한다.https://www.gabia.com 웹을 넘어 클라우드로. 가비아그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브www.gabia.com 2. 도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/105&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754972278815&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[인프라 구축] Amazon Lightsail 인스턴스 생성하기&quot; data-og-description=&quot;토이프로젝트인 만큼 개발 비용을 최대한 아끼기 위해Amazon Lightsail의 &amp;quot;처음 3개월은 무료&amp;quot; 인스턴스 중 사양이 가장 높은 것을 선택할 것이다.Amazon Lightsail 인스턴스 생성하기 https://aws.amazon.com/ko/&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/105&quot; data-og-url=&quot;https://bu119.tistory.com/105&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bY1OQj/hyZymg7KOd/3ClnXnl51pgxSmCpixGuy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/IThcd/hyZyqqhZSt/FOYlvv8DaNDM83BYKI81N1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/S93eh/hyZvwFqqNZ/LghO97o2VCcfCXoeUZePn1/img.png?width=2560&amp;amp;height=1333&amp;amp;face=0_0_2560_1333&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/105&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bY1OQj/hyZymg7KOd/3ClnXnl51pgxSmCpixGuy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/IThcd/hyZyqqhZSt/FOYlvv8DaNDM83BYKI81N1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/S93eh/hyZvwFqqNZ/LghO97o2VCcfCXoeUZePn1/img.png?width=2560&amp;amp;height=1333&amp;amp;face=0_0_2560_1333');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[인프라 구축] Amazon Lightsail 인스턴스 생성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;토이프로젝트인 만큼 개발 비용을 최대한 아끼기 위해Amazon Lightsail의 &quot;처음 3개월은 무료&quot; 인스턴스 중 사양이 가장 높은 것을 선택할 것이다.Amazon Lightsail 인스턴스 생성하기 https://aws.amazon.com/ko/&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 1️⃣ Lightsail에서 고정 IP 생성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/106&quot;&gt;https://bu119.tistory.com/106&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754981670412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[인프라 구축] Amazon Lightsail, Networking 설정&quot; data-og-description=&quot;고정 IP 주소 생성하기우선.. 네트워크 설정부터 하자. 고정 IP 주소를 생성할 것이다.&amp;nbsp;&amp;nbsp;1. Create static IP을 클릭한다.&amp;nbsp;2. 인스턴스 연결 설정을 작성한다.인스턴스를 연결하고 고정 IP 이름을 지어&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/106&quot; data-og-url=&quot;https://bu119.tistory.com/106&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d5sLyB/hyZyiZ7pQp/ElNXhDO3seDd1esXKT7htk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/3lPpo/hyZymOXJ72/bum3RP4qKXZ7Vwc8QgCm21/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eABGk/hyZyc6DX8h/FSgevXkC3wb3P1hJm6sALk/img.png?width=2560&amp;amp;height=1396&amp;amp;face=0_0_2560_1396&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/106&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d5sLyB/hyZyiZ7pQp/ElNXhDO3seDd1esXKT7htk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/3lPpo/hyZymOXJ72/bum3RP4qKXZ7Vwc8QgCm21/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eABGk/hyZyc6DX8h/FSgevXkC3wb3P1hJm6sALk/img.png?width=2560&amp;amp;height=1396&amp;amp;face=0_0_2560_1396');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[인프라 구축] Amazon Lightsail, Networking 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;고정 IP 주소 생성하기우선.. 네트워크 설정부터 하자. 고정 IP 주소를 생성할 것이다.&amp;nbsp;&amp;nbsp;1. Create static IP을 클릭한다.&amp;nbsp;2. 인스턴스 연결 설정을 작성한다.인스턴스를 연결하고 고정 IP 이름을 지어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;왜 고정 IP를 써야 하는가?&lt;/b&gt;&lt;br /&gt;Lightsail 서버는 기본적으로 &quot;임시 IP&quot;를 부여합니다. 서버를 재부팅하면 이 IP가 변경될 수 있습니다.&lt;br /&gt;고정 IP를 사용하면 언제나 동일한 주소로 접속할 수 있어 안정적인 서비스 운영이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;760&quot; data-start=&quot;751&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설정 방법&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;550&quot; data-start=&quot;480&quot; data-ke-size=&quot;size20&quot;&gt;1. Lightsail 콘솔 접속 &amp;rarr; 좌측 메뉴에서 &lt;b&gt;[ 네트워킹(Networking) ] &lt;/b&gt;을 클릭합니다.&lt;span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-end=&quot;550&quot; data-start=&quot;480&quot; data-ke-size=&quot;size20&quot;&gt;2. 우측 상단에서&amp;nbsp;&lt;b&gt;[ 고정 IP 생성(Create static IP) ]&lt;/b&gt; 을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxtbf/btsPI3fTRCt/iUtKgemw0uzyiYoKVT2eYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxtbf/btsPI3fTRCt/iUtKgemw0uzyiYoKVT2eYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxtbf/btsPI3fTRCt/iUtKgemw0uzyiYoKVT2eYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foxtbf%2FbtsPI3fTRCt%2FiUtKgemw0uzyiYoKVT2eYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1394&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 고정 IP를 연결할 인스턴스를 선택합니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 리소스 이름을 입력합니다. (예: pomorodo-ip)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당 고정 IP를 식별할 수 있도록, &lt;b&gt;리전 내에서 고유한 리소스 이름&lt;/b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;을 입력합니다.&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5.&lt;span&gt; &lt;/span&gt;&lt;b&gt;[ 생성(Create) ]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 예시: 13.124.56.78 (고정 IP)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ahcQ/btsPLQFSMMu/SJpXlnw8gMlQXMOhGhzb31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ahcQ/btsPLQFSMMu/SJpXlnw8gMlQXMOhGhzb31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ahcQ/btsPLQFSMMu/SJpXlnw8gMlQXMOhGhzb31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ahcQ%2FbtsPLQFSMMu%2FSJpXlnw8gMlQXMOhGhzb31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1326&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 2️⃣ Lightsail DNS 영역 생성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;DNS 영역이란?&lt;/b&gt;&lt;br /&gt;DNS(Domain Name System)는 사람이 기억하기 쉬운 도메인 이름(example.com)을 컴퓨터가 이해하는 IP 주소(13.124.56.78)로 변환하는 &amp;ldquo;전화번호부&amp;rdquo; 역할을 합니다.&lt;br /&gt;DNS 영역을 생성하면 AWS에서 이 전화번호부를 직접 관리하게 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 설정 방법 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. &lt;/span&gt;Lightsail 콘솔 접속 &amp;rarr; 좌측 메뉴 &lt;b&gt;[ 도메인 및 DNS ]&lt;/b&gt; 를 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpuH1Y/btsPLEZXXbJ/KZg8zkS4sstYDdQb5auZk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpuH1Y/btsPLEZXXbJ/KZg8zkS4sstYDdQb5auZk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpuH1Y/btsPLEZXXbJ/KZg8zkS4sstYDdQb5auZk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpuH1Y%2FbtsPLEZXXbJ%2FKZg8zkS4sstYDdQb5auZk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;[ DNS 영역 생성(Create DNS Zone) ]&lt;/b&gt; 을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ryZd0/btsPLh43xCc/QL2FkK6ZdOt7UqPwOJtXQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ryZd0/btsPLh43xCc/QL2FkK6ZdOt7UqPwOJtXQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ryZd0/btsPLh43xCc/QL2FkK6ZdOt7UqPwOJtXQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FryZd0%2FbtsPLh43xCc%2FQL2FkK6ZdOt7UqPwOJtXQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 구매한 도메인 정보 입력하고, DNS 영역을 생성합니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1020&quot; data-start=&quot;980&quot;&gt;&lt;b&gt;도메인 소스&lt;/b&gt;: 다른 도메인 대행업체의 도메인 사용 선택&lt;/li&gt;
&lt;li data-end=&quot;1073&quot; data-start=&quot;1024&quot;&gt;&lt;b&gt;도메인 이름&lt;/b&gt;: 가비아에서 구매한 도메인 (예: mydomain.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIYoOM/btsPMRZZON3/vzKOlTLGV3mTt7ztdobVzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIYoOM/btsPMRZZON3/vzKOlTLGV3mTt7ztdobVzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIYoOM/btsPMRZZON3/vzKOlTLGV3mTt7ztdobVzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIYoOM%2FbtsPMRZZON3%2FvzKOlTLGV3mTt7ztdobVzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;580&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sgwaT/btsPKIIRD0M/0qfQLWvCto6XQ2wqjrqxE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sgwaT/btsPKIIRD0M/0qfQLWvCto6XQ2wqjrqxE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sgwaT/btsPKIIRD0M/0qfQLWvCto6XQ2wqjrqxE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsgwaT%2FbtsPKIIRD0M%2F0qfQLWvCto6XQ2wqjrqxE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1314&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 생성이 완료되면 도메인이 목록에 표시됩니다. &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6keYr/btsPN5bVep7/TsqxtVeqbFBaLruDItvxI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6keYr/btsPN5bVep7/TsqxtVeqbFBaLruDItvxI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6keYr/btsPN5bVep7/TsqxtVeqbFBaLruDItvxI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6keYr%2FbtsPN5bVep7%2FTsqxtVeqbFBaLruDItvxI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1399&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.&amp;nbsp; AWS에서 제공하는 네임서버(NS) 4개를 확인합니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네임서버를 가비아에 등록해야 합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ns-123.awsdns-45.com&lt;br /&gt;ns-234.awsdns-56.net&lt;br /&gt;ns-345.awsdns-67.org &lt;br /&gt;ns-456.awsdns-78.co.uk&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csPPAE/btsPL3Gl0kB/Un4kO9ykMnxfkvaZshn3hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csPPAE/btsPL3Gl0kB/Un4kO9ykMnxfkvaZshn3hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csPPAE/btsPL3Gl0kB/Un4kO9ykMnxfkvaZshn3hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsPPAE%2FbtsPL3Gl0kB%2FUn4kO9ykMnxfkvaZshn3hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1397&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3️⃣&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;가비아에서 네임서버 변경 &lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;네임서버 변경이란?&lt;/b&gt;&lt;br /&gt;도메인이 어느 DNS 서버를 참조할지를 지정하는 작업입니다.&lt;br /&gt;AWS에서 제공한 네임서버로 변경해야 브라우저가 내 도메인을 입력했을 때 Lightsail 서버의 IP를 찾아올 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 설정 방법 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;832&quot; data-start=&quot;753&quot; data-ke-size=&quot;size20&quot;&gt;1. 가비아 홈페이지 로그인 &amp;rarr; &lt;b&gt;[ My가비아 ]&lt;/b&gt; 로 이동합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OqM0T/btsPLfMRzXM/mG5f7jHotA2eXah8k2YZs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OqM0T/btsPLfMRzXM/mG5f7jHotA2eXah8k2YZs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OqM0T/btsPLfMRzXM/mG5f7jHotA2eXah8k2YZs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqM0T%2FbtsPLfMRzXM%2FmG5f7jHotA2eXah8k2YZs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 상단 메뉴에서 &lt;b&gt;[ 서비스 관리 ]&lt;/b&gt; 를 클릭합니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 하단의 이용중인 도메인 목록에서, 연결할 도메인을 선택하고&lt;b&gt; [ 관리 ]&lt;/b&gt;를 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwwzua/btsPKUvvwJ8/3bGSKAphdWtPWWoAjK2Pxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwwzua/btsPKUvvwJ8/3bGSKAphdWtPWWoAjK2Pxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwwzua/btsPKUvvwJ8/3bGSKAphdWtPWWoAjK2Pxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwwzua%2FbtsPKUvvwJ8%2F3bGSKAphdWtPWWoAjK2Pxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1408&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;네임서버 [ 설정 ]&lt;/b&gt;을 클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsXYej/btsPI6KtScl/pIKHH7msbAKvbWrWfACZDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsXYej/btsPI6KtScl/pIKHH7msbAKvbWrWfACZDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsXYej/btsPI6KtScl/pIKHH7msbAKvbWrWfACZDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsXYej%2FbtsPI6KtScl%2FpIKHH7msbAKvbWrWfACZDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. Lightsail에서 받은 네임서버 4개를 입력하고 저장합니다.&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tjr3r/btsPKRMm6kd/PeB6fkeRs4m2OGCFXda9Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tjr3r/btsPKRMm6kd/PeB6fkeRs4m2OGCFXda9Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tjr3r/btsPKRMm6kd/PeB6fkeRs4m2OGCFXda9Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTjr3r%2FbtsPKRMm6kd%2FPeB6fkeRs4m2OGCFXda9Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1398&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 변경 사항은 전 세계 DNS 서버에 전파되기까지 최대 24시간이 걸릴 수 있습니다. (일반적으로 1~2시간 내 적용됩니다)&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clkUlz/btsPQyMpukp/9urDVaK09cEjraSSsHxop0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clkUlz/btsPQyMpukp/9urDVaK09cEjraSSsHxop0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clkUlz/btsPQyMpukp/9urDVaK09cEjraSSsHxop0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclkUlz%2FbtsPQyMpukp%2F9urDVaK09cEjraSSsHxop0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1305&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4️⃣ &lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;Lightsail DNS에 레코드 추가&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;DNS 레코드란?&lt;/b&gt;&lt;br /&gt;도메인 이름이 어떤 IP 주소를 가리킬지를 정의하는 규칙입니다.&lt;br /&gt;예: www.mydomain.com &amp;rarr; 13.124.56.78&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설정 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인을 인스턴스에 연결하는 방법은 크게 두 가지가 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS Lightsail &amp;gt; [ 인스턴스 ] &amp;gt; [ 도메인 ] &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; [ 도메인 할당 ]에서 연결하는 방법&lt;/li&gt;
&lt;li&gt;AWS Lightsail &amp;gt; [ 도메인 및 DNS ] &amp;gt; [ DNS 레코드 ] &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt; [ 레코드 추가 ]&lt;/span&gt;&lt;/span&gt; 에서 연결하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 방법 1: 인스턴스 화면에서 도메인 할당 (간단 설정) &lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&lt;span&gt; Lightsail 콘솔에서 &lt;b&gt;[ 인스턴스 ]&lt;/b&gt; 탭으로 이동합니다. &lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;2. 해당 인스턴스의 &lt;b&gt;[ 관리 ]&lt;/b&gt; 버튼을 클릭합니다. &lt;/span&gt;&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHE4p/btsPN3FdW07/ugOrTasZerwch7rnTRkbX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHE4p/btsPN3FdW07/ugOrTasZerwch7rnTRkbX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHE4p/btsPN3FdW07/ugOrTasZerwch7rnTRkbX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHE4p%2FbtsPN3FdW07%2FugOrTasZerwch7rnTRkbX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 상단 메뉴에서 &lt;b&gt;[ 도메인 ]&lt;/b&gt;을 선택한 뒤 &lt;b&gt;[ 도메인 할당 ]&lt;/b&gt;을 클릭합니다.&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ms0O4/btsPNOIpwIS/bAFmJWrWEQnv1vH2JosVwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ms0O4/btsPNOIpwIS/bAFmJWrWEQnv1vH2JosVwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ms0O4/btsPNOIpwIS/bAFmJWrWEQnv1vH2JosVwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMs0O4%2FbtsPNOIpwIS%2FbAFmJWrWEQnv1vH2JosVwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1317&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 사용할 도메인을 선택합니다.&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHoFBL/btsPN5wietz/QPkPsmqGLfOMdbhbNJYrM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHoFBL/btsPN5wietz/QPkPsmqGLfOMdbhbNJYrM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHoFBL/btsPN5wietz/QPkPsmqGLfOMdbhbNJYrM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHoFBL%2FbtsPN5wietz%2FQPkPsmqGLfOMdbhbNJYrM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;826&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 도메인 이름 및 주소 선택합니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mydomain.com&lt;/b&gt;을 이 인스턴스에서 사용할 도메인으로 선택했다면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 이름 선택: &quot;&lt;b&gt;mydomain.com&lt;/b&gt;&quot; 루트 도메인(최상위) 선택&lt;/li&gt;
&lt;li&gt;주소 선택: &quot; &lt;b&gt;고정 IP 주소(IPv4)&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&quot; 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EZZfi/btsPL37syVq/rP2eIcBEZWbiKkicexnAQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EZZfi/btsPL37syVq/rP2eIcBEZWbiKkicexnAQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EZZfi/btsPL37syVq/rP2eIcBEZWbiKkicexnAQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEZZfi%2FbtsPL37syVq%2FrP2eIcBEZWbiKkicexnAQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1128&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;① 도메인 이름 선택&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mydomain.com&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;루트 도메인(최상위)만 연결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mydomain.com의 하위 도메인&lt;/b&gt;:&lt;span&gt; 특정 서브도메인 하나만 연결 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;mydomain.com&lt;/span&gt;의 모든 하위 도메인&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;와일드카드(*)&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식으로 모든 하위 도메인 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;158&quot; data-start=&quot;147&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;374&quot; data-start=&quot;159&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;197&quot; data-start=&quot;159&quot;&gt;&lt;b&gt;루트 도메인만 연결&lt;/b&gt; &amp;rarr; mydomain.com 선택&lt;/li&gt;
&lt;li data-end=&quot;266&quot; data-start=&quot;198&quot;&gt;&lt;b&gt;특정 서브도메인만 연결&lt;/b&gt;&amp;nbsp;&amp;rarr; www.mydomain.com 또는 api.mydomain.com 등 선택&lt;/li&gt;
&lt;li data-end=&quot;374&quot; data-start=&quot;267&quot;&gt;&lt;b&gt; 모든 하위 도메인 연결&lt;/b&gt; &amp;nbsp;&amp;rarr; www.mydomain.com, api.mydomain.com, blog.mydomain.com 등 여러 개 서브도메인을 전부 연결 (루트는 별도 설정 필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;56&quot; data-end=&quot;537&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3953%;&quot;&gt;선택 옵션&lt;/td&gt;
&lt;td style=&quot;width: 23.1396%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;✅ 연결 성공 예시&lt;/td&gt;
&lt;td style=&quot;width: 28.9535%;&quot;&gt;❌ 연결 실패 예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;145&quot; data-end=&quot;249&quot;&gt;
&lt;td style=&quot;width: 16.3953%;&quot; data-start=&quot;145&quot; data-end=&quot;164&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;mydomain.com&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.1396%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;164&quot; data-end=&quot;182&quot;&gt;루트 도메인(최상위)만 연결&lt;/td&gt;
&lt;td style=&quot;width: 31.3953%;&quot; data-col-size=&quot;md&quot; data-start=&quot;182&quot; data-end=&quot;201&quot;&gt;&lt;b&gt;mydomain.com&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.9535%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;201&quot; data-end=&quot;249&quot;&gt;&lt;b&gt;www.&lt;/b&gt;mydomain.com&lt;br /&gt;&lt;b&gt;api.&lt;/b&gt;mydomain.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;250&quot; data-end=&quot;369&quot;&gt;
&lt;td style=&quot;width: 16.3953%;&quot; data-start=&quot;250&quot; data-end=&quot;277&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;mydomain.com의 하위 도메인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.1396%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;277&quot; data-end=&quot;296&quot;&gt;특정 하위 도메인 하나만 연결&lt;/td&gt;
&lt;td style=&quot;width: 31.3953%;&quot; data-col-size=&quot;md&quot; data-start=&quot;296&quot; data-end=&quot;324&quot;&gt;특정 하위 도메인으로 &lt;br /&gt;www.mydomain.com 선택 시,&lt;br /&gt;&lt;br /&gt;&lt;b&gt;www.&lt;/b&gt;mydomain.com&lt;/td&gt;
&lt;td style=&quot;width: 28.9535%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;324&quot; data-end=&quot;369&quot;&gt;mydomain.com&lt;br /&gt;&lt;b&gt;blog.&lt;/b&gt;mydomain.com&lt;br /&gt;&lt;b&gt;api.&lt;/b&gt;mydomain.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;370&quot; data-end=&quot;537&quot;&gt;
&lt;td style=&quot;width: 16.3953%;&quot; data-start=&quot;370&quot; data-end=&quot;400&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;mydomain.com의 모든 하위 도메인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.1396%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;400&quot; data-end=&quot;429&quot;&gt;와일드카드(*) 방식으로 모든 하위 도메인 연결&lt;/td&gt;
&lt;td style=&quot;width: 31.3953%;&quot; data-col-size=&quot;md&quot; data-start=&quot;429&quot; data-end=&quot;501&quot;&gt;&lt;b&gt;www.&lt;/b&gt;mydomain.com&lt;br /&gt;&lt;b&gt;api.&lt;/b&gt;mydomain.com&lt;br /&gt;&lt;b&gt;test.&lt;/b&gt;mydomain.com&lt;/td&gt;
&lt;td style=&quot;width: 28.9535%;&quot; data-col-size=&quot;sm&quot; data-start=&quot;501&quot; data-end=&quot;537&quot;&gt;mydomain.com &lt;br /&gt;(루트는 별도로 설정 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;② 주소 선택&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 연결할 서버 주소&lt;/b&gt;(IP 주소)를 선택합니다.&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;724&quot; data-start=&quot;688&quot;&gt;&lt;b&gt;고정 IP 주소(IPv4)&lt;/b&gt; : Lightsail에서 생성한 고정 IPv4 주소 (권장) &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;rarr;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;예: 13.124.56.78&lt;/li&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;730&quot;&gt;&lt;b&gt;IPv6 주소&lt;/b&gt; : IPv6 환경에서만 필요 &amp;rarr; 예: 2406:da1c:1234:abcd::1&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;권장&lt;/b&gt;&lt;br /&gt;일반적인 웹사이트 운영이라면 &lt;b&gt;고정 IP(IPv4)&lt;/b&gt; 만 선택해도 충분합니다. IPv6는 추가 지원이 필요할 때만 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-end=&quot;401&quot; data-start=&quot;54&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 16.7442%;&quot;&gt;선택 옵션&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 56.3955%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 12.4417%;&quot;&gt;예시&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 14.4186%;&quot;&gt;권장 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot; data-end=&quot;287&quot; data-start=&quot;139&quot;&gt;
&lt;td style=&quot;height: 42px; width: 16.7442%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;161&quot; data-start=&quot;139&quot;&gt;&lt;b&gt;고정 IP 주소 (IPv4)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 56.3955%;&quot; data-end=&quot;247&quot; data-start=&quot;161&quot; data-col-size=&quot;md&quot;&gt;Lightsail에서 미리 생성하여 인스턴스에 연결한 IPv4 주소입니다.&lt;br /&gt;도메인을 안정적으로 연결하려면 반드시 고정 IP를 선택하는 것이 좋습니다.&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 12.4417%;&quot; data-end=&quot;264&quot; data-start=&quot;247&quot; data-col-size=&quot;sm&quot;&gt;13.124.56.78&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 14.4186%;&quot; data-end=&quot;287&quot; data-start=&quot;264&quot; data-col-size=&quot;sm&quot;&gt;✅ 일반적인 웹서비스에서 기본 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot; data-end=&quot;401&quot; data-start=&quot;288&quot;&gt;
&lt;td style=&quot;height: 42px; width: 16.7442%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;302&quot; data-start=&quot;288&quot;&gt;&lt;b&gt;IPv6 주소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 56.3955%;&quot; data-end=&quot;362&quot; data-start=&quot;302&quot; data-col-size=&quot;md&quot;&gt;IPv6 기반 네트워크 주소입니다. &lt;br /&gt;IPv6를 사용하는 환경(일부 해외 네트워크 등)에서만 필요합니다.&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 12.4417%;&quot; data-end=&quot;383&quot; data-start=&quot;362&quot; data-col-size=&quot;sm&quot;&gt;2406:da1c:...&lt;/td&gt;
&lt;td style=&quot;height: 42px; width: 14.4186%;&quot; data-end=&quot;401&quot; data-start=&quot;383&quot; data-col-size=&quot;sm&quot;&gt;⚠️ 특수 환경에서만 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;6. 할당 완료 후 연결 상태를 확인합니다.&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcEuh/btsPOllsJ88/QasRCPqBCEhgzU70lmkUc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcEuh/btsPOllsJ88/QasRCPqBCEhgzU70lmkUc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcEuh/btsPOllsJ88/QasRCPqBCEhgzU70lmkUc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtcEuh%2FbtsPOllsJ88%2FQasRCPqBCEhgzU70lmkUc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1399&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 2: 도메인 및 DNS에서 직접 레코드 추가 (세부 설정) &lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1. Lightsail 콘솔에서 &lt;b&gt;[ 도메인 및 DNS ]&lt;/b&gt; 메뉴로 이동합니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2. 해당 도메인을 클릭합니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqN3lc/btsPM3eMck8/dYwGoUXrNvNrRkJAwwSpa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqN3lc/btsPM3eMck8/dYwGoUXrNvNrRkJAwwSpa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqN3lc/btsPM3eMck8/dYwGoUXrNvNrRkJAwwSpa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqN3lc%2FbtsPM3eMck8%2FdYwGoUXrNvNrRkJAwwSpa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1399&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;[ DNS 레코드 ]&lt;/b&gt; 탭의 &lt;b&gt;[&lt;/b&gt; &lt;b&gt;레코드 추가 (Add Record) ]&lt;/b&gt;를&amp;nbsp;클릭합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfxgu3/btsPNhDOcmh/8PV3B42KLDjtmMof1ZQNqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfxgu3/btsPNhDOcmh/8PV3B42KLDjtmMof1ZQNqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfxgu3/btsPNhDOcmh/8PV3B42KLDjtmMof1ZQNqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfxgu3%2FbtsPNhDOcmh%2F8PV3B42KLDjtmMof1ZQNqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1316&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 레코드 상세정보를 입력합니다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레코드 유형: &quot;&lt;b&gt;A 레코드&lt;/b&gt;&quot; 선택&lt;/li&gt;
&lt;li&gt;레코드 이름: &quot;&lt;b&gt;@&lt;/b&gt;&quot; 입력&lt;/li&gt;
&lt;li&gt;확인: &quot;&lt;b&gt;고정 IP 주소&lt;/b&gt;&quot; 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zC4gM/btsPLBXOi9R/xKJKYqUcUhg1wPYfK46SX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zC4gM/btsPLBXOi9R/xKJKYqUcUhg1wPYfK46SX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zC4gM/btsPLBXOi9R/xKJKYqUcUhg1wPYfK46SX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzC4gM%2FbtsPLBXOi9R%2FxKJKYqUcUhg1wPYfK46SX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1314&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;151&quot; data-start=&quot;123&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;151&quot; data-start=&quot;123&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;① 레코드 유형 (Record type)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;178&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;도메인을 어떤 방식으로 연결할지 선택합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;467&quot; data-start=&quot;180&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;238&quot; data-start=&quot;180&quot;&gt;&lt;b&gt;A&lt;/b&gt; : IPv4 주소로 연결 (&lt;b&gt;가장 일반적&lt;/b&gt;) &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;예) 13.124.56.78&lt;/li&gt;
&lt;li data-end=&quot;297&quot; data-start=&quot;239&quot;&gt;&lt;b&gt;AAAA&lt;/b&gt; : IPv6 주소로 연결 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;예) 2406:da1c:1234:abcd::1&lt;/li&gt;
&lt;li data-end=&quot;400&quot; data-start=&quot;298&quot;&gt;&lt;b&gt;CNAME&lt;/b&gt; : 다른 도메인으로 연결 (별칭)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;1607&quot; data-start=&quot;1577&quot;&gt;IP 주소 대신 다른 도메인 이름을 가리킵니다.&lt;/li&gt;
&lt;li data-end=&quot;1708&quot; data-start=&quot;1610&quot;&gt;&lt;b&gt;예시 1&lt;/b&gt; &amp;mdash; @ 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1708&quot; data-start=&quot;1636&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1708&quot; data-start=&quot;1636&quot;&gt;www.mydomain.com &amp;rarr; CNAME &amp;rarr; @ &amp;rarr; 루트 도메인(mydomain.com)과 같은 서버로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1813&quot; data-start=&quot;1711&quot;&gt;&lt;b&gt;예시 2&lt;/b&gt; &amp;mdash; 다른 도메인 직접 지정
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1813&quot; data-start=&quot;1743&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1813&quot; data-start=&quot;1743&quot;&gt;blog.mydomain.com &amp;rarr; CNAME &amp;rarr; target.example.net &amp;rarr; target 서버로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1883&quot; data-start=&quot;1816&quot;&gt;⚠ &lt;b&gt;주의&lt;/b&gt; : 루트 도메인(@)에는 CNAME을 설정할 수 없습니다. (www 등 서브도메인에서만 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;422&quot; data-start=&quot;401&quot;&gt;&lt;b&gt;MX&lt;/b&gt; : 메일 서버 지정 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;예)&lt;span&gt; 10 mail.example.com&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;422&quot; data-start=&quot;401&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; 우선순위(숫자) + 메일 서버 주소를 함께 입력 &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;467&quot; data-start=&quot;423&quot;&gt;&lt;b&gt;TXT&lt;/b&gt; : 소유권 인증, SPF/DKIM 설정 등 텍스트 값 저장 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;예)&lt;span&gt; &quot;google-site-verification=xxxx&quot; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;521&quot; data-start=&quot;474&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;521&quot; data-start=&quot;474&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;② 레코드 이름 (Record name / Host / Subdomain)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;866&quot; data-start=&quot;792&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;905&quot; data-start=&quot;867&quot;&gt;&lt;b&gt;@&lt;/b&gt; : 루트 도메인 &amp;rarr; 예) mydomain.com&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;906&quot;&gt;&lt;b&gt;www&lt;/b&gt; : 예) www.mydomain.com&lt;/li&gt;
&lt;li data-end=&quot;977&quot; data-start=&quot;942&quot;&gt;&lt;b&gt;api&lt;/b&gt; : 예) api.mydomain.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;③ 값(Value / IP address or Target) &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2326&quot; data-start=&quot;2296&quot; data-ke-size=&quot;size16&quot;&gt;선택한 레코드 유형에 따라 연결 대상을 입력합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1094&quot; data-start=&quot;1055&quot;&gt;&lt;b&gt;A&lt;/b&gt; : IPv4 주소 &amp;rarr; 예) 13.124.56.78&lt;/li&gt;
&lt;li data-end=&quot;1147&quot; data-start=&quot;1095&quot;&gt;&lt;b&gt;AAAA&lt;/b&gt; : IPv6 주소 &amp;rarr; 예) 2406:da1c:1234:abcd::1&lt;/li&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1148&quot;&gt;&lt;b&gt;CNAME&lt;/b&gt; : 다른 도메인 이름 &amp;rarr; 예) @ 또는 target.example.net&lt;/li&gt;
&lt;li data-end=&quot;1266&quot; data-start=&quot;1207&quot;&gt;&lt;b&gt;TXT&lt;/b&gt; : 인증 문자열 &amp;rarr; 예) &quot;google-site-verification=xxxx&quot;&lt;/li&gt;
&lt;li data-end=&quot;1321&quot; data-start=&quot;1267&quot;&gt;&lt;b&gt;MX&lt;/b&gt; : 메일 서버 주소와 우선순위 &amp;rarr; 예) 10 mail.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;주의&lt;/b&gt;&lt;br /&gt;CNAME, MX 등 &lt;b&gt;도메인 이름을 값으로 쓰는 레코드&lt;/b&gt;는 DNS 표준에서 끝에 점(.)을 붙여 mail.example.com. 형태로 작성하기도 합니다.&lt;br /&gt;하지만 &lt;b&gt;Lightsail DNS&lt;/b&gt;에서는 점이 없어도 자동으로 처리하므로 생략해도 됩니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt; 레코드 유형 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;&amp;nbsp; 예시 입력값&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;사용 예&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;IPv4 주소를 입력합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;13.124.56.78&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;Lightsail 고정 IPv4로 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt;AAAA&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;IPv6 주소를 입력합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;2406:da1c:1234:abcd::1&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;IPv6 네트워크에서 접속 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt;CNAME&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;다른 도메인 이름을 입력합니다. (@는 루트 도메인 의미)&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;@ 또는 target.example.net&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;www.mydomain.com을 mydomain.com으로 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt;TXT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;인증용 문자열을 입력합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;google-site-verification=abc123xyz&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;구글 검색 소유권 인증, SPF/DKIM 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.5116%;&quot;&gt;&lt;b&gt;MX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;메일 서버 주소와 우선순위를 입력합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;10 mail.example.com.&lt;/td&gt;
&lt;td style=&quot;width: 31.9767%;&quot;&gt;도메인 메일 서비스 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1101&quot; data-end=&quot;1127&quot;&gt;&lt;br /&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가장 많이 쓰는 기본 설정 예시&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1128&quot; data-end=&quot;1231&quot;&gt;
&lt;li data-start=&quot;1128&quot; data-end=&quot;1177&quot;&gt;@ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;A 레코드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 고정 IPv4 주소 (13.124.56.78)&lt;/li&gt;
&lt;li data-start=&quot;1178&quot; data-end=&quot;1231&quot;&gt;www &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CNAME 레코드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; @&lt;span&gt;&amp;nbsp;&lt;/span&gt;(www를 루트로 연결)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5. 추가된 레코드를 확인합니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQtn3a/btsPLKG0XeQ/EOtq7PFAf1FCG2ZUzk9rVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQtn3a/btsPLKG0XeQ/EOtq7PFAf1FCG2ZUzk9rVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQtn3a/btsPLKG0XeQ/EOtq7PFAf1FCG2ZUzk9rVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQtn3a%2FbtsPLKG0XeQ%2FEOtq7PFAf1FCG2ZUzk9rVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1312&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;2808&quot; data-start=&quot;2797&quot; data-ke-size=&quot;size26&quot;&gt;  연결 완료&lt;/h2&gt;
&lt;p data-end=&quot;2943&quot; data-start=&quot;2809&quot; data-ke-size=&quot;size16&quot;&gt;이제 가비아에서 구매한 도메인을 AWS Lightsail 서버에 연결하여, IP 주소 대신 도메인으로 웹사이트에 접속할 수 있습니다.&lt;br /&gt;네임서버 변경 후 바로 접속이 되지 않는다면, DNS 전파가 완료될 때까지 기다린 뒤 다시 시도합니다.&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/157</guid>
      <comments>https://bu119.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 12 Aug 2025 15:30:35 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] MySQL Workbench로 Lightsail DB에 접속하기</title>
      <link>https://bu119.tistory.com/156</link>
      <description>&lt;p data-end=&quot;325&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;AWS Lightsail에서 MySQL DB 인스턴스를 만들었다면, 이제 로컬 PC에서 접속해 직접 쿼리를 실행하는 방법을 알아보자.&lt;br /&gt;이 글에서는 &lt;b&gt;MySQL Workbench&lt;/b&gt;를 사용해 &lt;b&gt;Lightsail DB에 접속하는 방법&lt;/b&gt;을 설명한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;392&quot; data-start=&quot;327&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;392&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;MySQL Workbench&lt;/b&gt;는 MySQL 공식 GUI 도구로, SQL 쿼리 작성 및 테이블 관리 등을 시각적으로 처리할 수 있는 프로그램입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 사전 준비&lt;/h2&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;작업을 시작하기 전에 아래 항목을 준비해야한다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 87px;&quot; border=&quot;1&quot; data-end=&quot;640&quot; data-start=&quot;442&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot; data-end=&quot;549&quot; data-start=&quot;470&quot;&gt;
&lt;td style=&quot;height: 24px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;488&quot; data-start=&quot;470&quot;&gt;MySQL Workbench&lt;/td&gt;
&lt;td style=&quot;height: 24px;&quot; data-end=&quot;549&quot; data-start=&quot;488&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://dev.mysql.com/downloads/workbench/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dev.mysql.com/downloads/workbench/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;598&quot; data-start=&quot;550&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;576&quot; data-start=&quot;550&quot;&gt;Lightsail MySQL DB 인스턴스&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;598&quot; data-start=&quot;576&quot; data-col-size=&quot;sm&quot;&gt;생성 완료 상태 (사용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;640&quot; data-start=&quot;599&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;610&quot; data-start=&quot;599&quot;&gt;DB 접속 정보&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;640&quot; data-start=&quot;610&quot; data-col-size=&quot;sm&quot;&gt;엔드포인트, 포트, 사용자 이름, 비밀번호&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 1️⃣ Lightsail에서 접속 정보 확인 &lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. AWS Lightsail 콘솔에 접속한 뒤, 좌측 메뉴에서 Databases를 클릭한다. &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qeKRC/btsPJwn7rgf/tjHeiCOKHmfK3tgDxxU9rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qeKRC/btsPJwn7rgf/tjHeiCOKHmfK3tgDxxU9rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qeKRC/btsPJwn7rgf/tjHeiCOKHmfK3tgDxxU9rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqeKRC%2FbtsPJwn7rgf%2FtjHeiCOKHmfK3tgDxxU9rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;764&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 생성한 DB 인스턴스가 &lt;b&gt;&quot;사용 가능(Available)&quot;&lt;/b&gt; 상태인지 확인한다. &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nx1fV/btsPKHCjWn9/W7qpTM9NnwmB3K6kV8Vi7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nx1fV/btsPKHCjWn9/W7qpTM9NnwmB3K6kV8Vi7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nx1fV/btsPKHCjWn9/W7qpTM9NnwmB3K6kV8Vi7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNx1fV%2FbtsPKHCjWn9%2FW7qpTM9NnwmB3K6kV8Vi7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1405&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;3. 인스턴스 오른쪽 상단의 &lt;/span&gt;&lt;b&gt;햄버거 메뉴(☰)&lt;/b&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt; 를 클릭한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb94yA/btsPGurv8MH/qkBSUFAhxtP6T2Yvnklj9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb94yA/btsPGurv8MH/qkBSUFAhxtP6T2Yvnklj9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb94yA/btsPGurv8MH/qkBSUFAhxtP6T2Yvnklj9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb94yA%2FbtsPGurv8MH%2FqkBSUFAhxtP6T2Yvnklj9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1405&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &quot;&lt;b&gt;관리(Manage)&lt;/b&gt;&quot; 버튼을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNytfo/btsPJ3FHVga/uTstXhcLsf1MkQCPEZUKr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNytfo/btsPJ3FHVga/uTstXhcLsf1MkQCPEZUKr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNytfo/btsPJ3FHVga/uTstXhcLsf1MkQCPEZUKr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNytfo%2FbtsPJ3FHVga%2FuTstXhcLsf1MkQCPEZUKr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1317&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.&amp;nbsp;&lt;b&gt;연결 세부 정보(Connection Details)&lt;/b&gt; 항목에서 다음 정보를 확인한다:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1071&quot; data-start=&quot;972&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;994&quot; data-start=&quot;972&quot;&gt;사용자 이름 (User name)&lt;/li&gt;
&lt;li data-end=&quot;1026&quot; data-start=&quot;998&quot;&gt;사용자 암호 (Master password)&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1030&quot;&gt;DB 엔드포인트 (Endpoint)&lt;/li&gt;
&lt;li data-end=&quot;1071&quot; data-start=&quot;1057&quot;&gt;포트 번호 (Port)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DNJjf/btsPHOXuDs9/j3S249eD0o5phL18L016hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DNJjf/btsPHOXuDs9/j3S249eD0o5phL18L016hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DNJjf/btsPHOXuDs9/j3S249eD0o5phL18L016hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDNJjf%2FbtsPHOXuDs9%2Fj3S249eD0o5phL18L016hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1389&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 2️⃣ 퍼블릭 접속 허용 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL Workbench는 로컬 PC에서 원격 DB에 접속하므로,&lt;br /&gt;Lightsail DB 인스턴스에 &lt;b&gt;퍼블릭 접근을 허용&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. DB 인스턴스 관리 페이지에서 Networking 탭을 클릭한다.&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 퍼블릭 모드 활성화 버튼을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1F0aG/btsPKIusxjA/dLoXnN6wjD7Q52dVzjDfP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1F0aG/btsPKIusxjA/dLoXnN6wjD7Q52dVzjDfP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1F0aG/btsPKIusxjA/dLoXnN6wjD7Q52dVzjDfP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1F0aG%2FbtsPKIusxjA%2FdLoXnN6wjD7Q52dVzjDfP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⏳ 퍼블릭 모드 전환에는 약간의 시간이 소요된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nw09c/btsPKInHYsv/o1Pr4zbfoimeGqYcIQcPBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nw09c/btsPKInHYsv/o1Pr4zbfoimeGqYcIQcPBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nw09c/btsPKInHYsv/o1Pr4zbfoimeGqYcIQcPBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnw09c%2FbtsPKInHYsv%2Fo1Pr4zbfoimeGqYcIQcPBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1324&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료되면 상태가 다시 &quot;사용 가능&quot;으로 표시된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1yKDJ/btsPKgrrA8r/9wCuwuaahfcbNkxavd2Puk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1yKDJ/btsPKgrrA8r/9wCuwuaahfcbNkxavd2Puk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1yKDJ/btsPKgrrA8r/9wCuwuaahfcbNkxavd2Puk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1yKDJ%2FbtsPKgrrA8r%2F9wCuwuaahfcbNkxavd2Puk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1320&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 3️⃣ MySQL Workbench에서 접속 설정 &lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. MySQL Workbench 실행한다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 상단 메뉴에서 &quot; &lt;b&gt;+&lt;/b&gt; &quot; 아이콘을 클릭해 &lt;b&gt;새 커넥션&lt;/b&gt;을 생성한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br8Z6P/btsPJiXVErS/0HlrZc3c8E5ZFR8VV1nX9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br8Z6P/btsPJiXVErS/0HlrZc3c8E5ZFR8VV1nX9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br8Z6P/btsPJiXVErS/0HlrZc3c8E5ZFR8VV1nX9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr8Z6P%2FbtsPJiXVErS%2F0HlrZc3c8E5ZFR8VV1nX9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 아래 정보를 입력한다.&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 135px;&quot; border=&quot;1&quot; data-end=&quot;1690&quot; data-start=&quot;1448&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1516&quot; data-start=&quot;1473&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1495&quot; data-start=&quot;1473&quot;&gt;&lt;b&gt;Connection Name&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1516&quot; data-start=&quot;1495&quot; data-col-size=&quot;sm&quot;&gt;예: Lightsail DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1552&quot; data-start=&quot;1517&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1532&quot; data-start=&quot;1517&quot;&gt;&lt;b&gt;Hostname&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1552&quot; data-start=&quot;1532&quot;&gt;Lightsail의 엔드포인트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot; data-end=&quot;1574&quot; data-start=&quot;1553&quot;&gt;
&lt;td style=&quot;height: 17px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1564&quot; data-start=&quot;1553&quot;&gt;&lt;b&gt;Port&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;1574&quot; data-start=&quot;1564&quot; data-col-size=&quot;sm&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;Lightsail의&lt;/span&gt;&amp;nbsp; 포트 (기본값 3306)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1632&quot; data-start=&quot;1575&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1590&quot; data-start=&quot;1575&quot;&gt;&lt;b&gt;Username&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1632&quot; data-start=&quot;1590&quot; data-col-size=&quot;sm&quot;&gt;DB 생성 시 지정한 사용자 이름 (예: pomouser)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1690&quot; data-start=&quot;1633&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1648&quot; data-start=&quot;1633&quot;&gt;&lt;b&gt;Password&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1690&quot; data-start=&quot;1648&quot; data-col-size=&quot;sm&quot;&gt;DB 생성 시 지정 또는 제공된 비밀번호&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKZSTA/btsPJFZrGtP/AQViG8VUqiXIiz6USDGZmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKZSTA/btsPJFZrGtP/AQViG8VUqiXIiz6USDGZmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKZSTA/btsPJFZrGtP/AQViG8VUqiXIiz6USDGZmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKZSTA%2FbtsPJFZrGtP%2FAQViG8VUqiXIiz6USDGZmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;739&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Password&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목에서는 Store in Vault... 버튼을 클릭하여 암호를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHBvw/btsPKJtoV0W/14MkkPk7v9uMXtIcoyK9Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHBvw/btsPKJtoV0W/14MkkPk7v9uMXtIcoyK9Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHBvw/btsPKJtoV0W/14MkkPk7v9uMXtIcoyK9Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHBvw%2FbtsPKJtoV0W%2F14MkkPk7v9uMXtIcoyK9Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1111&quot; height=&quot;267&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 입력이 완료되면 OK 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qVYjR/btsPHNEjgOX/Aa6C08ZMuRWm5JR4DLlU9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qVYjR/btsPHNEjgOX/Aa6C08ZMuRWm5JR4DLlU9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qVYjR/btsPHNEjgOX/Aa6C08ZMuRWm5JR4DLlU9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqVYjR%2FbtsPHNEjgOX%2FAa6C08ZMuRWm5JR4DLlU9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;739&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 커넥션이 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vIUA5/btsPKiCS3nj/5Pq6ZrU2YZtO4LecxDplX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vIUA5/btsPKiCS3nj/5Pq6ZrU2YZtO4LecxDplX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vIUA5/btsPKiCS3nj/5Pq6ZrU2YZtO4LecxDplX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvIUA5%2FbtsPKiCS3nj%2F5Pq6ZrU2YZtO4LecxDplX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1529&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 4️⃣ DB 연결 확인 &lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 방금 생성한 커넥션을 클릭하면 경고 메시지가 나타날 수 있다. (신뢰 여부 확인)&amp;nbsp;&amp;rarr; Continue Anyway 클릭&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnEwu/btsPK5CYDPk/yk5hrj0NCPvz5SRkCQ1j5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnEwu/btsPK5CYDPk/yk5hrj0NCPvz5SRkCQ1j5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnEwu/btsPK5CYDPk/yk5hrj0NCPvz5SRkCQ1j5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnEwu%2FbtsPK5CYDPk%2Fyk5hrj0NCPvz5SRkCQ1j5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1261&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 접속에 성공하면 좌측 패널에 데이터베이스 목록이 표시된다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예: dbpomo 등 마스터 DB 이름이 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C8utW/btsPKoCSqiQ/RevzfGo6B09hOorAjINfsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C8utW/btsPKoCSqiQ/RevzfGo6B09hOorAjINfsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C8utW/btsPKoCSqiQ/RevzfGo6B09hOorAjINfsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC8utW%2FbtsPKoCSqiQ%2FRevzfGo6B09hOorAjINfsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1529&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/156</guid>
      <comments>https://bu119.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 7 Aug 2025 09:00:08 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Lightsail에서 MySQL DB 인스턴스 생성하기</title>
      <link>https://bu119.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Lightsail은 복잡한 설정 없이도 서버나 데이터베이스를 쉽게 만들 수 있는 서비스이다.&lt;/p&gt;
&lt;p data-end=&quot;356&quot; data-start=&quot;289&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 &lt;b&gt;AWS Lightsail에서 MySQL DB 인스턴스를 생성하는 방법&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;153&quot; data-start=&quot;137&quot; data-ke-size=&quot;size23&quot;&gt;  DB 인스턴스란?&lt;/h3&gt;
&lt;blockquote data-end=&quot;192&quot; data-start=&quot;155&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB 인스턴스 = 실행 중인 MySQL 데이터베이스 서버&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;268&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;268&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 단순히 &quot;MySQL을 설치했다&quot;는 의미가 아니라, &lt;b&gt;실제로 접속하고 사용할 수 있는 상태의 MySQL 서버&lt;/b&gt;를 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;345&quot; data-start=&quot;270&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AWS Lightsail에서는 복잡한 설치 과정 없이, &lt;b&gt;몇 번의 클릭만으로 이 DB 인스턴스를 자동으로 생성할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 1️⃣ Lightsail에서 MySQL DB 생성 시작하기&lt;/span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. AWS Lightsail 콘솔에 접속한다.&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 좌측 메뉴에서 &lt;b&gt;&quot;Databases(데이터베이스)&quot;&lt;/b&gt; 탭을 클릭한다. &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LAkwi/btsPJdacYOc/vbLi9oNOVpKpD6TdzYYEKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LAkwi/btsPJdacYOc/vbLi9oNOVpKpD6TdzYYEKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LAkwi/btsPJdacYOc/vbLi9oNOVpKpD6TdzYYEKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLAkwi%2FbtsPJdacYOc%2FvbLi9oNOVpKpD6TdzYYEKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span&gt;3. &quot;&lt;b&gt;데이터베이스 생성&lt;/b&gt;&quot; 버튼&lt;/span&gt;&lt;/span&gt;을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AE69q/btsPIHbzowk/sleeDGRmFxuE3Ln5wk3cF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AE69q/btsPIHbzowk/sleeDGRmFxuE3Ln5wk3cF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AE69q/btsPIHbzowk/sleeDGRmFxuE3Ln5wk3cF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAE69q%2FbtsPIHbzowk%2FsleeDGRmFxuE3Ln5wk3cF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 2️⃣ 데이터베이스 기본 설정&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;데이터베이스 위치 확인&lt;/b&gt;: 리전(Location) 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB가 배포될 지역(Region)을 확인하고, 가까운 리전을 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brtdgd/btsPIucb63h/3cejuOHTKiRNlSkKy3f0i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brtdgd/btsPIucb63h/3cejuOHTKiRNlSkKy3f0i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brtdgd/btsPIucb63h/3cejuOHTKiRNlSkKy3f0i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrtdgd%2FbtsPIucb63h%2F3cejuOHTKiRNlSkKy3f0i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1326&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;데이터베이스 선택&lt;/b&gt;: 플랫폼 및 버전 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;MySQL을 사용하며, 버전은&amp;nbsp;2025년 현재 기준 최신 LTS 버전인&amp;nbsp; 8.4.6을 선택한다.&lt;/span&gt;&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;769&quot; data-start=&quot;746&quot;&gt;&lt;b&gt;Platform&lt;/b&gt;: MySQL&lt;/li&gt;
&lt;li data-end=&quot;862&quot; data-start=&quot;770&quot;&gt;&lt;b&gt;MySQL version&lt;/b&gt;: &lt;b&gt;8.4.6&lt;/b&gt; (2025년 기준 최신 LTS 버전)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UQNPY/btsPJx0y0U8/4iuVeENP8h4vsKu3s75KGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UQNPY/btsPJx0y0U8/4iuVeENP8h4vsKu3s75KGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UQNPY/btsPJx0y0U8/4iuVeENP8h4vsKu3s75KGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUQNPY%2FbtsPJx0y0U8%2F4iuVeENP8h4vsKu3s75KGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1467&quot; height=&quot;300&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;56&quot; data-start=&quot;42&quot; data-ke-size=&quot;size18&quot;&gt;  버전 선택 팁&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;208&quot; data-start=&quot;58&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;129&quot; data-start=&quot;58&quot;&gt;&lt;b&gt;MySQL 8.4.6&lt;/b&gt;은 2024년 출시된 &lt;b&gt;장기 지원(LTS)&lt;/b&gt; 버전으로, &lt;b&gt;신규 프로젝트에 추천&lt;/b&gt;된다.&lt;/li&gt;
&lt;li data-end=&quot;208&quot; data-start=&quot;130&quot;&gt;&lt;b&gt;MySQL 8.0.43&lt;/b&gt;은 기존 환경과의 &lt;b&gt;호환성이 필요한 경우&lt;/b&gt;에 선택할 수 있으며, &lt;b&gt;공식 지원은 2026년까지&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CelDW/btsPJaYR74O/iLNZcGFrHWH60N6NjoYAkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CelDW/btsPJaYR74O/iLNZcGFrHWH60N6NjoYAkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CelDW/btsPJaYR74O/iLNZcGFrHWH60N6NjoYAkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCelDW%2FbtsPJaYR74O%2FiLNZcGFrHWH60N6NjoYAkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1325&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 3️⃣ 로그인 자격 증명 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1231&quot; data-start=&quot;1188&quot; data-ke-size=&quot;size16&quot;&gt;DB에 접속할 &lt;b&gt;기본 관리자 계정&lt;/b&gt;의 사용자 이름과 비밀번호를 설정한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;&quot;로그인 자격 증명 지정&quot;&lt;/b&gt; 영역을 클릭한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x02Zz/btsPIwukXXX/g2QFElKVArbCGb2dk18A6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x02Zz/btsPIwukXXX/g2QFElKVArbCGb2dk18A6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x02Zz/btsPIwukXXX/g2QFElKVArbCGb2dk18A6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx02Zz%2FbtsPIwukXXX%2Fg2QFElKVArbCGb2dk18A6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1309&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 사용자 이름과 암호를 직접 입력하거나, 기본값을 사용할 수 있다.&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1467&quot; data-start=&quot;1311&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;기본값&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1412&quot; data-start=&quot;1354&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1363&quot; data-start=&quot;1354&quot;&gt;사용자 이름&lt;/td&gt;
&lt;td data-end=&quot;1380&quot; data-start=&quot;1363&quot; data-col-size=&quot;sm&quot;&gt;dbmasteruser&lt;/td&gt;
&lt;td data-end=&quot;1412&quot; data-start=&quot;1380&quot; data-col-size=&quot;sm&quot;&gt;직접 변경 가능 (예: pomouser)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1467&quot; data-start=&quot;1413&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1422&quot; data-start=&quot;1413&quot;&gt;사용자 암호&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1430&quot; data-start=&quot;1422&quot;&gt;자동 생성&lt;/td&gt;
&lt;td data-end=&quot;1467&quot; data-start=&quot;1430&quot; data-col-size=&quot;sm&quot;&gt;생성 후 화면에서 확인 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcYLL2/btsPIGcGT1I/AcL5jfuifU5kVWmEu68Thk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcYLL2/btsPIGcGT1I/AcL5jfuifU5kVWmEu68Thk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcYLL2/btsPIGcGT1I/AcL5jfuifU5kVWmEu68Thk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcYLL2%2FbtsPIGcGT1I%2FAcL5jfuifU5kVWmEu68Thk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1319&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &quot;강력한 암호 생성&quot; 체크박스를 해제하면 암호를 직접 입력할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8tcML/btsPIJVMbIP/iI9KA8rYAen7QTt2DSVxYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8tcML/btsPIJVMbIP/iI9KA8rYAen7QTt2DSVxYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8tcML/btsPIJVMbIP/iI9KA8rYAen7QTt2DSVxYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8tcML%2FbtsPIJVMbIP%2FiI9KA8rYAen7QTt2DSVxYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1326&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 이름과 사용자 암호를 직 지정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csKtaD/btsPHXyZC8g/JZWRP48JzyFIsXEpRxU6G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csKtaD/btsPHXyZC8g/JZWRP48JzyFIsXEpRxU6G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csKtaD/btsPHXyZC8g/JZWRP48JzyFIsXEpRxU6G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsKtaD%2FbtsPHXyZC8g%2FJZWRP48JzyFIsXEpRxU6G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1316&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 4️⃣ 마스터 데이터베이스 이름 지정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 인스턴스가 생성될 때, 기본으로 하나의 데이터베이스가 함께 생성된다.&lt;br /&gt;이때 그 이름을 지정하는 항목이 바로 &quot;&lt;b&gt;마스터 데이터베이스 이름&lt;/b&gt;&quot;이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &quot;&lt;b&gt;마스터 데이터베이스 이름 지정&lt;/b&gt;&quot;영역을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/casxO2/btsPJvuZo4x/aJWVcg7yFWgLgBvfKJ3D2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/casxO2/btsPJvuZo4x/aJWVcg7yFWgLgBvfKJ3D2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/casxO2/btsPJvuZo4x/aJWVcg7yFWgLgBvfKJ3D2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcasxO2%2FbtsPJvuZo4x%2FaJWVcg7yFWgLgBvfKJ3D2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1324&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 해당 입력란에 원하는 이름을 입력한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력하지 않으면 기본값 dbmaster로 자동 설정된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Wjey/btsPJe1jGUs/uHV9KEpuTikyrbftGgOVh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Wjey/btsPJe1jGUs/uHV9KEpuTikyrbftGgOVh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Wjey/btsPJe1jGUs/uHV9KEpuTikyrbftGgOVh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Wjey%2FbtsPJe1jGUs%2FuHV9KEpuTikyrbftGgOVh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;364&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 이름은 항상 db로 시작되며, &lt;b&gt;뒤에 붙는 이름만 지정할 수 있다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 chadoll을 입력하면, 실제 생성되는 DB 이름은 &lt;b&gt;dbchadoll&lt;/b&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0LaL/btsPJiCGs0n/rBxNMu3cKVtg69nX0JSIGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0LaL/btsPJiCGs0n/rBxNMu3cKVtg69nX0JSIGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0LaL/btsPJiCGs0n/rBxNMu3cKVtg69nX0JSIGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0LaL%2FbtsPJiCGs0n%2FrBxNMu3cKVtg69nX0JSIGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;364&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 5️⃣ 데이터베이스 플랜 선택 &lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1865&quot; data-start=&quot;1841&quot; data-ke-size=&quot;size16&quot;&gt;DB 인스턴스의 사양을 선택하는 단계이다.&lt;/p&gt;
&lt;p data-end=&quot;1865&quot; data-start=&quot;1841&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;90일 무료 체험 플랜&lt;/b&gt;을 선택한다. (메모리 1GB, SSD 40GB 등 기본 사양)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh6J0s/btsPF8uZAiC/lqqE2hiLSc0cWoYfLkLh8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh6J0s/btsPF8uZAiC/lqqE2hiLSc0cWoYfLkLh8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh6J0s/btsPF8uZAiC/lqqE2hiLSc0cWoYfLkLh8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh6J0s%2FbtsPF8uZAiC%2FlqqE2hiLSc0cWoYfLkLh8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1331&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;  요금이 부과되지 않도록, 생성 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;사용이 끝난 인스턴스는 삭제&lt;/b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;하는 걸 잊지 말자.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 6️⃣ 데이터베이스 리소스 이름 지정 &lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2068&quot; data-start=&quot;2014&quot; data-ke-size=&quot;size16&quot;&gt;해당 DB 인스턴스를 식별할 수 있도록, &lt;b&gt;리전 내에서 고유한 리소스 이름&lt;/b&gt;을 입력한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2164&quot; data-start=&quot;2070&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2113&quot; data-start=&quot;2070&quot;&gt;예시: pomorodo-db-main, chadoll-db-01&lt;/li&gt;
&lt;li data-end=&quot;2164&quot; data-start=&quot;2114&quot;&gt;추후 관리나 검색 시 유용하므로, &lt;b&gt;서비스명을 포함한 직관적인 이름&lt;/b&gt;을 추천한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyiOAE/btsPJcWMnle/cdmsC4ZFKGHzXItB4DRCE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyiOAE/btsPJcWMnle/cdmsC4ZFKGHzXItB4DRCE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyiOAE/btsPJcWMnle/cdmsC4ZFKGHzXItB4DRCE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyiOAE%2FbtsPJcWMnle%2FcdmsC4ZFKGHzXItB4DRCE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1331&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 7️⃣ 데이터베이스 인스턴스 생성&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 모든 설정이 완료되면 하단의 &lt;b&gt;&quot;Create database(데이터베이스 생성)&quot;&lt;/b&gt; 버튼을 클릭다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9Gt0Z/btsPJjaAJ1b/VEep43PMDWb9lsaz0ruwdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9Gt0Z/btsPJjaAJ1b/VEep43PMDWb9lsaz0ruwdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9Gt0Z/btsPJjaAJ1b/VEep43PMDWb9lsaz0ruwdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9Gt0Z%2FbtsPJjaAJ1b%2FVEep43PMDWb9lsaz0ruwdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1316&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 인스턴스가 &lt;b&gt;&quot;Creating(생성 중)&quot;&lt;/b&gt; 상태로 나타난다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 &lt;b&gt;3~10분&lt;/b&gt; 후 인스턴스가 준비된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HfuAe/btsPHX7HFAG/Kogy7zoF62ETPs91yn0ZLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HfuAe/btsPHX7HFAG/Kogy7zoF62ETPs91yn0ZLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HfuAe/btsPHX7HFAG/Kogy7zoF62ETPs91yn0ZLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHfuAe%2FbtsPHX7HFAG%2FKogy7zoF62ETPs91yn0ZLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1398&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 상태가 &lt;b&gt;&quot;Available(사용 가능)&quot;&lt;/b&gt; 으로 변경되면, DB 인스턴스가 정상적으로 생성된 것이다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrD13/btsPIF50YQg/9ldKTopzqKXlZkgTS4u03k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrD13/btsPIF50YQg/9ldKTopzqKXlZkgTS4u03k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrD13/btsPIF50YQg/9ldKTopzqKXlZkgTS4u03k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrD13%2FbtsPIF50YQg%2F9ldKTopzqKXlZkgTS4u03k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1407&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/155</guid>
      <comments>https://bu119.tistory.com/155#entry155comment</comments>
      <pubDate>Tue, 5 Aug 2025 18:00:35 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Docker로 MySQL 초기 설정 자동화하기 (루트 접속 없이 DB&amp;middot;계정까지)</title>
      <link>https://bu119.tistory.com/154</link>
      <description>&lt;blockquote data-end=&quot;231&quot; data-start=&quot;187&quot; data-ke-style=&quot;style2&quot;&gt;루트 접속 없이 DB와 계정까지 자동 생성하는 방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  기존 방식: 루트 계정으로 수동 설정 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;340&quot; data-start=&quot;276&quot; data-ke-size=&quot;size16&quot;&gt;Docker로 MySQL 컨테이너를 생성한 뒤,&lt;br /&gt;다음과 같이 루트 계정으로 직접 접속해서 수동으로 설정했습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1754041171979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# MySQL 컨테이너 실행
docker run --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=root1234 \
  -p 3306:3306 \
  -d mysql:8.4&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-end=&quot;544&quot; data-start=&quot;519&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너가 실행되면 루트 계정으로 접속합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1754042257476&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it my-mysql mysql -u root -p Enter password: root1234&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;접속 후에는 직접 SQL 명령어를 입력해야 했습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1754041196981&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. example_db 라는 이름의 데이터베이스 생성
CREATE DATABASE example_db;

-- 2. example_user 계정 생성, 비밀번호는 example1234
--    @'%'는 어디서든 접속 허용(IP 제한 없음)을 의미
CREATE USER 'example_user'@'%' IDENTIFIED BY 'example1234';

-- 3. 권한 부여: example_user에게 example_db 전체 권한 부여
--    (읽기, 쓰기, 삭제 등 모든 작업 가능)
GRANT ALL PRIVILEGES ON example_db.* TO 'example_user'@'%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;792&quot; data-start=&quot;784&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;❌ 단점&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;863&quot; data-start=&quot;794&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;983&quot; data-start=&quot;958&quot;&gt;루트 계정으로 접속해야 하므로 보안상 위험&lt;/li&gt;
&lt;li data-end=&quot;1006&quot; data-start=&quot;984&quot;&gt;명령어를 매번 기억하거나 복사해야 함&lt;/li&gt;
&lt;li data-end=&quot;1033&quot; data-start=&quot;1007&quot;&gt;반복 작업 시 비효율적이고 실수 가능성 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1045&quot; data-start=&quot;1020&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  새 방식: 명령어 한 줄로 자동 설정 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;961&quot; data-start=&quot;898&quot; data-ke-size=&quot;size16&quot;&gt;Docker는 환경변수 설정만으로 &lt;b&gt;DB와 사용자 계정을 자동 생성&lt;/b&gt;할 수 있습니다.&lt;br /&gt;아래와 같이 단 한 줄로 모든 초기 설정을 마칠 수 있습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1754042399980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=root1234 \
  -e MYSQL_DATABASE=example_db \
  -e MYSQL_USER=example_user \
  -e MYSQL_PASSWORD=example1234 \
  -p 3306:3306 \
  -d mysql:8.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ &lt;b&gt;명령어 설명&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 122px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;root1234&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;루트 비밀번호 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;MYSQL_DATABASE&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;example_db&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;자동 생성할 DB 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;MYSQL_USER&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;example_user&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;새로 만들 사용자 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;MYSQL_PASSWORD&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;example1234&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;해당 계정의 비밀번호&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1641&quot; data-start=&quot;1614&quot; data-ke-size=&quot;size16&quot;&gt;위 명령을 실행하면 다음이 자동으로 이루어집니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1736&quot; data-start=&quot;1643&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1667&quot; data-start=&quot;1643&quot;&gt;example_db 데이터베이스 생성&lt;/li&gt;
&lt;li data-end=&quot;1691&quot; data-start=&quot;1668&quot;&gt;example_user 사용자 생성&lt;/li&gt;
&lt;li data-end=&quot;1736&quot; data-start=&quot;1692&quot;&gt;example_user에게 example_db에 대한 모든 권한 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  기존 방식 vs 자동 설정 방식 비교 &lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;기존 방식 (수동)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;새 방식 (자동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;루트 접속&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;불필요 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB 생성&lt;/td&gt;
&lt;td&gt;SQL 명령 입력&lt;/td&gt;
&lt;td&gt;환경변수로 자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용자 생성&lt;/td&gt;
&lt;td&gt;SQL 명령 입력&lt;/td&gt;
&lt;td&gt;환경변수로 자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;권한 부여&lt;/td&gt;
&lt;td&gt;수동 입력&lt;/td&gt;
&lt;td&gt;자동 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안 측면&lt;/td&gt;
&lt;td&gt;루트 사용 위험&lt;/td&gt;
&lt;td&gt;일반 계정으로 안전 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실수 가능성&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;거의 없음 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;반복 작업&lt;/td&gt;
&lt;td&gt;비효율적&lt;/td&gt;
&lt;td&gt;재사용 가능 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 초기 설정은 꼭 루트 계정으로 들어가야만 가능한 작업이 아니었습니다.&lt;br /&gt;&lt;b&gt;Docker의 환경변수 옵션을 잘 활용하면&lt;/b&gt;,&lt;br /&gt;보안은 높이고 실수는 줄이며 반복 작업까지 간편하게 해결할 수 있습니다.&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/154</guid>
      <comments>https://bu119.tistory.com/154#entry154comment</comments>
      <pubDate>Fri, 1 Aug 2025 19:30:24 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 무료 플랜에서 유료 플랜으로 업그레이드하는 방법</title>
      <link>https://bu119.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 콘솔 화면에서 &quot;Cost and usage&quot; 찾기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0VBiI/btsPB5yxKLW/eP9SDFQHX8jsKuNyY9P5A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0VBiI/btsPB5yxKLW/eP9SDFQHX8jsKuNyY9P5A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0VBiI/btsPB5yxKLW/eP9SDFQHX8jsKuNyY9P5A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0VBiI%2FbtsPB5yxKLW%2FeP9SDFQHX8jsKuNyY9P5A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1469&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Cost and usage&lt;/span&gt; 에서 &quot;Upgrade plan&quot; 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aghv1/btsPCoduRRW/3D72su11AWOd8yu9PrKzdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aghv1/btsPCoduRRW/3D72su11AWOd8yu9PrKzdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aghv1/btsPCoduRRW/3D72su11AWOd8yu9PrKzdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAghv1%2FbtsPCoduRRW%2F3D72su11AWOd8yu9PrKzdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;Upgrade plan&quot; 클릭하면&lt;/span&gt; 아래 창이 뜬다. 업그레이드 계획을 누른다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBkbNQ/btsPEF50UKs/fqAOj1wLUS3jf6bd7Rosvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBkbNQ/btsPEF50UKs/fqAOj1wLUS3jf6bd7Rosvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBkbNQ/btsPEF50UKs/fqAOj1wLUS3jf6bd7Rosvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBkbNQ%2FbtsPEF50UKs%2FfqAOj1wLUS3jf6bd7Rosvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 계속을 누르면 콘솔 화면으로 돌아간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIVhP/btsPDnkNW3v/g3IObuJ0QjVjEDNO8tJ0L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIVhP/btsPDnkNW3v/g3IObuJ0QjVjEDNO8tJ0L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIVhP/btsPDnkNW3v/g3IObuJ0QjVjEDNO8tJ0L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIVhP%2FbtsPDnkNW3v%2Fg3IObuJ0QjVjEDNO8tJ0L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 유료플랜으로 전환하니, 콘솔 화면 구성이 바꼈다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6bVK/btsPCIwdz9I/eWqjBzD0l3KK8od3JzAyD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6bVK/btsPCIwdz9I/eWqjBzD0l3KK8od3JzAyD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6bVK/btsPCIwdz9I/eWqjBzD0l3KK8od3JzAyD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6bVK%2FbtsPCIwdz9I%2FeWqjBzD0l3KK8od3JzAyD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/153</guid>
      <comments>https://bu119.tistory.com/153#entry153comment</comments>
      <pubDate>Thu, 31 Jul 2025 15:00:23 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] AWS Billing Budget 설정하기</title>
      <link>https://bu119.tistory.com/151</link>
      <description>&lt;h1 id=&quot;aws-비용-관리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;AWS 비용 관리&lt;/h1&gt;
&lt;h2 id=&quot;1-aws-bugets-예산&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. AWS Bugets (예산)&lt;/h2&gt;
&lt;h3 id=&quot;1-1-주요-기능&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1-1. 주요 기능&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;예산을 지정하고 비용과 사용량을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;추적&lt;/b&gt;하는 서비스&lt;/li&gt;
&lt;li&gt;비용 또는 사용량이 사용자가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;지정한 임계값을 초과할 때 이메일 등으로 알람을 받거나 AWS RDS / EC2 등의 서비스를 중지하는 작업을 연결할 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 할당 태그&lt;/b&gt;를 사용하면 AWS 특정 리소스에 태그를 지정해 태그에 대한 리소스 보고서만 생성 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 App을 실행하는 서비스 비용과 사용량에 대해서 보고서 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-2-실습&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1-2. 실습&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서비스 &amp;gt; AWS 비용관리 &amp;gt; AWS Budgets&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jzqf2/btsJShqlOVI/gKPXzsJIEKKJSjNGUlvBdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jzqf2/btsJShqlOVI/gKPXzsJIEKKJSjNGUlvBdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jzqf2/btsJShqlOVI/gKPXzsJIEKKJSjNGUlvBdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJzqf2%2FbtsJShqlOVI%2FgKPXzsJIEKKJSjNGUlvBdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 창이 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjTQeS/btsJSpaAHp2/d1wtsT1CK938FjbSvNZ0M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjTQeS/btsJSpaAHp2/d1wtsT1CK938FjbSvNZ0M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjTQeS/btsJSpaAHp2/d1wtsT1CK938FjbSvNZ0M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjTQeS%2FbtsJSpaAHp2%2Fd1wtsT1CK938FjbSvNZ0M1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1339&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. &lt;/b&gt;좌측 &lt;b&gt;&quot;예산 및 계획&quot;&lt;/b&gt;의 &lt;b&gt;&quot;예산&quot; &lt;/b&gt;탭 &lt;b&gt;&amp;gt;&lt;/b&gt; 우측 상단의 &lt;b&gt;&quot;예산 생성&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPa2Oa/btsJRYq36nn/4bVIUSKVHXMePIjRBOhJE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPa2Oa/btsJRYq36nn/4bVIUSKVHXMePIjRBOhJE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPa2Oa/btsJRYq36nn/4bVIUSKVHXMePIjRBOhJE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPa2Oa%2FbtsJRYq36nn%2F4bVIUSKVHXMePIjRBOhJE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1336&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 기본 템플릿으로 제로 지출 예산 템플릿을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clktXR/btsJScpfy0k/LjE5dgU5oMiLfdDBRSvvO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clktXR/btsJScpfy0k/LjE5dgU5oMiLfdDBRSvvO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clktXR/btsJScpfy0k/LjE5dgU5oMiLfdDBRSvvO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclktXR%2FbtsJScpfy0k%2FLjE5dgU5oMiLfdDBRSvvO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;941&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 예산 이름과 이메일 수신자를 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRtY0/btsJRYLrnCm/b4rluKYjk5dKx3OfFNYcgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRtY0/btsJRYLrnCm/b4rluKYjk5dKx3OfFNYcgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRtY0/btsJRYLrnCm/b4rluKYjk5dKx3OfFNYcgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRtY0%2FbtsJRYLrnCm%2Fb4rluKYjk5dKx3OfFNYcgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1289&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 생성된 예산을 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvysMc/btsJROIV82k/iozKbovZKmlVSSAoS3N49k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvysMc/btsJROIV82k/iozKbovZKmlVSSAoS3N49k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvysMc/btsJROIV82k/iozKbovZKmlVSSAoS3N49k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvysMc%2FbtsJROIV82k%2FiozKbovZKmlVSSAoS3N49k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;537&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jiseok/AWS-%EB%B9%84%EC%9A%A9-%EA%B4%80%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jiseok/AWS-%EB%B9%84%EC%9A%A9-%EA%B4%80%EB%A6%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/151</guid>
      <comments>https://bu119.tistory.com/151#entry151comment</comments>
      <pubDate>Wed, 30 Jul 2025 16:00:32 +0900</pubDate>
    </item>
    <item>
      <title>[Troubleshooting] GitHub Actions에서 발생한 &amp;quot;denied: requested access to the resource is denied&amp;quot; 오류 해결하기</title>
      <link>https://bu119.tistory.com/125</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GYxbE/btsIkkOyB8N/5OllGpW1aSmQ2nyBSa25Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GYxbE/btsIkkOyB8N/5OllGpW1aSmQ2nyBSa25Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GYxbE/btsIkkOyB8N/5OllGpW1aSmQ2nyBSa25Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGYxbE%2FbtsIkkOyB8N%2F5OllGpW1aSmQ2nyBSa25Hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;denied: requested access to the resource is denied&lt;/b&gt;&lt;/span&gt;&quot;라는 오류 메시지는 Docker Hub에 이미지를 푸시할 때 권한 문제가 발생했음을 나타낸다. 이는 로그인 자격 증명이 잘못되었거나 저장소에 대한 권한이 부족할 때 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 다음 단계를 수행해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Docker Hub 로그인 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Hub에 올바른 자격 증명으로 로그인했는지 확인한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1719652856536&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인하면 Docker Hub 사용자 이름과 비밀번호를 입력하라는 메시지가 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 저장소 이름 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker push 명령에서 저장소 이름이 올바른지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Docker Hub 사용자 이름이 tico인 경우 명령은 다음과 같아야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1719652841011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker push tico/nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 권한 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소에 푸시할 수 있는 권한이 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소가 비공개이거나 조직에 속한 경우 적절한 권한이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 트러블슈팅 &lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지 이름을 &quot;팀(회사)명/nginx&quot;로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Docker Hub에 이미지를 푸시할 때 권한 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;원인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Hub에 이미지를 푸시할 때 사용자 이름을 이미지 이름 앞에 두어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 이름이 없으면 Docker Hub는 어느 사용자나 조직의 저장소에 이미지를 푸시할지 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지 이름을 &quot;도커 허브 사용자명/nginx&quot;로 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;해결 방법&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Docker Hub 로그인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log in to Docker Hub 단계에서 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Docker Hub 사용자 이름과 비밀번호를 입력하여 로그인에 성공했다.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719653800509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Logging into Docker Hub...

Login Succeeded!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 도커 이미지 이름 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 빌드할 때 Docker Hub 사용자 이름을 포함하도록 태그를 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719653853355&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t 도커허브사용자명/nginx:latest .&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.&amp;nbsp;도커 이미지 푸시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 이름을 포함한 이미지 이름으로 Docker Hub에 이미지를 푸시한다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1719653975051&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker push 도커허브사용자명/nginx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;해결 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719653001357&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/usr/bin/env bash
set -e  # 명령 실패 시 스크립트 종료

# nginx 디렉토리로 이동
cd nginx

# Docker 이미지 빌드
docker build -t $DOCKER_USERNAME/nginx:latest .

# Docker Hub에 이미지 푸시
docker push $DOCKER_USERNAME/nginx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;이전 코드&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1719653165210&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# nginx 디렉토리로 이동
cd nginx

#!/usr/bin/env bash
set -e  # 명령 실패 시 스크립트 종료

# Docker 이미지 빌드
docker build -t tico/nginx:latest .

# Docker Hub에 이미지 푸시
docker push tico/nginx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>내맘대로 개발 일기/Troubleshooting</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/125</guid>
      <comments>https://bu119.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 29 Jun 2024 22:00:31 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Let&amp;rsquo;s Encrypt, SSL/TLS 인증서 발급하기</title>
      <link>https://bu119.tistory.com/115</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKOnpz/btsH0ZxxGs8/oiGFrhyTvhv7wjssWtIeVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKOnpz/btsH0ZxxGs8/oiGFrhyTvhv7wjssWtIeVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKOnpz/btsH0ZxxGs8/oiGFrhyTvhv7wjssWtIeVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKOnpz%2FbtsH0ZxxGs8%2FoiGFrhyTvhv7wjssWtIeVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 호스트 시스템에 Certbot을 활용하여 Let&amp;rsquo;s Encrypt SSL/TLS 인증서를 발급받을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 토이 프로젝트이고 서버 자원을 최대한 아껴야 한다. 이렇게 하면 Docker 컨테이너에 의해 추가되는 오버헤드를 피하고, 시스템 자원을 절약할 수 있다. 따라서, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Certbot을 호스트 시스템에 직접 설치하는 것이 더 적합할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker로 실행을 권장하는 경우:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 서버 환경에서 일관된 설정이 필요할 때&lt;/li&gt;
&lt;li&gt;DevOps 관행에 따라 컨테이너화된 환경을 선호할 때&lt;/li&gt;
&lt;li&gt;시스템 격리와 독립성이 중요한 경우&lt;/li&gt;
&lt;li&gt;Certbot 설치 및 업그레이드의 간편함이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker를 사용하지 않거나 Docker 사용이 복잡한 경우&lt;/li&gt;
&lt;li&gt;시스템 자원을 최소화하고자 할 때&lt;/li&gt;
&lt;li&gt;단일 서버에서 간단한 설정이 필요한 경우&lt;/li&gt;
&lt;li&gt;종속성 관리가 용이하고, Certbot이 서버의 다른 소프트웨어와 충돌할 가능성이 없을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1. 패키지 인덱스 업데이트하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템이 최신 패키지 정보를 갖도록 업데이트한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718459909069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패키지 인덱스는 시스템에서 사용할 수 있는 패키지와 그 버전에 대한 데이터베이스이다.&lt;/li&gt;
&lt;li&gt;업데이트를 하면 최신 소프트웨어 정보와 버전을 확보할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718460035637&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo apt update

Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelea   se
Hit:3 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-backports InRel   ease
Hit:4 https://download.docker.com/linux/ubuntu jammy InRelease
Get:5 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
Fetched 129 kB in 1s (117 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
99 packages can be upgraded. Run 'apt list --upgradable' to see them.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2. Certbot 설치하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Certbot은 Let's Encrypt SSL/TLS 인증서를 얻고 관리하는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;apt를 통해 Certbot 도구를 시스템에 설치한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718002141828&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install certbot -y&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-y 옵션은 설치 중 묻는 질문에 자동으로 &quot;예&quot;라고 답한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718460092271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo apt install certbot

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  python3-acme python3-certbot python3-configargparse python3-icu python3-josepy
  python3-parsedatetime python3-requests-toolbelt python3-rfc3339
  python3-zope.component python3-zope.event python3-zope.hookable
Suggested packages:
  python-certbot-doc python3-certbot-apache python3-certbot-nginx
  python-acme-doc
The following NEW packages will be installed:
  certbot python3-acme python3-certbot python3-configargparse python3-icu
  python3-josepy python3-parsedatetime python3-requests-toolbelt python3-rfc3339
  python3-zope.component python3-zope.event python3-zope.hookable
0 upgraded, 12 newly installed, 0 to remove and 99 not upgraded.
Need to get 958 kB of archives.
After this operation, 4915 kB of additional disk space will be used.

Do you want to continue? [Y/n] Y

Get:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-josepy all 1.10.0-1 [22.0 kB]
Get:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/main amd64 python3-requests-toolbelt all 0.9.1-1 [38.0 kB]
Get:3 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/main amd64 python3-rfc3339 all 1.1-3 [7110 B]
Get:4 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 python3-acme all 1.21.0-1ubuntu0.1 [36.4 kB]
Get:5 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-configargparse all 1.5.3-1 [26.9 kB]
Get:6 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-parsedatetime all 2.6-2 [32.9 kB]
Get:7 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-zope.hookable amd64 5.1.0-1build1 [11.6 kB]
Get:8 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-zope.event all 4.4-3 [8180 B]
Get:9 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-zope.component all 4.3.0-3 [38.3 kB]
Get:10 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 python3-certbot all 1.21.0-1build1 [175 kB]
Get:11 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/main amd64 python3-icu amd64 2.8.1-0ubuntu2 [540 kB]
Get:12 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu jammy/universe amd64 certbot all 1.21.0-1build1 [21.3 kB]
Fetched 958 kB in 0s (21.9 MB/s)
Preconfiguring packages ...
Selecting previously unselected package python3-josepy.
(Reading database ... 94226 files and directories currently installed.)
Preparing to unpack .../00-python3-josepy_1.10.0-1_all.deb ...
Unpacking python3-josepy (1.10.0-1) ...
Selecting previously unselected package python3-requests-toolbelt.
Preparing to unpack .../01-python3-requests-toolbelt_0.9.1-1_all.deb ...
Unpacking python3-requests-toolbelt (0.9.1-1) ...
Selecting previously unselected package python3-rfc3339.
Preparing to unpack .../02-python3-rfc3339_1.1-3_all.deb ...
Unpacking python3-rfc3339 (1.1-3) ...
Selecting previously unselected package python3-acme.
Preparing to unpack .../03-python3-acme_1.21.0-1ubuntu0.1_all.deb ...
Unpacking python3-acme (1.21.0-1ubuntu0.1) ...
Selecting previously unselected package python3-configargparse.
Preparing to unpack .../04-python3-configargparse_1.5.3-1_all.deb ...
Unpacking python3-configargparse (1.5.3-1) ...
Selecting previously unselected package python3-parsedatetime.
Preparing to unpack .../05-python3-parsedatetime_2.6-2_all.deb ...
Unpacking python3-parsedatetime (2.6-2) ...
Selecting previously unselected package python3-zope.hookable.
Preparing to unpack .../06-python3-zope.hookable_5.1.0-1build1_amd64.deb ...
Unpacking python3-zope.hookable (5.1.0-1build1) ...
Selecting previously unselected package python3-zope.event.
Preparing to unpack .../07-python3-zope.event_4.4-3_all.deb ...
Unpacking python3-zope.event (4.4-3) ...
Selecting previously unselected package python3-zope.component.
Preparing to unpack .../08-python3-zope.component_4.3.0-3_all.deb ...
Unpacking python3-zope.component (4.3.0-3) ...
Selecting previously unselected package python3-certbot.
Preparing to unpack .../09-python3-certbot_1.21.0-1build1_all.deb ...
Unpacking python3-certbot (1.21.0-1build1) ...
Selecting previously unselected package python3-icu.
Preparing to unpack .../10-python3-icu_2.8.1-0ubuntu2_amd64.deb ...
Unpacking python3-icu (2.8.1-0ubuntu2) ...
Selecting previously unselected package certbot.
Preparing to unpack .../11-certbot_1.21.0-1build1_all.deb ...
Unpacking certbot (1.21.0-1build1) ...
Setting up python3-configargparse (1.5.3-1) ...
Setting up python3-requests-toolbelt (0.9.1-1) ...
Setting up python3-parsedatetime (2.6-2) ...
Setting up python3-icu (2.8.1-0ubuntu2) ...
Setting up python3-zope.event (4.4-3) ...
Setting up python3-zope.hookable (5.1.0-1build1) ...
Setting up python3-josepy (1.10.0-1) ...
Setting up python3-rfc3339 (1.1-3) ...
Setting up python3-zope.component (4.3.0-3) ...
Setting up python3-acme (1.21.0-1ubuntu0.1) ...
Setting up python3-certbot (1.21.0-1build1) ...
Setting up certbot (1.21.0-1build1) ...
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
Scanning candidates...
Scanning linux images...

Restarting services...
Service restarts being deferred:
 /etc/needrestart/restart.d/dbus.service
 systemctl restart docker.service
 systemctl restart getty@tty1.service
 systemctl restart networkd-dispatcher.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VYTat/btsH1i4GC8v/QIF4xd3kKZbKykoYKrGJ31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VYTat/btsH1i4GC8v/QIF4xd3kKZbKykoYKrGJ31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VYTat/btsH1i4GC8v/QIF4xd3kKZbKykoYKrGJ31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVYTat%2FbtsH1i4GC8v%2FQIF4xd3kKZbKykoYKrGJ31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1330&quot; height=&quot;569&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvk9U9/btsH13Tw2KG/zdlxpozuRINWILBRJ5jpOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvk9U9/btsH13Tw2KG/zdlxpozuRINWILBRJ5jpOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvk9U9/btsH13Tw2KG/zdlxpozuRINWILBRJ5jpOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvk9U9%2FbtsH13Tw2KG%2FzdlxpozuRINWILBRJ5jpOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;689&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3. 도메인의 SSL/TLS 인증서 발급하기 - &lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Let&amp;rsquo;s Encrypt&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Certbot을 사용하여 도메인의 SSL/TLS 인증서를 얻는다.&lt;/p&gt;
&lt;pre id=&quot;code_1718002099914&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# certbot을 사용하여 SSL 인증서 발급
sudo certbot certonly --standalone -d 도메인주소&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;certonly 옵션은 인증서만 얻고 설치하지 않음을 의미한다.&lt;/li&gt;
&lt;li&gt;-d 옵션은 도메인 이름을 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 통해&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자체 임시 웹 서버를 사용하여 도메인 소유권을 증명한다.&lt;/li&gt;
&lt;li&gt;Let's Encrypt 서버와 통신하여 인증서를 얻는다.&lt;/li&gt;
&lt;li&gt;인증서와 키 파일을 시스템에 저장한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 /etc/letsencrypt/live/도메인/ 디렉토리에 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt; 명령어를 실행하면 이메일 주소를 입력하고, Let's Encrypt 서비스 약관에 동의하는 등의 절차가 진행된다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발급된 인증서는 /etc/letsencrypt/live/pomorodo.shop/ 경로에 저장된다.&lt;/p&gt;
&lt;pre id=&quot;code_1718003607323&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo certbot certonly --standalone -d pomorodo.shop

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): tico240516@gmail.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

Account registered.
Requesting a certificate for pomorodo.shop

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/pomorodo.shop/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/pomorodo.shop/privkey.pem
This certificate expires on 2024-09-13.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;추가 참고 사항&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;권한&lt;/b&gt;: 소프트웨어 설치 및 인증서 획득에는 관리자 권한이 필요하므로 sudo 명령어가 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DNS 레코드&lt;/b&gt;: 도메인(pomorodo.shop)이 명령어를 실행하는 서버로 올바르게 포워딩되어 있는지 확인해야 한다. 이는 도메인 검증 과정에 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;방화벽&lt;/b&gt;: 방화벽이 도메인 검증이 원활하게 진행되도록 80번 포트(HTTP)와 443번 포트(HTTPS) 트래픽을 허용하는지 확인해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계를 따라가면 도메인에 대한 SSL/TLS 인증서를 성공적으로 얻을 수 있으며, 이를 통해 HTTPS로 웹사이트를 안전하게 보호할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kamatera.com/knowledgebase/how-to-secure-nginx-with-lets-encrypt/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.kamatera.com/knowledgebase/how-to-secure-nginx-with-lets-encrypt/&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/115</guid>
      <comments>https://bu119.tistory.com/115#entry115comment</comments>
      <pubDate>Sun, 16 Jun 2024 09:00:41 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Ubuntu 현재 시스템의 시간대를 한국 시간으로 변경하기</title>
      <link>https://bu119.tistory.com/120</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b862P5/btsH01aYRrn/hWQ5KAyCVaHTi0HcYLXA40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b862P5/btsH01aYRrn/hWQ5KAyCVaHTi0HcYLXA40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b862P5/btsH01aYRrn/hWQ5KAyCVaHTi0HcYLXA40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb862P5%2FbtsH01aYRrn%2FhWQ5KAyCVaHTi0HcYLXA40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;우분투에서 터미널을 통해 현재 시스템 시간대를 한국 시간으로 변경할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;시스템의 현재 시간 및 날짜 관련 설정 상태 확인하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;명령어를 통해 시간 및 날짜 관련 시스템 상태를 자세히 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718441999603&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;timedatectl&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기상태에는 현재 시스템의 시간대가 UTC(협정 세계시)로 설정되어 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718442265237&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Time zone: Etc/UTC (UTC, +0000)&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1a1918; text-align: start;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718442096809&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ timedatectl
               Local time: Sat 2024-06-15 08:45:50 UTC
           Universal time: Sat 2024-06-15 08:45:50 UTC
                 RTC time: Sat 2024-06-15 08:45:50
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 출력 결과에는 다음과 같은 정보가 포함되어 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;로컬 시간 (Local time)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;협정 세계시 (Universal time)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;하드웨어 시계 시간 (RTC time)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;현재 시간대 (Time zone)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;NTP(Network Time Protocol) 동기화 상태 (NTP enabled, NTP synchronized)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;하드웨어 시계와 시스템 시계의 동기화 여부 (RTC in local TZ)&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;일광 절약 시간(DST) 활성화 여부 (DST active)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 시스템의 현재 시간 및 날짜 관련 설정 상태를 한눈에 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;시스템의 시간대를 &lt;/span&gt;&lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;한국 시간으로 변경하기&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;명령어를 통해 시스템 시간대를 한국 서울 시간대로 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718442354633&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo timedatectl set-timezone Asia/Seoul&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;sudo를 통해 관리자 권한으로 실행&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;timedatectl은 시간 및 날짜 설정을 관리하는 명령어&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;set-timezone으로 시간대를 변경&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Asia/Seoul은 한국 서울 시간대를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718442428103&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo timedatectl set-timezone Asia/Seoul
ubuntu@ip-000-000-000-000:~$ timedatectl
               Local time: Sat 2024-06-15 17:46:13 KST
           Universal time: Sat 2024-06-15 08:46:13 UTC
                 RTC time: Sat 2024-06-15 08:46:13
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템의 시간대가 Asia/Seoul로 한국 서울 시간대로 변경된 것을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718442954403&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Time zone: Asia/Seoul (KST, +0900)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1a1918; text-align: left;&quot;&gt; 현재 시간확인하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 통해 현재 날짜와 시간을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718442592692&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;date&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;시간대가 정상적으로 변경되었다면 한국 시간이 표시될 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718442661758&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ date

Sat Jun 15 17:56:32 KST 2024&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KST는 한국 표준시(Korea Standard Time)를 의미하므로, 이를 통해 우분투 PC의 시간대가 한국 시간으로 정상적으로 변경되었음을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718441638541&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ timedatectl

               Local time: Sat 2024-06-15 08:45:50 UTC
           Universal time: Sat 2024-06-15 08:45:50 UTC
                 RTC time: Sat 2024-06-15 08:45:50
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
          
ubuntu@ip-000-000-000-000:~$ sudo timedatectl set-timezone Asia/Seoul

ubuntu@ip-000-000-000-000:~$ timedatectl

               Local time: Sat 2024-06-15 17:46:13 KST
           Universal time: Sat 2024-06-15 08:46:13 UTC
                 RTC time: Sat 2024-06-15 08:46:13
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
          
ubuntu@ip-000-000-000-000:~$ date

Sat Jun 15 17:56:32 KST 2024&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/120</guid>
      <comments>https://bu119.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 15 Jun 2024 18:30:32 +0900</pubDate>
    </item>
    <item>
      <title>[CICD 구축] GitHub Actions 워크플로우 구성하기</title>
      <link>https://bu119.tistory.com/117</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIYuRT/btsHZZZs3yZ/FD7lydZKiSlMtukHFlIrCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIYuRT/btsHZZZs3yZ/FD7lydZKiSlMtukHFlIrCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIYuRT/btsHZZZs3yZ/FD7lydZKiSlMtukHFlIrCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIYuRT%2FbtsHZZZs3yZ%2FFD7lydZKiSlMtukHFlIrCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;워크플로우 개요&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 GitHub Actions 워크플로우는 Java, Spring Boot, Ubuntu, Docker를 사용하여 CI/CD(Continuous Integration/Continuous Deployment)를 자동화하는 설정이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 워크플로우는 develop-be 브랜치에 push 또는 pull request 이벤트가 발생할 때 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 개의 작업(Job) &amp;nbsp;build, deploy 로 구성되어 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Docker를 사용하기 때문에 Docker 이미지를 빌드하는 단계에서 Dockerfile이 필요하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Dockerfile 준비하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile은 애플리케이션의 실행 환경을 코드로 정의하여, 어디서나 동일한 환경에서 애플리케이션을 실행할 수 있도록 한다. Dockerfile을 사용하여 Docker 이미지를 빌드한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718372086002&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM openjdk:17-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT [&quot;java&quot;,&quot;-jar&quot;,&quot;/app.jar&quot;,&quot;-Duser.timezone=Asia/Seoul&quot;]
# -Duser.timezone=Asia/Seoul 옵션: 기본 타임존을 Asia/Seoul로 강제 설정&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dockerfile은 애플리케이션을 컨테이너화하는 데 필요한 명령어들을 포함하고 있다.&lt;/li&gt;
&lt;li&gt;여기에는 베이스 이미지를 설정하고, 필요한 종속성을 설치하고, 애플리케이션 코드를 추가하고, 실행 명령을 정의하는 내용이 포함된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;워크플로우 구성&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1718370614402&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# deploy.yml

name: CI/CD with Gradle, Docker, AWS

# develop-be 브랜치에 push 또는 PR 이벤트가 발생하면 워크플로우가 실행된다.
on:
  push:
    branches: [ &quot;develop-be&quot; ]
  pull_request:
    branches: [ &quot;develop-be&quot; ]

# 해당 Workflow의 Job 목록
jobs:
  build:
  # 이 작업이 실행되는 환경을 정의: 최신 Ubuntu 환경
    runs-on: ubuntu-latest
    # 리포지토리에 대한 읽기 권한을 부여한다.
    permissions:
      contents: read
      
    # build Job 내의 step 목록
    steps:
    ### CI
    # 레포지토리 체크아웃하여 레포지토리에 접근할 수 있게 한다.
    - name: Checkout Repository
      uses: actions/checkout@v4
      
    # JDK 버전 17 설정 (temurin 배포판 사용)
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        
    # Gradle 캐싱 설정으로 의존성 다운로드 시간을 줄인다.
    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('backend/pomoro-do/**/*.gradle*', 'backend/pomoro-do/**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-
          
    # Gradle 래퍼 스크립트에 실행 권한 부여
    - name: Grant Execute Permission For Gradlew
      run: chmod +x backend/pomoro-do/gradlew
    
    # 테스트를 제외한 Gradle 빌드 수행 (CI 단계)
    - name: Build with Gradle
      run: cd backend/pomoro-do &amp;amp;&amp;amp; ./gradlew build -x test

    ### CD
    # Docker Hub에 로그인 (보안) (CD 단계 준비)
    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    # SpringBoot 어플리케이션의 Docker 이미지를 빌드하고 Docker Hub에 푸시 (CD 단계 준비)
    - name: Build and Push Docker Image for SpringBoot
      run: |
        cd backend/pomoro-do
        set -e # 명령 실패 시 스크립트 종료
        # 현재 디렉토리에 있는 Dockerfile을 사용하여 Docker 이미지를 빌드
        docker build -t ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest .
        # Docker Hub에 이미지 푸시
        docker push ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest

  deploy:
    # 이 작업은 build 작업이 성공적으로 완료된 후에만 실행다.
    needs: build
    runs-on: ubuntu-latest
    steps:
    # SSH를 통해 원격 서버에서 명령을 실행하여 Docker 컨테이너 배포
    - name: Docker Run
      uses: appleboy/ssh-action@v0.1.8
      with:
        host: ${{ secrets.SSH_HOST }}  # 원격 서버의 호스트명
        username: ${{ secrets.SSH_USERNAME }}  # 원격 서버의 사용자명
        key: ${{ secrets.SSH_PRIVATE_KEY }}  # 원격 서버의 비밀 키
        port: 22  # SSH 포트
        sync: false
        use_insecure_cipher: false
        timeout: 30s
        command_timeout: 10m
        debug: true  # 디버그 모드 활성화
        script: |
          docker stop pomorodo-server || true  # 실행 중인 pomorodo-server 컨테이너 중지
          docker rm pomorodo-server || true  # 기존 컨테이너 삭제
          docker rmi ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest || true # 기존 이미지 삭제
          docker pull ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest # 최신 이미지 다운로드
          docker run -d -p 8080:8080 --name pomorodo-server -e DB_URL=${{ secrets.DB_URL }} -e DB_USERNAME=${{ secrets.DB_USERNAME }} -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;CI (Continuous Integration)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI 단계에서는 코드의 변경사항이 빌드되고 테스트된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 주로 코드가 정상적으로 동작하는지 확인하는 작업이 이루어진다. 여기서 코드를 빌드하여 문제가 없는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;워크플로우 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워크플로우 이름을 정의한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1718355893101&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: CI/CD with Gradle, Docker, AWS&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name: CI/CD with Gradle, Docker, AWS - 워크플로우의 이름이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;이벤트 트리거&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;develop-be 브랜치에 push되거나 pull request가 생성될 때 워크플로우가 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1718354961342&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;on:
  push:
    branches: [ &quot;develop-be&quot; ]
  pull_request:
    branches: [ &quot;develop-be&quot; ]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;on: - 워크플로우를 트리거하는 이벤트를 정의한다.&lt;/li&gt;
&lt;li&gt;push:&amp;nbsp; &lt;span&gt;branches:&lt;/span&gt; -&amp;nbsp; 해당 브랜치로 푸시 이벤트가 발생하면 워크플로우가 실행한다.&lt;/li&gt;
&lt;li&gt;pull_request: &lt;span&gt;branches: - 해당&lt;/span&gt; 브랜치를 대상으로 한 풀 리퀘스트 이벤트가 발생하면 워크플로우가 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;Job 1: build&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 작업은 최신 Ubuntu 환경에서 실행된다. 리포지토리에 대한 읽기 권한을 부여한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355078257&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;runs-on: ubuntu-latest - 최신 버전의 Ubuntu 가상 머신에서 작업이 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;permissions: &lt;span&gt;contents:&lt;/span&gt; &lt;span&gt;read&lt;/span&gt; - 저장소 내용에 대한 읽기 권한을 부여한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Steps (단계)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;b&gt;레포지토리 체크아웃&lt;/b&gt; (Checkout Repository&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레포지토리의 코드를 체크아웃하여 접근할 수 있게 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355237384&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Checkout Repository
  uses: actions/checkout@v4&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;actions/checkout 액션을 사용하여 저장소를 러너에 클론한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. JDK 17 설정 (&lt;b&gt;Set up JDK 17)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDK 17을 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355275026&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Set up JDK 17
  uses: actions/setup-java@v4
  with:
    java-version: '17'
    distribution: 'temurin'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;actions/setup-java 액션을 사용하여 JDK 17 (Temurin 배포판)을 설치한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Gradle 캐싱 (&lt;b&gt;Gradle Caching&lt;/b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradle 캐싱을 설정하여 빌드 시간을 줄인다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355311738&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Gradle Caching
  uses: actions/cache@v3
  with:
    path: |
      ~/.gradle/caches
      ~/.gradle/wrapper
    key: ${{ runner.os }}-gradle-${{ hashFiles('backend/pomoro-do/**/*.gradle*', 'backend/pomoro-do/**/gradle-wrapper.properties') }}
    restore-keys: |
      ${{ runner.os }}-gradle-&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;actions/cache 액션을 사용하여 Gradle 종속성을 캐싱하여 빌드 속도를 높인다.&lt;/li&gt;
&lt;li&gt;path - 캐싱할 디렉토리를 지정한다.&lt;/li&gt;
&lt;li&gt;key - OS 및 Gradle 파일의 해시를 기반으로 한 고유한 캐시 키를 정의한다.&lt;/li&gt;
&lt;li&gt;restore-keys - 기본 키가 없을 때 사용할 대체 키를 정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Gradlew 실행 권한 부여 (&lt;b&gt;Grant Execute Permission For Gradlew)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradle 래퍼 스크립트에 실행 권한을 부여한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355348882&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Grant Execute Permission For Gradlew
  run: chmod +x backend/pomoro-do/gradlew&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Gradle로 빌드 (&lt;b&gt;Build with Gradle&lt;/b&gt;)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718355368659&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Build with Gradle
  run: cd backend/pomoro-do &amp;amp;&amp;amp; ./gradlew build -x test&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Gradle 빌드 명령을 실행하여 테스트를 제외한 빌드를 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;CD (Continuous Deployment)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD 단계에서는 빌드된 애플리케이션을 실제 환경에 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Docker Hub에 로그인 (Log in to Docker Hub)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Hub에 로그인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718355408862&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Log in to Docker Hub
  uses: docker/login-action@v2
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker/login-action 액션을 사용하여 Docker Hub에 로그인한다.&lt;/li&gt;
&lt;li&gt;GitHub Secrets에 저장된 자격 증명 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. SpringBoot용 Docker 이미지 빌드 및 푸시 (Build and Push Docker Image for SpringBoot)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718355488351&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Build and Push Docker Image for SpringBoot
  run: |
    cd backend/pomoro-do
    set -e
    docker build -t ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest .
    docker push ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 단계에서는 backend/pomoro-do 디렉토리에 있는 Dockerfile을 사용하여 Spring Boot 애플리케이션의 Docker 이미지를 빌드한다.&lt;/li&gt;
&lt;li&gt;빌드된 Docker 이미지를 Docker Hub에 푸시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;Job 2: deploy&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 설정&lt;/h4&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1718355547829&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deploy:
  needs: build
  runs-on: ubuntu-latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;needs: build - 이 작업은 build 작업이 성공적으로 완료된 후에만 실행된다.&lt;/li&gt;
&lt;li&gt;최신 Ubuntu 환경에서 실행다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Steps (단계)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;Docker 실행 (Docker Run)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH를 통해 원격 서버에 접속하여 Docker 컨테이너를 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 컨테이너와 이미지를 중지하고 삭제한 후, 최신 이미지를 다운로드하여 새로운 컨테이너를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 단계에서는 Docker Hub에서 최신 이미지를 풀(pull) 한 후, 컨테이너를 실행한다.&lt;/li&gt;
&lt;li&gt;이 이미지도 Dockerfile을 통해 빌드된 것이므로, 이전 단계에서 만든 Dockerfile이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718355573826&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: Docker Run
  uses: appleboy/ssh-action@v0.1.8
  with:
    host: ${{ secrets.SSH_HOST }}
    username: ${{ secrets.SSH_USERNAME }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    port: 22
    sync: false
    use_insecure_cipher: false
    timeout: 30s
    command_timeout: 10m
    debug: true
    script: |
      docker stop pomorodo-server || true
      docker rm pomorodo-server || true
      docker rmi ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest || true
      docker pull ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest
      docker run -d -p 8080:8080 --name pomorodo-server -e DB_URL=${{ secrets.DB_URL }} -e DB_USERNAME=${{ secrets.DB_USERNAME }} -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} ${{ secrets.DOCKER_USERNAME }}/pomorodo:latest&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;appleboy/ssh-action 액션을 사용하여 SSH를 통해 원격 서버에서 명령을 실행한다.&lt;/li&gt;
&lt;li&gt;실행 중인 pomorodo-server 컨테이너를 중지하고 삭제한다.&lt;/li&gt;
&lt;li&gt;기존 Docker 이미지를 삭제한다.&lt;/li&gt;
&lt;li&gt;Docker Hub에서 최신 이미지를 다운로드한다.&lt;/li&gt;
&lt;li&gt;환경 변수를 설정하고 새로운 Docker 컨테이너를 실행다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;CI/CD&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI는 코드의 품질을 보장하고 빌드 과정을 자동화하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD는 빌드된 애플리케이션을 실제 운영 환경에 배포하는 과정을 자동화한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CI (지속적 통합)&lt;/b&gt;: 코드 체크아웃, JDK 설정, Gradle 캐싱, Gradle 빌드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CD (지속적 배포)&lt;/b&gt;: Docker Hub 로그인, Docker 이미지 빌드 및 푸시, Docker 컨테이너 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 워크플로우는 코드가 develop-be 브랜치에 푸시되거나 PR이 생성될 때 자동으로 빌드와 배포 과정을 수행하여, 최신 버전의 애플리케이션이 원격 서버에 배포되도록 설정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;docker-compose 사용하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose.yml 파일은 Docker Compose를 사용하여 여러 컨테이너 서비스를 정의하고 설정할 수 있는 구성 파일이다.&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;docker-compose.yml&lt;/h4&gt;
&lt;pre id=&quot;code_1718353046617&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# docker-compose.yml

# Docker Compose 파일의 버전을 지정
version: '3.8'

services:
  app:
    build:
      context: ./backend/pomoro-do
      dockerfile: Dockerfile
    image: ${DOCKER_USERNAME}/pomorodo:latest
    ports:
      - &quot;8080:8080&quot;
    environment:
      DB_URL: ${DB_URL}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      S3_ACCESS_KEY: ${S3_ACCESS_KEY}
      S3_SECRET_KEY: ${S3_SECRET_KEY}
      REGION: ${REGION}
      BUCKET_NAME: ${BUCKET_NAME}
      JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET}
      JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222; text-align: start;&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;h3 data-ke-size=&quot;size23&quot;&gt;버전&lt;/h3&gt;
&lt;pre id=&quot;code_1718373375068&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.8'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;version: Docker Compose 파일의 버전을 지정합니다. 여기서는 버전 3.8을 사용합니다. 이는 Docker Compose의 여러 기능을 사용할 수 있게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스 정의&lt;/h3&gt;
&lt;pre id=&quot;code_1718373387797&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  app:&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;services: 여러 컨테이너 서비스를 정의할 수 있는 섹션입니다.&lt;/li&gt;
&lt;li&gt;app: 서비스의 이름입니다. 여기서는 app이라는 이름을 사용하여 Spring Boot 애플리케이션을 정의하고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빌드 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1718373403564&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    build:
      context: ./backend/pomoro-do
      dockerfile: Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;build: Docker 이미지를 빌드하는 설정을 정의합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;context: Docker 빌드 컨텍스트를 지정합니다. ./backend/pomoro-do 디렉토리를 기준으로 빌드가 수행됩니다. 이 디렉토리에는 Dockerfile과 소스 코드가 있어야 합니다.&lt;/li&gt;
&lt;li&gt;dockerfile: 사용할 Dockerfile을 지정합니다. 기본적으로 context 내의 Dockerfile을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1718373422781&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    image: &quot;${DOCKER_USERNAME}/pomorodo:latest&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;image: 빌드된 Docker 이미지를 태그할 이름을 지정합니다. 여기서는 환경 변수 ${DOCKER_USERNAME}를 사용하여 Docker Hub의 사용자 이름과 pomorodo:latest 이미지를 결합하여 이름을 설정합니다. 예를 들어, 사용자 이름이 exampleuser인 경우 exampleuser/pomorodo:latest로 태그됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포트 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1718373432661&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    image: &quot;${DOCKER_USERNAME}/pomorodo:latest&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ports: 호스트와 컨테이너 간의 포트 매핑을 설정합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;8080:8080&quot;: 호스트의 포트 8080을 컨테이너의 포트 8080에 매핑합니다. 이렇게 하면 호스트의 8080 포트로 접근할 때 컨테이너의 8080 포트로 요청이 전달됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경 변수 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1718373446510&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    environment:
      DB_URL: &quot;${DB_URL}&quot;
      DB_USERNAME: &quot;${DB_USERNAME}&quot;
      DB_PASSWORD: &quot;${DB_PASSWORD}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;environment: 컨테이너에서 사용할 환경 변수를 설정합니다. 환경 변수는 주로 애플리케이션의 설정 값을 지정하는 데 사용됩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB_URL: 데이터베이스 URL을 지정합니다.&lt;/li&gt;
&lt;li&gt;DB_USERNAME: 데이터베이스 사용자 이름을 지정합니다.&lt;/li&gt;
&lt;li&gt;DB_PASSWORD: 데이터베이스 비밀번호를 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 docker-compose.yml 파일은 Spring Boot 애플리케이션을 정의하고, Docker 이미지를 빌드하고, 환경 변수를 설정하며, 포트 매핑을 통해 컨테이너가 호스트의 특정 포트에서 접근 가능하도록 합니다. 이를 통해 애플리케이션을 손쉽게 배포하고 관리할 수 있습니다. 각 구성 요소는 다음과 같은 역할을 합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;version&lt;/b&gt;: Docker Compose 파일의 버전 지정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;services&lt;/b&gt;: 여러 컨테이너 서비스를 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;app&lt;/b&gt;: 서비스 이름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;build&lt;/b&gt;: Docker 이미지를 빌드하는 설정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;image&lt;/b&gt;: 빌드된 이미지의 태그 이름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ports&lt;/b&gt;: 호스트와 컨테이너 간의 포트 매핑&lt;/li&gt;
&lt;li&gt;&lt;b&gt;environment&lt;/b&gt;: 컨테이너 내에서 사용할 환경 변수 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;deploy.yml&lt;/h4&gt;
&lt;pre id=&quot;code_1718353027129&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# deploy.yml

name: CI/CD with Gradle, Docker, AWS

# develop-be 브랜치에 push 또는 PR 이벤트가 발생하면 워크플로우가 실행된다.
on:
  push:
    branches: [ &quot;develop-be&quot; ]
  pull_request:
    branches: [ &quot;develop-be&quot; ]

# 해당 Workflow의 Job 목록
jobs:
  build:
  # 이 작업이 실행되는 환경을 정의: 최신 Ubuntu 환경
    runs-on: ubuntu-latest
    # 리포지토리에 대한 읽기 권한을 부여한다.
    permissions:
      contents: read
      
    # build Job 내의 step 목록
    steps:
    ### CI
    # 레포지토리 체크아웃하여 레포지토리에 접근할 수 있게 한다.
    - name: Checkout Repository
      uses: actions/checkout@v4
      
    # JDK 버전 17 설정 (temurin 배포판 사용)
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        
    # Gradle 캐싱 설정으로 의존성 다운로드 시간을 줄인다.
    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('backend/pomoro-do/**/*.gradle*', 'backend/pomoro-do/**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-
          
    # Gradle 래퍼 스크립트에 실행 권한 부여
    - name: Grant Execute Permission For Gradlew
      run: chmod +x backend/pomoro-do/gradlew
    
    # 테스트를 제외한 Gradle 빌드 수행 (CI 단계)
    - name: Build with Gradle
      run: cd backend/pomoro-do &amp;amp;&amp;amp; ./gradlew build -x test

    ### CD
    # Docker Hub에 로그인 (보안) (CD 단계 준비)
    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    # SpringBoot 어플리케이션의 Docker 이미지를 빌드하고 Docker Hub에 푸시 (CD 단계 준비)
    - name: Build and Push Docker Image for SpringBoot
      run: |
        cd backend/pomoro-do
        set -e # 명령 실패 시 스크립트 종료
        # 현재 디렉토리에 있는 Dockerfile을 사용하여 Docker 이미지를 빌드
       	docker-compose build
        # Docker Hub에 이미지 푸시
        docker-compose push
        
  deploy:
    # 이 작업은 build 작업이 성공적으로 완료된 후에만 실행다.
    needs: build
    runs-on: ubuntu-latest
    steps:
    # SSH를 통해 원격 서버에서 명령을 실행하여 Docker 컨테이너 배포
    - name: Docker Run
      uses: appleboy/ssh-action@v0.1.8
      with:
        host: ${{ secrets.SSH_HOST }}  # 원격 서버의 호스트명
        username: ${{ secrets.SSH_USERNAME }}  # 원격 서버의 사용자명
        key: ${{ secrets.SSH_PRIVATE_KEY }}  # 원격 서버의 비밀 키
        port: 22  # SSH 포트
        sync: false
        use_insecure_cipher: false
        timeout: 30s
        command_timeout: 10m
        debug: true  # 디버그 모드 활성화
        script: |
          cd /path/to/deploy
          docker-compose down # 기존 컨테이너 중지 및 제거
          docker-compose pull # 최신 이미지 가져오기
          docker-compose up -d # Docker Compose를 사용해 컨테이너 시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/117</guid>
      <comments>https://bu119.tistory.com/117#entry117comment</comments>
      <pubDate>Fri, 14 Jun 2024 18:00:04 +0900</pubDate>
    </item>
    <item>
      <title>[CICD 구축] GitHub Actions 시작하기</title>
      <link>https://bu119.tistory.com/116</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O6VXF/btsHWegUJUi/XP6S0XVaEfkbwrUHQcG6m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O6VXF/btsHWegUJUi/XP6S0XVaEfkbwrUHQcG6m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O6VXF/btsHWegUJUi/XP6S0XVaEfkbwrUHQcG6m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO6VXF%2FbtsHWegUJUi%2FXP6S0XVaEfkbwrUHQcG6m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/actions&quot;&gt;https://docs.github.com/ko/actions&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718083126902&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;GitHub Actions 설명서 - GitHub Docs&quot; data-og-description=&quot;GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완&quot; data-og-host=&quot;docs.github.com&quot; data-og-source-url=&quot;https://docs.github.com/ko/actions&quot; data-og-url=&quot;https://docs.github.com/ko/actions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zRD9i/hyWhasuOSo/KAeaOFhkIM1K8HpEp47oxk/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/actions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.github.com/ko/actions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zRD9i/hyWhasuOSo/KAeaOFhkIM1K8HpEp47oxk/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub Actions 설명서 - GitHub Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;GitHub&amp;nbsp;Actions &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;workflow 생성&lt;/span&gt;하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718086475445&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Gradle을 사용하여 Java 빌드 및 테스트 - GitHub Docs&quot; data-og-description=&quot;GitHub Actions CI(연속 통합) 워크플로를 만들어 Gradle을 사용하여 Java 프로젝트를 빌드하고 테스트할 수 있습니다.&quot; data-og-host=&quot;docs.github.com&quot; data-og-source-url=&quot;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&quot; data-og-url=&quot;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f5g1w/hyWg5dCdaE/8p33fkcN9LI7k4xWAkJJA0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.github.com/ko/actions/automating-builds-and-tests/building-and-testing-java-with-gradle&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f5g1w/hyWg5dCdaE/8p33fkcN9LI7k4xWAkJJA0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gradle을 사용하여 Java 빌드 및 테스트 - GitHub Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GitHub Actions CI(연속 통합) 워크플로를 만들어 Gradle을 사용하여 Java 프로젝트를 빌드하고 테스트할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;Github R&lt;/span&gt;epositorie &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;에서 Actions 클릭한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB0lam/btsHVDHMuNa/Xjk30TnjV9KP4LK6jbR8Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB0lam/btsHVDHMuNa/Xjk30TnjV9KP4LK6jbR8Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB0lam/btsHVDHMuNa/Xjk30TnjV9KP4LK6jbR8Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB0lam%2FbtsHVDHMuNa%2FXjk30TnjV9KP4LK6jbR8Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;2. 검색 창에 우리 프로젝트에서 사용하는 &lt;/span&gt;Java with Gradle &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;을 검색한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0xE5u/btsHUhTHUsc/2tu23s9R90PT6zj5nxlcWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0xE5u/btsHUhTHUsc/2tu23s9R90PT6zj5nxlcWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0xE5u/btsHUhTHUsc/2tu23s9R90PT6zj5nxlcWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0xE5u%2FbtsHUhTHUsc%2F2tu23s9R90PT6zj5nxlcWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. Java with Gradle&lt;span style=&quot;text-align: start;&quot;&gt;의 Configure를 클릭하면,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Gradle &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;wrapper &lt;/span&gt;스크립트를 사용하여 Java 프로젝트를 빌드하고 테스트할 수 있는 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;workflow를 생성할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLv9Qz/btsHV8ntR3m/h6JOFqxuWY9nKACEOAmoo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLv9Qz/btsHV8ntR3m/h6JOFqxuWY9nKACEOAmoo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLv9Qz/btsHV8ntR3m/h6JOFqxuWY9nKACEOAmoo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLv9Qz%2FbtsHV8ntR3m%2Fh6JOFqxuWY9nKACEOAmoo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=R4KMDWzN3XE&amp;amp;t=1976s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=R4KMDWzN3XE&amp;amp;t=1976s&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://white-world.tistory.com/411&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://white-world.tistory.com/411&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jmjmjmz732002/%E5%AE%8C-Github-Action-Docker-EC2-Nginx-%ED%99%9C%EC%9A%A9%ED%95%9C-Springboot-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-7-Github-Actions-CICD-docker-compose&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jmjmjmz732002/%E5%AE%8C-Github-Action-Docker-EC2-Nginx-%ED%99%9C%EC%9A%A9%ED%95%9C-Springboot-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-7-Github-Actions-CICD-docker-compose&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/116</guid>
      <comments>https://bu119.tistory.com/116#entry116comment</comments>
      <pubDate>Wed, 12 Jun 2024 09:00:08 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Nginx 설치하기</title>
      <link>https://bu119.tistory.com/114</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6hVyq/btsHUEmb3Ey/Dts0wsA7HP7DWztjTzjyJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6hVyq/btsHUEmb3Ey/Dts0wsA7HP7DWztjTzjyJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6hVyq/btsHUEmb3Ey/Dts0wsA7HP7DWztjTzjyJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6hVyq%2FbtsHUEmb3Ey%2FDts0wsA7HP7DWztjTzjyJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx를 설치하는 방법에는 두 가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;호스트 시스템에 Nginx를 직접 설치하기&lt;/li&gt;
&lt;li&gt;Nginx를 Docker 컨테이너로 실행하기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 사용하면 서비스와 그 환경을 격리할 수 있기 때문에 호스트 시스템에 영향을 덜 줄 수 있다. 또한,&amp;nbsp; Docker 컨테이너는 환경을 쉽게 복제하고 배포할 수 있으며, 여러 환경에서 일관되게 실행될 수 있도록 도와준다. 따라서 특히 복잡한 환경이나 여러 서비스를 함께 사용하는 경우에는 Docker를 사용하는 것이 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Docker를 사용하면 서비스와 해당 환경을 격리하여, 호스트 시스템에 미치는 영향을 최소화하고, 환경을 쉽게 복제하고 배포할 수 있으며, 관리를 단순화할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 이유로, 우리 프로젝트에서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Docker&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컨테이너로 Nginx를 관리할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;두 가지 방법 모두 작성해놓겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1. Nginx를&amp;nbsp;Docker 컨테이너로 실행하는 방법&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Nginx 이미지 다운로드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Hub에서 Nginx 이미지를 다운로드다.&lt;/p&gt;
&lt;pre id=&quot;code_1717935166826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 최신 버전의 Nginx 이미지를 다운로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, nginx:latest와 같은 이미지를 다운로드하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1717935206694&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull nginx:latest&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718036084039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ docker pull nginx

Using default tag: latest
latest: Pulling from library/nginx
09f376ebb190: Pull complete
5529e0792248: Pull complete
9b3addd3eb3d: Pull complete
57910a8c4316: Pull complete
7b5f78f21449: Pull complete
b7923aa4e8a6: Pull complete
785625911f12: Pull complete
Digest: sha256:0f041234098765asdfghjklxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

ubuntu@ip-000-000-000-000:~$ docker images

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx         latest    4fxxxxxxxxxx   11 days ago     188MB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Nginx 컨테이너 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx 컨테이너를 실행하여 포트 80과 443을 호스트에 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 외부에서 HTTP 및 HTTPS 요청을 처리할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717935140110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name nginx -d -p 80:80 -p 443:443 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용된 옵션 의미 보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--name nginx: 컨테이너의 이름을 nginx로 설정합니다.&lt;/li&gt;
&lt;li&gt;-d: 컨테이너를 백그라운드에서 실행합니다.&lt;/li&gt;
&lt;li&gt;-p 80:80 -p 443:443: 호스트의 80번 포트와 443번 포트를 컨테이너의 80번 포트와 443번 포트로 매핑합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Nginx 서버가 Docker 컨테이너로 실행되며, 호스트의 80번 및 443번 포트로 들어오는 HTTP 및 HTTPS 트래픽이 컨테이너 내의 Nginx로 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Nginx 설치 확인하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx를 설치했다면, 해당 서버의 ip 주소 또는 도메인 주소의 80포트로 접속한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Nginx가 정상적으로 실행되고 있다면 아래의 페이지가 보여진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4GTCP/btsHSTypWD5/QUr0X2QkkZv4l5Gr6VOL5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4GTCP/btsHSTypWD5/QUr0X2QkkZv4l5Gr6VOL5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4GTCP/btsHSTypWD5/QUr0X2QkkZv4l5Gr6VOL5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4GTCP%2FbtsHSTypWD5%2FQUr0X2QkkZv4l5Gr6VOL5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;702&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717935872685&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ docker run --name nginx -d -p 80:80 -p 443:443 nginx
78000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx000000000000

ubuntu@ip-000-000-000-000:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                                             PORTS                                                                                                         NAMES
780000000000   nginx          &quot;/docker-entrypoint.&amp;hellip;&quot;   11 minutes ago   Up 11 m                                   inutes   0.0.0.0:80-&amp;gt;80/tcp, :::80-&amp;gt;80/tcp, 0.0.0.0:443-&amp;gt;443/tcp, :::443-&amp;gt;443/t                                   cp   nginx
460000000000   mysql:latest   &quot;docker-entrypoint.s&amp;hellip;&quot;   2 days ago       Up 2 da                                   ys       0.0.0.0:3306-&amp;gt;3306/tcp, :::3306-&amp;gt;3306/tcp, 33060/tcp                                                          mysql-server&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2. Nginx를 호스트 시스템에 직접 설치하는 방법&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Nginx 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1717934781667&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Ubuntu 패키지 목록 업데이트
sudo apt update

# Nginx 설치
sudo apt install nginx -y&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;-y 옵션의 의미&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어에 -y 옵션이 포함된 경우, 이는 설치 도중 &quot;예&quot;라고 자동으로 응답하겠다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, sudo apt install nginx -y는 Nginx 설치 과정에서 사용자에게 확인을 요구하는 메시지에 자동으로 &quot;예&quot;라고 응답하여 설치를 진행하게 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Nginx가 제대로 설치되었는지 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1717934950021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Nginx 상태 확인
sudo systemctl status nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 Nginx가 실행 중인지 확인하고, 웹 브라우저에서 서버 IP 주소를 입력하여 기본 Nginx 환영 페이지가 나타나는지 확인한다.&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/114</guid>
      <comments>https://bu119.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 9 Jun 2024 22:00:32 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Amazon Lightsail에 가비아 도메인 연결하기</title>
      <link>https://bu119.tistory.com/113</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rf7vP/btsHVc4hhJF/p2aN9WWqWeHp4vPjKv8uO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rf7vP/btsHVc4hhJF/p2aN9WWqWeHp4vPjKv8uO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rf7vP/btsHVc4hhJF/p2aN9WWqWeHp4vPjKv8uO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frf7vP%2FbtsHVc4hhJF%2Fp2aN9WWqWeHp4vPjKv8uO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Amazon Lightsail 도메인 설정하기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;Domains &amp;amp; DNS &lt;/b&gt;탭에 접속한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS Lightsail &amp;gt; Domains &amp;amp; DNS&lt;/b&gt;&amp;nbsp;를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWqhw/btsHSsAfHzg/271RFMVjyTmKK5Lk6wgHRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWqhw/btsHSsAfHzg/271RFMVjyTmKK5Lk6wgHRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWqhw/btsHSsAfHzg/271RFMVjyTmKK5Lk6wgHRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWqhw%2FbtsHSsAfHzg%2F271RFMVjyTmKK5Lk6wgHRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1321&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. Lightsail DNS zone을 생성한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; Amazon Route 53에 새 도메인을 등록하려면 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Register domain&lt;/b&gt;&lt;/span&gt;을 선택하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;다른 곳에 등록된 도메인을 사용하는 경우에는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Create DNS zone&lt;/b&gt;&lt;/span&gt;을 선택하여 도메인을 등록할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;다른 곳에 등록된 도메인을 사용하는 경우,&lt;/span&gt; DNS 영역을 생성하여 Lightsail에 추가할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000716; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #687078;&quot; data-testid=&quot;dnsZones.descriptions.createDnsZoneForExternalRegistration&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가비아&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;에 등록된 도메인을 사용하므로 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Create DNS zone&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #687078; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버튼을 클릭한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YfvaR/btsHR38IlVM/NOfe9HSKCLxlzR0t6hvPs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YfvaR/btsHR38IlVM/NOfe9HSKCLxlzR0t6hvPs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YfvaR/btsHR38IlVM/NOfe9HSKCLxlzR0t6hvPs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYfvaR%2FbtsHR38IlVM%2FNOfe9HSKCLxlzR0t6hvPs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1403&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span data-testid=&quot;dnsZones.titles.createDnsZoneDomainNameSection&quot;&gt;Domain configuration &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocA5N/btsHSammygl/xKGSbQ7eNNR7fIGvJ9VdwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocA5N/btsHSammygl/xKGSbQ7eNNR7fIGvJ9VdwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocA5N/btsHSammygl/xKGSbQ7eNNR7fIGvJ9VdwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FocA5N%2FbtsHSammygl%2FxKGSbQ7eNNR7fIGvJ9VdwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1411&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Domain source&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px; background-color: #ffffff;&quot;&gt;&lt;b&gt;Use a domain from another registrar&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px; background-color: #ffffff;&quot;&gt;을 체크한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;다른 등록기관의 도메인 사용을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; background-color: #ffffff;&quot;&gt;Domain name&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;가비아에서 구매한 도메인 이름을 입력한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력 완료 후&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Create DNS zone&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;를 클릭한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 도메인이 정상적으로 등록되면 DNS zones에 추가된 도메인이 보인다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn1OAb/btsHRHEZ3Zk/ziOh5paGUGlJn3mnwz51Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn1OAb/btsHRHEZ3Zk/ziOh5paGUGlJn3mnwz51Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn1OAb/btsHRHEZ3Zk/ziOh5paGUGlJn3mnwz51Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn1OAb%2FbtsHRHEZ3Zk%2FziOh5paGUGlJn3mnwz51Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1416&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Lightsail 네임서버 확인하기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 도메인 관리에 접속한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3DZm%2FbtsHRLN27g5%2FP6KOYKCasI8Pbk7811ElJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1325&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.&amp;nbsp;등록한 도메인에 할당된 Lightsail 네임서버를 확인한다.&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span data-testid=&quot;shared.generic.connect&quot;&gt;&lt;b&gt;Domains&lt;/b&gt; 탭&lt;/span&gt;&lt;/span&gt;을 누르면 아래의 창이 나온다. 4개의 네임서버를 할당 받았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DUTsl/btsHQ9PpUaf/dTlw1xtkIJ5gF7cBBk9gtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DUTsl/btsHQ9PpUaf/dTlw1xtkIJ5gF7cBBk9gtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DUTsl/btsHQ9PpUaf/dTlw1xtkIJ5gF7cBBk9gtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDUTsl%2FbtsHQ9PpUaf%2FdTlw1xtkIJ5gF7cBBk9gtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1313&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;가비아에 Lightsail 네임서버 등록하기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 가비아 사이트에 접속한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/454bs/btsHTjoOwxo/y3eVaaKMTnPPL8TVk6v7r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/454bs/btsHTjoOwxo/y3eVaaKMTnPPL8TVk6v7r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/454bs/btsHTjoOwxo/y3eVaaKMTnPPL8TVk6v7r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F454bs%2FbtsHTjoOwxo%2Fy3eVaaKMTnPPL8TVk6v7r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;765&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 가비아&amp;nbsp;도메인 관리에 접속한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;가비아&lt;/span&gt;&lt;/span&gt; &amp;gt; My가비아 &amp;gt; 서비스 관리 &lt;/b&gt;를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 도메인을 선택하고 관리를 클릭하면 도메인 관리로 접속된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1PQ4L/btsHSyG2MUs/Fn7ptNrGj2IDzKglSXx2p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1PQ4L/btsHSyG2MUs/Fn7ptNrGj2IDzKglSXx2p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1PQ4L/btsHSyG2MUs/Fn7ptNrGj2IDzKglSXx2p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1PQ4L%2FbtsHSyG2MUs%2FFn7ptNrGj2IDzKglSXx2p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 가비아 네임서버 설정으로 접속한다.&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;네임서버 설정에 접근하는 방법은 두 가지가 있다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;전체 도메인&lt;/b&gt; 탭에서 &lt;b&gt;네임서버&lt;/b&gt; 옆 &lt;b&gt;설정&lt;/b&gt; 버튼을 누른다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도메인 정보 변경&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 탭에서 변경할 &lt;/span&gt;&lt;b&gt;도메인&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;을 &lt;/span&gt;&lt;b&gt;선택&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하고 상단에 &lt;/span&gt;&lt;b&gt;네임서버&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 탭을 누른다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전 잠금 서비스를 신청했다면 인증을 통해 안전 잠금을 풀어야 한다. 네임서버 설정으로 접속할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 방법.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wISpV/btsHRHkEmEk/Vtf9Mz0n6UU6lD5mj8fAZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wISpV/btsHRHkEmEk/Vtf9Mz0n6UU6lD5mj8fAZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wISpV/btsHRHkEmEk/Vtf9Mz0n6UU6lD5mj8fAZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwISpV%2FbtsHRHkEmEk%2FVtf9Mz0n6UU6lD5mj8fAZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1295&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 방법.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vcwlQ/btsHSAkxvKs/fLH2zALo7hk1AykYK25MMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vcwlQ/btsHSAkxvKs/fLH2zALo7hk1AykYK25MMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vcwlQ/btsHSAkxvKs/fLH2zALo7hk1AykYK25MMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvcwlQ%2FbtsHSAkxvKs%2FfLH2zALo7hk1AykYK25MMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1393&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 네임서버 설정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;Lightsail에서 할당해준 네임서버를 등록한다.&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Lightsail에서 할당해준 네임서버를 입력하고 소유자 인증을 해야 적용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcgD8O/btsHSTc5xRd/yexDWre7BAzXjXYlQbh4C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcgD8O/btsHSTc5xRd/yexDWre7BAzXjXYlQbh4C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcgD8O/btsHSTc5xRd/yexDWre7BAzXjXYlQbh4C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcgD8O%2FbtsHSTc5xRd%2FyexDWre7BAzXjXYlQbh4C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1388&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Lightsail&lt;/span&gt; 네임서버가 정상적으로 등록되면 아래와 같은 창이 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpwLDT/btsHSVvcONp/vPfkRYPaxGfOEdrOYjLzy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpwLDT/btsHSVvcONp/vPfkRYPaxGfOEdrOYjLzy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpwLDT/btsHSVvcONp/vPfkRYPaxGfOEdrOYjLzy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpwLDT%2FbtsHSVvcONp%2FvPfkRYPaxGfOEdrOYjLzy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Lightsail&lt;/span&gt; 인스턴스에 도메인 할당하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 준비가 끝난 도메인을 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Lightsail&lt;/span&gt;&amp;nbsp;인스턴스에 할당한다.&lt;/p&gt;
&lt;p id=&quot;the-pasted-async&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;도메인 할당은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AWS Lightsail &amp;gt; Instance &amp;gt; &lt;span style=&quot;text-align: start;&quot;&gt;&lt;span data-testid=&quot;shared.titles.domains&quot;&gt;Domains&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;에서 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인스턴스 Manage를 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/33C5v/btsHRm19ukv/gBSD8y4ciqnvOZw5VLZsKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/33C5v/btsHRm19ukv/gBSD8y4ciqnvOZw5VLZsKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/33C5v/btsHRm19ukv/gBSD8y4ciqnvOZw5VLZsKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F33C5v%2FbtsHRm19ukv%2FgBSD8y4ciqnvOZw5VLZsKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;705&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에 대한 다양한 정보와 함께 아래와 같은 창이 뜬다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk3PaR/btsHR311z1A/ZrWmrD53HtFW5Ejmv2gHPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk3PaR/btsHR311z1A/ZrWmrD53HtFW5Ejmv2gHPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk3PaR/btsHR311z1A/ZrWmrD53HtFW5Ejmv2gHPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk3PaR%2FbtsHR311z1A%2FZrWmrD53HtFW5Ejmv2gHPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;704&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. &lt;span style=&quot;text-align: start;&quot;&gt;Domains &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;탭&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;을 누르면 아래의 창이 나온다.&lt;/span&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7zpyH/btsHSAkx4Kh/Zvn3IL2vAugAfMVkaHhalk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7zpyH/btsHSAkx4Kh/Zvn3IL2vAugAfMVkaHhalk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7zpyH/btsHSAkx4Kh/Zvn3IL2vAugAfMVkaHhalk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7zpyH%2FbtsHSAkx4Kh%2FZvn3IL2vAugAfMVkaHhalk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1409&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; color: #dd6b10; text-align: center; letter-spacing: 0px;&quot;&gt;Assign domain&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 버튼을 클릭하여 할당 도메인을 설정한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq5I7N/btsHS7WrP8l/cLhYd2vO0V6BGyIKPKLoFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq5I7N/btsHS7WrP8l/cLhYd2vO0V6BGyIKPKLoFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq5I7N/btsHS7WrP8l/cLhYd2vO0V6BGyIKPKLoFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq5I7N%2FbtsHS7WrP8l%2FcLhYd2vO0V6BGyIKPKLoFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. &lt;b&gt;AWS Lightsail &amp;gt; Domains &amp;amp; DNS&lt;/b&gt; 에서도 확인 가능하다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AWS Lightsail &amp;gt; Instance &amp;gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span data-testid=&quot;shared.titles.domains&quot;&gt;Domains&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 에서 해당 인스턴스에 도메인을 할당하면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;AWS Lightsail &amp;gt; Domains &amp;amp; DNS&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 보다 덜 복잡하게 설정을 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3DZm/btsHRLN27g5/P6KOYKCasI8Pbk7811ElJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3DZm%2FbtsHRLN27g5%2FP6KOYKCasI8Pbk7811ElJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1325&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuKYbr/btsHR2B9aDF/IaI2S0b3B5ssBRNSv8ImDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuKYbr/btsHR2B9aDF/IaI2S0b3B5ssBRNSv8ImDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuKYbr/btsHR2B9aDF/IaI2S0b3B5ssBRNSv8ImDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuKYbr%2FbtsHR2B9aDF%2FIaI2S0b3B5ssBRNSv8ImDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;862&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo4ysD/btsHSX7ybSh/ytU4cDhxxCP5qrTskqAy6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo4ysD/btsHSX7ybSh/ytU4cDhxxCP5qrTskqAy6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo4ysD/btsHSX7ybSh/ytU4cDhxxCP5qrTskqAy6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo4ysD%2FbtsHSX7ybSh%2FytU4cDhxxCP5qrTskqAy6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;878&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bluescoder.com/amazon-lightsail%EC%97%90-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bluescoder.com/amazon-lightsail%EC%97%90-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gogowithsoo.tistory.com/entry/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-AWS-lightsail-%EC%97%90-%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gogowithsoo.tistory.com/entry/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-AWS-lightsail-%EC%97%90-%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@yeonju0511/AWS-lightsail-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@yeonju0511/AWS-lightsail-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/113</guid>
      <comments>https://bu119.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 8 Jun 2024 18:00:30 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] 가비아 도메인 구매하기</title>
      <link>https://bu119.tistory.com/112</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIdDuF/btsHUeosbSZ/NZPx3ALTs39jRu20eFMvK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIdDuF/btsHUeosbSZ/NZPx3ALTs39jRu20eFMvK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIdDuF/btsHUeosbSZ/NZPx3ALTs39jRu20eFMvK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIdDuF%2FbtsHUeosbSZ%2FNZPx3ALTs39jRu20eFMvK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;가비아 사이트에 접속하여 도메인을 구매하기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 가비아 사이트에 접속한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.gabia.com&quot;&gt;https://www.gabia.com&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1717769321620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;웹을 넘어 클라우드로. 가비아&quot; data-og-description=&quot;그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브&quot; data-og-host=&quot;www.gabia.com&quot; data-og-source-url=&quot;https://www.gabia.com&quot; data-og-url=&quot;https://www.gabia.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DLvfr/hyWgYEUU4F/83o6TMlts4ulnzkNUPV5Bk/img.jpg?width=1200&amp;amp;height=1000&amp;amp;face=0_0_1200_1000&quot;&gt;&lt;a href=&quot;https://www.gabia.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.gabia.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DLvfr/hyWgYEUU4F/83o6TMlts4ulnzkNUPV5Bk/img.jpg?width=1200&amp;amp;height=1000&amp;amp;face=0_0_1200_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;웹을 넘어 클라우드로. 가비아&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.gabia.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lsfWr/btsHR7XeDfB/kO15tduba61ccfzCaHbH60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lsfWr/btsHR7XeDfB/kO15tduba61ccfzCaHbH60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lsfWr/btsHR7XeDfB/kO15tduba61ccfzCaHbH60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlsfWr%2FbtsHR7XeDfB%2FkO15tduba61ccfzCaHbH60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 도메인 검색창에 원하는 도메인을 입력한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용가능한 도메인 목록이 가격과 함께 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qumZk/btsPIqh4gFm/KBrmszznM38icpwPCKmT81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qumZk/btsPIqh4gFm/KBrmszznM38icpwPCKmT81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qumZk/btsPIqh4gFm/KBrmszznM38icpwPCKmT81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqumZk%2FbtsPIqh4gFm%2FKBrmszznM38icpwPCKmT81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1391&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 마음에 드는 도메인을 선택하여 신청한다.&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리 프로젝트가 안드로이드 앱이기 때문에 사용자는 도메인을 직접 볼 수 없다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 '오늘의 도메인'에서 할인된 가격의 도메인 중에서 선택하여 구매할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TDKH2/btsPKFL3iZg/7lxwAcokU9AN3TiRSB2N81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TDKH2/btsPKFL3iZg/7lxwAcokU9AN3TiRSB2N81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TDKH2/btsPKFL3iZg/7lxwAcokU9AN3TiRSB2N81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTDKH2%2FbtsPKFL3iZg%2F7lxwAcokU9AN3TiRSB2N81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 도메인 서비스 신청하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 신청을 위한 정보 입력과 선택을 필요로 하는 창이 나온다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서비스 관리 정보
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;추후에 변경가능하기 때문에, 일단 가비아 네임서버 사용을 등록한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;부가서비스 추가&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;무료 서비스&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;동시 신청 가능 서비스&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;유료 서비스&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRyKke/btsPK4SkTsG/ykmo9WYHfA18RMdeUgG3LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRyKke/btsPK4SkTsG/ykmo9WYHfA18RMdeUgG3LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRyKke/btsPK4SkTsG/ykmo9WYHfA18RMdeUgG3LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRyKke%2FbtsPK4SkTsG%2Fykmo9WYHfA18RMdeUgG3LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1234&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buQK0l/btsPKmlr3Id/K0UzWkvMuexyPzZLZuy2P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buQK0l/btsPKmlr3Id/K0UzWkvMuexyPzZLZuy2P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buQK0l/btsPKmlr3Id/K0UzWkvMuexyPzZLZuy2P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuQK0l%2FbtsPKmlr3Id%2FK0UzWkvMuexyPzZLZuy2P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1260&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci8din/btsHRZLYa2z/6s3VkZgpTXKfGT11MRkoQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci8din/btsHRZLYa2z/6s3VkZgpTXKfGT11MRkoQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci8din/btsHRZLYa2z/6s3VkZgpTXKfGT11MRkoQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci8din%2FbtsHRZLYa2z%2F6s3VkZgpTXKfGT11MRkoQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1237&quot; height=&quot;1142&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/112</guid>
      <comments>https://bu119.tistory.com/112#entry112comment</comments>
      <pubDate>Sat, 8 Jun 2024 09:00:01 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] MySQL 새로운 계정 만들기</title>
      <link>https://bu119.tistory.com/111</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy2Caz/btsHSCcWwO5/LFp1tdFaEgyzvuaIKatkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy2Caz/btsHSCcWwO5/LFp1tdFaEgyzvuaIKatkm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy2Caz/btsHSCcWwO5/LFp1tdFaEgyzvuaIKatkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy2Caz%2FbtsHSCcWwO5%2FLFp1tdFaEgyzvuaIKatkm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;MySQL 새로운 계정 생성하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 데이터베이스에 접속할 때 root 계정을 사용하는 것은 일반적으로 보안상 권장되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;MySQL에서 &lt;/span&gt;root&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt; 계정 대신 사용할 새로운 계정을 생성하는 것은 좋은 보안 관행이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;1. MySQL에 root 계정으로 로그인하기&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;먼저, root 계정 또는 다른 관리자 권한을 가진 계정으로 MySQL 서버에 로그인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1717739489217&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사용된 옵션 의미 보기&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; &lt;/span&gt;-u root :&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&amp;nbsp;사용자 이름이 &lt;/span&gt;root&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;임을 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-p :&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; MySQL에 로그인할 때 비밀번호를 입력하라는 프롬프트가 나타나게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718035417604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ docker exec -it mysql-server bash

bash-5.1# mysql -u root -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. MySQL&amp;nbsp; 사용자 계정 조회하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 다음 SQL 명령어를 실행하여 현재 존재하는 사용자 계정을 조회할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SELECT User, Host FROM mysql.user;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mysql 데이터베이스의 user 테이블에서 사용자 이름(User)과 호스트(Host) 정보를 가져온다.&lt;/li&gt;
&lt;li&gt;결과는 현재 MySQL 서버에 존재하는 사용자 계정 목록을 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 나누어 실행하면 아래와 같이 된다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; use mysql;
mysql&amp;gt; select host, user from user;&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SELECT User, Host FROM mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 새로운 사용자 계정 생성하기&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 사용자를 생성하려면 다음과 같은 SQL 명령어를 사용하여 새 사용자 이름과 비밀번호를 설정해야한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 사용자를 어떤 호스트에 생성할지 지정할 수 있다.&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;localhost, &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;특정 호스트&lt;/span&gt;, 모든&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&amp;nbsp;호스트&lt;/span&gt; 크게 3가지로 구분된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;localhost에서만&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 접속할 수 있도록 제한&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;데이터베이스 서버를 로컬 컴퓨터에서 운영할 때, &lt;/span&gt;localhost&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;를 사용하여 그 서비스에 접근할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717739634465&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE USER '새사용자이름'@'localhost' IDENTIFIED BY '비밀번호';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`새사용자이름` 칸에 입력하는 이름을 가진 사용자를 생성하고,&lt;/li&gt;
&lt;li&gt;해당 사용자에게 로그인시 사용할 비밀번호를 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;예를 들어, MySQL 데이터베이스 서버를 자신의 컴퓨터에 설치하고 운영 중이라면, &lt;/span&gt;localhost&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;를 사용하여 해당 데이터베이스 서버에 접속할 수 있다. 이 경우, &lt;/span&gt;localhost&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;는 바로 그 컴퓨터를 가리키며, 다른 컴퓨터나 외부 네트워크를 통하지 않고 직접 로컬에서 접근하는 것을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 특정 호스트에서만 접속할 수 있도록 제한&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718035836906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE USER '새사용자이름'@'특정호스트' IDENTIFIED BY '비밀번호';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 특정 호스트에서만 접속하도록 제한하고 싶다면, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;해당 호스트의 IP 주소나 도메인을 입력&lt;/span&gt;한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;모든 호스트에서 접속할 수 있도록 설정&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;외부에서의 접속을 허용하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'localhost'&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'%'&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;CREATE USER '새사용자이름'@'%' IDENTIFIED BY '비밀번호';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;는 모든 주소를 나타내며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;모든 호스트에서 접속할 수 있도록 설정한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;새로운 사용자 계정을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mysql&amp;gt; CREATE USER 'admin'@'%' IDENTIFIED BY '비밀번호123';
Query OK, 0 rows affected (0.03 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;현재 존재하는 사용자 계정을 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SELECT User, Host FROM mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| admin            | %         |
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 새 사용자에게 데이터베이스 권한 부여하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;새 사용자가 데이터베이스에 대해 수행할 수 있는 작업을 정의하려면 권한을 부여해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;새 사용자가 &lt;b&gt;특정&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 데이터베이스의 &lt;b&gt;모든 테이블&lt;/b&gt;에 대해&amp;nbsp;&lt;b&gt;모든 권한&lt;/b&gt;을 갖기를 원한다면 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;b&gt;'특정 데이터베이스 이름'.*&lt;/b&gt;을 사용한다.&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON mydb.* TO '새사용자이름'@'localhost';&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1717742507782&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON mydb.* TO '새사용자이름'@'%';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;/span&gt;mydb&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 데이터베이스의 &lt;b&gt;모든 테이블&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;에 대해 &lt;/span&gt;새 &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;사용자가 모든 작업을 수행할 수 있는 권한을 부여한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;즉,&amp;nbsp;해당 사용자에게 mydb&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;데이터베이스의 모든 권한을 부여한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 새 사용자가 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;b&gt;모든&lt;/b&gt; 데이터베이스의 &lt;b&gt;모든 테이블&lt;/b&gt;에 대해&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;모든 권한&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;을 갖기를 원한다면&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;*.*를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON *.* TO '새사용자이름'@'localhost';&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1717742537884&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON *.* TO '새사용자이름'@'%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용된 옵션 의미 보기&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PRIVILEGES ON&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;: 모든 DB 권한을 준다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;GRANT SELECT, INSERT, UPDATE ON : 특정 권한(CRU)을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;계정에 &lt;/span&gt;pomodoro&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt; 데이터베이스에 대한 모든 권한을 부여한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; GRANT ALL PRIVILEGES ON pomorodo.* TO 'admin'@'%';
Query OK, 0 rows affected (0.00 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 변경사항 적용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경된 권한을 즉시 적용하기 위해 아래 명령을 실행한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;FLUSH PRIVILEGES;
&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.&amp;nbsp; 새 사용자 권한 확인하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 특정 사용자에게 부여된 권한을 확인하는 쿼리이다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SHOW GRANTS FOR '새사용자이름'@'hostname';&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SHOW GRANTS FOR '새사용자이름'@'%';&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 권한 부여 이전&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW GRANTS FOR 'admin'@'%';
+-----------------------------------+
| Grants for admin@%                |
+-----------------------------------+
| GRANT USAGE ON *.* TO `admin`@`%` |
+-----------------------------------+
1 row in set (0.00 sec)&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;2. pomorodo DB에 대한 권한 부여 후&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW GRANTS FOR 'admin'@'%';
+-----------------------------------------------------+
| Grants for admin@%                                  |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO `admin`@`%`                   |
| GRANT ALL PRIVILEGES ON `pomorodo`.* TO `admin`@`%` |
+-----------------------------------------------------+
2 rows in set (0.00 sec)&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;3. 모든 권한을 부여하면&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW GRANTS FOR 'admin'@'%';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for admin@%                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `admin`@`%`                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| GRANT ALLOW_NONEXISTENT_DEFINER,APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_ANY_DEFINER,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,TRANSACTION_GTID_TAG,XA_RECOVER_ADMIN ON *.* TO `admin`@`%` |
| GRANT ALL PRIVILEGES ON `pomorodo`.* TO `admin`@`%`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 새 사용자 접속 테스트&lt;/h4&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;mysql -u 새사용자이름 -p&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717743651413&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bash-5.1# mysql -u admin -p
Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 사용자 삭제하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;DROP USER '새사용자이름'@'localhost';&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;DROP USER '새사용자이름'@'%';&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;mysql&amp;gt; DROP USER 'admin'@'%';
Query OK, 0 rows affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 권한 회수하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한을 회수하려면 REVOKE 문을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 'admin' 사용자에게 부여한 모든 권한 회수한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%';
&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;2. 'admin' 사용자에게 부여한 'pomorodo' 데이터베이스에 대한 모든 권한 취소한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;REVOKE ALL PRIVILEGES ON pomorodo.* FROM 'admin'@'%';&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 모든 권한 회수&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;mysql&amp;gt; REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%';
Query OK, 0 rows affected (0.01 sec)
&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;2. 권한 확인&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW GRANTS FOR 'admin'@'%';
+-----------------------------------+
| Grants for admin@%                |
+-----------------------------------+
| GRANT USAGE ON *.* TO `admin`@`%` |
+-----------------------------------+
1 row in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/111</guid>
      <comments>https://bu119.tistory.com/111#entry111comment</comments>
      <pubDate>Fri, 7 Jun 2024 16:00:39 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Docker로 MySQL 데이터베이스 구축하기</title>
      <link>https://bu119.tistory.com/110</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGdGxz/btsHUvDuD27/J19viysMWL6sP5wEwvk75k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGdGxz/btsHUvDuD27/J19viysMWL6sP5wEwvk75k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGdGxz/btsHUvDuD27/J19viysMWL6sP5wEwvk75k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGdGxz%2FbtsHUvDuD27%2FJ19viysMWL6sP5wEwvk75k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Docker에 MySQL 컨테이너 띄우기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Lightsail에서 MySQL을 연결할 서버 포트 열기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWkXy/btsHP0ybEaM/O3IKmlUwWeZghAyXiIxYrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWkXy/btsHP0ybEaM/O3IKmlUwWeZghAyXiIxYrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWkXy/btsHP0ybEaM/O3IKmlUwWeZghAyXiIxYrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWkXy%2FbtsHP0ybEaM%2FO3IKmlUwWeZghAyXiIxYrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;765&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Docker Hub에서 MySQL Image 다운받기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hub.docker.com/_/mysql&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717738068905&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;mysql - Official Image | Docker Hub&quot; data-og-description=&quot;Quick reference Supported tags and respective Dockerfile links 8.4.0, 8.4, 8, lts, latest, innovation, 8.4.0-oraclelinux9, 8.4-oraclelinux9, 8-oraclelinux9, lts-oraclelinux9, oraclelinux9, innovation-oraclelinux9, 8.4.0-oracle, 8.4-oracle, 8-oracle, lts-or&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/_/mysql&quot; data-og-url=&quot;https://hub.docker.com/_/mysql&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/_/mysql&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;mysql - Official Image | Docker Hub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Quick reference Supported tags and respective Dockerfile links 8.4.0, 8.4, 8, lts, latest, innovation, 8.4.0-oraclelinux9, 8.4-oraclelinux9, 8-oraclelinux9, lts-oraclelinux9, oraclelinux9, innovation-oraclelinux9, 8.4.0-oracle, 8.4-oracle, 8-oracle, lts-or&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;docker pull mysql&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 명령어로 MySQL Docker 이미지를 다운로드한다.&lt;/li&gt;
&lt;li&gt;특정 버전을 적지 않으면, 최신 버전을 설치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718032647859&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ docker pull mysql

Using default tag: latest
latest: Pulling from library/mysql
07bc88e18c4a: Pull complete
1a9c1668bf49: Pull complete
1021dda8eecf: Pull complete
fb61b56acac1: Pull complete
0bca83908a5b: Pull complete
165e8b3d37ca: Pull complete
3e1b086f1295: Pull complete
dba651668484: Pull complete
ed90f5355e12: Pull complete
0412f59ab2b5: Pull complete
Digest: sha256:aa0123456789asdfghjklxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

ubuntu@ip-000-000-000-000:~$ docker images

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    fcaaa1234xxx   5 weeks ago     578MB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 다운받은 Image로 MySQL Docker 컨테이너 생성하기&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo docker run --name 컨테이너이름 -e MYSQL_ROOT_PASSWORD=비밀번호 -d -p 3306:3306 mysql:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용된 옵션 의미 보기&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sudo docker run : Docker 컨테이너를 실행&lt;/li&gt;
&lt;li&gt;-d : 컨테이너를 백그라운드에서 실행 (detached 모드)&lt;/li&gt;
&lt;li&gt;-p : 포트 (외부포트 : Docker 내부포트)&lt;/li&gt;
&lt;li&gt;-p 3306:3306 : 호스트의 3306 포트를 컨테이너의 3306 포트로 연결.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;MySQL 서버에 호스트에서 접속할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-e : 환경변수 (PASSWORD) 설정&lt;/li&gt;
&lt;li&gt;-e MYSQL_ROOT_PASSWORD=P@ssw0rd : 테이너의 환경 변수를 설정
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;MySQL 루트 사용자의 비밀번호를 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-name : 생성할 컨테이너 이름&lt;/li&gt;
&lt;li&gt;-name mysql-container : 컨테이너에 이름을 지정 (&quot;mysql-container&quot;라는 이름을 사용)&lt;/li&gt;
&lt;li&gt;mysql:latest : 실행할 도커 이미지의 이름
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;여러 버전의 mysql이 있다면, 'Tag'로 구분할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717736711359&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

ubuntu@ip-000-000-000:~$ docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=pomoro-d0@0517 -d -p 3306:3306 mysql:latest
1234567asdfghj??????????????????????????????????????????????&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Docker에서 MySQL로 접속하기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Docker MySQL 컨테이너에 접속하기&lt;/h4&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;sudo docker exec -it ${mysql-container 이름} bash
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;root@{containerName}:/# 으로 진입한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. MySQL에 관리자로 접속하기&lt;/h4&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL 루트로 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000:~$ docker exec -it mysql-server bash

bash-5.1# mysql -u root -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Enter password: 에 비밀번호 입력 (입력이 보이지 않음)&lt;/li&gt;
&lt;li&gt;명령어를 입력한 후, 패스워드를 입력하면&amp;nbsp;mysql&amp;gt;&amp;nbsp;로 진입한 것을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 현재 Database 리스트 확인하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW DATABASES;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; show databases;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)&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;위와 같이 자동으로 생성된 4개의 Database가 보인다.&amp;nbsp;MySQL Container는 생성하였지만 Database를 만들지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 직접 사용할 새로운 Database를 생성해보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 새로운 Database 생성하기&lt;/h4&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE DATABASE [DB이름]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;create database [DB이름];
&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; CREATE DATABASE pomorodo;
Query OK, 1 row affected (0.01 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'pomorodo'라는 이름을 가진 Database를 생성한다.&lt;/li&gt;
&lt;li&gt;추후 프로젝트의 application.yml에서 Database 환경설정을 변경해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 생성된 새로운 DB 확인하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW DATABASES;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mysql&amp;gt; show databases;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pomorodo           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717591992644&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql&amp;gt; CREATE DATABASE pomorodo;
Query OK, 1 row affected (0.00 sec)

mysql&amp;gt; SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pomorodo           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/110</guid>
      <comments>https://bu119.tistory.com/110#entry110comment</comments>
      <pubDate>Fri, 7 Jun 2024 15:00:05 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] 현재 사용자에게 Docker 접근 권한 부여하기</title>
      <link>https://bu119.tistory.com/109</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCqZrJ/btsHTl2HGpX/GjVwzc0YJfYeCsl3kD5DuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCqZrJ/btsHTl2HGpX/GjVwzc0YJfYeCsl3kD5DuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCqZrJ/btsHTl2HGpX/GjVwzc0YJfYeCsl3kD5DuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCqZrJ%2FbtsHTl2HGpX%2FGjVwzc0YJfYeCsl3kD5DuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;현재&amp;nbsp;사용자에게 도커 접근 권한 주기&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 현재 사용자 Docker 그룹에 추가하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용자를 Docker 그룹에 추가하여 Docker 소켓에 액세스할 수 있는 권한을 부여한다. 이렇게 하면 sudo를 사용하지 않고도 Docker 명령을 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo usermod -aG docker $USER&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;이 명령어는 현재 로그인한 사용자&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;를 docker 그룹에 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$USER는 현재 로그인한 사용자를 가리킨다.&lt;/li&gt;
&lt;li&gt;docker 그룹은 Docker 명령어를 실행할 수 있는 권한을 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용된 옵션 의미 보기&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sudo : 리눅스나 맥 OS에서 관리자 권한으로 실행할 때 사용하는 명령어&lt;/li&gt;
&lt;li&gt;usermod : 사용자 계정을 수정하는 명령어&lt;/li&gt;
&lt;li&gt;-aG docker : 사용자를 &quot;docker&quot; 그룹에 추가하는 옵션&lt;/li&gt;
&lt;li&gt;$USER :&amp;nbsp;&lt;span style=&quot;color: #1a1918; text-align: left;&quot;&gt;&amp;nbsp;현재 로그인한 사용자 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 위의 명령어는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo; &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: left;&quot;&gt;현재 로그인한 사용자&lt;/span&gt; ($USER)&quot; 를 Docker 그룹에 추가하여,&lt;/li&gt;
&lt;li&gt;일반 사용자 권한으로도 Docker 명령어를 실행할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 함으로써, Docker 명령어를 실행하기 위해 항상 root 계정으로 로그인하지 않아도 되므로, 보안 상의 이점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;Docker 그룹의 변경 사항을 반영하기&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;현재&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용자(&lt;b&gt;ubuntu&lt;/b&gt;)를 로그아웃한 다음 다시 로그인하거나, 새로운 터미널 세션을 시작하면 변경 사항이 적용된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉, 현재&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용자(&lt;b&gt;ubuntu&lt;/b&gt;)로 로그인된 상태에서 &lt;b&gt;sudo&lt;/b&gt;를 사용하지 않고도 Docker 명령을 실행할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;특정 사용자를 Docker 그룹에 추가하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;사용자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;ubuntu&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;가 현재 로그인되어 있지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;없이도 특정 작업을 수행하려면 사용자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;ubuntu&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 Docker 그룹에 추가하여 Docker 명령을 실행할 수 있도록 권한을 부여할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이렇게 하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 사용하지 않고도 Docker 명령을 실행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 특정 사용자 Docker 그룹에 추가하기&lt;/h4&gt;
&lt;pre id=&quot;code_1717744909798&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG docker 특정사용자이름&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;실습&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo usermod -aG docker bu

usermod: user 'bu' does not exist&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;에러 발생  &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'bu' 사용자가 존재하지 않는다는 메시지가 나타났다.&lt;/p&gt;
&lt;pre id=&quot;code_1718029286644&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user 'bu' does not exist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 사용자를 잘못 입력했거나 해당 사용자가 시스템에 존재하지 않는 경우 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자를 Docker 그룹에 추가하려면 실제로 존재하는 사용자를 대상으로 명령을 실행해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; &amp;nbsp;의문&amp;nbsp;발생  &lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 현재 사용자 이름 확인하기&lt;/h4&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo whoami&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo whoami

root&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt; &amp;nbsp;의문&amp;nbsp;해결  &lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;❗여기에서 로그인된 사용자는 ubuntu인데 실제 사용자가 root로 나타나는 이유는?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 &lt;b&gt;ubuntu&lt;/b&gt; 는 현재 시스템에서 로그인된 사용자이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어는 일시적으로 &lt;b&gt;root&lt;/b&gt; 권한을 얻어 특정 명령어를 실행할 수 있도록 하는 도구이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 &lt;b&gt;ubuntu&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;는 일반 사용자이며, 시스템 관리 작업과 같은 특정 작업을 수행하기 위해서는 일반적으로 &lt;b&gt;root&lt;/b&gt; 권한이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;sudo&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; whoami를 실행하면 현재 사용자인 &lt;b&gt;ubuntu&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;가 &lt;b&gt;sudo&lt;/b&gt; 를 통해 일시적으로 &lt;b&gt;root&lt;/b&gt; 권한을 얻어서 &lt;b&gt;whoami&lt;/b&gt; 명령어를 실행한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;에러 해결  &lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 현재 로그인한 실제 사용자의 정보 확인하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용자 이름을 확인하려면 다음 명령을 사용하여 현재 로그인한 사용자의 정보를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;whoami
&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ whoami

ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 현재 사용자를 명시적으로 Docker 그룹에 추가하기&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 로그인한 실제 사용자 이름은 ubuntu이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu를 명시적으로 Docker 그룹에 추가하여 Docker를 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo usermod -aG docker ubuntu
&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;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo usermod -aG docker ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;Docker 그룹의 변경 사항을 반영하기&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;현재&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용자(&lt;b&gt;ubuntu&lt;/b&gt;)를 로그아웃한 다음 다시 로그인하거나, 새로운 터미널 세션을 시작하면 변경 사항이 적용된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉, 현재&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용자(&lt;b&gt;ubuntu&lt;/b&gt;)로 로그인된 상태에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sudo&lt;/b&gt;를 사용하지 않고도 Docker 명령을 실행할 수 있게 된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; &amp;nbsp;의문&amp;nbsp;발생  &lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;새로운 사용자를 생성하는 것과 현재 사용자인 &lt;b&gt;ubuntu&lt;/b&gt;를 그대로 사용하여 Docker 접근 권한을 부여하는 것 간의 차이는?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 사용자를 생성하고 해당 사용자를 Docker 그룹에 추가하여 Docker를 사용할 수 있도록 권한을 부여하는 것과&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 사용자인&amp;nbsp;&lt;b&gt;ubuntu&lt;/b&gt;를 Docker 그룹에 추가하는 것 간의 차이는 크게 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 경우 모두 Docker를 사용할 수 있는 사용자를 생성하고 권한을 부여하는 것이며, 이를 통해 보다 세분화된 사용자 관리 및 보안을 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;해당 사용자를 Docker 그룹에서 제거하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자를 Docker 그룹에서 제거하려면 &lt;b&gt;gpasswd&lt;/b&gt; 명령을 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;sudo gpasswd -d ${USER} docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 주의해야 할 점&lt;/b&gt;&lt;/span&gt;은,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 그룹에서 사용자를 제거하더라도 해당 사용자가 이미 Docker 컨테이너를 실행하고 있는 경우에는 여전히 해당 컨테이너에 대한 접근이 허용될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, Docker 그룹에서 사용자를 제거한 후에는 사용자가 이미 실행 중인 Docker 작업을 모니터링하고 관리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@ip-000-000-000-000:~$ sudo gpasswd -d ubuntu docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용자 &lt;b&gt;ubuntu&lt;/b&gt;를 Docker 그룹에서 제거할 수 있다.&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/109</guid>
      <comments>https://bu119.tistory.com/109#entry109comment</comments>
      <pubDate>Wed, 5 Jun 2024 23:00:40 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Ubuntu에 Docker 엔진 설치하기</title>
      <link>https://bu119.tistory.com/108</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DEBZo/btsHUdQHcW2/9kgx0VIz7kbEKKFJHZ3jRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DEBZo/btsHUdQHcW2/9kgx0VIz7kbEKKFJHZ3jRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DEBZo/btsHUdQHcW2/9kgx0VIz7kbEKKFJHZ3jRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDEBZo%2FbtsHUdQHcW2%2F9kgx0VIz7kbEKKFJHZ3jRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Docs 를 참고하여 &lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;Amazon Lightsail&lt;/span&gt; Ubuntu에 Docker를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;Install Docker Engine on Ubuntu&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717588952411&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install Docker Engine on Ubuntu&quot; data-og-description=&quot;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxCeF6/hyWgXFle6E/5pg1fYZwDrWA2YTgVRyUx1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxCeF6/hyWgXFle6E/5pg1fYZwDrWA2YTgVRyUx1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install Docker Engine on Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Uninstall old versions (이전 버전 제거)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker Engine을 설치하기 전에 충돌하는 패키지를 제거해야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Linux 배포판에서 비공식 Docker 패키지를 제공할 수 있으며, 이는 Docker에서 제공하는 공식 패키지와 충돌할 수 있습니다. Docker Engine 공식 버전을 설치하기 전에 이러한 패키지를 제거해야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: start;&quot;&gt;다음 명령을 실행하여 충돌하는 모든 패키지를 제거합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Install using the apt repository (apt 저장소를 사용하여 설치)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 호스트 머신에 Docker Engine을 처음 설치하기 전에 Docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;apt저장소를 설정해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 해당 저장소에서 Docker를 설치하고 업데이트할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;apt저장소를 설정합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Install Docker Engine (docker 엔진 설치)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: left;&quot;&gt;2. Docker 패키지를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: oklab(0.62773 -0.0236212 -0.174 / 0.02); color: oklch(0.373 0.034 259.733); text-align: left;&quot;&gt;최신 버전을 설치하려면 다음을 실행하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이미지를 실행하여 설치가 성공적으로 완료되었는지 확인하세요&lt;span&gt; &quot;&lt;/span&gt;hello-world&quot;.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: left;&quot;&gt;이 명령은 테스트 이미지를 다운로드하여 컨테이너에서 실행합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: oklch(0.373 0.034 259.733); text-align: left;&quot;&gt;컨테이너가 실행되면 확인 메시지를 출력하고 종료됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Docker 버전 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;sudo docker version
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/108</guid>
      <comments>https://bu119.tistory.com/108#entry108comment</comments>
      <pubDate>Wed, 5 Jun 2024 22:00:52 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Lightsail 인스턴스에 SSH로 액세스</title>
      <link>https://bu119.tistory.com/107</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2s73o/btsHTiylVns/MEMrtIUXWvieK1SWeWdEz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2s73o/btsHTiylVns/MEMrtIUXWvieK1SWeWdEz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2s73o/btsHTiylVns/MEMrtIUXWvieK1SWeWdEz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2s73o%2FbtsHTiylVns%2FMEMrtIUXWvieK1SWeWdEz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;MobaXterm을 활용하여 Lightsail 인스턴스에 SSH로 접속할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1a1918; text-align: start;&quot;&gt; &lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;MobaXterm&lt;/span&gt; &amp;nbsp;다운로드하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;MobaXterm을 공식 홈페이지에서 다운로드한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1918; text-align: start;&quot;&gt;&lt;a href=&quot;https://mobaxterm.mobatek.net/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mobaxterm.mobatek.net/download.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718036987780&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MobaXterm free Xserver and tabbed SSH client for Windows&quot; data-og-description=&quot;The ultimate toolbox for remote computing - includes X server, enhanced SSH client and much more!&quot; data-og-host=&quot;mobaxterm.mobatek.net&quot; data-og-source-url=&quot;https://mobaxterm.mobatek.net/download.html&quot; data-og-url=&quot;https://mobaxterm.mobatek.net/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSzjwu/hyWgYrXTtt/SCphUqk7UaTvkqQU0diz1k/img.png?width=764&amp;amp;height=489&amp;amp;face=0_0_764_489,https://scrap.kakaocdn.net/dn/iKYTc/hyWlih0wM4/xenKEIKFDyFgHYQKks0QTK/img.png?width=768&amp;amp;height=443&amp;amp;face=0_0_768_443,https://scrap.kakaocdn.net/dn/JXyqP/hyWg9NOhcd/VK4UO4ykIXfoJfHgMRAVl1/img.png?width=768&amp;amp;height=443&amp;amp;face=0_0_768_443&quot;&gt;&lt;a href=&quot;https://mobaxterm.mobatek.net/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mobaxterm.mobatek.net/download.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSzjwu/hyWgYrXTtt/SCphUqk7UaTvkqQU0diz1k/img.png?width=764&amp;amp;height=489&amp;amp;face=0_0_764_489,https://scrap.kakaocdn.net/dn/iKYTc/hyWlih0wM4/xenKEIKFDyFgHYQKks0QTK/img.png?width=768&amp;amp;height=443&amp;amp;face=0_0_768_443,https://scrap.kakaocdn.net/dn/JXyqP/hyWg9NOhcd/VK4UO4ykIXfoJfHgMRAVl1/img.png?width=768&amp;amp;height=443&amp;amp;face=0_0_768_443');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MobaXterm free Xserver and tabbed SSH client for Windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The ultimate toolbox for remote computing - includes X server, enhanced SSH client and much more!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mobaxterm.mobatek.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Lightsail 개인키 다운로드하기&lt;/span&gt;&lt;/h2&gt;
&lt;p id=&quot;the-pasted-async&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인키는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AWS Lightsail &amp;gt; Instance &amp;gt; Connect&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하단에서 다운로드할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인스턴스 Manage를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btgHtR/btsHOgA1qi2/tlU9ZJMCAzgtHLVD0vK4c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btgHtR/btsHOgA1qi2/tlU9ZJMCAzgtHLVD0vK4c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btgHtR/btsHOgA1qi2/tlU9ZJMCAzgtHLVD0vK4c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtgHtR%2FbtsHOgA1qi2%2FtlU9ZJMCAzgtHLVD0vK4c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;705&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에 대한 다양한 정보와 함께 아래와 같은 창이 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAHz2/btsHPQAWbG5/5F8rs5De5zfRwkWTOlY7Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAHz2/btsHPQAWbG5/5F8rs5De5zfRwkWTOlY7Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAHz2/btsHPQAWbG5/5F8rs5De5zfRwkWTOlY7Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAHz2%2FbtsHPQAWbG5%2F5F8rs5De5zfRwkWTOlY7Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;704&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;text-align: start;&quot;&gt;&lt;span data-testid=&quot;shared.generic.connect&quot;&gt;Connect 탭&lt;/span&gt;&lt;/span&gt;을 누르면 아래의 창이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MuMjx/btsHQmlInGb/1KYTfEGvsNxYIqGX6ZqWmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MuMjx/btsHQmlInGb/1KYTfEGvsNxYIqGX6ZqWmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MuMjx/btsHQmlInGb/1KYTfEGvsNxYIqGX6ZqWmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMuMjx%2FbtsHQmlInGb%2F1KYTfEGvsNxYIqGX6ZqWmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1398&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; color: #dd6b10; text-align: center;&quot;&gt;Download default key&lt;span style=&quot;color: #000000;&quot;&gt;를 클릭하여 pem 키를 다운로드한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pGMRi/btsHQndPD4r/SdZv5ML9CjYel5akMFtAk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pGMRi/btsHQndPD4r/SdZv5ML9CjYel5akMFtAk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pGMRi/btsHQndPD4r/SdZv5ML9CjYel5akMFtAk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpGMRi%2FbtsHQndPD4r%2FSdZv5ML9CjYel5akMFtAk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1a1918; text-align: start;&quot;&gt;&lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;MobaXter&lt;span style=&quot;background-color: #f6e199;&quot;&gt;m을 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;Lightsail 인스턴스에 SSH로 접속하기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;&lt;span style=&quot;color: #1a1918; text-align: start;&quot;&gt;MobaXterm 실행한다.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVawhD/btsHOY0SOVD/afqRAhdCghAcgO1cEP7ma1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVawhD/btsHOY0SOVD/afqRAhdCghAcgO1cEP7ma1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVawhD/btsHOY0SOVD/afqRAhdCghAcgO1cEP7ma1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVawhD%2FbtsHOY0SOVD%2FafqRAhdCghAcgO1cEP7ma1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1977&quot; height=&quot;1087&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1087&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Session을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEN5s/btsHP2gPjJO/XQ3eOjpvA5BdaYucNfn8Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEN5s/btsHP2gPjJO/XQ3eOjpvA5BdaYucNfn8Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEN5s/btsHP2gPjJO/XQ3eOjpvA5BdaYucNfn8Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEN5s%2FbtsHP2gPjJO%2FXQ3eOjpvA5BdaYucNfn8Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1977&quot; height=&quot;1087&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1087&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. SSH를 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIXjLR/btsHPebfXfS/fMgT28UFqmAjPGYGEGKrk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIXjLR/btsHPebfXfS/fMgT28UFqmAjPGYGEGKrk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIXjLR/btsHPebfXfS/fMgT28UFqmAjPGYGEGKrk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIXjLR%2FbtsHPebfXfS%2FfMgT28UFqmAjPGYGEGKrk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1977&quot; height=&quot;1296&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 창이 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDvr6P/btsHQjvQF4b/4wdK9qrFaQZIUbFY07Wni0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDvr6P/btsHQjvQF4b/4wdK9qrFaQZIUbFY07Wni0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDvr6P/btsHQjvQF4b/4wdK9qrFaQZIUbFY07Wni0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDvr6P%2FbtsHQjvQF4b%2F4wdK9qrFaQZIUbFY07Wni0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;854&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. SSH settings를 작성한다.&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Remote host* 에 고정 IP를 작성한다.&lt;/li&gt;
&lt;li&gt;Advanced SSH settings를 클릭한다.&lt;/li&gt;
&lt;li&gt;Use private key를 선택하여 우측의 파일 모양을 클릭한다.&lt;/li&gt;
&lt;li&gt;다운로드하여놓은 Lightsail의 pem키를 넣어준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ljOuS/btsHPny83CC/5tTDhKF3VxClVuItfUCKiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ljOuS/btsHPny83CC/5tTDhKF3VxClVuItfUCKiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ljOuS/btsHPny83CC/5tTDhKF3VxClVuItfUCKiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FljOuS%2FbtsHPny83CC%2F5tTDhKF3VxClVuItfUCKiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;854&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBNrSf/btsHOGzsuu0/rk35C3vjnbKSt72JiKkrOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBNrSf/btsHOGzsuu0/rk35C3vjnbKSt72JiKkrOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBNrSf/btsHOGzsuu0/rk35C3vjnbKSt72JiKkrOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBNrSf%2FbtsHOGzsuu0%2Frk35C3vjnbKSt72JiKkrOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;854&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Lightsail 인스턴스에 SSH로 접속 성공&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb4TUq/btsHPZ5uNyC/XAgcnnz60uKFu8VJqXWSdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb4TUq/btsHPZ5uNyC/XAgcnnz60uKFu8VJqXWSdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb4TUq/btsHPZ5uNyC/XAgcnnz60uKFu8VJqXWSdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb4TUq%2FbtsHPZ5uNyC%2FXAgcnnz60uKFu8VJqXWSdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1977&quot; height=&quot;1297&quot; data-origin-width=&quot;1977&quot; data-origin-height=&quot;1297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://backendcode.tistory.com/270&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://backendcode.tistory.com/270&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@turret1234/AWS-Lightsail-nginx-React-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@turret1234/AWS-Lightsail-nginx-React-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://thesse.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thesse.tistory.com/101&lt;/a&gt;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/107</guid>
      <comments>https://bu119.tistory.com/107#entry107comment</comments>
      <pubDate>Wed, 5 Jun 2024 18:00:49 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Amazon Lightsail, Networking 설정</title>
      <link>https://bu119.tistory.com/106</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edaCYw/btsHUSydozO/sSz5NkuVj3O7uR7MRHBZtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edaCYw/btsHUSydozO/sSz5NkuVj3O7uR7MRHBZtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edaCYw/btsHUSydozO/sSz5NkuVj3O7uR7MRHBZtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedaCYw%2FbtsHUSydozO%2FsSz5NkuVj3O7uR7MRHBZtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;고정 IP 주소 생성하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선.. 네트워크 설정부터 하자. 고정 IP 주소를 생성할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Create static IP을 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBfh1Z/btsHPhrmyHh/xiYtH9WSRu8Uj8nC2pty50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBfh1Z/btsHPhrmyHh/xiYtH9WSRu8Uj8nC2pty50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBfh1Z/btsHPhrmyHh/xiYtH9WSRu8Uj8nC2pty50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBfh1Z%2FbtsHPhrmyHh%2FxiYtH9WSRu8Uj8nC2pty50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 인스턴스 연결 설정을 작성한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 연결하고 고정 IP 이름을 지어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결된 인스턴스가 있다면 고정 IP 연결은 무료!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ym4qf/btsHPwof6FA/cw05riIUURumsu90D5gRXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ym4qf/btsHPwof6FA/cw05riIUURumsu90D5gRXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ym4qf/btsHPwof6FA/cw05riIUURumsu90D5gRXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYm4qf%2FbtsHPwof6FA%2Fcw05riIUURumsu90D5gRXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1325&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;앞서 만든 Ubuntu-Pomoro-Do 인스턴스를 연결해 준다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;고정 IP 이름은 StaticIp-Pomoro-Do 로 지어준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brHBav/btsHNVC5IS7/NZWBkNOTK5hVrGsSK957E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brHBav/btsHNVC5IS7/NZWBkNOTK5hVrGsSK957E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brHBav/btsHNVC5IS7/NZWBkNOTK5hVrGsSK957E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrHBav%2FbtsHNVC5IS7%2FNZWBkNOTK5hVrGsSK957E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Create를 누르면 고정 IP 주소에 연결된 것을 볼 수 있다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyLzav/btsHNvY55TB/veKHaCMRqZtI1FuyKR2mOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyLzav/btsHNvY55TB/veKHaCMRqZtI1FuyKR2mOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyLzav/btsHNvY55TB/veKHaCMRqZtI1FuyKR2mOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyLzav%2FbtsHNvY55TB%2FveKHaCMRqZtI1FuyKR2mOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1411&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;방화벽 설정 (사용 포트 번호 열기)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 기존 포트에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MySQL,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;HTTPS , SpringBoot 서버 포트를 추가로 생성할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt; 인스턴스 Manage를 클릭한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUTNv1/btsHPoKGI6D/QKwNN76AVRCGAubhviEyvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUTNv1/btsHPoKGI6D/QKwNN76AVRCGAubhviEyvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUTNv1/btsHPoKGI6D/QKwNN76AVRCGAubhviEyvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUTNv1%2FbtsHPoKGI6D%2FQKwNN76AVRCGAubhviEyvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1411&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;Ubuntu-Pomoro-Do&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;에 대한 다양한 정보와 함께 아래와 같은 창이 뜬다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KTUyk/btsHNtNI7U4/Dh01mqMYaCkxNVkKg7rl11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KTUyk/btsHNtNI7U4/Dh01mqMYaCkxNVkKg7rl11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KTUyk/btsHNtNI7U4/Dh01mqMYaCkxNVkKg7rl11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKTUyk%2FbtsHNtNI7U4%2FDh01mqMYaCkxNVkKg7rl11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1409&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Networking을 누르면 아래의 창이 나온다. IPv4 Firewall 에서 &lt;span style=&quot;background-color: #ffffff; color: #dd6b10; text-align: center;&quot;&gt;Add rule&lt;/span&gt; 을 클릭하여 사용할 포트를 열어준다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blOnjF/btsHNCKwIzA/bYnH7rM88cLO7j2n8EgV51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blOnjF/btsHNCKwIzA/bYnH7rM88cLO7j2n8EgV51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blOnjF/btsHNCKwIzA/bYnH7rM88cLO7j2n8EgV51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblOnjF%2FbtsHNCKwIzA%2FbYnH7rM88cLO7j2n8EgV51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1406&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;열려는 포트와 프로토콜을 지정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; 0 - 65535와 같이 대시를 사용하여 포트 범위를 지정한다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpLdIc/btsHN0YFlyY/7aGflMFi9fA7mupOaY3KXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpLdIc/btsHN0YFlyY/7aGflMFi9fA7mupOaY3KXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpLdIc/btsHN0YFlyY/7aGflMFi9fA7mupOaY3KXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpLdIc%2FbtsHN0YFlyY%2F7aGflMFi9fA7mupOaY3KXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1404&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. MySQL, HTTPS , SpringBoot 서버로 사용할 포트 번호를 열어준다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB로 사용하는 MySQL 포트로 사용할 3306 포트를 연다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgkC2c/btsHNo6MReI/ndU5dXkKwShkirbxe4BKg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgkC2c/btsHNo6MReI/ndU5dXkKwShkirbxe4BKg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgkC2c/btsHNo6MReI/ndU5dXkKwShkirbxe4BKg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgkC2c%2FbtsHNo6MReI%2FndU5dXkKwShkirbxe4BKg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1396&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTPS 포트로 사용할 443 포트를 연다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDKLE/btsHPpixZXo/pT1buVwgfPkTK6DdtLYVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDKLE/btsHPpixZXo/pT1buVwgfPkTK6DdtLYVn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDKLE/btsHPpixZXo/pT1buVwgfPkTK6DdtLYVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDKLE%2FbtsHPpixZXo%2FpT1buVwgfPkTK6DdtLYVn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1409&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SpringBoot&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 서버 포트로 사용할 8080 포트를 연다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXbpl/btsHPoKGKpF/k9duTi75AGhVT2gdx7fJW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXbpl/btsHPoKGKpF/k9duTi75AGhVT2gdx7fJW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXbpl/btsHPoKGKpF/k9duTi75AGhVT2gdx7fJW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXbpl%2FbtsHPoKGKpF%2Fk9duTi75AGhVT2gdx7fJW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 필수적으로 필요한&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MySQL,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;HTTPS , SpringBoot 서버 포트 생성을 완료했다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNUTNb/btsHPzrLTLn/vKHuVfm3dtcfMYONbwdSY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNUTNb/btsHPzrLTLn/vKHuVfm3dtcfMYONbwdSY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNUTNb/btsHPzrLTLn/vKHuVfm3dtcfMYONbwdSY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNUTNb%2FbtsHPzrLTLn%2FvKHuVfm3dtcfMYONbwdSY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/106</guid>
      <comments>https://bu119.tistory.com/106#entry106comment</comments>
      <pubDate>Wed, 5 Jun 2024 09:00:15 +0900</pubDate>
    </item>
    <item>
      <title>[인프라 구축] Amazon Lightsail 인스턴스 생성하기</title>
      <link>https://bu119.tistory.com/105</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IaR0Q/btsHUoLd4ja/jDKpdTR3llkIQUQgVFT9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IaR0Q/btsHUoLd4ja/jDKpdTR3llkIQUQgVFT9y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IaR0Q/btsHUoLd4ja/jDKpdTR3llkIQUQgVFT9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIaR0Q%2FbtsHUoLd4ja%2FjDKpdTR3llkIQUQgVFT9y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;325&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토이프로젝트인 만큼 개발 비용을 최대한 아끼기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon Lightsail의 &quot;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;처음 3개월은 무료&quot; 인스턴스 중 사양이 가장 높은 것을 선택할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; background-color: #f6e199;&quot;&gt;Amazon&amp;nbsp;Lightsail&amp;nbsp;인스턴스&amp;nbsp;생성하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wRkv4/btsHOMrp7yM/aSKKXWqFJ2x7vzIyAE57J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wRkv4/btsHOMrp7yM/aSKKXWqFJ2x7vzIyAE57J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wRkv4/btsHOMrp7yM/aSKKXWqFJ2x7vzIyAE57J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwRkv4%2FbtsHOMrp7yM%2FaSKKXWqFJ2x7vzIyAE57J1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;201&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/lightsail/?nc2=h_ql_prod_fs_ls&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws.amazon.com/ko/lightsail/?nc2=h_ql_prod_fs_ls&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717513405451&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;company&quot; data-og-title=&quot;가상 프라이빗 서버 및 웹 호스팅&amp;ndash;Amazon Lightsail&amp;mdash;Amazon Web Services&quot; data-og-description=&quot;WordPress, Magento, Prestashop, Joomla와 같은 사전 구성된 애플리케이션을 통해 단 몇 번의 클릭으로 블로그, 전자 상거래 또는 개인 웹 사이트를 구축합니다.&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/lightsail/?nc2=h_ql_prod_fs_ls&quot; data-og-url=&quot;https://aws.amazon.com/ko/lightsail/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JEgy3/hyWdhL3iA1/9CX3EneXUEgK06GayOJvFk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/lnX3J/hyWdrOGkAf/zgndxyLm4pl5s0bd34Kzz0/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109,https://scrap.kakaocdn.net/dn/bPyKfo/hyWdnr0nUg/o6dxiBkQFkqHrY2umJi7p0/img.png?width=300&amp;amp;height=200&amp;amp;face=0_0_300_200&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/lightsail/?nc2=h_ql_prod_fs_ls&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/lightsail/?nc2=h_ql_prod_fs_ls&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JEgy3/hyWdhL3iA1/9CX3EneXUEgK06GayOJvFk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/lnX3J/hyWdrOGkAf/zgndxyLm4pl5s0bd34Kzz0/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109,https://scrap.kakaocdn.net/dn/bPyKfo/hyWdnr0nUg/o6dxiBkQFkqHrY2umJi7p0/img.png?width=300&amp;amp;height=200&amp;amp;face=0_0_300_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;가상 프라이빗 서버 및 웹 호스팅&amp;ndash;Amazon Lightsail&amp;mdash;Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WordPress, Magento, Prestashop, Joomla와 같은 사전 구성된 애플리케이션을 통해 단 몇 번의 클릭으로 블로그, 전자 상거래 또는 개인 웹 사이트를 구축합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사이트에서 Amazon Lightsail 을 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에 로그인을 하고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Lightsail을 누르면 아래의 창이 나타난다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. Lightsail 인스턴스 생성를 생성하기 위해 Create Instance를 클릭한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1G5x/btsHPqBIHQZ/2oRljwF6mYekoNOtBr7Awk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1G5x/btsHPqBIHQZ/2oRljwF6mYekoNOtBr7Awk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1G5x/btsHPqBIHQZ/2oRljwF6mYekoNOtBr7Awk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1G5x%2FbtsHPqBIHQZ%2F2oRljwF6mYekoNOtBr7Awk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 우분투 선택하고, 버전은 상관없기 때문에 최신버전으로 쓰겠다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0SKp8/btsHOJu7XCx/n47kgdrY2pR7pO2T1vlDf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0SKp8/btsHOJu7XCx/n47kgdrY2pR7pO2T1vlDf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0SKp8/btsHOJu7XCx/n47kgdrY2pR7pO2T1vlDf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0SKp8%2FbtsHOJu7XCx%2Fn47kgdrY2pR7pO2T1vlDf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1333&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 선택 사항의 &quot;SSH 키&quot; 부문에서 &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 지정 키 생성&quot; 버튼을 누른다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKpLeU/btsPCjDvU3O/lhQBDRS1e7JK2Loj1SKdo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKpLeU/btsPCjDvU3O/lhQBDRS1e7JK2Loj1SKdo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKpLeU/btsPCjDvU3O/lhQBDRS1e7JK2Loj1SKdo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKpLeU%2FbtsPCjDvU3O%2FlhQBDRS1e7JK2Loj1SKdo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1322&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-1. 리전 선택 창이 뜨면, 확인하고 생성 버튼을 누른다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fz7H8/btsPCIJKYIW/EUqK1aAFUYwg9uS6MBzbZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fz7H8/btsPCIJKYIW/EUqK1aAFUYwg9uS6MBzbZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fz7H8/btsPCIJKYIW/EUqK1aAFUYwg9uS6MBzbZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFz7H8%2FbtsPCIJKYIW%2FEUqK1aAFUYwg9uS6MBzbZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1321&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-2. 새 SSH 키 페어 생성 창이 뜨면,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &quot;키 페어의 이름&quot;을 정하고 &quot;키 페어 생성&quot; 버튼을 누른다.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ8DPZ/btsPDJujlwv/2E6f8rVcZbWsq9NJyOHXlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ8DPZ/btsPDJujlwv/2E6f8rVcZbWsq9NJyOHXlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ8DPZ/btsPDJujlwv/2E6f8rVcZbWsq9NJyOHXlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ8DPZ%2FbtsPDJujlwv%2F2E6f8rVcZbWsq9NJyOHXlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1324&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-3. 키 페어가 생성되었다는 창이 뜨면, 프라이빗 키 다운로드를 누른다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다시 다운로드 할 수 없기 때문에 잃어버리면 안된다!!!!! 보안 중요!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJj25l/btsPCppZTPx/lvWgnKiAvJrzPJdxyU9EP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJj25l/btsPCppZTPx/lvWgnKiAvJrzPJdxyU9EP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJj25l/btsPCppZTPx/lvWgnKiAvJrzPJdxyU9EP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJj25l%2FbtsPCppZTPx%2FlvWgnKiAvJrzPJdxyU9EP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1389&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. &lt;span style=&quot;text-align: start;&quot;&gt;퍼블릭 IPv4 주소가 필요하니까&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;Dual-stack로 선택한다.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;비용을 최대한 줄이기위해 처음 3개월은 무료라고 적혀있는 &lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;instance를 구매할꺼예요. 그중에서 &lt;/span&gt;사양이 가장 좋은 &lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot;&gt;instance&lt;/span&gt;를 쓸거예요!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJ3Lx/btsHNYl9bCL/3enWY1k9MKBwYkNXA5fZkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJ3Lx/btsHNYl9bCL/3enWY1k9MKBwYkNXA5fZkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJ3Lx/btsHNYl9bCL/3enWY1k9MKBwYkNXA5fZkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJ3Lx%2FbtsHNYl9bCL%2F3enWY1k9MKBwYkNXA5fZkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1325&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. &lt;span style=&quot;background-color: #ffffff; color: #000716; text-align: start;&quot;&gt;Lightsail 리소스에는 고유한 이름이 필요하다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Lightsail에서는 각 리소스(인스턴스, 디스크 등)에 &lt;b&gt;고유한 이름&lt;/b&gt;을 지정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 나는 앱과 관련 있으면서도 내가 기억하기 쉬운 이름으로 인스턴스를 만들었다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NcYck/btsPCLsWp9Y/Qk4uuNrm6taOpDBVylBci0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NcYck/btsPCLsWp9Y/Qk4uuNrm6taOpDBVylBci0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NcYck/btsPCLsWp9Y/Qk4uuNrm6taOpDBVylBci0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcYck%2FbtsPCLsWp9Y%2FQk4uuNrm6taOpDBVylBci0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1322&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;6.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000716; text-align: start;&quot;&gt;모든 설정을 마쳤으면 인스턴스 생성 버튼을 누른다.&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;7.&lt;span&gt; 생성된 인스턴스가 &quot;시작중&quot; 상태로 보인다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLYjo/btsPEPm7hMt/35vNGNFRKIto55Sv2AwHq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLYjo/btsPEPm7hMt/35vNGNFRKIto55Sv2AwHq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLYjo/btsPEPm7hMt/35vNGNFRKIto55Sv2AwHq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLYjo%2FbtsPEPm7hMt%2F35vNGNFRKIto55Sv2AwHq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;8.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성된 인스턴스가 &quot;실행중&quot; 상태로 바꼈다. 이제 사용 가능하다!&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G61pY/btsPE3rVQxH/qUialFL0VvKk3AzDt1X68K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G61pY/btsPE3rVQxH/qUialFL0VvKk3AzDt1X68K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G61pY/btsPE3rVQxH/qUialFL0VvKk3AzDt1X68K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG61pY%2FbtsPE3rVQxH%2FqUialFL0VvKk3AzDt1X68K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1318&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&lt;span&gt; 인스턴스 생성 버튼을 눌렀는데, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;오류 메시지가 뜰 수도 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 실제로는 생성 요청이 정상적으로 처리된 상태일 수 있으므로, &lt;b&gt;페이지를 새로고침하여 인스턴스 목록을 확인&lt;/b&gt;해보는 것이 좋습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6EO1/btsHNWPu0xL/xqmckbn4tK7lzStZoGR6kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6EO1/btsHNWPu0xL/xqmckbn4tK7lzStZoGR6kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6EO1/btsHNWPu0xL/xqmckbn4tK7lzStZoGR6kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6EO1%2FbtsHNWPu0xL%2Fxqmckbn4tK7lzStZoGR6kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>내맘대로 개발 일기/DevOps</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/105</guid>
      <comments>https://bu119.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 4 Jun 2024 23:00:15 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 9. API Gateway와 Eureka 서버 연동하기 (API Gateway)</title>
      <link>https://bu119.tistory.com/102</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이번에는,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API Gateway를&amp;nbsp; Eureka 클라이언트로 등록하여 API Gateway와 Eureka 서버를 연동할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;API Gateway와 Eureka 서버 연동 프로세스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트가 API Gateway&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;에 요청을 하면 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;API Gateway&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;가 Eureka server에 등록된 서비스들을 조회하고 해당 서비스로 라우팅을 해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF8FZb/btsFQyctpI5/epu3IRNkKXCMiLkLzOsVpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF8FZb/btsFQyctpI5/epu3IRNkKXCMiLkLzOsVpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF8FZb/btsFQyctpI5/epu3IRNkKXCMiLkLzOsVpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF8FZb%2FbtsFQyctpI5%2Fepu3IRNkKXCMiLkLzOsVpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;494&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, 로그인을 한다는 가상의 시나리오에 대해 어떻게 동작하는지 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;①:&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;각 인스턴스를 실행하여 유레카 서버에 등록한다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;새로운 인스턴스는 시작할 때 유레카 서버에 IP, 호스트 주소, 포트 정보 등을 전달한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;유레카 서버는 등록된 인스턴스들을 주기적으로 상태를 체크하면서 해당 인스턴스를 관리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;②:&lt;/b&gt;&amp;nbsp;클라이언트에서 로그인 요청이 API 게이트로 온다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;③④:&lt;/b&gt;&amp;nbsp;API 게이트웨이에서 받은 로그인 요청을 어떤 인스턴스에서 처리할 수 있을지 서비스 디스커버리에서 찾는다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;매번 질의하지 않고 인스턴스 정보를 캐싱한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;⑤:&lt;/b&gt;&amp;nbsp;API 게이트웨이는 로그인 처리 요청을 Auth Service에 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;⑥:&lt;/b&gt;&amp;nbsp;Auth Service의 응답 결과를 클라이언트에 전달한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;게이트웨이와 Eureka 서버 연동&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Eureka 서버는 각각의 비즈니스 로직 처리를 담당하는 스프링 부트 애플리케이션 목록들을 가지고 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MSA를 구성하는 요소는 자동으로 오토 스케일링되기 때문에 새로 생긴 서버의 IP를 게이트웨이가 알지 못한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 Eureka 서버가 해당 목록들을 관리하며 Gateway에게 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQZWF/btsFUkRhMdo/I17OjaeajSKTnsGdmCcKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQZWF/btsFUkRhMdo/I17OjaeajSKTnsGdmCcKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQZWF/btsFUkRhMdo/I17OjaeajSKTnsGdmCcKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQZWF%2FbtsFUkRhMdo%2FI17OjaeajSKTnsGdmCcKh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;849&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt; 스프링 클라우드 게이트웨이 Eureka 클라이언트 설정&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;1. Eureka 클라이언트 설정을 위한 의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 기존 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;apigateway-service의 build.gradle에&lt;/span&gt;&amp;nbsp;의존성 추가하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1710776401286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// build.gradle

ext {
  set('springCloudVersion', &quot;2023.0.0&quot;)
}

dependencies {
  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

dependencyManagement {
  imports {
    mavenBom &quot;org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) 처음 부터 Spring Initializr에서 apigateway-service를 생성할 때 의존성 같이 등록하기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEuRrw/btsFQuHXdsh/zt5wWgYA1Z4MZlxLJhMtY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEuRrw/btsFQuHXdsh/zt5wWgYA1Z4MZlxLJhMtY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEuRrw/btsFQuHXdsh/zt5wWgYA1Z4MZlxLJhMtY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEuRrw%2FbtsFQuHXdsh%2Fzt5wWgYA1Z4MZlxLJhMtY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;3. Eureka 서버와 연결&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;apigateway-service의 application.yml 파일에서 변수 설정을 통해 Eureka 서버에 등록할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710778609438&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# application.yml

# eureka 클라이언트 설정 (eureka 서버와 연결)
eureka:
  client:
    # eureka 서버에 등록할지 여부
    register-with-eureka: true
    # eureka 서버로 부터 인스턴스들의 정보를 가져올 것인지 설정하는 속성
    fetch-registry: true
    # eureka 서버 주소에 마이크로서비스 정보 등록
    service-url:
      defaultZone: http://admin:1234mst@localhost:8761/eureka&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;apigateway-service의 application.yml 파일 전체&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710778567783&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# application.yml

server:
  port: 8000

# eureka 클라이언트 설정 (eureka 서버와 연결)
eureka:
  client:
    # eureka 서버에 등록할지 여부
    register-with-eureka: true
    # eureka 서버로 부터 인스턴스들의 정보를 가져올 것인지 설정하는 속성
    fetch-registry: true
    # eureka 서버 주소에 마이크로서비스 정보 등록
    service-url:
      defaultZone: http://admin:1234mst@localhost:8761/eureka

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081/
          predicates:
            - Path=/user-service/**
          filters:
            - RewritePath=/user-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}
        - id: beverage-service
          uri: http://localhost:8082/
          predicates:
            - Path=/beverage-service/**
          filters:
            - RewritePath=/beverage-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}
        - id: community-service
          uri: http://localhost:8083/
          predicates:
            - Path=/community-service/**
          filters:
            - RewritePath=/community-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca4IIm/btsFUHZLc1o/njEIuesiTKlO9ZXf1wCBl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca4IIm/btsFUHZLc1o/njEIuesiTKlO9ZXf1wCBl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca4IIm/btsFUHZLc1o/njEIuesiTKlO9ZXf1wCBl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca4IIm%2FbtsFUHZLc1o%2FnjEIuesiTKlO9ZXf1wCBl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://covenant.tistory.com/251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://covenant.tistory.com/251&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://covenant.tistory.com/252&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://covenant.tistory.com/252&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wonit.tistory.com/497&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wonit.tistory.com/497&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@boo105/MSA-EUREKA-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@boo105/MSA-EUREKA-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Eureka</category>
      <category>Eureka Client</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Service Discovery</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/102</guid>
      <comments>https://bu119.tistory.com/102#entry102comment</comments>
      <pubDate>Fri, 22 Mar 2024 09:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] Spring Cloud Gateway Filter (API Gateway)</title>
      <link>https://bu119.tistory.com/100</link>
      <description>&lt;h2 id=&quot;먼저-프로세스를-이해하자&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;Spring Cloud Gateway를 사용한&lt;span&gt; 요청/응답 &lt;/span&gt;&lt;/span&gt;프로세스&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring Cloud Gateway는 다음과 같이 마이크로서비스들과 클라이언트단의 라우팅 역할을 해준다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;클라이언트는 원하는 서비스를 호출하기 위해 Spring Cloud gateway로 요청을 보낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Spring Cloud gateway에서는 어떤 서비스로 가야 하는지 분기처리를 해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span&gt;이때 Filter 기능을 통해 조건을 분기한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;점선 네모 박스는 Spring Cloud gateway안에서 일어나는 일을 확대한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECuvi/btsFR2XE428/wFhLCgYiRE4uKomeLr1kNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECuvi/btsFR2XE428/wFhLCgYiRE4uKomeLr1kNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECuvi/btsFR2XE428/wFhLCgYiRE4uKomeLr1kNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECuvi%2FbtsFR2XE428%2FwFhLCgYiRE4uKomeLr1kNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1133&quot; height=&quot;691&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;먼저-프로세스를-이해하자&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;Spring Cloud Gateway&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Filter 란?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Spring Cloud Gateway의 필터는 클라이언트의 요청을 가로채고 수정하거나, 다양한 작업을 수행하여 마이크로서비스 아키텍처에서의 라우팅, 보안, 모니터링 등을 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, Http 요청, 응답에 대한 내용을 추가/수정할 수 있도록 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Pre Filter: 요청 전 처리하는 필터,&lt;span&gt;&amp;nbsp;&lt;/span&gt;사전에 정의&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Post Filter: 요청 후 처리하는 필터,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사후에 정의,&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서, API Gateway가 담당하고 있는 라우팅이라는 기능뿐만 아니라 부가기능을 추가할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;먼저-프로세스를-이해하자&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;Spring Cloud Gateway&amp;nbsp;&lt;/span&gt;동작 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트가 Spring Cloud Gateway에 요청을 하게 되면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Spring Cloud gateway&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;내부의 Predicate에서 어떤 서비스로 갈지 판단 후 요청을 전달한다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Spring Cloud gateway에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;요청이 들어오면 Gateway Handler Mapping을 통해 클라이언트로부터 어떤 요청이 들어왔는지 정보를 받고 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;그 후&lt;b&gt;사전 Filter&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사후 Filter&lt;/b&gt;를 통해 요청정보를 구성할 수 있습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;Pre Filter :Http 요청에 대해 과정을 수행한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: circle; color: #000000;&quot;&gt;Post Filter : Http 응답에 대해 과정을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway Filter의 동작 순서&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;클라이언트가 Spring Cloud Gateway에 요청을 하면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway Filter는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;아래의 순서로 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Client Request&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Gateway Handler (진입점)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;predicate 영역에서의 분기&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;pre-filter 처리&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;서비스에서의 요청 처리&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;post-filter&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Gateway Handler&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Client&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Gateway Handler Mapping&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;클라이언트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;요청이 Gateway에 도달하면 Handler Mapping을 통해 적절한 Route로 매핑된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Gateway Handler Mapping은 들어오는 요청이 어떤 Route에 매핑되는지를 결정합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;이를 통해 클라이언트가 요청한 URI, 헤더, HTTP 메서드 등과 일치하는 Route를 찾아냅니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Route에는 실제로 요청을 처리할 서비스의 위치 및 추가 구성이 포함될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Predicate&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;요청에 대한 사전 조건을 분기하여 적절한 Filter를 거쳐 서비스로 라우팅 되도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Predicate은 Handler Mapping을 통해 선택된 Route에 대한 추가적인 요청 조건을 검사합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;이 조건들은 주어진 요청이 특정한 Route로 전달되어야 하는지를 결정합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;예를 들어, 특정 URI 패턴, 특정 헤더의 존재 여부, 혹은 요청이 특정한 호스트로부터 오는지를 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Pre Filter&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;HTTP 요청에 대한 사전 처리를 담당한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Pre Filter는 실제 요청이 핸들러로 전달되기 전에 실행됩니다. 이 단계에서는 요청에 대한 사전 처리를 수행합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;주로 인증, 권한 부여, 요청 수정 등의 작업을 수행할 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;예를 들어, JWT 토큰을 확인하고, 요청에 특정 헤더를 추가하거나 수정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Post Filter&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;HTTP 응답에 대한 후속 처리를 담당한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;Post Filter는 핸들러에서 응답이 생성되고 클라이언트로 반환되기 전에 실행됩니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;이 단계에서는 응답에 대한 후속 처리를 수행합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;주로 응답에 대한 로깅, 헤더 수정, 캐싱 등의 작업을 수행할 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;예를 들어, 응답에 특정 헤더를 추가하거나 수정하고, 응답을 로깅하여 추적 및 모니터링에 활용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway Filter 적용 방법&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Filter를&lt;/span&gt; 정의하는 방법은 크게 2가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;yml 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529; text-align: start;&quot;&gt;properties&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 정의&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Java 코드로 정의&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@sungjin0757/Spring-Cloud%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EB%8A%94-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-API-GATEWAYFilter&quot;&gt;https://velog.io/@sungjin0757/Spring-Cloud%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EB%8A%94-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-API-GATEWAYFilter&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ychxexn/Spring-Cloud-Gateway-Filter-%EC%A0%81%EC%9A%A9&quot;&gt;https://velog.io/@ychxexn/Spring-Cloud-Gateway-Filter-%EC%A0%81%EC%9A%A9&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yarisong.tistory.com/m/46&quot;&gt;https://yarisong.tistory.com/m/46&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Gateway%EC%97%90%EC%84%9C-filter-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-MSA3&quot;&gt;https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Gateway%EC%97%90%EC%84%9C-filter-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-MSA3&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter&quot;&gt;https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Architecture</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>Project</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <category>Spring Cloud Gateway Filter</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/100</guid>
      <comments>https://bu119.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 21 Mar 2024 18:00:11 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 8. Spring Cloud Gateway에 필터 적용하기 (API Gateway)</title>
      <link>https://bu119.tistory.com/99</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &amp;nbsp;&lt;/span&gt;이번에는,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Cloud Gateway Routes의 Filters&lt;/span&gt;를&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&amp;nbsp;설정할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;API Gateway 파트 4&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #006dd7; text-align: start;&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/94&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/94&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710734566298&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MSA 구축하기] 6. Spring Cloud Gateway 라우팅 설정하기 (API Gateway)&quot; data-og-description=&quot;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   이번에는, API Gateway의 라우팅을 설정할 것이다. API Gateway 파트 2 마이크로서비스 서버를 2개 이상 준비하자. 라우팅을 설정하는 방법에는 3가&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/94&quot; data-og-url=&quot;https://bu119.tistory.com/94&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buqPzy/hyVAH4N9EJ/LQxvpSUHHpoCiR7CTiZUd0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRZ4Uj/hyVAFlElWM/dCx32keAK17UKNQq74Tr40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/8CNk3/hyVAIJsAtw/J84kX5mZ6JqqvHE3TLZpq0/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buqPzy/hyVAH4N9EJ/LQxvpSUHHpoCiR7CTiZUd0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRZ4Uj/hyVAFlElWM/dCx32keAK17UKNQq74Tr40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/8CNk3/hyVAIJsAtw/J84kX5mZ6JqqvHE3TLZpq0/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MSA 구축하기] 6. Spring Cloud Gateway 라우팅 설정하기 (API Gateway)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   이번에는, API Gateway의 라우팅을 설정할 것이다. API Gateway 파트 2 마이크로서비스 서버를 2개 이상 준비하자. 라우팅을 설정하는 방법에는 3가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Cloud Gateway&lt;/span&gt; 라우팅을 설정했지만 서버를 실행했을 때 제대로 연결되지 않았다. 이러한 문제는 &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway 설정 경로 및 프록시 설정과 실제 서비스 코드 간의 불일치 때문에 발생했다.&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/97&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710939680529&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MSA 구축하기] 7. Spring Cloud Gateway를 활용한 경로 수정 (API Gateway)&quot; data-og-description=&quot;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   앞서, API Gateway의 라우팅을 설정했는데 실행했을 때 결과 값이 다르게 나타났다. 그 이유에 대해 알아보자. API Gateway 파트 3 우선, 작성한 코&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/97&quot; data-og-url=&quot;https://bu119.tistory.com/97&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Evv7Y/hyVALGI5fq/enJgv8k9bKy8CPqDuuHspK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/co0R7S/hyVAAFcTCc/NcRPUhT9kQXFi4WfAjy4kK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZPUiQ/hyVAyOdZ5Q/SFWTCcSKJs5vFraNaQnUrk/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/97&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Evv7Y/hyVALGI5fq/enJgv8k9bKy8CPqDuuHspK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/co0R7S/hyVAAFcTCc/NcRPUhT9kQXFi4WfAjy4kK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZPUiQ/hyVAyOdZ5Q/SFWTCcSKJs5vFraNaQnUrk/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MSA 구축하기] 7. Spring Cloud Gateway를 활용한 경로 수정 (API Gateway)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   앞서, API Gateway의 라우팅을 설정했는데 실행했을 때 결과 값이 다르게 나타났다. 그 이유에 대해 알아보자. API Gateway 파트 3 우선, 작성한 코&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정 경로&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;와 서비스 경로 일치를 위해 user-service의 컨트롤러 경로를 수정했다&lt;/span&gt;. &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 경우는 필터를 사용하지 않고,&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;단순히 경로를 라우팅 대상으로 전달하는 것으로 문제를 해결했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;❓&lt;/b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;경로 수정으로 문제를 해결하면, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;user-service의 모든 컨트롤러에 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;@RequestMapping(&quot;/user-service&quot;) 을 추가해야 하는 상황이 발생한다. 다른 마이크로서비스들도 각 서비스의 이름으로 &lt;span style=&quot;color: #5733b1; text-align: left;&quot;&gt;@RequestMapping을 추가해야 히고 &lt;/span&gt;이러한 부분이 상당히 비효율적이라고 느껴졌다. 구글 검색을 통해 다른 방법을 찾을 수 있었다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway의 Filter를 사용하여 URI 경로를 재작성하여 요청을 백엔드 서비스로 라우팅 하는 방법이 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot; data-block-id=&quot;63370807-7be5-495c-bcb2-35e7b4cdef9e&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #333333;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;i&gt;API Gateway 라우팅 필터 설정을 해야 하는 이유?&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;클라이언트가 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;http://localhost:8000/user-service/으로 요청을 보냈을 때 http://localhost:8081/user-service/로&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 프록시하기 위해서는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;user-service의 모든 컨트롤러에@RequestMapping(&quot;/user-service&quot;)을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; 추가해줘야 하는 상황이 발생한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 이러한 접근 방식은 많은 양의 코드를 수정해야 하고, 유지보수에 어려움을 줄 수 있다. 또한, 서비스를 추가하거나 제거할 때마다 코드를 변경해야 하므로 유연성이 떨어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, Gateway의 Filter를 사용하여 URI 경로를 재작성하여 요청을 백엔드 서비스로 라우팅 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;클라이언트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;http://localhost:8000/user-service/&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 요청을 보내면, Gateway의 Filter가 요청의 URI를 수정하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;http://localhost:8081&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 프록시 하게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;다시 말해, 아래의 형태로 라우팅 하려면&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;Gateway의&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Filter를 사용하여&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;URI 경로를 재작성해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #333333;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8000/user-service/name&amp;nbsp; ➡️&amp;nbsp; http://localhost:8081/name&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;0&quot;&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgRORo/btsFSclijSX/t3l5oybJoyoyEYgWYeW6wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgRORo/btsFSclijSX/t3l5oybJoyoyEYgWYeW6wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgRORo/btsFSclijSX/t3l5oybJoyoyEYgWYeW6wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgRORo%2FbtsFSclijSX%2Ft3l5oybJoyoyEYgWYeW6wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1133&quot; height=&quot;691&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway Filter 적용 방법&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Filter&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;를 정의하는 방법은 크게 2가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;yml 또는 &lt;span style=&quot;background-color: #f8f9fa; color: #212529; text-align: start;&quot;&gt;properties&lt;/span&gt; 파일에 정의할 수 있다.&lt;/li&gt;
&lt;li&gt;Java 코드로 정의할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;  현재, 우리는 yml 파일을 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Spring Cloud Gateway Filter&lt;span style=&quot;text-align: start;&quot;&gt;를 정의할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리의 서비스에는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;3개의 마이크로서비스가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;user-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;beverage-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;community-service&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;2. application.yml를 통한 경로 설정&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;apigateway-service의 application.yml에 filters 추가&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RewritePath&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; 필터를 사용하여, 게이트웨이가 요청을 프록시할 때 백엔드 서비스가 요구하는 경로로 요청을 재작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710762927135&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apigateway-service: application.yml

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/user-service/**
          filters:
            - RewritePath=/user-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment} # 추가&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RewritePath &lt;/b&gt;필터는 요청의 경로를 재작성한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;=/user-service/(?&amp;lt;segment&amp;gt;.*)&lt;/b&gt;는 정규 표현식을 사용하여 경로를 다시 쓰는 패턴을 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 /user-&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;service&lt;/span&gt;/ 다음에 오는 모든 것을 포함하는 부분을 캡처하여&lt;b&gt; $\{segment}&lt;/b&gt;에 할당한다.&lt;/li&gt;
&lt;li&gt;이것은 URI 경로에서 /user-&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;service&lt;/span&gt;/ 부분을 캡처하지 않고 그 뒤의 모든 것을 캡처한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/$\{segment}&lt;/b&gt;는 재작성된 경로를 나타낸다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; ${segment}&lt;/b&gt;는 앞서 캡처한 새로운 경로 세그먼트를 나타낸다.&lt;/li&gt;
&lt;li&gt;따라서, 이 필터는 /user-&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;service&lt;/span&gt;/ 뒤에 오는 모든 것을 끝에 슬래시가 없는 경로로 재작성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 말해,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RewritePath&lt;/b&gt; &amp;nbsp;필터는 요청이 게이트웨이를 통과할 때 /user-&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;service&lt;/span&gt;/로 시작하는 모든 경로를 해당 경로 뒤에 슬래시가 없는 형태로 재작성한다. 예를 들어, /user- &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;service&lt;/span&gt;/profile은 /profile로 재작성된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 필터는 라우터가 백엔드 서비스에 전달되기 전에 요청을 변경하거나 수정할 필요가 있는 경우에 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;apigateway-service의 application.yml 전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710603601057&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apigateway-service: application.yml

server:
  port: 8000

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081/
          predicates:
            - Path=/user-service/**
          filters:
            - RewritePath=/user-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}
        - id: beverage-service
          uri: http://localhost:8082/
          predicates:
            - Path=/beverage-service/**
          filters:
            - RewritePath=/beverage-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}
        - id: community-service
          uri: http://localhost:8083/
          predicates:
            - Path=/community-service/**
          filters:
            - RewritePath=/community-service/(?&amp;lt;segment&amp;gt;.*),/$\{segment}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;user-service의 UserController.java&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// user-service: UserController.java (8081 포트 사용)

package com.caffeinedoctor.userservice.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping(&quot;/&quot;)
    public String getServiceName(){
        return &quot;user-service&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;각 마이크로서비스 서버 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8081/&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdw6Vk/btsFQQ5nluA/4bBsIxtIKGykmlxGkZKjkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdw6Vk/btsFQQ5nluA/4bBsIxtIKGykmlxGkZKjkK/img.png&quot; data-alt=&quot;user-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdw6Vk/btsFQQ5nluA/4bBsIxtIKGykmlxGkZKjkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdw6Vk%2FbtsFQQ5nluA%2F4bBsIxtIKGykmlxGkZKjkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;user-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8082/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EZgGV/btsFUCc0qWH/40s5XLXKXb5Ea5zZvbIkLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EZgGV/btsFUCc0qWH/40s5XLXKXb5Ea5zZvbIkLK/img.png&quot; data-alt=&quot;beverage-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EZgGV/btsFUCc0qWH/40s5XLXKXb5Ea5zZvbIkLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEZgGV%2FbtsFUCc0qWH%2F40s5XLXKXb5Ea5zZvbIkLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;beverage-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8083/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sEzuo/btsFQx5HUNQ/s1RUgf9JFgAreaJD76ixe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sEzuo/btsFQx5HUNQ/s1RUgf9JFgAreaJD76ixe0/img.png&quot; data-alt=&quot;community-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sEzuo/btsFQx5HUNQ/s1RUgf9JFgAreaJD76ixe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsEzuo%2FbtsFQx5HUNQ%2Fs1RUgf9JFgAreaJD76ixe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;community-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;apigateway-service 서&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버 실행&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8000/user-service/&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zOG1i/btsFR2DOmsg/KHl20kkLcGnidyup9HqXQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zOG1i/btsFR2DOmsg/KHl20kkLcGnidyup9HqXQk/img.png&quot; data-alt=&quot;apigateway-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zOG1i/btsFR2DOmsg/KHl20kkLcGnidyup9HqXQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzOG1i%2FbtsFR2DOmsg%2FKHl20kkLcGnidyup9HqXQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apigateway-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8000/beverage-service/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIi30q/btsFR3bD9w9/us6FiAon8yKHg9226D1r0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIi30q/btsFR3bD9w9/us6FiAon8yKHg9226D1r0K/img.png&quot; data-alt=&quot;apigateway-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIi30q/btsFR3bD9w9/us6FiAon8yKHg9226D1r0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIi30q%2FbtsFR3bD9w9%2Fus6FiAon8yKHg9226D1r0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apigateway-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8000/community-service/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FthQr/btsFQV6fZ9P/G1YXQSr52iIs6pY4w0suOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FthQr/btsFQV6fZ9P/G1YXQSr52iIs6pY4w0suOk/img.png&quot; data-alt=&quot;apigateway-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FthQr/btsFQV6fZ9P/G1YXQSr52iIs6pY4w0suOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFthQr%2FbtsFQV6fZ9P%2FG1YXQSr52iIs6pY4w0suOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1127&quot; height=&quot;413&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apigateway-service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot; data-token-index=&quot;0&quot;&gt;  정리하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; 첫 번째 &quot;&lt;b&gt;7. Spring Cloud Gateway를 활용한 경로 수정&lt;/b&gt;&quot; 방법은&amp;nbsp;요청된 경로를 변경하지 않고 그대로 전달하고,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot; data-token-index=&quot;0&quot;&gt;두 번째 &quot;&lt;b&gt;8.&amp;nbsp;Spring&amp;nbsp;Cloud&amp;nbsp;Gateway에&amp;nbsp;필터&amp;nbsp;적용하기&lt;/b&gt;&quot; 방법은 요청된 경로를 수정하여 서버로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>filter</category>
      <category>Gateway</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>Project</category>
      <category>Routes</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <category>Trouble Shooting</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/99</guid>
      <comments>https://bu119.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 21 Mar 2024 09:00:28 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 7. Spring Cloud Gateway를 활용한 경로 수정 (API Gateway)</title>
      <link>https://bu119.tistory.com/97</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;  &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;앞서,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #ffffff; text-align: start;&quot;&gt;API Gateway의&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt; 라우팅을 설정했는데 실행했을 때 결과 값이 다르게 나타났다. &lt;/span&gt;그&amp;nbsp;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;이유에 대해 알아보자.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;API Gateway 파트 3&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;우선, &lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;작성한 코드를 살펴보&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;자.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot; data-block-id=&quot;63370807-7be5-495c-bcb2-35e7b4cdef9e&quot;&gt;
&lt;h3 style=&quot;color: #333333;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. user-service의 UserController.java&amp;nbsp; 파일&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710585445917&quot; class=&quot;java&quot; style=&quot;color: #333333;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// user-service: UserController.java (8081 포트 사용)

package com.caffeinedoctor.userservice.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping(&quot;/&quot;)
    public String getServiceName(){
        return &quot;user-service&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;user- service 서버 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http://localhost:8081/&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AgKbQ/btsFP9bP8gq/Sw6aKmooeUd7bKkgUpNPd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AgKbQ/btsFP9bP8gq/Sw6aKmooeUd7bKkgUpNPd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AgKbQ/btsFP9bP8gq/Sw6aKmooeUd7bKkgUpNPd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAgKbQ%2FbtsFP9bP8gq%2FSw6aKmooeUd7bKkgUpNPd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;349&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. apigateway-service의 application.yml 파일&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #333333;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# apigateway-service: application.yml

server:
  port: 8000

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081/
          predicates:
            - Path=/user-service/**
        - id: beverage-service
          uri: http://localhost:8082/
          predicates:
            - Path=/beverage-service/**
        - id: community-service
          uri: http://localhost:8083/
          predicates:
            - path=/community-service/**&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;apigateway-service 서&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버 실행&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;http://localhost:8000/user-service/&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I1Chn/btsFRkjq04B/CYIrjarpVg9U1SE9omaM2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I1Chn/btsFRkjq04B/CYIrjarpVg9U1SE9omaM2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I1Chn/btsFRkjq04B/CYIrjarpVg9U1SE9omaM2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1Chn%2FbtsFRkjq04B%2FCYIrjarpVg9U1SE9omaM2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;419&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;404 에러 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;❓&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;라우팅 연결을 했는데 두 주소의 결과가 다르게 나타난다. 다시 말해, &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;API Gateway &lt;/span&gt;service의 라우팅 설정을 마쳤는데 각 서비스로 연결이 되지 않는 문제가 발생했다. apigateway-service의 yml 파일에 설정을 했는데 8000번 포트에서 8081, 8082, 8083 포트로 연결이 안 된다. &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot; data-block-id=&quot;63370807-7be5-495c-bcb2-35e7b4cdef9e&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-content-editable-leaf=&quot;true&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;http://localhost:8000/user-service/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;http://localhost:8081/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로 연결이 안된다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-content-editable-leaf=&quot;true&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;http://localhost:8000/beverage-service/&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;http://localhost:8082/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로 연결이 안된다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-content-editable-leaf=&quot;true&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;http://localhost:8000/community-service/&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;http://localhost:8083/으&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로 연결이 안된다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;왜 그럴까? 그 이유를 찾기 위해 또 열심히 구글 검색을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;결론적으로, 이 문제는 Gateway 설정 경로와 실제 서비스 코드 간의 API 통신 경로 불일치로 인해 발생한다는 것을 알아냈다. 위의 코드 설정에 따르면 &lt;a style=&quot;background-color: #ffffff; color: #5733b1; text-align: start;&quot;&gt;http://localhost:8000/user-service/로&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 들어오는 요청이 &lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #5733b1; text-align: start;&quot;&gt;http://localhost:8081/로&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;프락시되는 것을 예상했으나 실제로는 &lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #5733b1; text-align: start;&quot;&gt;http://localhost:8081/user-service/로&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 전달되는 것이었다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이 문제를 해결하기 위해 두 가지 방법을 찾았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;첫 번째 방법은 간단히 경로를 수정하여 서비스 코드와 일치시키는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;두 번째 방법은 Spring Cloud Gateway에서 URI 경로를 재작성하는 필터를 적용하는 것이다. Gateway는 이러한 필터를 통해 들어오는 요청과 나가는 응답을 수정할 수 있으며, 이를 통해 Gateway와 서비스 간의 일관성을 유지할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #333333;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;⭐&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;API&amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Gateway&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start; background-color: #ffc1c8;&quot;&gt;에서 마이크로서비스로 라우팅 연결이 제대로 되지 않은 이유&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;결론부터 말하자면,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; Gateway 구성에서 정의된 경로 및 프락시 설정과 실제 서비스 코드 간의 불일치 때문에 문제가 발생했다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Gateway 설정 경로&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;http://localhost:8000/user-service/** 으로 요청하면&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8081/user-service/** 으로 요청이 넘어간다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;user-service 서비스 경로&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;user-service 서비스&lt;/b&gt; API @GetMapping(&quot;/&quot;) 으로 설정되어있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;http://localhost:8081/ 으로 API 통신을 하고있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;즉, http://localhost:8000/user-service/ 에 대해서는 API가 설정되어 있지 않아 404에러가 발생한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;상세히 설명하면,&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저, Spring Cloud Gateway 설정을 살펴보면 라우터 설정이&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710587026989&quot; class=&quot;bash&quot; style=&quot;color: #333333;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apigateway-service: application.yml

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          # 어디로 갈꺼니?
          uri: http://localhost:8081/
          # 조건절
          predicates:
            - Path=/user-service/**&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이 설정은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway에 들어오는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;/user-service/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 시작하는 요청을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;http://localhost:8081/&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;user-service/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 프록시 하라는 의미이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;현재 Spring Cloud Gateway 설정은 http://localhost:8081/에 user-service/**가 추가되어 http://localhost:8081/user-service/**로 요청된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://localhost:8081/ + user-service/**&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;http://localhost:8000/user-service/** 으로 요청하면 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8081/user-service/** 으로 요청이 넘어간다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;user-service의 컨트롤러의 API 통신 코드는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710587119300&quot; class=&quot;java&quot; style=&quot;color: #333333;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// user-service: UserController.java (8081 포트 사용)

@RestController
public class UserController {

    @GetMapping(&quot;/&quot;)
    public String getServiceName(){
        return &quot;user-service&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;user-service의 컨트롤러는 &quot;/&quot; 경로에 대해서만 응답하고 있다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;따라서 실제로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;http://localhost:8081/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;에서 대해서만 동작한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;하지만, &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Gateway는 /user-service/로 시작하는 요청을 기대하고 있기 때문에 이 요청을 처리하지 못한다.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;정리하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;이 문제는 Gateway 설정 경로와 실제 서비스 코드 간의 API 통신 경로 불일치로 인해 발생한다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 설정에 따르면, Gateway에서 요청이&amp;nbsp;http://localhost:8000/user-service/** 으로 들어오면 실제로는&amp;nbsp;http://localhost:8081/user-service/** 으로 전달된다.&lt;/li&gt;
&lt;li&gt;그러나 실제 서비스 코드에서는&amp;nbsp;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;http://localhost:8081/user-service/가&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&amp;nbsp;아닌&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;http://localhost:8081/에서만&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&amp;nbsp;API가 설정되어 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이 불일치로 인해 요청이 올바른 엔드포인트로 전달되지 않고 서비스 코드의 다른 경로로 이동하게 되어 404에러가 발생한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;다른 API 주소로 예를 들면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;@GetMapping(&quot;/&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;welcome&lt;/span&gt;&quot;)&lt;span&gt;&amp;nbsp; 으로 되어있을 때,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Gateway에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;http://localhost:8000/user-service/welcome로&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청이 전달되면 실제로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;http://localhost:8081/user-service/welcome로&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;전달되어야 한다. 그러나 실제 서비스 코드에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;http://localhost:8081/welcome&quot;&gt;http://localhost:8081/welcome&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;경로에 API가 설정되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;1. API Gateway 라우팅 경로 수정하기&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 문제를 해결하기 위해서는 user-service의 컨트롤러가 /user-service/ 경로에 대해서 응답하도록 수정해야 한다. 이렇게 하면 Gateway 설정과 실제 서비스의 경로가 일치하게 되어 요청이 올바르게 프락시 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;user-service의 UserController.java&amp;nbsp; 파일 수정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710587233316&quot; class=&quot;java&quot; style=&quot;color: #333333;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// user-service: UserController.java (8081 포트 사용)

@RestController
@RequestMapping(&quot;/user-service&quot;)
public class UserController {

    @GetMapping(&quot;/&quot;)
    public String getServiceName(){
        return &quot;user-service&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;클라이언트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;http://localhost:8000/user-service/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 요청을 보내면, API Gateway는 이 요청을 &lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;http://localhost:8081/user-service/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로 프락시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;user- service 서버 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfj6qY/btsFQSAI4td/3q3gkZ5J7beyFCLFexqxN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfj6qY/btsFQSAI4td/3q3gkZ5J7beyFCLFexqxN0/img.png&quot; data-alt=&quot;user-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfj6qY/btsFQSAI4td/3q3gkZ5J7beyFCLFexqxN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfj6qY%2FbtsFQSAI4td%2F3q3gkZ5J7beyFCLFexqxN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;419&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;user-service&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;apigateway-service 서&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버 실행&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cERR59/btsFSa1GzFd/G88Ki49doqnUagTA9aGXZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cERR59/btsFSa1GzFd/G88Ki49doqnUagTA9aGXZ0/img.png&quot; data-alt=&quot;apiateway-service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cERR59/btsFSa1GzFd/G88Ki49doqnUagTA9aGXZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcERR59%2FbtsFSa1GzFd%2FG88Ki49doqnUagTA9aGXZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;419&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apiateway-service&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 이 경우는 필터를 사용하지 않고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;단순히 경로를 라우팅 대상으로 전달한 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;경로 예시&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8000/user-service/name&amp;nbsp; ➡️&amp;nbsp; http://localhost:8081/user-service/name&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8000/beverage-service/10 &amp;nbsp;➡️&amp;nbsp; http://localhost:8082/beverage-service/10&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http://localhost:8000/community-service/feed&amp;nbsp; ➡️&amp;nbsp; http://localhost:8083/community-service/feed&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>filter</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Routes</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <category>Trouble Shooting</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/97</guid>
      <comments>https://bu119.tistory.com/97#entry97comment</comments>
      <pubDate>Wed, 20 Mar 2024 09:00:41 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] API Gateway</title>
      <link>https://bu119.tistory.com/95</link>
      <description>&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최근 많은 서비스들이 독립적인 기능을 수행하는 작은 단위의 서비스들로 구성된&amp;nbsp;&lt;b&gt;마이크로 서비스 아키텍처(Micro Service Architecture)&lt;/b&gt;&amp;nbsp;형태로 구축되면서 서비스의 복잡도를 줄일 수 있게 되었고, 변경에 따른 영향을 최소화하면서 개발과 배포를 할 수 있다는 장점도 얻게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 여기서 말하는 작은 단위의 서비스가 50개, 100개가 되었을 때, 이 많은 서비스들의 엔드포인트를 관리하는 데 있어서 어려움이 생기고, 또 각각의 서비스마다 공통적으로 들어가는 기능(ex 인증/인가, 로깅 등)들을 중복으로 개발해야 한다는 문제점이 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 문제점을 해결하기 위해 등장한 것이 바로&amp;nbsp;&lt;b&gt;API Gateway&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;API Gateway란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API Gateway Service는 사용자가 설정한 Routing 설정에 따라 각 &lt;span style=&quot;text-align: start;&quot;&gt;endpoint&lt;/span&gt;로 클라이언트를 대신해서 요청하고, 응답을 받으면 다시 클라이언트에게 전달해 주는 &lt;span style=&quot;text-align: left;&quot;&gt;역할&lt;/span&gt;을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YYY7A/btsFRAlUpZ4/PIkrwNmCB785kKMvzuOk5K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YYY7A/btsFRAlUpZ4/PIkrwNmCB785kKMvzuOk5K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YYY7A/btsFRAlUpZ4/PIkrwNmCB785kKMvzuOk5K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYYY7A%2FbtsFRAlUpZ4%2FPIkrwNmCB785kKMvzuOk5K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;277&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다시 말해,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;클라이언트는 각 서비스의 엔드포인트 대신에&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;API Gateway로 요청을 보내게 되며, 요청을 받은 API Gateway는 설정에 따라 각 &lt;span style=&quot;text-align: start;&quot;&gt;endpoint&lt;/span&gt;로 클라이언트를 대신하여 요청하고, 응답을 받으면 다시 클라이언트에게 전달하는 프락시(proxy) 역할&lt;span style=&quot;text-align: start;&quot;&gt;을 한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt; API Gateway는 클라이언트와 각각의 서비스들 사이에 위치한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시스템의 내부 구조는 숨기고 외부의 요청에 대해 적절한 형태로 가공해서 응답할 수 있는 장점이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API Gateway Service가 없을 경우,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;클라이언트&lt;/span&gt;에서는 microservice를 호출할 때, 클라이언트 쪽에서 endpoint를 설정하게 된다. 그런데 만약 microservice의 설정이 변경되어 endpoint가 변경되거나, 새로운 microservice가 추가되어 이에 해당하는 endpoint를 &lt;span style=&quot;text-align: start;&quot;&gt;클라이언트&lt;/span&gt;에 추가할 때 &lt;span style=&quot;text-align: start;&quot;&gt;클라이언트도 &lt;/span&gt;관련해서 수정 및 재배포가 이뤄저야 한다. 이러한 불편함을 없애고자 단일 진입점이 존재하는 개발이 필요하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API Gateway의 주요 기능&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증 및 권한 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스(마이크로서비스 등) 검색 통합&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;응답 캐싱&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정책, 회로 차단기 및 QoS 다시 시도&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;nbsp;클라이언트가 요청한 Micro Service에 문제가 생기면 그 회로를 차단한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;속도 제한&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부하 분산&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들면,&amp;nbsp;A라는 Micro Service가 3개의 인스턴스로 나누어졌을 경우에도 판단 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로깅, 추적, 상관관계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 서비스가 다른 서비스를 호출하는 경우도 많은데 진입점 및 중간 단계를 거치고 그다음 단계는 어디인지도 추적 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이를 위해서는 Logging 하는 작업 필요하다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Api Gateway는 어떤 클라이언트가 어느 서비스에 요청했는지 로그 파일을 처리 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;헤더, 쿼리 문자열 및 청구 변환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IP 허용 목록에 추가&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;목록에 추가 허용할 수 있는 IP와 차단 IP를 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일종의 방화벽처럼 사용 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 인증/인가 및 토큰 발급&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증/인가의 경우, 각 서비스마다 공통으로 구현되어야 하는 필수적인 기능이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각각의 서비스마다 인증/인가 처리를 구현하는 것은 매우 비효율적이다. 따라서, API Gateway에서 이를 처리하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXGuX/btsFPIlssWP/W4xlMqflBQ6fIO9Cj0FDF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXGuX/btsFPIlssWP/W4xlMqflBQ6fIO9Cj0FDF1/img.jpg&quot; data-alt=&quot;인증 서버&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXGuX/btsFPIlssWP/W4xlMqflBQ6fIO9Cj0FDF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXGuX%2FbtsFPIlssWP%2FW4xlMqflBQ6fIO9Cj0FDF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;163&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인증 서버&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Spring으로 예를 들면, 각각의 서비스에 Spring Security 의존성을 추가하여 해당 기능을 구현하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, API 사용을 위한 토큰 발급 기능도 마찬가지 이유로 API Gateway에서 처리된다. 실제로 토큰 발급 기능은 인증을 위한 서비스(= 인증 서버)를 하나 두고 거기에서 처리된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증(Authentication) : 해당 사용자가 본인이 맞는지를 확인하는 절차&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가(Authorization) : 인증된 사용자가 요청한 자원에 접근 가능한지를 확인하는 절차&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 공통 로직 처리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증/인가 외에도 여러 서비스에서 공통적으로 처리해야 할 기능들이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공통되는 기능을 각각의 서비스마다 구현하는 것은 번거로울 일일뿐더러 코드 수정이 필요할 때, 각각의 서비스를 다 수정해야 하는 등, 유지보수 측면에서의 어려움도 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;common.jpg&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUHxGJ/btsFP4BNmYN/IrnSgcKNFfrKNEvLoqcfM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUHxGJ/btsFP4BNmYN/IrnSgcKNFfrKNEvLoqcfM0/img.jpg&quot; data-alt=&quot;공통 로직 처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUHxGJ/btsFP4BNmYN/IrnSgcKNFfrKNEvLoqcfM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUHxGJ%2FbtsFP4BNmYN%2FIrnSgcKNFfrKNEvLoqcfM0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;231&quot; data-filename=&quot;common.jpg&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공통 로직 처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, 공통적으로 사용되는 로직의 경우 API Gateway에서 구현되는 것이 효율적이며,&amp;nbsp;&lt;b&gt;개발 중복을 줄이는 것뿐만 아니&lt;/b&gt;&lt;b&gt;라 표준 준수도 쉽다는 장점&lt;/b&gt;을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최근에는 API 호출 로깅을 통한 클라이언트의 API 호출 패턴을 분석하여 활용하는 것이 빅데이터의 특면에서 중요한 자산으로도 다뤄지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 로드밸런싱&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;대용량 처리 서비스에 있어서 로드밸런싱은 필수적&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로는 여러 개의 API 서버로 부하를 분산하는 기능이 주가 되겠지만, API 서버에 장애가 발생했을 때 이를 감지해서 로드밸런싱 리스트에서 빼고, 복구되었을 때 다시 로드밸런싱 리스트에 넣는 기능들이 필요하다.&amp;nbsp;(health-check)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 메디에이션 기능(Mediation)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메디에이션 기능 중에는&amp;nbsp;&lt;b&gt;메시지 호출 변화(Message Exchange Pattern)&lt;/b&gt;가 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메시지 호출 패턴은 동기(Sync), 비동기(Async)와 같은 API를 호출하는 메시지 패턴을 정의하는 것인데, API Gateway를 이용하면 아래와 같이 동기 호출을 비동기 호출로 바꿀 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sycn.jpg&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di5ywR/btsFQ0rQ4rr/DwyLzEsFu6vTYxRZtQUntk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di5ywR/btsFQ0rQ4rr/DwyLzEsFu6vTYxRZtQUntk/img.jpg&quot; data-alt=&quot;API Gateway에서의 Message Exchance Pattern&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di5ywR/btsFQ0rQ4rr/DwyLzEsFu6vTYxRZtQUntk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi5ywR%2FbtsFQ0rQ4rr%2FDwyLzEsFu6vTYxRZtQUntk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;410&quot; data-filename=&quot;sycn.jpg&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API Gateway에서의 Message Exchance Pattern&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, 클라이언트의 요청을 하위 서비스가 처리할 수 있도록 데이터 형식을 변형하거나, 하위 서비스의 응답 표준 포맷으로 데이터 형식을 변형하는&amp;nbsp;&lt;b&gt;메시지 포맷 변환(Message format transformation)&lt;/b&gt; 기능도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;span-stylecolorlightpinkspring-history-about-api-gatewayspan&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring과 API Gateway의 역사&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;1. RestTemplate와 Feign Client&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;과거에는 Spring Cloud에서의 MSA 간 통신&lt;/span&gt;을 위해 RestTemplate, Feign Client를 주로 사용했었다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RestTemplate&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전통적인 사용법이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 웹 애플리케이션에서 다른 애플리케이션을 사용하기 위해 사용된 API이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 애플리케이션을 호출할 때 접속하고자 하는 서버의 주소, port 번호 등을 기재해야 했다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Feign Client&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud에서 사용하는 API이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;interface를 생성하고 외부 microservice 이름만으로 다른 microservice를 호출할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만, RestTemplate와 Feign Client는 단일 인스턴스의 서비스를 호출할 때는 잘 동작하지만, 마이크로서비스 아키텍처와 같이 많은 수의 서비스 인스턴스가 있는 환경에서는 부족한 점이 있었다. MSA 환경에서는 서비스 인스턴스의 동적인 변화, 로드 밸런싱, 장애 처리 등을 고려해야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Netflix의 Ribbon은 이러한 문제를 해결하기 위해 개발되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. Netflix Ribbon&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud는 Load Balancer를 해주는 별도의 서비스를 위해 Netflix의 Ribbon을 채택하여 제공했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Ribbon은 클라이언트 측 로드 밸런싱을 지원하고, 서비스 디스커버리와 통합하여 동적으로 서비스 인스턴스를 찾고 호출하는 기능을 제공한다. 또한, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;장애 처리와 재시도 메커니즘을 내장하고 있어서, 네트워크 문제나 서비스 장애 시 적절히 대응할 수 있다.&lt;/span&gt;&amp;nbsp;(Health Check)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트 측 내부에 Ribbon을 구축해서 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트 안에서 이동하고자 하는 주소값을 직접 관리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ip:port를 명시 안 해도 서비스를 이름만으로 호출 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만, Netflix Ribbon도&amp;nbsp;리액트와 같이 비동기를 사용하는 기술들과의 호환이 잘 안 되는 문제가 발생했고 최근에는 잘 사용하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Spring Boot 2.4에서 Maintenance 상태가 되었다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;즉, Spring boot 2.4 이상 버전에서는 지원하지 않는다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Maintenace : 다음 버전에서 사용할지 이 기술을 빼거나 보완하려는 상태&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Netflix Zuul&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Netflix OSS(Open Source Software) 프로젝트의 일부로 개발되었으며, &lt;span style=&quot;background-color: #f8f9fa; text-align: start;&quot;&gt;Netflix에서 제공하는 API Gateway 또는 API Service 기술이다. 마이크로서비스 아키텍처에서 여러 클라이언트 요청을 적절한 서비스로 프락시 및 라우팅 하기 위한 서비스이다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JVM-based router 및 Server-side load Balancer이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내부적으로 Eureka 서버를 사용하고, 부하 분산을 위해 Ribbon을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka Client이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka 및 Ribbon과 함께 사용할 수 있도록 만들어진 기술이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Ribbon과 마찬 가지로 maintenance 상태이며, Spring boot 2.4 이상 버전에서는 지원하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Spring Cloud Gateway&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring 생테계를 기반으로 하는 API Gateway를 제공해 준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway는 간단하지만 효율적인 방법으로 API를 라우팅 하는 방법을 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 외에도 security, monitoring/metrics, resiliency 등과 같은 공통 관심사를 처리해 준다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최신의 버전은 Spring 6, Spring Boot 3 and Project Reactor를 기반으로 동작한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 처리가 가능하며, 동기 방식인 Tomcat 서버가 아닌 &lt;b&gt;비동기 방식인 Netty 서버&lt;/b&gt;로 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기 방식이란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;비동기 방식은 작업을 동기적으로 기다리지 않고, Reactive Programming을 통해 blocking process로 동작하는 애플리케이션을 non-blocking process로 변환하는 프로그래밍 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 Spring - Blocking 방식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Web에서 서버에 요청이 왔을 때 서버는 요청에 대한 적절한 응답을 보내야 하는데 만약 작업이 오래 걸릴 경우에는 요청에 대한 응답이 모두 종료될 때까지 Blocking 됐다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 이유로, Spring에서는 동시 요청 처리를 위해서 멀티 Thread를 지원하였고 Thread마다 다른 요청을 할당받아서 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;물론 요청을 동시에 처리하니 비동기처럼 보일 수 있겠지만, Thread가 늘어날수록 Thread할당에 필요한 Resource가 늘어나게 되어 비효율적이다!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring 5 - Non-Blocking&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring 5가 도입되면서 클라이언트 요청에 별도의 Thread를 생성하지 않고 buffer를 사용해서 요청을 받고 요청을 Back단에서 처리하는 Thread를 둔다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 왜 Non-blocking 방식이 사용될까?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약, 수 천 개의 Stream Data 가 초 당 계속 Update 되는 시스템이라면,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적절하게 응답을 해야 하는 경우 기존의 Blocking 방식은 상당한 부하가 걸린다. 따라서&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, 부하를 효율적으로 처리하는 목적을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring Cloud Gateway&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Spring Cloud Gateway의 동작 순서&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Client는 Spring Cloud Gateway 서버로 요청을 보낸다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gateway Handler Mapping에서 요청이 매핑된다고 판단하면 Gateway Web Handler로 요청을 보낸다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gateway Web Handler는 매핑되는 요청을 위한 필터 체인을 거쳐 요청을 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EjWrR/btsFQhHFoKv/C2samnWFkihWs3BVt9wJD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EjWrR/btsFQhHFoKv/C2samnWFkihWs3BVt9wJD1/img.jpg&quot; data-alt=&quot;동작 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EjWrR/btsFQhHFoKv/C2samnWFkihWs3BVt9wJD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEjWrR%2FbtsFQhHFoKv%2FC2samnWFkihWs3BVt9wJD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;246&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동작 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Spring Cloud Gateway 장점과 단점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청을 다른 서버로 라우팅 시키는 부분을 간단한 yaml 파일로 완성할 수 있다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Non-Blocking 기술 기반이라 라우팅에 집중된&lt;span style=&quot;text-align: left;&quot; data-remove=&quot;true&quot;&gt;(I/O 작업이 많은)&lt;/span&gt; 프로젝트에 최고의 성능을 보일 수 있다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라우티 전/후에 손쉽게 부가 기능을 추가할 수 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GatewayFilter를 등록할 수 있고, 이미 많은 필터를 제공해주고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예시) 헤더 추가 필터, RateLimit 필터 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추가 기능의 구현을 WebFlux 기반(리액티브)으로 작성해야 하므로 어려울 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라우팅 대상 서버가 많아진다면 관리가 어려울 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/230&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mangkyu.tistory.com/230&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jkijki12/Zuul%EC%9D%B4%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jkijki12/Zuul%EC%9D%B4%EB%9E%80&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wildeveloperetrain.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wildeveloperetrain.tistory.com/205&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@sungjin0757/Spring-Cloud%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EB%8A%94-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-API-GATEWAY&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@sungjin0757/Spring-Cloud%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EB%8A%94-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-API-GATEWAY&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Architecture</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>Netflix Ribbon</category>
      <category>Netflix Zuul</category>
      <category>Project</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/95</guid>
      <comments>https://bu119.tistory.com/95#entry95comment</comments>
      <pubDate>Tue, 19 Mar 2024 09:00:24 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 6. Spring Cloud Gateway 라우팅 설정하기 (API Gateway)</title>
      <link>https://bu119.tistory.com/94</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;  &lt;/span&gt;이번에는,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API Gateway의 라우팅을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7; text-align: start;&quot;&gt; 설정할 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;API Gateway 파트 2&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;마이크로서비스 서버를 2개 이상 준비하자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;라우팅을 설정하는 방법에는 3가지가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;application.properties를 통한 경로 설정&lt;/li&gt;
&lt;li&gt;application.yml를 통한 경로 설정&lt;/li&gt;
&lt;li&gt;Config 클래스를 활용한 경로 설정 (직접 Java 코드 작성)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring Cloud Gateway 공식문서의 5번째 카테고리 5. Route Predicate Factories에 다양한 라우팅전략이 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Spring Cloud Gateway 공식문서&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710524288825&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Cloud Gateway&quot; data-og-description=&quot;This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 6, Spring Boot 3 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them &quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&quot; data-og-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLg99u/hyVAOPGyXg/yQKBNNH1r1nQJ8yIyZp1bk/img.png?width=443&amp;amp;height=595&amp;amp;face=0_0_443_595&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-between-route-predicate-factory&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLg99u/hyVAOPGyXg/yQKBNNH1r1nQJ8yIyZp1bk/img.png?width=443&amp;amp;height=595&amp;amp;face=0_0_443_595');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Cloud Gateway&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 6, Spring Boot 3 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;우리는 application.yml 설정을 통해 Path기반의 라우팅을 설정할 것이다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;준비된 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;마이크로서비스&lt;span&gt; 확인하기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;앞서 생성한 3개의 마이크로서비스가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;user-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;beverage-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;community-service&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;각 서비스에&amp;nbsp;&lt;/span&gt;랜덤포트를 지정했지만 API &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Gateway&lt;span&gt; 테스트를 위해 각 서비스에 포트를 지정한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;1. user-service의 포트번호는 8081번으로 지정&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710524950120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# user-service - application.yml

# 현재 프로젝트 포트 지정
server:
  port: 8081

# 현재 프로젝트 이름 지정
spring:
  application:
    name: user-service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. beverage-service&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 포트번호는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8082번으로 지정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710525007480&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# beverage-service - application.yml

server:
  port: 8082

spring:
  application:
    name: beverage-service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. community-service의 포트번호는 8083번으로 지정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710525064599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# community-service - application.yml

server:
  port: 8083

spring:
  application:
    name: community-service&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;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Spring Cloud Gateway &lt;/span&gt;라우팅 설정하기&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;API&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Gateway의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;포트 번호는 8000번으로 지정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1710525157191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apigateway-service - application.yml

server:
  port: 8000

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          # 어디로 갈꺼니?
          uri: http://localhost:8081/
          # 조건절
          predicates:
            - Path=/user-service/**
        - id: beverage-service
          uri: http://localhost:8082/
          predicates:
            - Path=/beverage-service/**
        - id: community-service
          uri: http://localhost:8083/
          predicates:
            - Path=/community-service/**&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;spring: cloud: gateway: &lt;b&gt;routes:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;spring: cloud: gateway:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;routes: - id:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션 고유 이름&lt;/li&gt;
&lt;li&gt;구분하기 위한 id값으로 임의로 작성해도 무관하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;spring: cloud: gateway:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;routes: - uri:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;진입 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;spring: cloud: gateway:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;routes: - predicates:&lt;/b&gt; &amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 조건 (조건절)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;spring: cloud: gateway:&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;routes: -&lt;span&gt;&amp;nbsp;&lt;/span&gt;predicates: - Path =&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt; Path를 기반으로 라우팅을 설정 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ex) - Path = &lt;b&gt;/user-service/**&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;http://localhost:8000&lt;b&gt;/user-service/&lt;/b&gt; 으로 요청이 들어오면 유레카 서버에서 uri에 해당하는 주소를 찾아 그곳으로 요청을 보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Gateway &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 마이크로서비스 서버를 먼저 실행한 후에 API Gateway 서버를 실행해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이대로 라면 &quot;&lt;b&gt;http://localhost:8081/&lt;/b&gt;&quot;과 &quot;&lt;b&gt;http://localhost:8000/user-service/&lt;/b&gt;&quot;를 실행했을 때&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; 같은 결과가 나타나야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;&lt;/span&gt;user-service 서버 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;user-service의 &quot;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;http://localhost:8081/&lt;/b&gt;&quot;의 주소로 &lt;/span&gt;실행하면 &quot;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;user-service&quot;라는 글자가 나타난다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccLy0H/btsFRzUKzyj/iO7kKKxmA2MaQt12beLaM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccLy0H/btsFRzUKzyj/iO7kKKxmA2MaQt12beLaM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccLy0H/btsFRzUKzyj/iO7kKKxmA2MaQt12beLaM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccLy0H%2FbtsFRzUKzyj%2FiO7kKKxmA2MaQt12beLaM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;425&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;&lt;/span&gt;apigateway-service 서버 실행&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;apigateway-service의 &lt;b&gt;&quot;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;http://localhost:8000&lt;/span&gt;/user-service/&lt;/b&gt;&quot;&lt;span&gt;의 주소로 API를 &lt;/span&gt;실행하면 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;user-servicer&quot;라는 글자가 보이지 않는다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfll8/btsFP6F5uJh/TZm9xHktG8ZaEHzpnuYg2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfll8/btsFP6F5uJh/TZm9xHktG8ZaEHzpnuYg2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfll8/btsFP6F5uJh/TZm9xHktG8ZaEHzpnuYg2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyfll8%2FbtsFP6F5uJh%2FTZm9xHktG8ZaEHzpnuYg2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;425&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;  &quot;&lt;b&gt;http://localhost:8081/&lt;/b&gt;&quot;&lt;/span&gt;과&lt;span style=&quot;text-align: left;&quot;&gt; &quot;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;http://localhost:8000&lt;/span&gt;/user-service/&lt;/b&gt;&quot;를 실행했을 때&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;같은 결과가 나타나야 하는데 위&lt;/span&gt;의 결과값을 보면 다르다. 그 이유를 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/97&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731146298458&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MSA 구축하기] 7. Spring Cloud Gateway를 활용한 경로 수정 (API Gateway)&quot; data-og-description=&quot;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   앞서, API Gateway의 라우팅을 설정했는데 실행했을 때 결과 값이 다르게 나타났다. 그 이유에 대해 알아보자. API Gateway 파트 3 우선, 작성한 코&quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/97&quot; data-og-url=&quot;https://bu119.tistory.com/97&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWfMwL/hyXwqstkjT/l0lhkf7NHBNkGzFLkZ8Fmk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSZ34F/hyXsZDk6H3/6XwwT2VvA3QbkWv4dGKql1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmPm2e/hyXs4xRCne/Q8SuCaL2kbH1UI1AS0sPfk/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/97&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWfMwL/hyXwqstkjT/l0lhkf7NHBNkGzFLkZ8Fmk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSZ34F/hyXsZDk6H3/6XwwT2VvA3QbkWv4dGKql1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmPm2e/hyXs4xRCne/Q8SuCaL2kbH1UI1AS0sPfk/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MSA 구축하기] 7. Spring Cloud Gateway를 활용한 경로 수정 (API Gateway)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.   앞서, API Gateway의 라우팅을 설정했는데 실행했을 때 결과 값이 다르게 나타났다. 그 이유에 대해 알아보자. API Gateway 파트 3 우선, 작성한 코&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Gateway</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Routes</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/94</guid>
      <comments>https://bu119.tistory.com/94#entry94comment</comments>
      <pubDate>Mon, 18 Mar 2024 09:00:26 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring MVC 와 Spring Webflux의 차이점</title>
      <link>https://bu119.tistory.com/93</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Spring Framework에는 대표적인 프로그래밍 모델이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;첫 번째는 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;가장 널리 알려지고&lt;/span&gt; 대중적으로 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;사용되는&lt;/span&gt; &lt;b&gt;Spring MVC&lt;/b&gt; 모델이고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;두 번째는 &lt;b&gt;Spring WebFlux&lt;/b&gt; 모델이다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring WebFlux란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; Spring WebFlux는 Spring 5에서 새롭게 도입된 모듈이며, 비동기 및 리액티브 프로그래밍을 지원한다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring MVC와는 다르게 Servlet API를 기반으로 하지 않고, 리액티브 프로그래밍 모델을 채택하여 작동한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이전에는 &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Servlet API를 기반으로 한&lt;/span&gt; Spring MVC를 사용하여 동기적인 처리 방식으로 웹 애플리케이션을 개발했다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;동기적인 처리 방식&lt;/span&gt;은 한 번에 하나의 요청을 처리하는데, 이는 높은 트래픽과 데이터 양을 효과적으로 처리하기 어렵다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;최근에는 더 많은 트래픽과 데이터량을 효율적으로 처리하기 위한 필요성이 증가했고 리액티브 프로그래밍이 등장하게 되었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;리액티브&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;프로그래밍은 데이터 스트림과 변화의 전파를 중심으로 하는 프로그래밍 패러다임으로,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring WebFlux는 Reactor라는 리액티브 스트림 스펙을 기반으로 개발되었다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이를 통해 비동기적이고 논블로킹 방식으로 동작하여 더 많은 동시 요청을 처리하고, 데이터 스트림을 효율적으로 처리할 수 있게 되었다.&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;따라서, Spring WebFlux는 현대적이고 확장 가능한 웹 애플리케이션을 개발하는 데 유용한 도구이다. 이 모듈을 사용하면 개발자는 비동기적이고 효율적인 방식으로 작업할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Spring WebFlux와 Spring MVC를 비교할 때 가장 큰 차이는 리액티브 프로그래밍의 도입이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리액티브 프로그래밍이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;리액티브 프로그래밍은 변화에 반응하여 동작하는 프로그래밍 모델로서, 비동기적이고 이벤트 기반의 접근 방식을 통해 데이터 스트림과 변경 사항을 처리하는 것이 핵심이다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이 패러다임은 데이터의 흐름에 따라 프로그램의 흐름이 결정되며, 데이터가 변경될 때마다 자동으로 관련 코드를 실행하여 응답한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;예를 들어,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;블로킹 코드&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;에서는 함수 호출 후 결과를&lt;/span&gt;&lt;b&gt;&amp;nbsp;기다리는 것&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이 자연스러운 형태이다. 반면,&amp;nbsp;&lt;/span&gt;&lt;b&gt;논블로킹 코드&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;에서&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터를 전송하는 쪽의 전송속도가 수신자의 처리속도를 앞지르지 않게 이벤트 속도를 제어하는 것이 중요&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;하다.&amp;nbsp;&lt;/span&gt;&lt;b&gt;reactive stream&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;은 이런 비동기성 컴포넌트 간의 상호작용에 정의된 작은 스펙이다. 이런 기능을 Back Pressure라고 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring WebFlux의 특징&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액티브 프로그래밍 모델을 기반으로 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring MVC와 마찬가지로 어노테이션 기반의 프로그래밍을 한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대표적으로 @Controller, @RestController, @GetMapping 등을 사용하여 엔드 포인트를 정의하고 요청을 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수형 프로그래밍을 지원한다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring WebFlux는 함수형 엔드포인트 정의와 리액티브 데이터 흐름을 표현하기 위해 Java8의 도입된 람다식을 활용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 및 논블로킹 기반으로 동작하기 때문에, 대량의 동시 요청에 대한 빠른 응답과 서버의 확장성을 향상하는 개발이 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring과 완벽한 통합을 이루고 netty를 지원한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GlbuX/btsFP8w5ZaZ/WkccsKqm0eTE8UTInlmCak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GlbuX/btsFP8w5ZaZ/WkccsKqm0eTE8UTInlmCak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GlbuX/btsFP8w5ZaZ/WkccsKqm0eTE8UTInlmCak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGlbuX%2FbtsFP8w5ZaZ%2FWkccsKqm0eTE8UTInlmCak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;713&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;Spring MVC란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 계층의 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈 개발 영역을 MVC(Model-View-Controller)로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;MVC 패턴을 도입하면서 UI 영역과 도메인(비즈니스 로직) 영역이 구분되어 서로에게 영향을 주지 않으면서 개발과 유지보수를 가능한 방향으로 설계&lt;/b&gt;되었다.&lt;/span&gt;&lt;/p&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-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 처리한 작업의 결과 데이터를 클라이언트에게 응답을 돌려주어야 하는데, 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 칭한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트의 요청을 구체적으로 처리하는 영역을 서비스 계층이라 하며, 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직이라고 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;View&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;Model을 이용하여 웹 브라우저와 같은 애플리케이션의 화면에 보이는 리소스를 제공하는 역할이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; HTML 페이지 등을 출력하는 것 뿐만이 아닌 PDF, Excel 등의 문서 형태 출력 그리고 자주 사용되는 XML, JSON 등 특정 형식의 포맷 변환까지 View가 담당한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트로 Model과 View의 중간에서 상호작용을 해주는 역할이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 클라이언트의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면 이 Model을 View로 전달하는 역할을 수행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring MVC의 구조&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XR8Ey/btsFRb0StDk/yEuZkCnx8BbudjGAPgoBg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XR8Ey/btsFRb0StDk/yEuZkCnx8BbudjGAPgoBg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XR8Ey/btsFRb0StDk/yEuZkCnx8BbudjGAPgoBg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXR8Ey%2FbtsFRb0StDk%2FyEuZkCnx8BbudjGAPgoBg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;590&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동작 순서&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핸들러 조회 : URL에 매핑된 핸들러(컨트롤러)를 조회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핸들러 어댑터 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핸들러 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 변환하여 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;viewResolver 호출 : 뷰의 논리 이름을 물리 이름으로 변경&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;View 반환 : 렌더링 역할을 담당하는 뷰 객체 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;View 랜더링 : 뷰를 통해 뷰를 렌더링&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt;와&amp;nbsp;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Spring WebFlux&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;비교&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Djks/btsFRsH41UC/T0kypEc6SB99RyqgX0ysO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Djks/btsFRsH41UC/T0kypEc6SB99RyqgX0ysO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Djks/btsFRsH41UC/T0kypEc6SB99RyqgX0ysO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Djks%2FbtsFRsH41UC%2FT0kypEc6SB99RyqgX0ysO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;799&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;공통점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MVC와 Webflux 모두 Spring Framework에서 웹 애플리케이션을 개발하기 위한 프레임워크로 공통적으로 @Controller, Reactive Client이 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;둘 다 Tomcat, Jetty, Undertow와 같은 서버에서 실행할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;차이점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동기적 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 동기적인 방식으로 HTTP 요청을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청이 들어오면 해당 요청을 처리하기 위한 스레드를 할당하고, 해당 요청에 대한 응답을 준비할 때까지 기다린다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서블릿 기반:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서블릿 API에 의존하여 구현되어 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 전통적인 서블릿 기반의 웹 애플리케이션 개발 방식을 따르며, 서블릿 컨테이너를 기반으로 동작한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;전통적인 프로그래밍 모델&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring MVC는 전통적인 웹 애플리케이션 개발 모델을 따른다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤러, 서비스, DAO 등의 구성 요소를 사용하여 비즈니스 로직을 처리하고, 서블릿 기반의 요청-응답 사이클을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스레드 모델&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각각의 요청에 대해 별도의 스레드를 할당하여 처리하므로, 스레드 당 요청 처리량이 제한될 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring &lt;/b&gt;&lt;b&gt;WebFlux&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기 및 논블로킹 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Reactive Streams API를 기반으로 하여 비동기 및 논블로킹 방식으로 HTTP 요청을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 요청이 들어오면 해당 요청을 블로킹하지 않고 비동기적으로 처리하며, 응답을 기다리는 동안 다른 요청을 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비서블릿 기반&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WebFlux는 서블릿 API에 의존하지 않으며, 서블릿 컨테이너를 기반으로 동작하지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대신에 Netty나 Undertow와 같은 비서블릿 기반의 웹 서버를 사용하여 동작한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;함수형 및 반응형 프로그래밍 모델&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WebFlux는 함수형 및 반응형 프로그래밍 모델을 채택하여 비동기적으로 데이터를 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 Reactive Streams를 기반으로 하여 데이터 스트림을 처리하고 변환할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;적은 수의 쓰레드 사용&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적은 수의 쓰레드로 더 많은 요청을 처리할 수 있는 비동기 및 논블로킹 모델을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring MVC는 전통적인 동기적인 방식으로 웹 애플리케이션을 개발하는 데 사용되는 반면, &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Spring WebFlux&lt;/span&gt;는 비동기 및 논블로킹 방식으로 개발되어 있어 대량의 요청을 효율적으로 처리할 수 있다. 선택은 프로젝트의 요구 사항과 개발자의 선호도에 따라 달라진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;마지막으로 Spring &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;WebFlux에 대해 자세히 &lt;/span&gt;정리하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Spring WebFlux는 &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;비동기 및 리액티브 프로그래밍의 개념을 익히고 높은 동시성을 필요로 하는 웹 애플리케이션을 개발하는 데 유용하다. &lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;대규모 트래픽 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Non-blocking I/O 모델을 사용하여 단일 쓰레드에서 많은 요청을 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 리소스의 효율적인 활용을 가능하게 하며, 대규모 트래픽을 처리하는 데 효과적이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;데이터 스트리밍 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Reactive Streams API를 기반으로 한 WebFlux는 데이터 스트리밍 처리에 적합하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 데이터를 비동기적으로 처리하고 변환하는 데 유용하며, 실시간 데이터 처리나 이벤트 기반 애플리케이션에서 특히 유용하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;다양한 데이터베이스 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;NoSQL 데이터베이스나 비동기적인 데이터베이스 처리가 필요한 경우 Spring WebFlux는 적합하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 비동기적으로 데이터베이스 호출을 수행하고, 동시성을 높일 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;높은 확장성&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WebFlux는 비동기 및 논블로킹 방식을 사용하여 높은 확장성을 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 애플리케이션의 부하에 따라 쉽게 확장될 수 있음을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mumomu.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mumomu.tistory.com/176&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@jooomOut/spring-webflux-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-1902af1c88bf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/@jooomOut/spring-webflux-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-1902af1c88bf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mooonstar.tistory.com/entry/SpringMVC%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EB%B9%84%EA%B5%90%EB%90%98%EB%8A%94-WebFlux%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mooonstar.tistory.com/entry/SpringMVC%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EB%B9%84%EA%B5%90%EB%90%98%EB%8A%94-WebFlux%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://clairdelunes.tistory.com/158&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://clairdelunes.tistory.com/158&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jaehyunup/Srping-Webflux%EC%9D%98-%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD%EA%B3%BC-MVC%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jaehyunup/Srping-Webflux%EC%9D%98-%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD%EA%B3%BC-MVC%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devuna.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devuna.tistory.com/108&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pearlluck.tistory.com/726&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pearlluck.tistory.com/726&lt;/a&gt;&lt;/p&gt;</description>
      <category>Programming/Spring</category>
      <category>Project</category>
      <category>spring</category>
      <category>spring mvc</category>
      <category>Spring WebFlux</category>
      <category>리액티브 프로그래밍</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/93</guid>
      <comments>https://bu119.tistory.com/93#entry93comment</comments>
      <pubDate>Sun, 17 Mar 2024 09:00:24 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] Spring Cloud Gateway와 Netflix Zuul의 차이점 (API Gateway)</title>
      <link>https://bu119.tistory.com/92</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Cloud Gateway를 활용하여 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;API &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Gateway를 구축할 때 &lt;/span&gt;Spring Initializr에서 의존성으로&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Gateway를 추가하면 안 되고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Reactive Gateway를&amp;nbsp;추가해야 하는 이유는 무엇일까?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;❓&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #8a3db6;&quot;&gt; API&amp;nbsp;Gateway 프로젝트를 생성하기 위해 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Initializr에서 의존성으로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Gateway를 추가했다가 이후에 설정들이 잘 되지 않았다. 그래서 이유를 찾아봤더니 Reactive Gateway를 추가했어야 했다. 왜?!!!&amp;nbsp; Gateway가 아닌 Reactive Gateway를 추가해야 할까? 그 이유에 대해 알아보자!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;⭐&lt;span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;의존성에&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;Gateway가 아닌 Reactive Gateway를&lt;span&gt;&amp;nbsp;&lt;/span&gt;추가해야 하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;이유&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;마이크로서비스 아키텍처에서 API &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway&lt;/span&gt;를 구축하기 위한 도구에는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Cloud Gateway와 Netflix Zuul가 있다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Cloud Gateway를 사용해서&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;API&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Gateway를 구축하기 위해서는 Spring&lt;/span&gt;&lt;/span&gt; Initializr에서 &quot; &lt;span style=&quot;text-align: left;&quot;&gt;Reactive Gateway&quot;를 추가해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&quot;Gateway&quot;를 추가하게 되면, Spring Cloud Gateway가 아닌 Netflix Zuul 방식의 API &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway&lt;/span&gt; 솔루션을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;Netflix Zuu&lt;/span&gt;은 Netflix에서 지원하는&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;API&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Gateway&lt;/span&gt; 방식인데 최근에는 지원이 중단되었고, Spring Cloud Gateway와 같은 다른 대안을 선호하는 추세이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; 즉,&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;Netflix Zuu은 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;더 이상 권장되지 않는 접근 방식이며, Spring Cloud Gateway가 더 현대적이고 유연한 대안으로 간주된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 id=&quot;-api-gateway&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;API Gateway 란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;API Gateway라는&lt;/b&gt; 것은,&amp;nbsp;&lt;b&gt;Reverse Proxy&lt;/b&gt;처럼 클라이언트 요청의&amp;nbsp;&lt;b&gt;앞단&lt;/b&gt;에 위치한다. 마치&amp;nbsp;&lt;b&gt;&amp;lsquo;도어 맨'&lt;/b&gt;&amp;nbsp;역할처럼 들어온 요청들에게 어디로 가야 할지 &amp;lsquo;라우팅&amp;rsquo;해줄 수 있고 들어오고 나가는 명단을&amp;nbsp;&lt;b&gt;&amp;lsquo;로깅&amp;rsquo;&lt;/b&gt;할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;구체적으로는 다음과 같은 역할들이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API 라우팅&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증 및 권한 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;속도 제한&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부하 분산 (로드밸런싱)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로깅 (모니터링)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오케스트레이션&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnp8mD/btsFPHUeyU8/QLtC3VmvJy4WVqhNL8CeCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnp8mD/btsFPHUeyU8/QLtC3VmvJy4WVqhNL8CeCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnp8mD/btsFPHUeyU8/QLtC3VmvJy4WVqhNL8CeCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnp8mD%2FbtsFPHUeyU8%2FQLtC3VmvJy4WVqhNL8CeCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;497&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;마이크로서비스 아키텍처에서 API 게이트웨이를 구축하기 위한 도구에는 &lt;/span&gt;Spring Cloud Gateway와 Netflix Zuul가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6PJRs/btsFRcrTrky/KQBnx7p8Equt8EMvVl8Khk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6PJRs/btsFRcrTrky/KQBnx7p8Equt8EMvVl8Khk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6PJRs/btsFRcrTrky/KQBnx7p8Equt8EMvVl8Khk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6PJRs%2FbtsFRcrTrky%2FKQBnx7p8Equt8EMvVl8Khk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;139&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Cloud Gateway&lt;/span&gt;&lt;/b&gt;는 비동기 처리에 유리&lt;/b&gt;한 반면, Zuul은 그렇지 않기 때문에 더 이상 Zuul을 지원하지 않고 Spring.io 는 &lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Cloud Gateway를&lt;/span&gt;&lt;/b&gt;&lt;b&gt; 권장&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Netflix Zuul 이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Netflix Zuul은 Netflix OSS 프로젝트의 일부로서, 서블릿 기반의 동기식 아키텍처를 사용한다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring 기반의 애플리케이션에서 사용하기 위해 Spring Cloud Netflix 모듈을 사용하여 통합된다.&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Zuul은 Netflix에서 지원되었으나, 최근에는 지원이 중단되었고, Spring Cloud Gateway와 같은 다른 대안을 선호하는 추세이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;의존성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1710505777245&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;  implementation 'org.springframework.cloud:spring-cloud-starter-gateway-mvc'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Cloud Gateway 란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Cloud 프로젝트의 일부로서, Spring Boot와 Spring WebFlux를 기반으로 한다. 따라서 리액티브 스프링 프레임워크를 사용하여 비동기 및 논블로킹 방식으로 요청을 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;의존성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1710505163379&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;  implementation 'org.springframework.cloud:spring-cloud-starter-gateway'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring Cloud Gateway와 Netflix Zuul의 차이점&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud Gateway는 각각의 요청을 처리하기 위해 적은 수의 스레드를 사용하는 Event-loop 방식을 채택한다. 이는 Node.js와 비슷한 접근 방식으로, 각 작업을 작은 단위로 쪼개어 동시에 처리하려고 한다. 이를 통해 적은 수의 스레드로도 많은 작업을 처리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반면에 Netflix Zuul은 전통적인 방식으로, 각 요청을 처리하기 위해 &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Thread pool&lt;/span&gt;을 사용한다. 각 요청은 별도의 스레드에서 처리된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 방식의 선택은 서비스의 요구사항과 사용하는 기술에 따라 다를 수 있다. 현재 잘 동작하고 있는 서비스에 대해서는 변경할 필요가 없다. 그러나 비동기 작업이 많거나 리소스를 효율적으로 사용해야 하는 경우에는 Spring Cloud Gateway와 같은 Reactive 한 접근 방식을 고려할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Spring Cloud Gateway&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기술 스택&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud 프로젝트의 일부로서, Spring Boot와 Spring WebFlux를 기반으로 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;따라서 리액티브 프로그래밍 모델을 사용하여 비동기 및 논블로킹 방식으로 요청을 처리한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기적이고 논블로킹 방식으로 동작하여 적은 스레드로도 많은 요청을 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이벤트 루프(Event Loop) 방식을 사용하여 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;고부하 상황에서도 효율적으로 동작할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;적합한 사용 사례&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;고성능 및 확장성이 필요한 경우에 적합하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기적이고 논블로킹 방식으로 요청을 처리하여 서버 자원을 효율적으로 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring Webflux 예시&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 사용자가 웹 애플리케이션에 접속하여 요청을 보낸다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 요청은 이벤트 루프(Event Loop) 방식으로 처리된다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 적은 수의 스레드로 많은 요청을 처리하는 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, 사용자 A의 요청이 도착하면 하나의 이벤트 루프가 해당 요청을 처리하고, 사용자 B의 요청이 도착하면 다른 이벤트 루프가 해당 요청을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 요청은 작은 단위로 쪼개어 비동기적으로 처리되므로, 많은 요청이 동시에 들어오더라도 적은 수의 스레드로 효율적으로 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Netflix Zuul&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기술 스택&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Netflix에서 만든 도구로, 서블릿 기반의 동기식 아키텍처를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 요청을 처리하는데 스레드(Thread)를 많이 사용하고, 요청마다 스레드를 할당하여 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동기식 아키텍처를 사용하여 요청마다 스레드를 할당하여 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;쓰레드&lt;/span&gt; 풀의 크기에 따라 확장되므로 &lt;/span&gt;많은 스레드를 사용하게 되며 높은 부하 상황에서 확장성이 제한될 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;적합한 사용 사례&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존의 서블릿 기반 아키텍처를 사용하는 서비스에 적합하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 또한 동기식 방식으로 요청을 처리하는 것을 선호하는 경우에 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring MVC 예시&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 방식은 서버에서 각각의 요청을 처리할 때마다 새로운 스레드(Thread)를 생성하여 작업을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 예를 들어, Spring Boot 웹 애플리케이션에서 요청이 들어오면 새로운 스레드를 사용하여 해당 요청을 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 방식은 각각의 요청마다 스레드를 할당하기 때문에 동시에 처리할 수 있는 요청의 수가 제한된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, 스레드를 관리하는데 복잡성이 증가할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, Spring Cloud Gateway는 비동기적이고 효율적인 요청 처리를 위한 도구이며, Netflix Zuul은 기존의 방식을 사용하는 경우에 적합한 도구입니다. 요청의 처리 방식과 성능, 확장성에 따라 적절한 도구를 선택해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jaehyunup/Srping-Webflux%EC%9D%98-%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD%EA%B3%BC-MVC%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jaehyunup/Srping-Webflux%EC%9D%98-%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD%EA%B3%BC-MVC%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devuna.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devuna.tistory.com/108&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@gowjr207/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EB%A5%BC-%EC%84%A4%EB%AA%85%ED%95%B4%EB%B3%B4%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@gowjr207/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EB%A5%BC-%EC%84%A4%EB%AA%85%ED%95%B4%EB%B3%B4%EB%8B%A4&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stir.tistory.com/375&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stir.tistory.com/375&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sky-h-kim.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sky-h-kim.tistory.com/67&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://corono.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://corono.tistory.com/33&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Architecture</category>
      <category>Gateway</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>Netflix Zuul</category>
      <category>Reactive Gateway</category>
      <category>Spring Cloud</category>
      <category>spring mvc</category>
      <category>Spring WebFlux</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/92</guid>
      <comments>https://bu119.tistory.com/92#entry92comment</comments>
      <pubDate>Sat, 16 Mar 2024 09:00:01 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 5. Spring Cloud Gateway 프로젝트 생성하기 (API Gateway)</title>
      <link>https://bu119.tistory.com/91</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이번에는,&lt;span&gt; Spring Cloud Gateway를 사용하여 API Gateway&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7; text-align: start;&quot;&gt;를 구축할 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;API Gateway 파트 1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;API Gateway란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;사용자가 설정한 Routing 설정에 따라 각 endpoint로 client를 대신해서 요청하고, 응답을 받으면 다시 client에게 전달해주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Spring Cloud에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Spring Cloud Gateway&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;가&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span&gt; API&amp;nbsp;Gateway&lt;/span&gt;의 역할을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Spring Cloud Gateway란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 클라우드 게이트웨이는 MSA 가장 앞단에서 클라이언트들로 부터 오는 요청을 받은 후 경로와 조건에 알맞은 마이크로서비스 로직에 요청을 전달하는 게이트웨이이다.&amp;nbsp;게이트웨이는 개념적으로는 아주 단순하지만 가장 앞단에서 무중지 상태로 모든 요청을 받아야하기 때문에 설정하기에 까다롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Spring Cloud Gateway의 특성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 제작했던 스프링 부트, Eureka, Config와 같은 서비스들을 블로킹 기반으로 모두 톰캣 엔진을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 게이트 웨이의 경우 비즈니스 로직 처리 보단 단순하게 지나가는 통로 즉, I/O 처리를 중점적으로 진행하기 때문에 논 블로킹 방식으로 동작하는 WebFlux와 네티엔진을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebFlux는 기존에 스프링 부트에서 사용했던 JPA와 같은 블로킹 방식의 의존성들을 모두 사용하지 못하기 때문에 구현에 앞서 많은 학습이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;Spring Cloud에서 제공하는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start; color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Spring Cloud Gateway를 활용하여 API Gateway를 구축할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cl&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;oud &lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Gateway&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt; 프로젝트 생성하기&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;1. 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0gXWP/btsFO0e9opr/S7M6e5N5khmxwsKOkTkqZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0gXWP/btsFO0e9opr/S7M6e5N5khmxwsKOkTkqZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0gXWP/btsFO0e9opr/S7M6e5N5khmxwsKOkTkqZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0gXWP%2FbtsFO0e9opr%2FS7M6e5N5khmxwsKOkTkqZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;b&gt;Gateway &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설정을 위한 의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필수 의존성&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Reactive Gateway&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710500250182&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// build.gradle

ext {
	set('springCloudVersion', &quot;2023.0.0&quot;)
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'io.projectreactor:reactor-test'
}

dependencyManagement {
	imports {
		mavenBom &quot;org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}&quot;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Spring Initializr에서 의존성으로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;Reactive Gateway를 추가&lt;/b&gt;해야한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Gateway&lt;/b&gt;를 추가하면 안된다!!!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt;&amp;nbsp;그 이유가 궁금하다면 아래 포스팅을 읽어보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bu119.tistory.com/92&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710564677157&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MSA] Spring Cloud Gateway와 Netflix Zuul의 차이점 (API Gateway)&quot; data-og-description=&quot;  Spring Cloud Gateway를 활용하여 API Gateway를 구축할 때 Spring Initializr에서 의존성으로 Gateway를 추가하면 안 되고 Reactive Gateway를 추가해야 하는 이유는 무엇일까? ❓ API Gateway 프로젝트를 생성하기 &quot; data-og-host=&quot;bu119.tistory.com&quot; data-og-source-url=&quot;https://bu119.tistory.com/92&quot; data-og-url=&quot;https://bu119.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwZT05/hyVyeoGphS/CvajNrhabnJPMcPk27FZ61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFY31P/hyVAJnoley/kM7EljCt7Ru7kLpJ7rQN3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTa34U/hyVAMj6Pg0/lfezo0k9t0XL7QB3IhH7y0/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711&quot;&gt;&lt;a href=&quot;https://bu119.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bu119.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwZT05/hyVyeoGphS/CvajNrhabnJPMcPk27FZ61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFY31P/hyVAJnoley/kM7EljCt7Ru7kLpJ7rQN3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTa34U/hyVAMj6Pg0/lfezo0k9t0XL7QB3IhH7y0/img.jpg?width=951&amp;amp;height=951&amp;amp;face=236_304_608_711');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MSA] Spring Cloud Gateway와 Netflix Zuul의 차이점 (API Gateway)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Spring Cloud Gateway를 활용하여 API Gateway를 구축할 때 Spring Initializr에서 의존성으로 Gateway를 추가하면 안 되고 Reactive Gateway를 추가해야 하는 이유는 무엇일까? ❓ API Gateway 프로젝트를 생성하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bu119.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Gateway-%EB%A7%8C%EB%93%A4%EA%B8%B0-MSA2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Gateway-%EB%A7%8C%EB%93%A4%EA%B8%B0-MSA2&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://substantial-park-a17.notion.site/8-84d3a62b9a214035a42ab49aae704a34&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://substantial-park-a17.notion.site/8-84d3a62b9a214035a42ab49aae704a34&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>API Gateway</category>
      <category>Architecture</category>
      <category>Gateway</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Spring Cloud Gateway</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/91</guid>
      <comments>https://bu119.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 15 Mar 2024 21:00:09 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 4. Eureka 클라이언트에 랜덤 포트 할당하기 (Service Discovery)</title>
      <link>https://bu119.tistory.com/89</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;Service Discovery 파트 3&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;Service Discovery의 역할을 간략하게 정리하자면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service Discovery란?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;마이크로서비스의 정보(위치 등)를 등록할 수 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;외부의 요청이나 서비스가 마이크로서비스의 정보를 검색하기 위해 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring Cloud에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Spring Cloud Netflix Eureka&lt;/b&gt;가&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt; Service Discovery의 역할을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Eureka는 Eureka Server와 Eureka Client로 구성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Eureka 클라이언트란?&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MSA를 구성하는 요소들 중 Eureka 서버에서 모니터링 및 관리를 원하는 요소를 Eureka 클라이언트 설정을 진행해서 등록할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번에는, &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;로드밸런싱을 사용하기 위해 &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Eureka&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&amp;nbsp;Client에게 랜덤 포트를 부여할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;❓&lt;span style=&quot;color: #5733b1;&quot;&gt; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery의&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #5733b1;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Eureka Client를 구축하기 위해 구글 검색을 통해 많은 블로그의 자료를 찾아봤다. 포트번호를 랜덤 포트로 설정하는 블로그 글들이 많이 있었는데 그 이유에 대해서는 명확하지 않았다. 이유를 모르고 그대로 적용할 수는 없기 때문에 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #5733b1; text-align: start;&quot;&gt;왜 랜덤포트를 적용하여 구현했는지 &lt;/span&gt;그 이유에 대해 더 파헤쳤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #5733b1;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;다. 그 결과, 로드밸런싱을 사용하기 위해 랜덤포트를 설정한다는 것을 알 수 있었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;⭐ &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;각 애플리케이션에 랜덤 포트를 부여하는 이유?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;랜덤포트의 사용 여부는 마이크로서비스가 독립적으로 사용되는지, LB(로드밸랜서)로 구성되어 사용되는지, 사용 시 문제가 되었을 때 복귀해야 하는 구조는 어떻게 되어 있는지 등에 따라 결정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 프로젝트에서 랜덤포트(port: 0)에 대한 설정은 LB사용을 보이기 위함이고, 포트를 고정(port: 8081)으로 설정한 상태에서 진행해도 문제는 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만, Service Discovery에서 등록된 서비스들이 포트 간의 충돌이 발생할 경우, 해당 서비스를 우회할 수 있는 포트를 지정하여 새롭게 실행하지 않고, 충돌이 발생한 서비스는 중지시켜 버리게 된다. 포트를 잘 구분하여 서비스들을 배포한다고 했을 때는 문제가 없을 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데, 서비스에서 LB를 사용하도록 되어 있다면, LB에 연결되는 다수의 동일 서비스들은 같은 형태(코드)로 작성된 애플리케이션인데, 매번 실행할 때마다 포트를 변경하는 작업을 하기에는 번거로울 수 있다. 이때 랜덤포트로 실행하며 임의의 사용가능한 포트가 할당되고, Service Discovery에 등록될 때는 서비스명으로 사용되기 때문에, 여러 개의 서비스가 연결되어 있어도 하나의 서비스명이 요청을 받아 해당 서비스들에 요청처리를 배분해 줄 수 있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제로 MSA 형태로 구성된 애플리케이션들은 컨테이너 가상화 형태로 운영되는 경우가 대부분인데, Docker나 Kubernetes에서 컨테이너를 기동 할 때는 외부와 연결되기 위한 포트를 랜덤포트로 설정(범위는 지정할 수 있습니다)되어 사용된다. 컨테이너 자체는 독립적인 IP를 가지고 있는 VM이라고 보시면 되고, 이 안에서 사용되는 포트는 어떠한 포트로 지정되어 있더라도 상관없이, 컨테이너 외부하고의 연결만 잘 되어 서비스되는 구조라고 이해하면 좋을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;Eureka 클라이언트 랜덤 포트 지정하기&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;존재하는 마이크로서비스 모두에게 동일하게 설정한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;user-service&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;baverage-service&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;community-service&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 환경에서는 지정된 PORT를 사용하여 애플리케이션을 운영한다.&amp;nbsp;그러나 MSA와 같이 LB 환경을 위해 여러 서비스를 등록하거나 자동으로 서비스가 증가되어야 하는 상황에서는 random port를 이용한다. 동일한 서비스를 여러 개 실행하는 경우라면, 관리자가 매번 PORT 번호를 지정하는 것도 한계가 존재하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 실습을 통해 확인해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;만약, user-service 인스턴스를 여러 개 띄운다면 아래와 같 매번 포트번호를 바꾸고 실행하기 불편하다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9UfH/btsFKaOdis7/xhjEunwgsWzOJ7wfzRm5i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9UfH/btsFKaOdis7/xhjEunwgsWzOJ7wfzRm5i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9UfH/btsFKaOdis7/xhjEunwgsWzOJ7wfzRm5i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9UfH%2FbtsFKaOdis7%2FxhjEunwgsWzOJ7wfzRm5i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;4.&amp;nbsp;Eureka 클라이언트에 랜덤 포트 할당&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;yml 파일에서 port번호를 0번으로 설정하면 &lt;/span&gt;같은 서비스가 실행될 때마다 랜덤으로 포트 번호가 할당된다.&lt;/p&gt;
&lt;pre id=&quot;code_1710166716699&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# application.yml

# 포트번호를 0으로 두면 포트번호가 매번 랜덤으로 할당된다.
server:
    port: 0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;server port 설정을 랜덤 포트로 지정해 주면&amp;nbsp;실행할 때마다 spring boot가 50,000 이상인 랜덤 한 port 번호를 할당해 준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Status에 포트번호가 0으로 보이지만, 마우스로 이 주소에 커서를 올려놓으면 왼쪽 하단에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;http://desktop-4v4j52s:51873/actuator/info&amp;nbsp; 즉, 51873 포트가 랜덤으로 할당된 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nu3vM/btsFEZOWOwS/0MYNuAs9fiuxkwhLkFPUg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nu3vM/btsFEZOWOwS/0MYNuAs9fiuxkwhLkFPUg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nu3vM/btsFEZOWOwS/0MYNuAs9fiuxkwhLkFPUg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnu3vM%2FbtsFEZOWOwS%2F0MYNuAs9fiuxkwhLkFPUg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나, 위와 같이 설정할 경우 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;eureka 서버의 인스턴스 이름은 0으로 고정되어&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서버를 여러 개 띄우더라도&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;ESKTOP-4V4J52S:user-service:0&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;로 인스턴스가 한 개만 등록되게 된다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7pnb5/btsFF4vrNZr/bp0Ksz4VRKKoj8fdTeiMKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7pnb5/btsFF4vrNZr/bp0Ksz4VRKKoj8fdTeiMKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7pnb5/btsFF4vrNZr/bp0Ksz4VRKKoj8fdTeiMKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7pnb5%2FbtsFF4vrNZr%2Fbp0Ksz4VRKKoj8fdTeiMKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포트번호가 0인 user-service를 3개 띄웠지만&amp;nbsp; eureka 서버에는 1개로 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 동일한 service application이 여러 개 실행될 때 yml에서 설정한 port인 0으로 인식이 되기 때문에 각각의 서비스를 구분하기 어렵다.&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;따라서, 인스턴스 id 값을 재정의 해야 한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;5. 인스턴스 ID 값&amp;nbsp; 재정의&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;random port 지정 시 서비스를 구분하기 위해 각각의 서비스를 instance-id로 구분한다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;eureka&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클라이언트들의 instance-id 값을 랜덤으로 부여한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710166716700&quot; class=&quot;apache&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# application.yml

# eureka 설정
eureka:
  instance:
    # 여러 개의 프로젝트를 실행할 때 유레카 서버에서 각각의 인스턴스를 식별하기 위해 설정
    # 'random.value를 활용하여 랜덤 값을 생성해 각 인스턴스를 고유하게 식별
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;eureka: instance: instance-id:
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트를 eureka 서버에 등록하고 유레카 서버로 접속해 보면 위와 같이 등록된 서비스를 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;하지만, 같은 프로젝트를 여러 개 띄우게 되면 포트번호가 같기 때문에 여러 개 띄워지더라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;eureka&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서버에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;1개만 표시되는 현상이 발생한다.&lt;/li&gt;
&lt;li&gt;따라서, 실행되는 프로젝트마다 구분해 주기 위해 표기되는 instance-id 값을 변경해서 적용해 주는 설정이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;${spring.cloud.client.hostname}
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;호스트 이름 (ip 표시)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;${spring.application.instance_id:${random.value}}
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인스턴스 id 값을 랜덤으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;6. 현재까지 최종 application.yml 파일&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710174927858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# application.yml

# 현재 프로젝트 랜덤 포트로 지정
server:
  port: 0

# 현재 프로젝트 이름 지정
spring:
  application:
    name: user-service

# eureka 설정
eureka:
  client:
    # eureka 등록 여부
    register-with-eureka: true
    # eureka 서버로 부터 인스턴스들의 정보를 가져올 것인지 설정하는 속성
    fetch-registry: true
    # eureka 서버 주소에 마이크로서비스 정보 등록
    service-url:
      defaultZone: http://admin:1234mst@localhost:8761/eureka
  instance:
    # 여러 개의 프로젝트를 실행할 때 유레카 서버에서 각각의 인스턴스를 식별하기 위해 설정
    # 'random.value를 활용하여 랜덤 값을 생성해 각 인스턴스를 고유하게 식별
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;instance-id를 랜덤으로 부여하면 Eureka server에서 설정한 instance-id로 인스턴스가 각각 보이게 된다.&lt;span style=&quot;color: #000000; background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3개의 user-service를 실행시키면 각각 instance-id 가 랜덤으로 생성되어 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Eureka server에서&lt;/span&gt; 정상작동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1uopa/btsFFZuuYUw/uzC2Hj1lrfJZvx4PmSLSzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1uopa/btsFFZuuYUw/uzC2Hj1lrfJZvx4PmSLSzK/img.png&quot; data-alt=&quot;user-service 3개 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1uopa/btsFFZuuYUw/uzC2Hj1lrfJZvx4PmSLSzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1uopa%2FbtsFFZuuYUw%2FuzC2Hj1lrfJZvx4PmSLSzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;user-service 3개 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOkFg0/btsFE4vXh5c/bwqVp3L3yE96qeiW7AE6K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOkFg0/btsFE4vXh5c/bwqVp3L3yE96qeiW7AE6K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOkFg0/btsFE4vXh5c/bwqVp3L3yE96qeiW7AE6K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOkFg0%2FbtsFE4vXh5c%2FbwqVp3L3yE96qeiW7AE6K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/193571/instance-id-%EB%8C%80%EC%8B%A0-port%EB%A5%BC-%EB%B3%B4%EC%97%AC%EC%A3%BC%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EC%97%86%EC%9D%84%EA%B9%8C%EC%9A%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.inflearn.com/questions/193571/instance-id-%EB%8C%80%EC%8B%A0-port%EB%A5%BC-%EB%B3%B4%EC%97%AC%EC%A3%BC%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EC%97%86%EC%9D%84%EA%B9%8C%EC%9A%94&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/681124/%EA%B0%81-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90-%EB%9E%9C%EB%8D%A4%ED%8F%AC%ED%8A%B8%EB%A5%BC-%EB%B6%80%EC%97%AC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.inflearn.com/questions/681124/%EA%B0%81-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90-%EB%9E%9C%EB%8D%A4%ED%8F%AC%ED%8A%B8%EB%A5%BC-%EB%B6%80%EC%97%AC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yarisong.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yarisong.tistory.com/42&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/qjawnswkd/222307979571&quot;&gt;https://m.blog.naver.com/qjawnswkd/222307979571&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@boo105/MSA-EUREKA-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&quot;&gt;https://velog.io/@boo105/MSA-EUREKA-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devhan.tistory.com/m/260&quot;&gt;https://devhan.tistory.com/m/260&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&quot;&gt;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>Eureka</category>
      <category>Eureka Client</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Service Discovery</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <category>Trouble Shooting</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/89</guid>
      <comments>https://bu119.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 14 Mar 2024 09:00:46 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 3. Eureka 클라이언트 설정 (Service Discovery)</title>
      <link>https://bu119.tistory.com/88</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery 파트 2&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery의 역할을 간략하게 정리하자면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7QCWG/btsFR1rnjcx/JVQKnZJtygHkSTTp3loL0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7QCWG/btsFR1rnjcx/JVQKnZJtygHkSTTp3loL0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7QCWG/btsFR1rnjcx/JVQKnZJtygHkSTTp3loL0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7QCWG%2FbtsFR1rnjcx%2FJVQKnZJtygHkSTTp3loL0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;580&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Service Discovery란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마이크로서비스의 정보(위치 등)를 등록할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부의 요청이나 서비스가 마이크로서비스의 정보를 검색하기 위해 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud에서는&amp;nbsp;&lt;b&gt;Spring Cloud Netflix Eureka&lt;/b&gt;가&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt; Service Discovery의 역할을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Eureka는 Eureka Server와 Eureka Client로 구성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Eureka 클라이언트란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MSA를 구성하는 요소들 중 Eureka 서버에서 모니터링 및 관리를 원하는 요소를 Eureka 클라이언트 설정을 진행해서 등록할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;  이번에는, 이전에 생성한 각각의 마이크로서비스들에게 &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Eureka&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&amp;nbsp;Client 설정을 할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;마이크로서비스 Eureka 클라이언트 설정하기&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생성한 모든 마이크로서비스들에게 동일하게 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;user-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;beverage&lt;/span&gt;-service&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;community-service&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;1. Eureka 클라이언트 설정을 위한 의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필수 의존성&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Eureka Discovery Client&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710166540401&quot; class=&quot;gams&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// build.gradle

ext {
  set('springCloudVersion', &quot;2023.0.0&quot;)
}

dependencies {

  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

dependencyManagement {
  imports {
    mavenBom &quot;org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;2. Main 클래스 어노테이션 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka 클라이언트로 동작하기 위해 @EnableDiscoveryClient 어노테이션을 등록해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710166540402&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// UserServiceApplication 

package com.caffeinedoctor.userservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 유레카 클라이언트로 등록
public class UserServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(UserServiceApplication.class, args);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;3. Eureka 서버와 연결&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;application.yml 변수 설정을 통해 Eureka 서버에 등록할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710166540403&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# application.yml

# 현재 프로젝트 포트 지정 (user-service)
server:
  port: 8081

# 현재 프로젝트 이름 지정
spring:
  application:
    name: user-service

# eureka 설정 (eureka 서버와 연결)
eureka:
  client:
    # eureka 서버에 등록할지 여부
    register-with-eureka: true
    # eureka 서버로 부터 인스턴스들의 정보를 가져올 것인지 설정하는 속성
    fetch-registry: true
    # eureka 서버 주소에 마이크로서비스 정보 등록
    service-url:
      defaultZone: http://admin:1234mst@localhost:8761/eureka&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring: application: name:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트의 애플리케이션 이름을 정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 이름으로 Gateway에서 호출하므로 필수적으로 입력한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;eureka: client:&amp;nbsp;&lt;/span&gt;register-with-eureka (디폴트 true)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;eureka 서버에 등록 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;eureka: client:&lt;/span&gt;&amp;nbsp;fetch-registry&amp;nbsp;(디폴트 true)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부에서 Client가 검색 가능 여부 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;eureka: client: service-url: defaultZone:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;eureka&lt;/span&gt;&amp;nbsp;클라이언트가 마이크로서비스를 등록할 eureka&amp;nbsp;서버 주소를 지정하기 위해 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 마이크로서비스를 등록할 eureka&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;nbsp;서버&amp;nbsp;주소를 작성한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpf9uN/btsFE2kxLQD/BZAFsHbJ3pRLq9SNAErYK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpf9uN/btsFE2kxLQD/BZAFsHbJ3pRLq9SNAErYK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpf9uN/btsFE2kxLQD/BZAFsHbJ3pRLq9SNAErYK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpf9uN%2FbtsFE2kxLQD%2FBZAFsHbJ3pRLq9SNAErYK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://covenant.tistory.com/251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://covenant.tistory.com/251&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devhan.tistory.com/m/260&quot;&gt;https://devhan.tistory.com/m/260&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&quot;&gt;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>Architecture</category>
      <category>Eureka</category>
      <category>Eureka Client</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Service Discovery</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/88</guid>
      <comments>https://bu119.tistory.com/88#entry88comment</comments>
      <pubDate>Wed, 13 Mar 2024 09:00:19 +0900</pubDate>
    </item>
    <item>
      <title>[MSA 구축하기] 2. Eureka 서버 구축 (Service Discovery)</title>
      <link>https://bu119.tistory.com/87</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;  우리는 Spring Cloud를 활용하여 MSA를 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt; 이번에는, &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery를 구축할 것이다.&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery 파트 1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery의 역할을 간략하게 정리하자면,&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lT1eK/btsFRuAnO3o/KgiXwAhcuPkS7MgbbeUq4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lT1eK/btsFRuAnO3o/KgiXwAhcuPkS7MgbbeUq4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lT1eK/btsFRuAnO3o/KgiXwAhcuPkS7MgbbeUq4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlT1eK%2FbtsFRuAnO3o%2FKgiXwAhcuPkS7MgbbeUq4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;580&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Service Discovery란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마이크로서비스의 정보(위치 등)를 등록할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부의 요청이나 서비스가 마이크로서비스의 정보를 검색하기 위해 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Cloud에서는 &lt;b&gt;Spring Cloud Netflix Eureka&lt;/b&gt;가&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt; Service Discovery의 역할을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Eureka는 Eureka Server와 Eureka Client로 구성된다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Eureka 서버란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka 서버는 단순하게 MSA를 구성하는 마이크로 서비스들을 모니터링하는 감시자 서버의 역할을 한다고 볼 수 있지만. 깊게 보면 현재 존재하는 마이크로 서비스들을 Gateway에게 알려주어 시간과 부하에 따라 유동적으로 스케일 아웃되는 서버들을 모두 가용할 수 있도록 하는 역할을 수행한다.&amp;nbsp;따라서, Eureka 서버는 가동되는 서버를 확인 후 Gateway에게 그 목록을 알려주는 역할을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;span style=&quot;text-align: left;&quot;&gt; &lt;/span&gt; 먼저,&amp;nbsp; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Service Discovery의&lt;/span&gt; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: start;&quot;&gt;Eureka Server를 구축할 것이다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버 구축하기&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;1. 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JPxf4/btsFJ4gbTP4/k5ulDZcf5FthO5tPzP7iDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JPxf4/btsFJ4gbTP4/k5ulDZcf5FthO5tPzP7iDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JPxf4/btsFJ4gbTP4/k5ulDZcf5FthO5tPzP7iDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJPxf4%2FbtsFJ4gbTP4%2Fk5ulDZcf5FthO5tPzP7iDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1530&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Eureka 서버&amp;nbsp;&lt;/b&gt;&lt;b&gt;설정을 위한 의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필수 의존성&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Eureka Server&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Spring Security&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1710166108457&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// build.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;2. Main 클래스 어노테이션 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eureka 서버로 동작하기 위한 어노테이션을 등록해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1710166108458&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// EurekaServerApplication

package com.caffeinedoctor.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer // EurekaServer로 등록
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;main&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;메서드에&amp;nbsp;&lt;/span&gt;@EnableEurekaServer 어노테이션을&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;추가하면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Discovery 서버로의 역할을 수행할 수 있게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;3. Eureka 서버 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;application.properties 파일을 삭제하고 application.yml 파일을 생성하여 설정을 통해 Eureka 서버를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710166108459&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# application.yml 

# 현재 프로젝트의 포트 번호 지정
# 유레카 서버 포트 번호는 보통 8761번 사용
server:
  port: 8761
  
# 현재 프로젝트의 이름 지정
spring:
  application:
    name: eureka-server

# 현재 프로젝트의 eureka 설정
eureka:
  client:
    # eureka 등록 여부
    # 유레카 서버가 자기자신을 등룍하는 것을 막음
    register-with-eureka: false
    # Eureka 서버로부터 인스턴스들의 정보를 주기적으로 가져올 것인지 설정하는 속성
    fetch-registry: false&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;포트 번호: 8761&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Service 이름:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;eureka-server&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;register-with-eureka (디폴트 true)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레지스트리에 자신을 등록할 건지에 대한 여부이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉,&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;유레카 서버에 등록하겠냐는 뜻이다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;지금 Service는 Eureka Server이니 등록이 필요 없어서 false로 설정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;fetch-registry&amp;nbsp;(디폴트 true)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레지스트리에 있는 정보를 가지고 올건지에 대한 여부이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;true 설정 시 검색할 때마다 Eureka server를 호출하는 대신 레지스트리가 로컬로 캐싱된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, Client가 검색 가능하도록 하는 설정이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금 Service는 Eureka Server이니 검색이 필요 없어서 false로 설정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;4. 시큐리티 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka 서버는 내부망에서만 존재해야 된다.&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 외부망에 구축하거나 내부망에서도 보안을 중요시해야 하기 때문에 스프링 시큐리티 설정을 진행한다.&amp;nbsp;&lt;/span&gt;시큐리티는 httpBasic 방식 코드를 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710166108460&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// SecurityConfig

package com.caffeinedoctor.eurekaserver.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;


// 시큐리티 커스텀 config를 작성하여 특정 경로에 대해 접근을 막는다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 암호화 시키기
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {

        return new BCryptPasswordEncoder();
    }

    // 특정 경로에 대해서 보안 설정하기
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // csrf 무시
        http.csrf((auth) -&amp;gt; auth.disable());

        // 모든 경로에 대해 권한이 필요하게 한다.
        http.authorizeHttpRequests((auth) -&amp;gt; auth.anyRequest().authenticated());

        // 로그인 방식은 http 베이직 방식
        http.httpBasic(Customizer.withDefaults());

        return http.build();
    }

    // 서버에 접속할 수 있는 비밀번호와 아이디 등록하기 (인 메모리 타입)
    @Bean
    public UserDetailsService userDetailsService() {
        // 시용자1 생성
        UserDetails user1 = User.builder()
                .username(&quot;아이디&quot;)
                .password(bCryptPasswordEncoder().encode(&quot;비밀번호&quot;))
                .roles(&quot;ADMIN&quot;)
                .build();

        return new InMemoryUserDetailsManager(user1);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5610584655236226&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #99cefa;&quot;&gt;&lt;i&gt;&lt;b&gt;Spring Cloud Eureka 서버&amp;nbsp; 실행&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YN18K/btsFJqD03zw/gNR4GCihm9LAouonFKAzGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YN18K/btsFJqD03zw/gNR4GCihm9LAouonFKAzGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YN18K/btsFJqD03zw/gNR4GCihm9LAouonFKAzGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYN18K%2FbtsFJqD03zw%2FgNR4GCihm9LAouonFKAzGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;765&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://covenant.tistory.com/251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://covenant.tistory.com/251&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devhan.tistory.com/m/260&quot;&gt;https://devhan.tistory.com/m/260&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&quot;&gt;https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>Architecture</category>
      <category>Eureka</category>
      <category>Eureka Server</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>MSA 구축하기</category>
      <category>Project</category>
      <category>Service Discovery</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/87</guid>
      <comments>https://bu119.tistory.com/87#entry87comment</comments>
      <pubDate>Tue, 12 Mar 2024 18:00:33 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] Service Discovery</title>
      <link>https://bu119.tistory.com/86</link>
      <description>&lt;h2 style=&quot;color: #333333;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Service Discovery&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;마이크로서비스 아키텍처(MSA)로 구성되어 있는 서비스들은 각자 다른 IP와 Port를 가지고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이러한 서로 다른 서비스들의 IP와 Port 정보에 대해서 저장하고 관리할 필요가 있는데 Service Discovery라고 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, MSA에서는 Service의 IP와 Port가 일정하지 않고 지속적을 변화한&lt;span style=&quot;text-align: start;&quot;&gt;다. 그렇기 때문에 Client에 Service의 정보를 수동으로 입력하는 것은 한계가 분명하다. Service Discovery란 이런 MSA의 상황에 적합하다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스의 인스턴스가 생성 혹은 소멸되거나 신규 서비스들이 지속적으로 증가하는 등 서비스의 정보가 지속적으로 바뀔 수 있다.&amp;nbsp;&lt;b&gt;디스커버리 서버&lt;/b&gt;는&amp;nbsp;이러한&amp;nbsp;&lt;b&gt;가변적인 모든 서비스의 정보&lt;/b&gt;들은 각 서비스의&amp;nbsp;&lt;b&gt;고유 ID(거의 변하지 않는)&lt;/b&gt;에 매핑하여 관리한다.&amp;nbsp;그리고 각 서비스들은 지속적으로&amp;nbsp;&lt;b&gt;1) 자신의 정보를 디스커버리 서버에 등록하며&lt;/b&gt;&amp;nbsp;&lt;b&gt;2) 다른 서비스들의 정보를 조회한다.&lt;/b&gt; 그럼 각 서비스들은 다른 서비스의 IP와 PORT를 몰라도 서비스의&amp;nbsp;&lt;b&gt;고유 ID만&lt;/b&gt; 가지고 연계가 가능해진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정리하자면, &lt;b&gt;Service Discovery&lt;/b&gt;는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;마이크로서비스의 정보(위치 등)를 등록할 수 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;외부의 요청이나 서비스가 마이크로서비스의 정보를 검색하기 위해 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 서비스 디스커버리의 구현을 쉽게 도와주는 것이 Spring Cloud의&amp;nbsp;&lt;b&gt;Eureka&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;Spring Cloud Netflix Eureka&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Spring Cloud Netflix Eureka는 Service Discovery의 역할을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfhVkr/btsFGBmuvLL/0k0ngMowLoJ43C9l5jkfo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfhVkr/btsFGBmuvLL/0k0ngMowLoJ43C9l5jkfo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfhVkr/btsFGBmuvLL/0k0ngMowLoJ43C9l5jkfo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfhVkr%2FbtsFGBmuvLL%2F0k0ngMowLoJ43C9l5jkfo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1028&quot; height=&quot;809&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Eureka의 구성 요소&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service Discovery : 외부에서 마이크로서비스를 찾아주는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service Registry : 각각의 서비스가 자신의 위치 정보를 특정 서버에 등록하는 작업&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;즉, Eureka는 Eureka Server와 Eureka Client로 구성된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;Eureka Server (&lt;/b&gt;서버 라이브러리)&amp;nbsp;&lt;/b&gt;: 서비스들의 정보를 관리, 제공&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;Eureka Client&amp;nbsp;&lt;/b&gt;(&lt;b&gt;클라이언트 라이브러리&lt;/b&gt;)&amp;nbsp;&lt;/b&gt;: 서버에 자신의 정보를 제공, 다른 서비스의 정보를 조회&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;말 그대로&amp;nbsp;&lt;b&gt;Eureka Server는 디스커버리 서버에 탑재&lt;/b&gt;되며,&amp;nbsp;&lt;b&gt;Eureka Client는 각각의 서비스들에 탑재된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbzRi/btsFGkZuVM2/0IHOl7m1a7IGhbIhd43Fy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbzRi/btsFGkZuVM2/0IHOl7m1a7IGhbIhd43Fy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbzRi/btsFGkZuVM2/0IHOl7m1a7IGhbIhd43Fy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpbzRi%2FbtsFGkZuVM2%2F0IHOl7m1a7IGhbIhd43Fy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;423&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 그림과 같이 각 서비스들이 기동 될 때 혹은 가동 중에도 지속적으로&amp;nbsp;&lt;b&gt;자신의 정보를 디스커버리 서버에 등록(갱신)&lt;/b&gt;하며, 서버는 이 정보들을&amp;nbsp;&lt;b&gt;캐싱하여 관리&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euLJli/btsFI5z34CG/QLFSBtOmMQryrckklDXU4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euLJli/btsFI5z34CG/QLFSBtOmMQryrckklDXU4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euLJli/btsFI5z34CG/QLFSBtOmMQryrckklDXU4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuLJli%2FbtsFI5z34CG%2FQLFSBtOmMQryrckklDXU4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;423&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이와 동시에 각 서비스들은 디스커버리 서버로부터&amp;nbsp;&lt;b&gt;다른 서비스들의 정보를 지속적으로 조회한&lt;/b&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(이 정보들 또한 기본적으로 서비스들이 캐싱하여 관리한다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 각서비스 들은 서로의 고유 ID만 가지고 연계가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, 상품 서비스가 주문 서비스로 REST API 요청을 할 때&amp;nbsp;&lt;b&gt;IP와 PORT 대신&amp;nbsp;고유 ID로 통신&lt;/b&gt;이 가능해진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://junhyunny.github.io/spring-boot/spring-cloud/msa/spring-cloud-netflix-eureka/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://junhyunny.github.io/spring-boot/spring-cloud/msa/spring-cloud-netflix-eureka/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cloud.spring.io/spring-cloud-netflix/reference/html/#service-discovery-eureka-clients&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.spring.io/spring-cloud-netflix/reference/html/#service-discovery-eureka-clients&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/&quot;&gt;https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wonit.tistory.com/m/495&quot;&gt;https://wonit.tistory.com/m/495&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://enjoy-dev.tistory.com/10&quot;&gt;https://enjoy-dev.tistory.com/10&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Architecture/MSA</category>
      <category>Architecture</category>
      <category>Eureka</category>
      <category>Eureka Client</category>
      <category>Eureka Server</category>
      <category>MircroService</category>
      <category>MSA</category>
      <category>Project</category>
      <category>Service Discovery</category>
      <category>spring boot</category>
      <category>Spring Cloud</category>
      <author>bu119</author>
      <guid isPermaLink="true">https://bu119.tistory.com/86</guid>
      <comments>https://bu119.tistory.com/86#entry86comment</comments>
      <pubDate>Tue, 12 Mar 2024 09:00:33 +0900</pubDate>
    </item>
  </channel>
</rss>