<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>공대생의 코딩 일기</title>
    <link>https://blogan99.tistory.com/</link>
    <description>전자공학과 학부생의 코딩 일기</description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 07:18:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>공대생안씨</managingEditor>
    <image>
      <title>공대생의 코딩 일기</title>
      <url>https://tistory1.daumcdn.net/tistory/5128218/attach/98abe5d55b2b4c7b941b22fe45543d79</url>
      <link>https://blogan99.tistory.com</link>
    </image>
    <item>
      <title>[DevOps/Monitoring] Spring Boot 프로젝트에 Apache JMeter 활용한 부하 테스트하기</title>
      <link>https://blogan99.tistory.com/162</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 부하 테스트&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 부하 테스트란 ?&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;부하 테스트 (Load Test)
&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;주로 웹 서비스, API 서버, 데이터베이스 등에서 성능 한계나 병목 구간을 찾기 위해 사용함&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;1-1-1. 주요 부하 테스트 유형&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Load Test : 점진적으로 부하 증가 &amp;rarr; 시스템 성능 측정&lt;/li&gt;
&lt;li&gt;Stress Test : 정상 한계를 넘는 부하를 가함 &amp;rarr; 시스템 안정성 확인&lt;/li&gt;
&lt;li&gt;Spike Test : 짧은 시간에 급격한 부하를 가함&lt;/li&gt;
&lt;li&gt;Soak Test : 장시간 일정 부하를 가함 &amp;rarr; 시스템의 메모리 누수, 성능 저하 여부 확인&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;b&gt;1-2. 테스트 진행 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blogan99.tistory.com/161&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.05.16 - [DevOps/Monitoring] - [DevOps/Monitoring] AWS EC2에 Prometheus + Grafana로 Docker 기반 모니터링 시스템 구축&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1749388429092&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;[DevOps/Monitoring] AWS EC2에 Prometheus + Grafana로 Docker 기반 모니터링 시스템 구축&quot; data-og-description=&quot;1. 모니터링 시스템1-1. 사용 이유단순한 로그만으로는 운영 상태를 파악하는데 한계가 있음서비스의 성능, 상태, 오류 등 실시간 정보 파악 및 대응 가능특히 운영 환경 (Production)에서는 메트릭 &quot; data-og-host=&quot;blogan99.tistory.com&quot; data-og-source-url=&quot;https://blogan99.tistory.com/161&quot; data-og-url=&quot;https://blogan99.tistory.com/161&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DAOJe/hyY5dTisRg/E2gt83hGzLSkLt2N7DfcHK/img.png?width=635&amp;amp;height=531&amp;amp;face=0_0_635_531,https://scrap.kakaocdn.net/dn/XlZEd/hyY44Wlldh/DjbxUc6hn7gB9vCXKlZaX1/img.png?width=635&amp;amp;height=531&amp;amp;face=0_0_635_531,https://scrap.kakaocdn.net/dn/dg6ZHa/hyY49XDKqg/LmdTi9bvI4l156Z61KZnqK/img.png?width=636&amp;amp;height=480&amp;amp;face=0_0_636_480&quot;&gt;&lt;a href=&quot;https://blogan99.tistory.com/161&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blogan99.tistory.com/161&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DAOJe/hyY5dTisRg/E2gt83hGzLSkLt2N7DfcHK/img.png?width=635&amp;amp;height=531&amp;amp;face=0_0_635_531,https://scrap.kakaocdn.net/dn/XlZEd/hyY44Wlldh/DjbxUc6hn7gB9vCXKlZaX1/img.png?width=635&amp;amp;height=531&amp;amp;face=0_0_635_531,https://scrap.kakaocdn.net/dn/dg6ZHa/hyY49XDKqg/LmdTi9bvI4l156Z61KZnqK/img.png?width=636&amp;amp;height=480&amp;amp;face=0_0_636_480');&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;[DevOps/Monitoring] AWS EC2에 Prometheus + Grafana로 Docker 기반 모니터링 시스템 구축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 모니터링 시스템1-1. 사용 이유단순한 로그만으로는 운영 상태를 파악하는데 한계가 있음서비스의 성능, 상태, 오류 등 실시간 정보 파악 및 대응 가능특히 운영 환경 (Production)에서는 메트릭&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blogan99.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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://blogan99.tistory.com/161&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blogan99.tistory.com/161&lt;/a&gt;&amp;nbsp;에서 Prometheus와 Grafana를 활용한 모니터링 시스템 구축함&lt;/li&gt;
&lt;li&gt;트래픽이 적은 상황이라 모니터링 시스템으로 서버의 실시간 지표를 확인하는 의미가 크게 없었음&lt;/li&gt;
&lt;li&gt;만약 사용자가 늘어 트래픽이 증가하게 된다면 &lt;br /&gt;&amp;ldquo;서버가 안정적으로 트래픽을 처리할 수 있는지&amp;rdquo;, &amp;ldquo;어느 수준에서 성능 저하가 발생하는지&amp;rdquo;가 궁금해짐&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;b&gt;1-3. 테스트 진행 방법&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;Apache의 JMeter를 통해 테스트하고자 하는 API에 짧은 시간동안 많은 요청을 발생시켜 서버의 처리 능력 측정&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;1-3-1. Apache JMeter 란 ?&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;Apache JMeter
&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GUI 기반으로 테스트 플랜 작성 가능&lt;/li&gt;
&lt;li&gt;CLI 모드로 테스트 자동화 가능&lt;/li&gt;
&lt;li&gt;다양한 Listener(리포트)를 통한 시각적인 결과 확인&lt;/li&gt;
&lt;li&gt;커스터마이징 용이하며 다양한 플러그인 제공&lt;/li&gt;
&lt;li&gt;경량 테스트 도구로 별도 서버 설치 없이 로컬에서 실행 가능&lt;/li&gt;
&lt;/ol&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. JMeter 활용 부하 테스트&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. JMeter 설치&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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;brew search jmeter
brew install jmeter&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;b&gt;2-2. JMeter 실행 (GUI)&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;GUI로 실행할 것 (사용자 설정이 있다면 설치 위치가 다를 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# GUI 실행
open /usr/local/opt/jmeter/libexec/bin/jmeter

# CLI 실행
jmeter&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;b&gt;2-3. 테스트 플랜 구성 및 테스트 진행&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-3-1. Thread Group 추가&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;Test Plan 우클릭 &amp;gt; Add &amp;gt; Threads(Users) &amp;gt; Thread Group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvSamU/btsOrCjHu0u/XGZyt2wOB9JRZaeBcSpEcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvSamU/btsOrCjHu0u/XGZyt2wOB9JRZaeBcSpEcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvSamU/btsOrCjHu0u/XGZyt2wOB9JRZaeBcSpEcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvSamU%2FbtsOrCjHu0u%2FXGZyt2wOB9JRZaeBcSpEcK%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;1401&quot; height=&quot;713&quot; data-origin-width=&quot;1401&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thread Properties 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7KN0f/btsOrWJfNkX/iwPDNTApjLLbMU6A3mgDOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7KN0f/btsOrWJfNkX/iwPDNTApjLLbMU6A3mgDOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7KN0f/btsOrWJfNkX/iwPDNTApjLLbMU6A3mgDOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7KN0f%2FbtsOrWJfNkX%2FiwPDNTApjLLbMU6A3mgDOk%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;1397&quot; height=&quot;711&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Number of Threads (users) : 동시에 실행될 가상 사용자(스레드) 수 ex) 10,000으로 설정 &amp;rArr; 10,000 명의 사용자가 동시에 서버에 요청 보내는 상황 시뮬레이션 함&lt;/li&gt;
&lt;li&gt;Ramp-up period (seconds) : 모든 스레드를 몇 초 동안 순차적으로 실행할 지 (0 설정 : 모든 스레드가 동시에 시작함)&lt;br /&gt;ex) 10초로 설정 &amp;rArr; 10,000개의 스레드가 10초 동안 순차적으로 실행됨 / 값이 작을수록 부하가 급격하게 증가&lt;/li&gt;
&lt;li&gt;Loop Count : 각 스레드가 요청을 몇 번 반복할 지&lt;br /&gt;ex) 5로 설정 &amp;rArr; 각 스레드가 요청을 5번 반복함&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-3-2. HTTP Request 추가&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;Thread Group 우클릭 &amp;gt; Add &amp;gt; Sampler &amp;gt; Http Request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/45yPM/btsOss1FsH0/bzZ8TFTqNtI2qvHQlMWHa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/45yPM/btsOss1FsH0/bzZ8TFTqNtI2qvHQlMWHa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/45yPM/btsOss1FsH0/bzZ8TFTqNtI2qvHQlMWHa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F45yPM%2FbtsOss1FsH0%2FbzZ8TFTqNtI2qvHQlMWHa0%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;1399&quot; height=&quot;715&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;715&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;HTTP Request 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCXmx/btsOt03Ym7b/ABSev94kWLtCDpBxQbbqS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCXmx/btsOt03Ym7b/ABSev94kWLtCDpBxQbbqS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCXmx/btsOt03Ym7b/ABSev94kWLtCDpBxQbbqS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCXmx%2FbtsOt03Ym7b%2FABSev94kWLtCDpBxQbbqS1%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;1134&quot; height=&quot;402&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Server Name or IP : 테스트할 서버 주소&lt;/li&gt;
&lt;li&gt;Port Number : 포트번호&lt;/li&gt;
&lt;li&gt;HTTP Request : HTTP Method와 테스트할 API의 URI&lt;/li&gt;
&lt;/ul&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;Timeout 설정 (선택)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Advanced 탭 &amp;gt; Timeout&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GTxgu/btsOrFOgLx7/YpkmgndzcfFNODVW8gkoYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GTxgu/btsOrFOgLx7/YpkmgndzcfFNODVW8gkoYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GTxgu/btsOrFOgLx7/YpkmgndzcfFNODVW8gkoYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGTxgu%2FbtsOrFOgLx7%2FYpkmgndzcfFNODVW8gkoYk%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;1134&quot; height=&quot;337&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Connect (Connect Timeout) : 클라이언트 (JMeter)가 서버에 TCP 연결을 맺을 때까지 기다리는 최대 시간 (ms 단위)&lt;br /&gt;&amp;rArr; 설정 시간을 초과하면 &amp;ldquo;Connection Timeout&amp;rdquo; 에러 발생함&lt;/li&gt;
&lt;li&gt;Response (Response Timeout) : 서버에 요청을 보내고 응답을 모두 받을 때까지 기다리는 최대 시간 (ms 단위)&lt;br /&gt;&amp;rArr; 서버 연결은 되어 있지만, 응답까지 시간이 오래걸리면 &amp;ldquo;Response Timeout&amp;rdquo; 에러 발생함&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-3-3. View Results Tree + Aggregate Graph 추가&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;View Results Tree 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thread Group 우클릭 &amp;gt; Add &amp;gt; Listener &amp;gt; View Results Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBBsp0/btsOtgNcOf4/ETLAY7Dw43qy1EKzZmD9HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBBsp0/btsOtgNcOf4/ETLAY7Dw43qy1EKzZmD9HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBBsp0/btsOtgNcOf4/ETLAY7Dw43qy1EKzZmD9HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBBsp0%2FbtsOtgNcOf4%2FETLAY7Dw43qy1EKzZmD9HK%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;1384&quot; height=&quot;631&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 개별 요청에 대한 상세 결과 (성공 여부, 응답 시간, 응답 내용, 오류 메시지 등)를 확인 가능&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;Aggregate Graph 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thread Group 우클릭 &amp;gt; Add &amp;gt; Listener &amp;gt; Aggregate Graph&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K1AHG/btsOrDpp60U/szdS5vb2ktlCChEs12ZYpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K1AHG/btsOrDpp60U/szdS5vb2ktlCChEs12ZYpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K1AHG/btsOrDpp60U/szdS5vb2ktlCChEs12ZYpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK1AHG%2FbtsOrDpp60U%2FszdS5vb2ktlCChEs12ZYpk%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;1439&quot; height=&quot;622&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 전체 테스트 결과를 집계하여 그래프 형태로 시각화, 테스트 종료 후 주요 성능 지표 확인에 활용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✏️ Aggregate Graph 주요 항목&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZXuaa/btsOrt8sa80/ZqkWyaaLKhzRKKptFr667K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZXuaa/btsOrt8sa80/ZqkWyaaLKhzRKKptFr667K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZXuaa/btsOrt8sa80/ZqkWyaaLKhzRKKptFr667K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZXuaa%2FbtsOrt8sa80%2FZqkWyaaLKhzRKKptFr667K%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;1135&quot; height=&quot;257&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
- Samples : 총 요청 수 (스레드 수 * loop 수 등)&lt;br /&gt;- Average : 요청 1건 당 평균 응답 시간 (ms)&lt;br /&gt;- Min : 요청 중 가장 빠른 응답 시간&lt;br /&gt;- Max : 요청 중 가장 느린 응답 시간&lt;br /&gt;- Throughput : 초당 처리 요청 수 (Requests per Second, RPS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 서버 처리 성능을 나타내는 중요한 지표임 Error % : 오류 발생 비율 &amp;rArr; 높다면 서버 또는 테스트 설정에 문제가 있을 가능성이 높음 &lt;br /&gt;- Received KB/sec : 초당 수신한 데이터 양&lt;br /&gt;- Sent KB/sec : 초당 전송한 데이터 양&lt;/blockquote&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-3-4. Plugin 설치 (선택)&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;우측 상단 Plugins Manager 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;29&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bghs01/btsOskixmV7/CyWKFaU0WjLVokZTLqpyMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bghs01/btsOskixmV7/CyWKFaU0WjLVokZTLqpyMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bghs01/btsOskixmV7/CyWKFaU0WjLVokZTLqpyMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbghs01%2FbtsOskixmV7%2FCyWKFaU0WjLVokZTLqpyMK%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;199&quot; height=&quot;29&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;29&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;Available Plugins 탭 &amp;gt; 3 Basic Graphs &amp;gt; Apply Changes and Restart JMeter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmzJDW/btsOtK1m1sS/6TecW3d2RJNupKhljZakB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmzJDW/btsOtK1m1sS/6TecW3d2RJNupKhljZakB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmzJDW/btsOtK1m1sS/6TecW3d2RJNupKhljZakB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmzJDW%2FbtsOtK1m1sS%2F6TecW3d2RJNupKhljZakB1%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;1021&quot; height=&quot;769&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; Response Times Over Time, Transactions per Second, Active Threads Over Time의 3개 그래프를 확인 가능&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;b&gt;3. Grafana 연동한 모니터링 결과 분석&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 테스트 시 관찰할 메트릭 선정&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;CPU 사용률&lt;/li&gt;
&lt;li&gt;Memory 사용률&lt;/li&gt;
&lt;li&gt;Request 처리 속도 (Throughput)&lt;/li&gt;
&lt;li&gt;에러율 (Error %)&lt;/li&gt;
&lt;li&gt;응답 시간 (Latency / Response Time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 서비스 성능과 안정성 확인에 핵심적인 지표라고 생각해서 선정함&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;3-2. 테스트 진행 + Grafana 대시보드 관찰&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-1. 테스트 진행&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;JMeter에서 설정한 부하 시나리오 실행 (현 상황 : Thread 1,000 / Ramp-up 1초 / Loop 3회)&lt;/li&gt;
&lt;li&gt;Aggregate Graph 통해 기본 응답 시간 및 에러율 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b07Z60/btsOsAyCPHx/OHGwgmCnRypRr30xkAHKjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b07Z60/btsOsAyCPHx/OHGwgmCnRypRr30xkAHKjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b07Z60/btsOsAyCPHx/OHGwgmCnRypRr30xkAHKjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb07Z60%2FbtsOsAyCPHx%2FOHGwgmCnRypRr30xkAHKjk%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;1145&quot; height=&quot;799&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;1145&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-2. Grafana 관찰 항목 분석&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;CPU 사용률&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opkLE/btsOsWBshTS/14oYLNUBvqhXU6tK9gKra1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opkLE/btsOsWBshTS/14oYLNUBvqhXU6tK9gKra1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opkLE/btsOsWBshTS/14oYLNUBvqhXU6tK9gKra1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopkLE%2FbtsOsWBshTS%2F14oYLNUBvqhXU6tK9gKra1%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;866&quot; height=&quot;263&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;System CPU Usage (전체 시스템 CPU 사용률) : 약 13.7% 사용&lt;/li&gt;
&lt;li&gt;Process CPU Usage (Spring Boot 프로세스 자체가 사용한 CPU 사용률) : 약 12.7% 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; CPU 사용률이 100%에 가까울 수록 병목 가능성 높음 현재는 13% 수준이므로 CPU에는 여유가 있음을 확인 가능&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;Memory 사용률&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhGIb/btsOtJuCUHB/sSQTQwsXqYyV5VoMTdgLPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhGIb/btsOtJuCUHB/sSQTQwsXqYyV5VoMTdgLPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhGIb/btsOtJuCUHB/sSQTQwsXqYyV5VoMTdgLPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhGIb%2FbtsOtJuCUHB%2FsSQTQwsXqYyV5VoMTdgLPk%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;842&quot; height=&quot;240&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Heap Used (JVM 힙 영역 사용률) : 43.0%&lt;br /&gt;&amp;rArr; 일반적으로 Heap 사용률이 70~80% 이상에서 GC가 자주 발생하면서 성능에 영향을 줄 가능성이 커짐&lt;br /&gt;현재는 43%이므로 안정적임&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Non-Heap Used (JVM 힙 외 영역 (Metaspace, Code Cache 등) 사용률) : 11.3%&lt;br /&gt;&amp;rArr; 현재 11.3% 수준이므로 여유로움&lt;/li&gt;
&lt;/ul&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;Throughput&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdK6g/btsOrBrSbZy/PoNcRgzYnLlOkdi4kcjU41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdK6g/btsOrBrSbZy/PoNcRgzYnLlOkdi4kcjU41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdK6g/btsOrBrSbZy/PoNcRgzYnLlOkdi4kcjU41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdK6g%2FbtsOrBrSbZy%2FPoNcRgzYnLlOkdi4kcjU41%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;843&quot; height=&quot;257&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Requests per second (RPS, 서버가 초당 처리하는 요청 수) : 3.82&lt;br /&gt;&amp;rArr; 서버 리소스 (CPU, Memory) 등에는 여유가 있지만 처리 수는 낮음&lt;br /&gt;(요청량이 작아서 그런 것 같긴 함, 스레드 수를 늘려서 확인 필요)&lt;/li&gt;
&lt;/ul&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;에러율 (Error %)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb0kPr/btsOsh67zFz/FHF0gkxiBoqovKsrDzziUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb0kPr/btsOsh67zFz/FHF0gkxiBoqovKsrDzziUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb0kPr/btsOsh67zFz/FHF0gkxiBoqovKsrDzziUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb0kPr%2FbtsOsh67zFz%2FFHF0gkxiBoqovKsrDzziUK%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;979&quot; height=&quot;241&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;4xx (클라이언트 에러) : 0 ops/s&lt;br /&gt;&amp;rArr; 클라이언트 오류 발생 x&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;2xx (성공) : 54.7 ops/s&lt;br /&gt;&amp;rArr; 초 당 약 54.7 건의 정상 응답 (성공) 발생&lt;br /&gt;테스트 설정이 정상적이고, 서버가 요청을 안정적으로 처리하고 있음을 확인 가능&lt;/li&gt;
&lt;/ul&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;응답 시간 (Latency / Response Time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbG8l7/btsOszNhMv0/aKnYE8ZwGSV8JQHGurafTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbG8l7/btsOszNhMv0/aKnYE8ZwGSV8JQHGurafTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbG8l7/btsOszNhMv0/aKnYE8ZwGSV8JQHGurafTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbG8l7%2FbtsOszNhMv0%2FaKnYE8ZwGSV8JQHGurafTk%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;659&quot; height=&quot;257&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Average (평균 응답 대기 시간) : 2.29 ms&lt;br /&gt;&amp;rArr; 평균적으로 거의 즉시 응답하는 모습을 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Maximum (가장 긴 응답 대기 시간) : 11.8ms&lt;br /&gt;&amp;rArr; 최악의 경우에도 11.8ms 내에 응답을 하므로 괜찮은 결과라고 판단 가능&lt;br /&gt;(일반적으로 평균 latency가 수십ms라면 사용자 체감 성능에 문제 없다고 평가됨)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>DevOps/Monitoring</category>
      <category>Apache Jmeter</category>
      <category>jmeter</category>
      <category>jmeter grafana</category>
      <category>jmeter 사용법</category>
      <category>spring boot 성능 테스트</category>
      <category>spring jmeter</category>
      <category>스프링 jmeter</category>
      <category>스프링 load test</category>
      <category>스프링 부하 테스트</category>
      <category>스프링 성능 테스트</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/162</guid>
      <comments>https://blogan99.tistory.com/162#entry162comment</comments>
      <pubDate>Sun, 8 Jun 2025 22:26:52 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps/Monitoring] AWS EC2에 Prometheus + Grafana로 Docker 기반 모니터링 시스템 구축</title>
      <link>https://blogan99.tistory.com/161</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 모니터링 시스템&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 사용 이유&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;/li&gt;
&lt;li&gt;서비스의 성능, 상태, 오류 등 실시간 정보 파악 및 대응 가능&lt;/li&gt;
&lt;li&gt;특히 운영 환경 (Production)에서는 메트릭 기반 모니터링이 필수임&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;b&gt;1-2. 구성 요소&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;메트릭 수집기 (Collector) : 애플리케이션으로부터 CPU 사용량, 요청 수, 에러 수 등 다양한 지표 수집
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) Prometheus, Telegraf, StatsD 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저장소 (Time-Series DB) : 수집된 데이터를 시계열로 저장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) Prometheus 내장 TSDB, InfluxDB 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시각화 도구 (Dashboard) : 데이터를 그래프, 차트 등으로 시각화 &amp;rArr; 직관적인 분석 가능하게 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) Grafana, Kibana 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;알림 시스템 (Alerting) : 이상 징후 감지 &amp;rarr; 이메일, 슬랙 등으로 알림 전송
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) Prometheus Alertmanager, Grafana Alerting 등&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;b&gt;1-3. 메트릭 (Metric)&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;시스템이나 애플리케이션의 상태나 성능을 수치화한 지표 (&amp;ldquo;무엇을 모니터링할지&amp;rdquo;를 정의하는 대상)&lt;/li&gt;
&lt;li&gt;메트릭은 수치 기반으로 표현됨 &amp;rArr; 시간에 따른 변화 기록해서 성능 추이 분석, 장애 감지, 이상 탐지, 용량 계획 등의 목적으로 사용&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;1-3-1. 대표적인 메트릭 예시&lt;/b&gt;&lt;/h4&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;/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;CPU 사용률, 메모리 사용량, 디스크 I/O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;애플리케이션 성능&lt;/td&gt;
&lt;td&gt;서비스 응답 속도와 안정성&lt;/td&gt;
&lt;td&gt;HTTP 요청 수, 응답 시간, 에러율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;애플리케이션 상태&lt;/td&gt;
&lt;td&gt;애플리케이션 내부 동작 상태&lt;/td&gt;
&lt;td&gt;GC 횟수, 스레드 수, DB 연결 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용자 트래픽&lt;/td&gt;
&lt;td&gt;사용자 이용 패턴 및 부하&lt;/td&gt;
&lt;td&gt;접속 사용자 수, API 호출 수, 사용자 세션 수&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-4. 적용할 도구 소개&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-4-1. Spring Boot Actuator&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;Spring Boot에서 제공하는 운영용 엔드포인트 제공 라이브러리&lt;/li&gt;
&lt;li&gt;/actuator/health, /actuator/metrics, /actuator/prometheus 등으로 시스템 상태, 메트릭 정보 확인 가능&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;1-4-2. Prometheus&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;CNCF(Cloud Native Computing Foundation) 에서 관리하는 오픈소스 모니터링 도구&lt;/li&gt;
&lt;li&gt;대상 서버에 주기적으로 접속해 메트릭 수집 (pull 방식을 통해)&lt;/li&gt;
&lt;li&gt;수집한 데이터를 자체 저장소에 보관 &amp;rarr; 쿼리 언어인 PromQL을 통해 원하는 정보 조회 가능&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;1-4-3. Grafana&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;Prometheus와 같은 시계열 데이터 저장소에 연결해 시각화 대시보드를 제공하는 도구&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 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 설정 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. Spring Boot Actuator 의존성 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// build.gradle

// Spring Boot Actuator 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'&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;b&gt;2-2. Prometheus 관련 설정&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-2-1. Prometheus 의존성 추가&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// build.gradle

// Prometheus 의존성 추가
implementation 'io.micrometer:micrometer-registry-prometheus'&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-2-2. exposure 설정 변경&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;Prometheus가 메트릭을 polling 하려면 /actuator/prometheus 엔드포인트를 제공하도록 설정해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# application.yml

management:
  endpoints:
    web:
      exposure:
        include: &quot;prometheus&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 해당 엔드포인트를 제공하게 설정되었는지 확인하려면 /actuator/prometheus 로 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L5RDC/btsNZeJx6ul/kZ55921VtHPUUkAR4BEcL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L5RDC/btsNZeJx6ul/kZ55921VtHPUUkAR4BEcL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L5RDC/btsNZeJx6ul/kZ55921VtHPUUkAR4BEcL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL5RDC%2FbtsNZeJx6ul%2FkZ55921VtHPUUkAR4BEcL1%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;635&quot; height=&quot;531&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;531&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;b&gt;2-2-3. prometheus.yml 작성&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;현재는 메트릭 수집 주기, 경로 등을 설정하지 않은 상태임 &amp;rArr; 이를 설정하기 위한 YAML 파일 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;#prometheus.yml

global:
  scrape_interval: 5s  # 매 5초마다 수집

scrape_configs:
  - job_name: 'SWITCH'
    metrics_path: '/actuator/prometheus'  # Spring에서 제공하는 메트릭 경로
    static_configs:
      - targets: ['[EC2 퍼블릭 IP]:[포트번호]']  # 또는 EC2 내 컨테이너 IP/이름
&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;scrape_interval : 메트릭 수집 주기 (기본값: 1분)&lt;/li&gt;
&lt;li&gt;job_name : Prometheus 내부에서 이 수집 대상의 이름&lt;/li&gt;
&lt;li&gt;metrics_path : 메트릭이 노출되는 경로&lt;/li&gt;
&lt;li&gt;targets : 모니터링 대상 서버 &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;[host:port 형식]&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&gt;EC2에서 Docker로 실행한 경우는 일반적으로 &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;host.docker.inter:포트번호&lt;/b&gt;&lt;/span&gt; 또는 &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;IP&lt;/b&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;2-2-4. prometheus.yml 파일을 EC2 인스턴스에 업로드&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;prometheus.yml이 docker-compose.yml에서 마운트되려면 EC2 인스턴스에 로컬 파일로 존재해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. EC2 인스턴스에 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ~/prometheus 디렉토리 생성&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;mkdir ~/prometheus
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;&lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;scp&lt;/b&gt;&lt;/span&gt; 명령어로 prometheus.yml 파일 업로드 (복사)&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;scp -i [/PEM키 경로] prometheus.yml [ec2유저이름]@[ec2의 IP]:~/prometheus/prometheus.yml
&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;~/prometheus/prometheus.yml : EC2 내에 업로드할 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 해당 경로에 업로드됨을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da2ozh/btsNYkKtx7Z/AbbQkf2ifIwLkFDysIhBO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da2ozh/btsNYkKtx7Z/AbbQkf2ifIwLkFDysIhBO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da2ozh/btsNYkKtx7Z/AbbQkf2ifIwLkFDysIhBO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda2ozh%2FbtsNYkKtx7Z%2FAbbQkf2ifIwLkFDysIhBO0%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;323&quot; height=&quot;55&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;55&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;b&gt;2-3. docker-compose 관련 설정&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✏️ 현재 상황&lt;br /&gt;&lt;br /&gt;- GitHub Actions를 통해 CI/CD 파이프라인 구축함&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 간략하게 설명 : gradle.yml에서 (1) Gradle로 프로젝트 빌드 &amp;rarr; (2) 프로젝트 내의 Dockerfile로 Docker 이미지 생성 및 DockerHub에 push &amp;rarr; (3) EC2 인스턴스에 SSH로 접속 &amp;rarr; (4) 이미지 pull &amp;rarr; (5) 이미지 실행해서 애플리케이션을 컨테이너로 구동&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; Prometheus를 실행하고 싶음 &amp;rArr; docker-compose 사용! (별도의 컨테이너로 실행하는 방식)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker-compose 사용하는 이유
&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: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링 애플리케이션 컨테이너에 Prometheus를 함께 구성 &amp;rArr; 단일 책임 원칙에 어긋남!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prometheus는 prometheus 바이너리를 직접 실행하며 설정 파일 (prometheus.yml) 을 필요로 함 &amp;rArr; 스프링 프로젝트와는 실행 구조가 다르기 때문에 같은 이미지에서 관리하기 어려움!&lt;/li&gt;
&lt;li&gt;docker-compose를 통해 Prometheus 뿐 아니라 Grafana도 함께 구성할 수 있는 확장성 확보&lt;/li&gt;
&lt;/ol&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-3-0. EC2에 docker-compose 설치&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;설치되어 있지 않다면 docker-compose 명령어가 실행되지 않을 것&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo curl -L &quot;&amp;lt;https://github.com/docker/compose/releases/latest/download/docker-compose-$&amp;gt;(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
&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-3-1. docker-compose.yml 파일 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# docker-compose.yml

version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - &quot;9090:9090&quot; # Prometheus는 기본적으로 9090 포트 사용
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml&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;volumes : [호스트의 파일 경로]:[컨테이너 내부의 경로] &amp;rArr; prom/prometheus 이미지는 /etc/prometheus/prometheus.yml 경로에서 설정 파일을 자동으로 찾기 때문에 해당 경로로 연결&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-3-2. EC2 인스턴스의 홈 디렉토리에 해당 파일 업로드&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;scp -i [/PEM키 경로] docker-compose.yml [ec2유저이름]@[ec2의 IP]:~
&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;~ : EC2 사용자의 홈 디렉토리&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-3-3. EC2 인스턴스의 보안 그룹 수정&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;인바운드 규칙에 9090 포트 허용하도록 수정&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-3-4. EC2 인스턴스에 SSH로 접속 후 docker-compose.yml 실행&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;docker-compose -f ~/docker-compose.yml up -d 명령어로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqqYDU/btsNYCjQC8D/KqrTLqIGjy5fnTvWvAJpz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqqYDU/btsNYCjQC8D/KqrTLqIGjy5fnTvWvAJpz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqqYDU/btsNYCjQC8D/KqrTLqIGjy5fnTvWvAJpz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqqYDU%2FbtsNYCjQC8D%2FKqrTLqIGjy5fnTvWvAJpz0%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;639&quot; height=&quot;61&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;61&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;[EC2 퍼블릭 IP]:9090/targets 접속 시 아래와 같은 화면이 나온다면 성공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0iMrm/btsNXZGJ8zt/6Pmd1jzgGCLjSKPcL5KJe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0iMrm/btsNXZGJ8zt/6Pmd1jzgGCLjSKPcL5KJe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0iMrm/btsNXZGJ8zt/6Pmd1jzgGCLjSKPcL5KJe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0iMrm%2FbtsNXZGJ8zt%2F6Pmd1jzgGCLjSKPcL5KJe1%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;637&quot; height=&quot;213&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 이제 해당 페이지에서 원하는 메트릭 정보를 얻을 수 있음!&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;2-4. Grafana 관련 설정&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;Prometheus를 통해 애플리케이션의 메트릭을 수집할 수 있도록 설정 완료&lt;/li&gt;
&lt;li&gt;이제 수집된 메트릭을 시각화하여 보다 직관적으로 모니터링할 수 있도록 Grafana 도입할 것&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-4-1. docker-compose.yml 수정&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# docker-compose.yml

version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - &quot;9090:9090&quot;
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
  
  # grafana 관련 설정
  grafana:
	  image: grafana/grafana:latest
    container_name: grafana
    user: &quot;$UID:$GID&quot;
    ports:
      - &quot;3000:3000&quot; # Grafana는 기본적으로 3000 포트 사용
    volumes:
      - ./grafana-data:/var/lib/grafana
    depends_on:
      - prometheus # prometheus 컨테이너가 먼저 시작된 후 실행&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;user: &quot;$UID:$GID&quot;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각 호스트(EC2)의 사용자 ID, 그룹 ID (환경 변수로 설정되어 있지 않으면 에러 발생 가능 &amp;rArr; 이때는 이 줄 삭제하거나 직접 값 지정할 것)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UID 값 확인 방법 : &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;id -u&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;GID 값 확인 방법 : &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;b&gt;id -g&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;volumes: - ./grafana-data:/var/lib/grafana
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 디렉토리 (./grafana-data) 를 컨테이너 내부의 Grafana 데이터 디렉토리 (/var/lib/grafana)에 마운트&lt;br /&gt;&amp;rArr; Grafana 설정, 대시보드, 사용자 설정 등이 컨테이너가 재시작되거나 삭제되어도 유지됨&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;2-4-2. EC2 인스턴스의 보안 그룹 수정&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;인바운드 규칙에 3000 포트 허용하도록 수정&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-4-3. docker-compose 재실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 실행중인 컨테이너 확인
docker ps

# 기존 prometheus 컨테이너 중지, 삭제
docker kill [기존 컨테이너 ID]
docker rm [기존 컨테이너 ID]

# docker-compose 재실행
docker-compose -f ~/docker-compose-monitoring.yml up -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;[EC2 퍼블릭 IP]:3000 접속 시 아래와 같은 화면이 나온다면 성공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLLDV/btsNX1R5XGW/wwNTuwMhkCgaEeVih3gxuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLLDV/btsNX1R5XGW/wwNTuwMhkCgaEeVih3gxuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLLDV/btsNX1R5XGW/wwNTuwMhkCgaEeVih3gxuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLLDV%2FbtsNX1R5XGW%2FwwNTuwMhkCgaEeVih3gxuK%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;636&quot; height=&quot;480&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;480&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;b&gt;2-5. Grafana 대시보드&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-5-1. 최초 로그인&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;최초 로그인 시 username, password 모두 admin으로 로그인 가능 &amp;rarr; 이후 수정 해야함&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-5-2. Prometheus 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Connections &amp;gt; Data sources &amp;gt; Add data source 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VDVEi/btsNYoTLlzk/CyeI50wzMsz1P6RcI0Djw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VDVEi/btsNYoTLlzk/CyeI50wzMsz1P6RcI0Djw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VDVEi/btsNYoTLlzk/CyeI50wzMsz1P6RcI0Djw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVDVEi%2FbtsNYoTLlzk%2FCyeI50wzMsz1P6RcI0Djw0%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;637&quot; height=&quot;276&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;276&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. Prometheus 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU3EMW/btsN0kIMJ9i/c5ThKsMv9nK2126EVgBctK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU3EMW/btsN0kIMJ9i/c5ThKsMv9nK2126EVgBctK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU3EMW/btsN0kIMJ9i/c5ThKsMv9nK2126EVgBctK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU3EMW%2FbtsN0kIMJ9i%2Fc5ThKsMv9nK2126EVgBctK%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;636&quot; height=&quot;250&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;250&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. Prometheus 접속했던 URL 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHV7b/btsNZY0kH8f/83nhvbVSUipYZZMhjYlsy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHV7b/btsNZY0kH8f/83nhvbVSUipYZZMhjYlsy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHV7b/btsNZY0kH8f/83nhvbVSUipYZZMhjYlsy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHV7b%2FbtsNZY0kH8f%2F83nhvbVSUipYZZMhjYlsy1%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;637&quot; height=&quot;342&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;342&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. 하단의 Save &amp;amp; test 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YeCv3/btsNYvrKHn7/tmD0vFQigg8hQbY4q2rYB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YeCv3/btsNYvrKHn7/tmD0vFQigg8hQbY4q2rYB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YeCv3/btsNYvrKHn7/tmD0vFQigg8hQbY4q2rYB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYeCv3%2FbtsNYvrKHn7%2FtmD0vFQigg8hQbY4q2rYB0%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;637&quot; height=&quot;66&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 해당 문구가 나온다면 성공한 것&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuhbr2/btsNYrwboAd/Q5hoC8SmfgwtiOQZbVQC80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuhbr2/btsNYrwboAd/Q5hoC8SmfgwtiOQZbVQC80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuhbr2/btsNYrwboAd/Q5hoC8SmfgwtiOQZbVQC80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuhbr2%2FbtsNYrwboAd%2FQ5hoC8SmfgwtiOQZbVQC80%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;637&quot; height=&quot;194&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; Data sources에 추가된 것 확인 가능&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;2-5-3. 대시보드 검색&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://grafana.com/grafana/dashboards/&quot;&gt;https://grafana.com/grafana/dashboards/&lt;/a&gt; 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. spring boot 검색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Bgok/btsNYX88mAs/Ta1KYsuDDeRcsuAQJtZDwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Bgok/btsNYX88mAs/Ta1KYsuDDeRcsuAQJtZDwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Bgok/btsNYX88mAs/Ta1KYsuDDeRcsuAQJtZDwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Bgok%2FbtsNYX88mAs%2FTa1KYsuDDeRcsuAQJtZDwk%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;635&quot; height=&quot;396&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 원하는 대시보드 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. ID 복사 (회원가입 필요)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1bzS/btsN0wvwNMb/5KuBAjzObCQlzKyuKVlxV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1bzS/btsN0wvwNMb/5KuBAjzObCQlzKyuKVlxV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1bzS/btsN0wvwNMb/5KuBAjzObCQlzKyuKVlxV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1bzS%2FbtsN0wvwNMb%2F5KuBAjzObCQlzKyuKVlxV0%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;634&quot; height=&quot;332&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;332&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;b&gt;2-5-4. 대시보드 적용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Dashboards &amp;gt; Create dashboard 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CWIcU/btsNXWwk0n8/7xNLTOwok3FR80K9aYfZt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CWIcU/btsNXWwk0n8/7xNLTOwok3FR80K9aYfZt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CWIcU/btsNXWwk0n8/7xNLTOwok3FR80K9aYfZt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCWIcU%2FbtsNXWwk0n8%2F7xNLTOwok3FR80K9aYfZt1%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;637&quot; height=&quot;348&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;348&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. Import dashboard 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rDDfF/btsNYjkwSBA/1aRB1SLwKptTKTkIKOoZZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rDDfF/btsNYjkwSBA/1aRB1SLwKptTKTkIKOoZZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rDDfF/btsNYjkwSBA/1aRB1SLwKptTKTkIKOoZZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrDDfF%2FbtsNYjkwSBA%2F1aRB1SLwKptTKTkIKOoZZ1%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;635&quot; height=&quot;343&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;343&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. 복사한 ID 입력 &amp;gt; Load 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA55Tx/btsNYE26e9X/MJhkcUt06eTLXkOxoTtbz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA55Tx/btsNYE26e9X/MJhkcUt06eTLXkOxoTtbz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA55Tx/btsNYE26e9X/MJhkcUt06eTLXkOxoTtbz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA55Tx%2FbtsNYE26e9X%2FMJhkcUt06eTLXkOxoTtbz1%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;658&quot; height=&quot;695&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;695&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. Prometheus data source 선택 &amp;gt; Import 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K0DeG/btsN0gfonta/U4F5cXXHOK0Zo6YRiWcHm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K0DeG/btsN0gfonta/U4F5cXXHOK0Zo6YRiWcHm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K0DeG/btsN0gfonta/U4F5cXXHOK0Zo6YRiWcHm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK0DeG%2FbtsN0gfonta%2FU4F5cXXHOK0Zo6YRiWcHm1%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;646&quot; height=&quot;687&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;687&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;rArr; 대시보드가 적용된 것을 확인 가능!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjjEfp/btsNZ22G3Dz/1cZY5BoKOEwgybKUBwLnTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjjEfp/btsNZ22G3Dz/1cZY5BoKOEwgybKUBwLnTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjjEfp/btsNZ22G3Dz/1cZY5BoKOEwgybKUBwLnTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjjEfp%2FbtsNZ22G3Dz%2F1cZY5BoKOEwgybKUBwLnTk%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;635&quot; height=&quot;374&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps/Monitoring</category>
      <category>docker-compose grafana</category>
      <category>docker-compose prometheus</category>
      <category>prometheus grafana</category>
      <category>spring boot grafana</category>
      <category>spring boot prometheus</category>
      <category>스프링 grafana</category>
      <category>스프링 prometheus</category>
      <category>스프링 메트릭</category>
      <category>스프링 모니터링 시스템</category>
      <category>스프링 부트 모니터링</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/161</guid>
      <comments>https://blogan99.tistory.com/161#entry161comment</comments>
      <pubDate>Fri, 16 May 2025 00:54:02 +0900</pubDate>
    </item>
    <item>
      <title>[Trouble Shooting/성능 개선] 비동기 작업 통한 단체 이메일 전송 성능 개선 ( + @Async)</title>
      <link>https://blogan99.tistory.com/160</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제 상황 파악&lt;/b&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;/li&gt;
&lt;li&gt;샘플 유저 데이터 20개를 삽입 후 이메일 전송 기능을 테스트했을 때 시간이 꽤 걸리는 것을 확인 &lt;br /&gt;&amp;rArr; 실제 소요 시간을 찍어보기로 함&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;b&gt;1-1. 전송 시간 측정 결과&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;구현한 api는 이메일 주소 1개에 대해 이메일을 전송하는 기능을 가짐&lt;/li&gt;
&lt;li&gt;따라서 api 호출만의 소요 시간으로는 여러개 이메일 전송에 걸리는 시간을 측정하기 어려울 것이라 판단&lt;br /&gt;&amp;rArr; 현재 FE에서 비동기적으로 api를 호출하므로 총 시간을 브라우저의 콘솔에 출력해보기로 함&lt;/li&gt;
&lt;/ul&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;FE 코드 일부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737291774642&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이메일 전송 함수 일부

try {
    await Promise.all(selectedEmails.map(async (email, index) =&amp;gt; {
        const emailTemplate = CouponEmailTemplate({ coupon: coupon }); // 이메일 템플릿 HTML 가져오기

        // 실제 이메일 전송 요청
        const response = await axios.post('http://localhost:8080/api/admin/coupons/email', {
            couponId: coupon.id,
            address: email,
            template: emailTemplate // 결합된 템플릿 사용
        }, {
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${localStorage.getItem('token')}`
            }
        });

        if (response.status !== 200) {
            throw new Error(`이메일 전송에 실패했습니다: ${email}`);
        }

        // 진행률 업데이트
        setProgress(((index + 1) / selectedEmails.length) * 100);
        await new Promise(resolve =&amp;gt; setTimeout(resolve, 50)); // 요청 사이에 잠시 대기
    }));

    alert('모든 쿠폰 이메일 전송을 완료했습니다!');
    onRequestClose(); // 모달 닫기
} catch (err) {
    try {
        await sendRefreshTokenAndStoreAccessToken();
        window.location.reload();
    } catch (e) {
        console.error(err.message);
    }
} finally {
    setSending(false);
    const endTime = Date.now(); // 종료 시간 기록
    const duration = endTime - startTime; // 걸린 시간 계산
    console.log('전송한 이메일 개수: ' + selectedEmails.length + '개');
    console.log(`이메일 전송에 걸린 시간: ${duration}ms`);
}
};&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;color: #ee2323;&quot;&gt;&lt;b&gt;Promise.all&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;async&lt;/span&gt;&lt;/b&gt; / &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;await&lt;/b&gt;&lt;/span&gt; 를 사용하여 선택된 이메일 목록에 대해 비동기적으로 api 호출하는 코드&lt;/li&gt;
&lt;li&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일 20개 전송 시 소요 시간 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSE5lU/btsLS5Hmym6/9D06FSo4yrCKynuviijVN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSE5lU/btsLS5Hmym6/9D06FSo4yrCKynuviijVN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSE5lU/btsLS5Hmym6/9D06FSo4yrCKynuviijVN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSE5lU%2FbtsLS5Hmym6%2F9D06FSo4yrCKynuviijVN1%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;1042&quot; height=&quot;114&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;20개 이메일 전송 시 18.871s (= 18871ms) 소요&lt;/span&gt;됨을 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 만약 이메일을 전송해야 하는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;유저가 20명이 아닌 1만명, 10만명 &amp;hellip; 이라면 시간이 매우 많이 소요될 것이라고 판단해 성능 개선&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;b&gt;2. 문제 원인 파악&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 기존 이메일 전송 관련 서비스 단 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class CouponEmailService {

    private final JavaMailSender javaMailSender;

    public void sendEmail(CouponEmailRequestDto dto) {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        try{
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, &quot;UTF-8&quot;);

            // 메일을 받을 수신자 설정
            mimeMessageHelper.setTo(dto.getAddress());

            // 메일의 제목 설정
            mimeMessageHelper.setSubject(&quot;FITinside 쿠폰 메일&quot;);

            // 발신자 설정
            mimeMessageHelper.setFrom(&quot;chm20060@gmail.com&quot;, &quot;FITinside 관리자&quot;);

            // 메일의 내용 설정
            mimeMessageHelper.setText(dto.getTemplate(), true);

            javaMailSender.send(mimeMessage);
        } catch (Exception e) {
            throw new CustomException(ErrorCode.INVALID_EMAIL_DATA);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 특별한 비동기 처리나 멀티스레딩 기능이 적용되지 않은 상태이므로 단일 스레드로 실행됨!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  단일 스레드에서 다수의 이메일 전송을 순차적으로 처리할 때의 문제점&lt;br /&gt;&lt;br /&gt;- 단일 스레드에서는 한 가지 작업이 실행 ~ 완료 될 때 까지 다른 작업을 할 수 없음&lt;br /&gt;- 따라서 첫 번째 이메일 전송이 완료된 후에야 두 번째 이메일 전송이 시작됨 &lt;br /&gt;- 즉, 대략적으로 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;(한 개의 이메일을 보내는 시간) * (이메일 목록의 수) 만큼의 소요시간&lt;/span&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;b&gt;3. 해결 방법 및 결과 검증&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 비동기 처리&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;br /&gt;&amp;rArr; 애플리케이션의 반응성을 높일 수 있음&lt;br /&gt;&amp;rArr; 메인 스레드의 블로킹 피할 수 있음&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-1-1. 스프링에서의 비동기 처리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;@Async&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;/li&gt;
&lt;li&gt;해당 어노테이션이 붙은 메서드는 호출 시 새로운 스레드에서 실행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Async
public void asyncMethod() {
		
    // 생략 ...
		
}&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. Executor&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;스프링은 기본적으로 SimpleAsyncTaskExecutor 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Configuration
@EnableAsync  // 기본적으로 SimpleAsyncTaskExecutor 사용됨
public class AsyncConfig {
}&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;ThreadPoolTaskExecutor
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 SimpleAsyncTaskExecutor는 스레드 풀을 사용하지 않으므로 매번 새로운 스레드 생성함&lt;br /&gt;&amp;rArr; 성능이 저하될 수 있음!&lt;/li&gt;
&lt;li&gt;ThreadPoolTaskExecutor 사용해 스레드 풀 설정 가능&lt;br /&gt;&amp;rArr; 비동기 메서드 호출 시 스레드 풀에서 스레드를 가져와 작업 처리하게 되어 성능, 자원 관리 측면에서 더 효율적일 수 있음!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {	// ThreadPoolTaskExecutor 사용
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2); // 최소 스레드 수
        executor.setMaxPoolSize(5); // 최대 스레드 수
        executor.setQueueCapacity(100); // 대기열 크기
        executor.initialize();
        return executor;
    }
}&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;b&gt;3-2. 프로젝트에 적용&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-1. AsyncConfig 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2); // 최소 스레드 수
        executor.setMaxPoolSize(10); // 최대 스레드 수
        executor.setQueueCapacity(100); // 대기열 크기
        executor.initialize();
        return executor;
    }
}

&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;확장 가능성을 염두에 두고 더 효율적인 관리를 위해 ThreadPoolTaskExecutor 설정함&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;3-2-2. @Async 어노테이션 추가&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class CouponEmailService {

    private final JavaMailSender javaMailSender;

    @Async  // 비동기 작업을 위한 어노테이션 추가
    public void sendEmail(CouponEmailRequestDto dto) {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        try{
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, &quot;UTF-8&quot;);

            // 메일을 받을 수신자 설정
            mimeMessageHelper.setTo(dto.getAddress());

            // 메일의 제목 설정
            mimeMessageHelper.setSubject(&quot;FITinside 쿠폰 메일&quot;);

            // 발신자 설정
            mimeMessageHelper.setFrom(&quot;chm20060@gmail.com&quot;, &quot;FITinside 관리자&quot;);

            // 메일의 내용 설정
            mimeMessageHelper.setText(dto.getTemplate(), true);

            javaMailSender.send(mimeMessage);
        } catch (Exception e) {
            throw new CustomException(ErrorCode.INVALID_EMAIL_DATA);
        }
    }
}&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;color: #ee2323;&quot;&gt;&lt;b&gt;@Async&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-3. 성능 개선 결과 확인&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;기존과 동일하게 20개의 이메일 주소에 이메일을 전송해 비교 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S5uZd/btsLT2iXK41/CRiWt1HeNOAQfC36GRXipk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S5uZd/btsLT2iXK41/CRiWt1HeNOAQfC36GRXipk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S5uZd/btsLT2iXK41/CRiWt1HeNOAQfC36GRXipk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS5uZd%2FbtsLT2iXK41%2FCRiWt1HeNOAQfC36GRXipk%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;1042&quot; height=&quot;96&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;96&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;rArr; &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;20개 이메일 전송에 571ms 소요&lt;/span&gt;됨을 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 기존 18871ms 대비, &lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 96.97% 의 성능 개선&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;을 확인 (더 많은 이메일로 비교한다면 더 큰 성능 개선을 이룰 것으로 예상!)&lt;/p&gt;</description>
      <category>Trouble Shooting</category>
      <category>@Async</category>
      <category>asyncconfig</category>
      <category>simpleasynctaskexecutor</category>
      <category>threadpooltaskexecutor</category>
      <category>스프링 @async</category>
      <category>스프링 단체 이메일</category>
      <category>스프링 단체 이메일 비동기 처리</category>
      <category>스프링 비동기 작업</category>
      <category>스프링 이메일 성능</category>
      <category>스프링 이메일 성능 개선</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/160</guid>
      <comments>https://blogan99.tistory.com/160#entry160comment</comments>
      <pubDate>Sun, 19 Jan 2025 22:13:55 +0900</pubDate>
    </item>
    <item>
      <title>[MongoDB/Spring Boot] MongoDB 활용 예제</title>
      <link>https://blogan99.tistory.com/159</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Mongo DB&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NoSQL 데이터베이스, 문서 지향 데이터베이스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NoSQL : &amp;lsquo;Not Only SQL&amp;rsquo;&lt;/li&gt;
&lt;li&gt;RDBMS와는 데이터 저장 방식이 다름&lt;/li&gt;
&lt;li&gt;스키마가 고정되지 않아, 다양한 형태의 데이터 저장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구조화되지 않은 데이터나 반정형 데이터 (JSON, XML 등) 효과적 처리 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 JSON과 유사한 BSON (바이너리 JSON) 형식으로 저장&lt;/li&gt;
&lt;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. Mongo DB 사용 이유 및 장점&lt;/b&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;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;데이터를 여러 서버에 분산 저장 가능 &amp;rArr; 데이터 증가에 유연한 대응 가능&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;대량 데이터 읽고 쓰기가 빠름&lt;/li&gt;
&lt;li&gt;인덱스 및 샤딩 (sharding) 을 통해 쿼리 성능 최적화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;복잡한 쿼리 지원&lt;/li&gt;
&lt;li&gt;실시간 데이터 처리하는 데 적합함 &amp;rArr; 웹 애플리케이션, IoT, 빅데이터 분석 등 다양하게 사용됨&lt;/li&gt;
&lt;/ol&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;2.  Spring Boot, Mongo DB 활용 예제&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. MongoDB Atlas 가입 및 기본 설정&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;MongoDB Atlas
&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;MongoDB 배포, 관리를 도와주는 플랫폼&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;2-1-1. 회원가입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://account.mongodb.com/account/login&quot;&gt;https://account.mongodb.com/account/login&lt;/a&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-1-2. Organization 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2814&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGbTq4/btsLShVPgiG/JVa1x11xmojR6k9sCvIWbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGbTq4/btsLShVPgiG/JVa1x11xmojR6k9sCvIWbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGbTq4/btsLShVPgiG/JVa1x11xmojR6k9sCvIWbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGbTq4%2FbtsLShVPgiG%2FJVa1x11xmojR6k9sCvIWbk%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;2814&quot; height=&quot;1396&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2814&quot; data-origin-height=&quot;1396&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;회원가입을 진행하면 Organization이 자동으로 생성됨&lt;/li&gt;
&lt;li&gt;만약 다른 organization을 생성하고 싶다면 추가적으로 생성하면 됨&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-1-3. Project 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 톱니바퀴 버튼을 눌러 Organization의 설정으로 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;2808&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gbp7w/btsLTtAXFOl/E4GedokTukz8M59NmJ07Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gbp7w/btsLTtAXFOl/E4GedokTukz8M59NmJ07Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gbp7w/btsLTtAXFOl/E4GedokTukz8M59NmJ07Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbp7w%2FbtsLTtAXFOl%2FE4GedokTukz8M59NmJ07Yk%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;2808&quot; height=&quot;1386&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;2808&quot; data-origin-height=&quot;1386&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. 좌측의 Projects 탭 클릭 &amp;rarr; New Project 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EVOJp/btsLSzIMaBB/jvVkPB34Vh6r0aFPf2JZoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EVOJp/btsLSzIMaBB/jvVkPB34Vh6r0aFPf2JZoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EVOJp/btsLSzIMaBB/jvVkPB34Vh6r0aFPf2JZoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEVOJp%2FbtsLSzIMaBB%2FjvVkPB34Vh6r0aFPf2JZoK%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;2816&quot; height=&quot;1412&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1412&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. 이름 입력 (태그는 선택적으로 입력) &amp;rarr; Next 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/obEpy/btsLQ2yArGg/GrRnu6PI0UDXa1UR94RTdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/obEpy/btsLQ2yArGg/GrRnu6PI0UDXa1UR94RTdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/obEpy/btsLQ2yArGg/GrRnu6PI0UDXa1UR94RTdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FobEpy%2FbtsLQ2yArGg%2FGrRnu6PI0UDXa1UR94RTdk%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;2816&quot; height=&quot;1406&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;2816&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;4. Project 접근 멤버 추가 (없다면 스킵) &amp;rarr; Create Project 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;2812&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4vTlG/btsLSsJzfhh/hoJLqL28R5KXeluMVgK0E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4vTlG/btsLSsJzfhh/hoJLqL28R5KXeluMVgK0E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4vTlG/btsLSsJzfhh/hoJLqL28R5KXeluMVgK0E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4vTlG%2FbtsLSsJzfhh%2FhoJLqL28R5KXeluMVgK0E0%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;2812&quot; height=&quot;1388&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;2812&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-1-4. Cluster 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 홈 화면에서 Create a cluster의 Create 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;2810&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj5bgE/btsLSr4XeMn/2OE9iyVjQklKTdB5voAEL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj5bgE/btsLSr4XeMn/2OE9iyVjQklKTdB5voAEL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj5bgE/btsLSr4XeMn/2OE9iyVjQklKTdB5voAEL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj5bgE%2FbtsLSr4XeMn%2F2OE9iyVjQklKTdB5voAEL1%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;2810&quot; height=&quot;1394&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;2810&quot; data-origin-height=&quot;1394&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;2808&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS9i3M/btsLSoOb7jI/ksblGiGzFk192jYkafmyQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS9i3M/btsLSoOb7jI/ksblGiGzFk192jYkafmyQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS9i3M/btsLSoOb7jI/ksblGiGzFk192jYkafmyQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS9i3M%2FbtsLSoOb7jI%2FksblGiGzFk192jYkafmyQk%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;2808&quot; height=&quot;914&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;2808&quot; data-origin-height=&quot;914&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. 정보 기입 &amp;rarr; Create Deployment 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/briEz0/btsLS7kEHWw/R8t9kii0fkndaQeHI70DG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/briEz0/btsLS7kEHWw/R8t9kii0fkndaQeHI70DG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/briEz0/btsLS7kEHWw/R8t9kii0fkndaQeHI70DG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbriEz0%2FbtsLS7kEHWw%2FR8t9kii0fkndaQeHI70DG0%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;2806&quot; height=&quot;1348&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;1348&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;Name: Cluster 이름&lt;/li&gt;
&lt;li&gt;Provider: AWS&lt;/li&gt;
&lt;li&gt;Region: Seoul(ap-northeast-2)&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;4. Network Access 설정 (스킵 가능)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재는 내 개인 ip만 접근 가능하게 설정되어 있음 &amp;rArr; 모든 ip가 접근 가능하게 설정하는 단계임&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;4-1. Network Access 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;2812&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvxS5A/btsLTsWmUH0/eAiTCF2Dje5ACsBidJEpak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvxS5A/btsLTsWmUH0/eAiTCF2Dje5ACsBidJEpak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvxS5A/btsLTsWmUH0/eAiTCF2Dje5ACsBidJEpak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvxS5A%2FbtsLTsWmUH0%2FeAiTCF2Dje5ACsBidJEpak%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;2812&quot; height=&quot;1414&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;2812&quot; data-origin-height=&quot;1414&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-2. 내 ip 주소에서 edit 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;2820&quot; data-origin-height=&quot;1410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB94Sz/btsLSdGazfo/gQrbXdS7ORpejZ5QDfKMV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB94Sz/btsLSdGazfo/gQrbXdS7ORpejZ5QDfKMV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB94Sz/btsLSdGazfo/gQrbXdS7ORpejZ5QDfKMV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB94Sz%2FbtsLSdGazfo%2FgQrbXdS7ORpejZ5QDfKMV1%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;2820&quot; height=&quot;1410&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;2820&quot; data-origin-height=&quot;1410&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-3. ALLOW ACCESS FROM ANYWHERE 클릭 &amp;rarr; confirm 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7tOH/btsLRJ6tcL0/kyDTHVEbS6tecwzVYoJ2eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7tOH/btsLRJ6tcL0/kyDTHVEbS6tecwzVYoJ2eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7tOH/btsLRJ6tcL0/kyDTHVEbS6tecwzVYoJ2eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7tOH%2FbtsLRJ6tcL0%2FkyDTHVEbS6tecwzVYoJ2eK%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;1204&quot; height=&quot;816&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;816&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. 다시 돌아와서 database user 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9J2EM/btsLRHt0vT6/JgKGnYxqeQo2s22hHxm5kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9J2EM/btsLRHt0vT6/JgKGnYxqeQo2s22hHxm5kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9J2EM/btsLRHt0vT6/JgKGnYxqeQo2s22hHxm5kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9J2EM%2FbtsLRHt0vT6%2FJgKGnYxqeQo2s22hHxm5kk%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;2388&quot; height=&quot;1200&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1200&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;첫 user 생성 시 admin으로 만들어야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Username, password 입력 &amp;rarr; Copy 클릭 &amp;rarr; Create Database User 클릭 &amp;rarr; Choose a connection method 클릭&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;6. Drivers 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGFv8E/btsLTqxww6X/PASWUlvAz3zy6r2kXuT6Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGFv8E/btsLTqxww6X/PASWUlvAz3zy6r2kXuT6Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGFv8E/btsLTqxww6X/PASWUlvAz3zy6r2kXuT6Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGFv8E%2FbtsLTqxww6X%2FPASWUlvAz3zy6r2kXuT6Ck%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;2412&quot; height=&quot;1420&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;1420&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;Compass 클릭 후 MongoDB의 GUI를 통해 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;7. 자바 버전 선택 &amp;rarr; connection string 복사&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6cPO2/btsLS93PJtK/mKKbRqCWKltBLm52gaImp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6cPO2/btsLS93PJtK/mKKbRqCWKltBLm52gaImp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6cPO2/btsLS93PJtK/mKKbRqCWKltBLm52gaImp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6cPO2%2FbtsLS93PJtK%2FmKKbRqCWKltBLm52gaImp1%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;2412&quot; height=&quot;1418&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;1418&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;입력되지 않은 정보 기입 후 application.properties나 application.yml 등에 붙여 넣을 것임&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;b&gt;2-2. Spring Boot, MongoDB 활용 예제&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;/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-2-1. 데이터베이스 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Atlas MongoDB 홈 화면에서 Browse Collections 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;1382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boYUHZ/btsLRHndyvC/LSah4JE6tWjx2mv5r7d3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boYUHZ/btsLRHndyvC/LSah4JE6tWjx2mv5r7d3D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boYUHZ/btsLRHndyvC/LSah4JE6tWjx2mv5r7d3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboYUHZ%2FbtsLRHndyvC%2FLSah4JE6tWjx2mv5r7d3D1%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;2488&quot; height=&quot;1382&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;1382&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. Create Database 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7vNfB/btsLQ4XxxXl/Z4HBuwMSl3wXd5vqVkUuOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7vNfB/btsLQ4XxxXl/Z4HBuwMSl3wXd5vqVkUuOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7vNfB/btsLQ4XxxXl/Z4HBuwMSl3wXd5vqVkUuOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7vNfB%2FbtsLQ4XxxXl%2FZ4HBuwMSl3wXd5vqVkUuOk%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;2482&quot; height=&quot;1386&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1386&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터베이스, 컬렉션 정보 기입 후 Create 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nORrs/btsLSl4YTsJ/35fqiSEm2q1klYHc5ZUGa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nORrs/btsLSl4YTsJ/35fqiSEm2q1klYHc5ZUGa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nORrs/btsLSl4YTsJ/35fqiSEm2q1klYHc5ZUGa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnORrs%2FbtsLSl4YTsJ%2F35fqiSEm2q1klYHc5ZUGa0%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;2490&quot; height=&quot;1400&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;컬렉션&lt;br /&gt;&lt;br /&gt;- MongoDB에서 데이터베이서 내에 존재하는 문서 (Document)의 그룹&lt;br /&gt;- 관계형 데이터베이스에서의 테이블과 유사한 개념임&lt;br /&gt;- 유저 관련 예제이므로 유저 관련 컬렉션 생성함 &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 데이터베이스 생성 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;2494&quot; data-origin-height=&quot;1382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF020o/btsLTtnq8nS/mrL4VkHbdubhwbxem1nUkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF020o/btsLTtnq8nS/mrL4VkHbdubhwbxem1nUkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF020o/btsLTtnq8nS/mrL4VkHbdubhwbxem1nUkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF020o%2FbtsLTtnq8nS%2FmrL4VkHbdubhwbxem1nUkK%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;2494&quot; height=&quot;1382&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;2494&quot; data-origin-height=&quot;1382&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;b&gt;2-2-2. build.gradle&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;mongoDB 의존성 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;dependencies {

    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'     // mongoDB 의존성 추가
    
}&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-2-3. application.yml 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;spring:
  data:
    mongodb:
      uri: [복사해 둔 uri를 수정해서 붙여넣기]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;uri&lt;br /&gt;&lt;br /&gt;- 기존 복사해 둔 uri는 아래와 같은 형식임 &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;mongodb+srv://[유저id]:[db비밀번호]@[클러스터 uri]/[db 이름]?retryWrites=true&amp;amp;w=majority&amp;amp;appName=MyCluster &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- [db비밀번호]와 [db 이름] 을 채워서 applicaton.yml에 넣을 것! &lt;br /&gt;&lt;br /&gt;ex) &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;mongodb+srv://chm2006:[db 비밀번호]@mycluster.wtuen.mongodb.net/[db이름]?retryWrites=true&amp;amp;w=majority&amp;amp;appName=MyCluster&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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-2-4. User&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Document(collection = &quot;User&quot;)  // mongoDB에서 생성한 컬렉션 이름
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id
    private String id;
    private String name;
    private String loginId;
    private String password;

    public User(String name, String loginId, String password) {
        this.name = name;
        this.loginId = loginId;
        this.password = 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;JPA 사용 시의 엔티티와 매우 유사함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Entity가 아닌 @Document 사용&lt;/li&gt;
&lt;li&gt;@Id에 해당하는 필드는 Object 타입 혹은 String 타입으로 생성할 것!&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;2-2-5. UserRepository&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public interface UserRepository extends MongoRepository&amp;lt;User, String&amp;gt; {

    List&amp;lt;User&amp;gt; findUsersByNameContains(String name);
}&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;JpaRepository와 매우 유사함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MongoRepository&amp;lt;Document, Id 타입&amp;gt; 을 상속!&lt;/li&gt;
&lt;li&gt;기본적인 crud 기능이 내장&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;2-2-6. UserService&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public String saveUser(UserRequestDto userRequestDto) {
        User user = new User(userRequestDto.getName(), userRequestDto.getLoginId(), userRequestDto.getPassword());
        User savedUser = userRepository.save(user);

        return savedUser.getId();
    }

    public List&amp;lt;UserResponseDto&amp;gt; findUserByName(String name) {
        List&amp;lt;User&amp;gt; usersByNameContains = userRepository.findUsersByNameContains(name);

        List&amp;lt;UserResponseDto&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();
        for (User user : usersByNameContains) {
            UserResponseDto dto = new UserResponseDto(user.getName(), user.getLoginId());
            results.add(dto);
        }

        return results;
    }
}&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;user 저장 메서드, 이름 포함하는 user 조회 메서드 2개 생성함&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-2-7. DTO&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;UserRequestDto&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Getter
public class UserRequestDto {

    private String name;
    private String loginId;
    private String 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;UserResponseDto&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Getter
@AllArgsConstructor
public class UserResponseDto {

    private String name;
    private String loginId;
}&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-2-8. UserController&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @PostMapping(&quot;/user&quot;)
    public String save(@RequestBody UserRequestDto userRequestDto) {

        return userService.saveUser(userRequestDto);
    }

    @GetMapping(&quot;/user&quot;)
    public List&amp;lt;UserResponseDto&amp;gt; find(@RequestParam(&quot;name&quot;) String name) {

        return userService.findUserByName(name);
    }
}

&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;b&gt;2-3. 결과 확인&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-3-1. 유저 생성&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;[POST] localhost:8080/user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GMX7N/btsLRKxx8M5/VJBh7ZKY1pKNxYw9sk4pvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GMX7N/btsLRKxx8M5/VJBh7ZKY1pKNxYw9sk4pvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GMX7N/btsLRKxx8M5/VJBh7ZKY1pKNxYw9sk4pvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGMX7N%2FbtsLRKxx8M5%2FVJBh7ZKY1pKNxYw9sk4pvK%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;1094&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;&amp;rArr; 생성된 user의 Id를 반환함을 확인!&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBfiK/btsLRGu4aQo/8QSE4hGhQQzHpNKzEv1oL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBfiK/btsLRGu4aQo/8QSE4hGhQQzHpNKzEv1oL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBfiK/btsLRGu4aQo/8QSE4hGhQQzHpNKzEv1oL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBfiK%2FbtsLRGu4aQo%2F8QSE4hGhQQzHpNKzEv1oL1%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;2648&quot; height=&quot;1354&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;&amp;rArr; 데이터베이스에도 저장됨을 확인!&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;b&gt;2-3-2. 유저 조회&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;[GET] localhost:8080/user?name=이름&lt;/li&gt;
&lt;li&gt;확인을 위해 몇개의 샘플 유저 데이터를 삽입 후 진행함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsQzdI/btsLTsWmWlk/BI85W4zk8tjMswhBRrI96k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsQzdI/btsLTsWmWlk/BI85W4zk8tjMswhBRrI96k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsQzdI/btsLTsWmWlk/BI85W4zk8tjMswhBRrI96k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsQzdI%2FbtsLTsWmWlk%2FBI85W4zk8tjMswhBRrI96k%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;1506&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;&amp;rArr; &amp;lsquo;이름&amp;rsquo;을 포함하는 이름을 가진 유저 목록 조회됨을 확인!&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;1378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/786P9/btsLRDLQ2Gn/zvNKHfnssSXGIw8Z3V6iok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/786P9/btsLRDLQ2Gn/zvNKHfnssSXGIw8Z3V6iok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/786P9/btsLRDLQ2Gn/zvNKHfnssSXGIw8Z3V6iok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F786P9%2FbtsLRDLQ2Gn%2FzvNKHfnssSXGIw8Z3V6iok%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;2866&quot; height=&quot;1378&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;1378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;2756&quot; data-origin-height=&quot;1378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOHFOB/btsLRoBwfs3/SQKbS8KkL0OrpPFnlpzP7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOHFOB/btsLRoBwfs3/SQKbS8KkL0OrpPFnlpzP7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOHFOB/btsLRoBwfs3/SQKbS8KkL0OrpPFnlpzP7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOHFOB%2FbtsLRoBwfs3%2FSQKbS8KkL0OrpPFnlpzP7k%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;2756&quot; height=&quot;1378&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;2756&quot; data-origin-height=&quot;1378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;&amp;rArr; &amp;lsquo;이름&amp;rsquo;이 이름에 포함되지 않은 데이터는 반환되지 않았음을 확인!&lt;/span&gt;&lt;/p&gt;</description>
      <category>Database/MongoDB</category>
      <category>mongo db user</category>
      <category>mongo db 연결</category>
      <category>mongo db 예제</category>
      <category>spring mongodb</category>
      <category>springboot mongodb</category>
      <category>스프링 mongo db</category>
      <category>스프링 mongo db 연결</category>
      <category>스프링 mongo db 예제</category>
      <category>스프링 mongo db 활용</category>
      <category>스프링부트 mongo db 예제</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/159</guid>
      <comments>https://blogan99.tistory.com/159#entry159comment</comments>
      <pubDate>Sat, 18 Jan 2025 15:56:07 +0900</pubDate>
    </item>
    <item>
      <title>[Trouble Shooting/성능 개선] Redis로 캐싱 도입해 채팅 전송 및 조회 성능 개선</title>
      <link>https://blogan99.tistory.com/158</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제 상황 파악&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트에 STOMP를 통해 1:1 채팅 기능을 구현함&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;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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWBl4k/btsLByqOQ2g/kdgbsUYugbTKuehxJm3grK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWBl4k/btsLByqOQ2g/kdgbsUYugbTKuehxJm3grK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWBl4k/btsLByqOQ2g/kdgbsUYugbTKuehxJm3grK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWBl4k%2FbtsLByqOQ2g%2FkdgbsUYugbTKuehxJm3grK%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;487&quot; height=&quot;141&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림과 같은 순서를 가지며 매번 채팅을 전송할 때마다 DB에 접근함&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsFEPH/btsLCqFN7Eo/KUZ3dgFiP08c5IPDWCwVz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsFEPH/btsLCqFN7Eo/KUZ3dgFiP08c5IPDWCwVz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsFEPH/btsLCqFN7Eo/KUZ3dgFiP08c5IPDWCwVz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsFEPH%2FbtsLCqFN7Eo%2FKUZ3dgFiP08c5IPDWCwVz0%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;483&quot; height=&quot;122&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 다수의 사람이 채팅을 전송 및 조회할 때 &lt;span style=&quot;background-color: #f89009;&quot;&gt;모든 요청이 DB에 접근하게 된다면 과부하가 발생하거나 성능이 저하될 것이라고 판단&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;b&gt;2. 해결 방법 및 현재 상황에 적용&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;일반적인 방법 혹은 채팅 아키텍처가 아니지만 프로젝트 진행 도중 조금이라도 성능 개선할 수 없을까하는 생각에 도입함&lt;/b&gt;&lt;/blockquote&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;2-1. 캐싱(caching)&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;자주 사용되는 데이터를 임시 저장소 ( = 캐시, cache)에 저장해 동일한 요청이 들어왔을 때 더 빠른 응답이 가능하게 하는 기술&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;일반적으로 메모리에 위치함 (대표적으로 Redis, Memcached 등 존재)&lt;/li&gt;
&lt;li&gt;DB와 같은 느린 저장소에 비해 빠른 속도가 특징임&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;b&gt;2-2. 상태 관리&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;/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;애플리케이션에서 특정 시점의 데이터 (ex. 온/오프라인 상태, 읽음 여부, 웹 소켓 연결 인원 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;시스템 안정성: 서버 장애나 네트워크 문제로 인해 상태가 불일치할 수 있는데, 이를 관리함으로써 시스템의 안정성을 높일 수 있음&lt;/li&gt;
&lt;/ol&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;b&gt;2-3. Redis 캐시 선택 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 현재 Redis에 해당 채팅방의 웹 소켓 연결 인원 수를 저장 (상태 관리) 함으로써 읽음 여부 기능 구현함&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;&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;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;연결 인원 수 : 0명 &amp;rArr; 아무도 채팅방 페이지에 머무르고 있지 않음&lt;/li&gt;
&lt;li&gt;연결 인원 수 : 1명 &amp;rArr; &amp;lsquo;나&amp;rsquo; 만 채팅방 페이지에 머무르고 있음&lt;br /&gt;- 채팅 전송 시 읽지 않음으로 저장&lt;/li&gt;
&lt;li&gt;연결 인원 수 : 2명 &amp;rArr; &amp;lsquo;나&amp;rsquo;와 &amp;lsquo;상대방&amp;rsquo; 모두 채팅방 페이지에 머무르고 있음&lt;br /&gt;- 채팅 전송 시 읽음으로 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot; data-token-index=&quot;0&quot;&gt;&amp;rArr; 새로운 캐시를 도입하는 것보다 기존 사용하는 Redis를 사용하는 것이 좋겠다고 판단&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. 추후 Redis의 메세지 브로커 사용 가능성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상황: 스프링의 Simple Message Broker 사용 중
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 메모리 기반: 스프링 서버의 내부 메모리에서 동작 &amp;rArr; 서버가 다운되면 메시지 브로커의 데이터가 유실될 수 있음&lt;/li&gt;
&lt;li&gt;다중 서버 환경의 제약: 다중 서버 환경에서는 서버 간 채팅방을 공유할 수 없음 &amp;rArr; 다른 서버의 사용자와 채팅이 불가능함!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Redis의 메시지 브로커
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pub/Sub 기능 활용: Redis가 제공하는 Pub/Sub 기능을 통해 메시지 브로커로 사용 가능&lt;/li&gt;
&lt;li&gt;실시간 데이터 처리: 메시지 전송 후 삭제되기 때문에 실시간 데이터 처리에는 적합하지만, 메시지가 유실될 수 있는 위험 존재&lt;/li&gt;
&lt;li&gt;분산 서버 환경 지원: 여러 서버에 Redis 인스턴스를 배포함으로써 서버 간 채팅방을 공유할 수 있음 &amp;rArr; 다른 서버의 사용자와도 채팅이 가능함!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 추후 scale-out 하게 된다면 Redis의 메세지 브로커 사용을 고려하고 있기에 현재 상황에서 Redis를 캐시로 사용하는 것이 좋겠다고 판단&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;2-4. 현재 프로젝트에 적용&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-4-1. 채팅 전송 (캐싱 + 상태 관리)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLPkcz/btsLDXPZy9H/oKDlEAaITosZDhxczDU610/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLPkcz/btsLDXPZy9H/oKDlEAaITosZDhxczDU610/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLPkcz/btsLDXPZy9H/oKDlEAaITosZDhxczDU610/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLPkcz%2FbtsLDXPZy9H%2FoKDlEAaITosZDhxczDU610%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;558&quot; height=&quot;233&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;233&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: #ee2323;&quot;&gt;&lt;b&gt;캐싱 (임시 저장)&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&gt;서버에서 메세지 처리를 완료하고 (기존: DB에 저장) Redis에 임시 저장함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;DB에 저장&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&gt;Redis에 저장된 해당 채팅방의 웹 소켓 연결 인원이 0명이 되는 순간 (상태 관리) Redis에 임시 저장한 채팅들을 DB로 영구 저장함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;웹 소켓 연결 인원이 0명이 되는 순간 : &amp;ldquo;해당 채팅방을 현재 사용중인 유저가 없다는 것!&amp;rdquo;&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;rArr; 따라서 &lt;span style=&quot;background-color: #ef6f53; color: #ffffff;&quot;&gt;비교적 시간이 오래걸리는 DB를 거치는 작업을 할 여유가 생겼다&lt;/span&gt;는 것으로 해석!&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;&lt;b&gt;2-4-2. 채팅 조회&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;현재 무한 스크롤이 구현되어 있는 상황 &amp;rArr; 두 가지 조회 상황 존재 &lt;br /&gt;1. 첫 페이지 조회&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 채팅방에 입장했을 때 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - 채팅이 진행중 일 때: 생성된 채팅이 추가되면 첫 페이지가 로드 되어야 함 (채팅 생성일자 기준 내림차순 정렬이므로 최신 채팅은 첫 페이지에 존재하므로) &lt;br /&gt;&lt;br /&gt;2. 이후 페이지 조회 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - 스크롤을 올려서 현재 로드된 채팅 목록 이후의 페이지를 조회할 때&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 첫 페이지 조회&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HvlIJ/btsLDfcJBeh/K1Nwrk4MM0wpLS9melARJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HvlIJ/btsLDfcJBeh/K1Nwrk4MM0wpLS9melARJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HvlIJ/btsLDfcJBeh/K1Nwrk4MM0wpLS9melARJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHvlIJ%2FbtsLDfcJBeh%2FK1Nwrk4MM0wpLS9melARJ0%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;501&quot; height=&quot;125&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;125&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;위에서 도입한 채팅 전송 프로세스에 따라 Redis에 임시 저장되어 있는 모든 채팅을 조회함&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. 이후 페이지 조회 (혹은 첫 페이지 조회 시 Redis에 채팅이 존재하지 않는 경우)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4rlD/btsLDt2Vikp/mTvlctApht8wfTSKZKkd6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4rlD/btsLDt2Vikp/mTvlctApht8wfTSKZKkd6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4rlD/btsLDt2Vikp/mTvlctApht8wfTSKZKkd6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4rlD%2FbtsLDt2Vikp%2FmTvlctApht8wfTSKZKkd6k%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;483&quot; height=&quot;113&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;113&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;Redis에 현재 존재하는 모든 채팅을 이미 로드했기 때문에 이후의 채팅은 모두 DB에 저장되어 있음&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;b&gt;3. 결과 검증&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 채팅 전송 메서드 검증&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;서비스 단의 채팅 전송 메서드 전체의 소요 시간을 측정함 &amp;rArr; &lt;span style=&quot;background-color: #f89009;&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;blockquote data-ke-style=&quot;style3&quot;&gt;기존 방법 대비 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 41% 성능 개선&lt;/span&gt; 확인!&lt;/blockquote&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: 38px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 20px; text-align: center;&quot;&gt;바로 DB에 저장하는 기존 방법&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 20px; text-align: center;&quot;&gt;Redis에 저장하는 개선 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 18px;&quot;&gt;소요 시간&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 18px;&quot;&gt;3회 측정: &lt;span style=&quot;background-color: #f89009;&quot;&gt;평균 약 54ms&lt;/span&gt; 소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzOJt/btsLEjedQhl/tPZ1y6bw7M4eTMoqbIr6QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzOJt/btsLEjedQhl/tPZ1y6bw7M4eTMoqbIr6QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzOJt/btsLEjedQhl/tPZ1y6bw7M4eTMoqbIr6QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzOJt%2FbtsLEjedQhl%2FtPZ1y6bw7M4eTMoqbIr6QK%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;252&quot; height=&quot;110&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 18px;&quot;&gt;3회 측정: &lt;span style=&quot;background-color: #f89009;&quot;&gt;평균 약 32ms&lt;/span&gt; 소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWxHk/btsLCGhCcog/e9TYPwikZ3VBIji62ocd4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWxHk/btsLCGhCcog/e9TYPwikZ3VBIji62ocd4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWxHk/btsLCGhCcog/e9TYPwikZ3VBIji62ocd4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWxHk%2FbtsLCGhCcog%2Fe9TYPwikZ3VBIji62ocd4K%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;256&quot; height=&quot;113&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. (채팅 전송 시) 메세지 저장 시간만 검증&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;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;background-color: #f89009;&quot;&gt;DB 혹은 Redis 에 저장하는 코드의 실행 시간 측정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;기존 방법 대비 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 53.4% 성능 개선&lt;/span&gt; 확인!&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 38px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 20px; text-align: center;&quot;&gt;바로 DB에 저장하는 기존 방법&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 20px; text-align: center;&quot;&gt;Redis에 저장하는 개선 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 18px;&quot;&gt;소요 시간&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 18px;&quot;&gt;3회 측정:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;평균 약 10.1ms&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M7XvH/btsLDvfk6sy/PVCi1aCMmrkR8sbcwae7xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M7XvH/btsLDvfk6sy/PVCi1aCMmrkR8sbcwae7xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M7XvH/btsLDvfk6sy/PVCi1aCMmrkR8sbcwae7xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM7XvH%2FbtsLDvfk6sy%2FPVCi1aCMmrkR8sbcwae7xk%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;257&quot; height=&quot;104&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 18px;&quot;&gt;3회 측정:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;평균 약 4.7ms&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0GMRy/btsLCmp8St1/eEc3cQdEfIxqg4v2pKRcu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0GMRy/btsLCmp8St1/eEc3cQdEfIxqg4v2pKRcu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0GMRy/btsLCmp8St1/eEc3cQdEfIxqg4v2pKRcu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0GMRy%2FbtsLCmp8St1%2FeEc3cQdEfIxqg4v2pKRcu1%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;244&quot; height=&quot;103&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 채팅 조회 검증&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;현재 한 페이지 당 채팅 개수를 20개로 설정함&lt;/li&gt;
&lt;li&gt;만약 Redis에 저장되어 있는 채팅 개수가 20개보다 현저히 많다면 성능 개선 효과가 미비할 수 있지만 측정은 20개를 기준으로 해봄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;기존 방법 대비 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 65.2% 성능 개선&lt;/span&gt; 확인!&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 38px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 20px;&quot;&gt;DB에서 가장 최근 20개 채팅 조회하는 기존 방법&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 20px;&quot;&gt;Redis에서 가장 최근 20개 채팅 조회하는 개선 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 18px;&quot;&gt;소요 시간&lt;/td&gt;
&lt;td style=&quot;width: 44.845%; height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;약 13.5ms&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbujvO/btsLByqO2eA/daztkXojeRYrE7Ski5V9X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbujvO/btsLByqO2eA/daztkXojeRYrE7Ski5V9X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbujvO/btsLByqO2eA/daztkXojeRYrE7Ski5V9X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbujvO%2FbtsLByqO2eA%2FdaztkXojeRYrE7Ski5V9X0%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;294&quot; height=&quot;52&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 45.1937%; height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;약 4.7ms&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNPRs/btsLBWrpNxS/GhL9NiDRhxVtv22M5k107k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNPRs/btsLBWrpNxS/GhL9NiDRhxVtv22M5k107k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNPRs/btsLBWrpNxS/GhL9NiDRhxVtv22M5k107k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNPRs%2FbtsLBWrpNxS%2FGhL9NiDRhxVtv22M5k107k%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;317&quot; height=&quot;53&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 정리 및 개선사항&lt;/b&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;/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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 사용할 수 있는 개선 방식 중 하나인 읽기/쓰기가 빠른 DB를 도입하는 방법에 대해서도 시도해 볼 예정&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Trouble Shooting</category>
      <category>메세지 브로커</category>
      <category>스프링 redis 예제</category>
      <category>스프링 채팅</category>
      <category>스프링 채팅 redis</category>
      <category>스프링 채팅 성능 개선</category>
      <category>스프링 채팅 전송 성능</category>
      <category>스프링 채팅 조회 성능</category>
      <category>스프링 캐싱</category>
      <category>채팅 redis</category>
      <category>채팅 성능 개선</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/158</guid>
      <comments>https://blogan99.tistory.com/158#entry158comment</comments>
      <pubDate>Fri, 3 Jan 2025 00:03:41 +0900</pubDate>
    </item>
    <item>
      <title>[Trouble Shooting/성능 개선] QueryDSL 로 no-offset 페이지네이션 구현하여 조회 성능 개선</title>
      <link>https://blogan99.tistory.com/157</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제 상황 파악&lt;/b&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;/li&gt;
&lt;li&gt;약 1000~2000개의 채팅 추가 후 확인 시 조금씩 느려짐을 확인함&lt;/li&gt;
&lt;/ul&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;데이터가 많아지면 느려지는 문제를 확인해보기 위해 아래의 과정대로 1,000,000개의 데이터를 삽입하고 테스트를 진행함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 채팅 메시지 테이블에 1,000,000개의 샘플 데이터를 삽입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnfC7s/btsLAWSGho4/9q6sLisuR0vTW1qwkU3wTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnfC7s/btsLAWSGho4/9q6sLisuR0vTW1qwkU3wTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnfC7s/btsLAWSGho4/9q6sLisuR0vTW1qwkU3wTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnfC7s%2FbtsLAWSGho4%2F9q6sLisuR0vTW1qwkU3wTk%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;280&quot; height=&quot;207&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 가장 마지막 20개의 채팅 조회&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XebWP/btsLAaja2iv/De1HkmkIVkLU3snBQVhPE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XebWP/btsLAaja2iv/De1HkmkIVkLU3snBQVhPE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XebWP/btsLAaja2iv/De1HkmkIVkLU3snBQVhPE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXebWP%2FbtsLAaja2iv%2FDe1HkmkIVkLU3snBQVhPE0%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;677&quot; height=&quot;392&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 백만개의 데이터 (생성일 기준 내림차순) 중 가장 마지막에 해당하는 20개를 조회할 때 2.08초가 소요됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 그렇다면 데이터가 1억, 10억개 ... 등 더 많이 &lt;span style=&quot;background-color: #ef6f53;&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;b&gt;2. 문제 원인 파악&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 기존의 페이지네이션 기법&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;offset을 사용함&lt;/li&gt;
&lt;li&gt;JPA가 생성하는 쿼리 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// JpaRepository 내의 메서드
Page&amp;lt;ChatMessage&amp;gt; findChatMessagesByChatRoomId(Pageable pageable, Long chatRoomId);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- Jpa가 자동으로 생성해주는 쿼리
SELECT * FROM chat_message
WHERE chat_room_id = ?
ORDER BY created_at DESC
LIMIT 20 OFFSET ?
&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-1-1. offset 사용 페이지네이션 분석&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Gcbo/btsLAwzuwBK/vJ8sAUPB0EQdaTD9NeCkPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Gcbo/btsLAwzuwBK/vJ8sAUPB0EQdaTD9NeCkPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Gcbo/btsLAwzuwBK/vJ8sAUPB0EQdaTD9NeCkPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Gcbo%2FbtsLAwzuwBK%2FvJ8sAUPB0EQdaTD9NeCkPk%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;329&quot; height=&quot;241&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;241&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;full-scan 방식에 해당함&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&gt;처음 ~ offset에 해당하는 행까지 데이터를 읽음&lt;/li&gt;
&lt;li&gt;그 이후 limit 만큼 행을 읽음&lt;/li&gt;
&lt;li&gt;1번에서 읽은 데이터는 필요없으므로 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;문제점 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;만약 첫페이지, 즉 첫 행부터 limit만큼 조회한다면 삭제하는 행 (쓸데없이 조회하는 행)이 없기 때문에 성능에는 차이가 없음 &lt;br /&gt;&amp;rArr; 반대로 가장 마지막에 있는 페이지의 데이터를 읽게된다면 그 전까지의 많은 데이터는 쓸데없이 조회와 삭제의 작업을 거치게 됨&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ef6f53; color: #ffffff;&quot;&gt;&amp;rArr; 따라서 데이터의 양이 많을수록 성능 저하는 심해질 것!&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;문제점 2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;만약 새로운 행이 삽입되고 (지금 기준) 다음 페이지를 조회하는 경우에는 &lt;span style=&quot;background-color: #ef6f53; color: #ffffff;&quot;&gt;중복되는 데이터&lt;/span&gt;가 발생할 수 있음!&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SXPPm/btsLAzwaswK/6X8LdxlVyWPKopI0Q4J8YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SXPPm/btsLAzwaswK/6X8LdxlVyWPKopI0Q4J8YK/img.png&quot; data-alt=&quot;중복 예시 그림 (10번행 중복)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SXPPm/btsLAzwaswK/6X8LdxlVyWPKopI0Q4J8YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSXPPm%2FbtsLAzwaswK%2F6X8LdxlVyWPKopI0Q4J8YK%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;643&quot; height=&quot;311&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중복 예시 그림 (10번행 중복)&lt;/figcaption&gt;
&lt;/figure&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;b&gt;3. 해결 방법 및 결과 검증&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. no-offset 구조 페이지네이션 ( = 커서 기반 페이지네이션)&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;기존 방식 (offset 사용) 과는 달리 offset을 사용하지 않는 방식
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(Jpa는 @Id에 해당하는 컬럼 (pk) 를 인덱스로 자동 설정해 줌)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGVewf/btsLBxYKxVF/NLoToZxnkeDqL9Brw6gDwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGVewf/btsLBxYKxVF/NLoToZxnkeDqL9Brw6gDwK/img.png&quot; data-alt=&quot;no-offset 페이지네이션 동작 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGVewf/btsLBxYKxVF/NLoToZxnkeDqL9Brw6gDwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGVewf%2FbtsLBxYKxVF%2FNLoToZxnkeDqL9Brw6gDwK%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;333&quot; height=&quot;372&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;no-offset 페이지네이션 동작 방식&lt;/figcaption&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;예시 sql&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 위의 예시 쿼리
SELECT * FROM chat_message
WHERE chat_room_id = ?
ORDER BY created_at DESC
LIMIT 20 OFFSET ?
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- no-offset 방식으로 변경한 예시 쿼리
SELECT * FROM chat_message
WHERE chat_room_id = ? 
			AND  chat_message_id &amp;lt; ?
ORDER BY created_at DESC
LIMIT 20;

&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;여기서 chat_message_id는 이전 조회 결과에서가장 마지막 채팅의 id를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 이전 조회 결과의 마지막 채팅을 기준으로 다음 데이터를 조회하기 때문에 매번 이전 데이터를 건너뛸 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ef6f53;&quot;&gt;&amp;rArr; 따라서 가장 마지막 페이지를 읽는다고 해도 매번 첫 페이지를 읽는 성능과 동일!&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;3-2. sql을 통한 성능 비교&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;테이블에 삽입한 데이터 양은 1,000,000 건&lt;/li&gt;
&lt;li&gt;쿼리는 위의 예시와 다소 다를 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;마지막 페이지 조회 기준으로 기존 방식 대비 no-offset 방식으로 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 96.2% 성능 개선&lt;/span&gt; 가능!&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpzMn/btsLA5IoS2A/RXXreEzorPfiNKXqGKgIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpzMn/btsLA5IoS2A/RXXreEzorPfiNKXqGKgIkk/img.png&quot; data-alt=&quot;글 작성 시 표가 깨짐으로 인해 캡쳐 사진으로 대체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpzMn/btsLA5IoS2A/RXXreEzorPfiNKXqGKgIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpzMn%2FbtsLA5IoS2A%2FRXXreEzorPfiNKXqGKgIkk%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;871&quot; height=&quot;460&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;460&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 코드 구현&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;QueryDSL&lt;br /&gt;&lt;br /&gt;- Java 기반의 SQL 쿼리 생성 라이브러리&lt;br /&gt;&amp;nbsp; &amp;nbsp; - java 코드에서 SQL 쿼리를 직접 작성할 수 있음!&lt;/blockquote&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-3-1. QueryDSL 의존성 추가&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;build.gradle&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735572286951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// QueryDSL 의존성 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor &quot;com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta&quot;
annotationProcessor &quot;jakarta.annotation:jakarta.annotation-api&quot;
annotationProcessor &quot;jakarta.persistence:jakarta.persistence-api&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;3-3-2. 레포지토리 생성&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;QueryDSL 사용하여 SQL을 직접 작성하기 위한 레포지토리를 생성함&lt;/li&gt;
&lt;/ul&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;ChatMessageQueryRepository&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735572329218&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
@RequiredArgsConstructor
public class ChatMessageQueryRepository {

    // jpa의 EntityManager 의존 주입
    private final EntityManager em;

    // 특정 채팅방에 대한 채팅 메시지를 no-offset 방식으로 조회하는 메서드
    public Page&amp;lt;ChatMessage&amp;gt; findChatMessagesByChatRoomIdUsingNoOffset(Pageable pageable, Long chatRoomId, @Nullable Long index) {

        // JPAQueryFactory 생성 =&amp;gt; QueryDSL 쿼리 작성 가능
        JPAQueryFactory query = new JPAQueryFactory(em);
        QChatRoom chatRoom = QChatRoom.chatRoom;    // QChatRoom 타입 인스턴스 생성
        QChatMessage chatMessage = QChatMessage.chatMessage;    // QChatMessage 타입 인스턴스 생성
        
        List&amp;lt;ChatMessage&amp;gt; results =
                query.select(chatMessage)
                        .from(chatMessage)
                        .join(chatMessage.chatRoom, chatRoom)
                        .where(chatRoom.id.eq(chatRoomId) // 조인 조건
                                .and(ltChatMessageId(index)))   // no-offset 조건
                        .orderBy(chatMessage.createdAt.desc())
                        .limit(20)
                        .fetch();

        return new PageImpl&amp;lt;&amp;gt;(results, pageable, results.size());
    }

    // 주어진 index 보다 작은 chat_message_id에 대한 조건 생성 메서드
    public BooleanExpression ltChatMessageId(@Nullable Long index) {

        return index == null ? null : QChatMessage.chatMessage.id.lt(index);
    }
}&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;b&gt;3-4. api 호출로 성능 개선 결과 확인&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;마지막 페이지 조회 기준으로 기존 방식 대비 no-offset 방식으로 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 96.0% 성능 개선&lt;/span&gt; 확인!&lt;/blockquote&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;기존 조회 api 호출: &lt;span style=&quot;background-color: #ef6f53;&quot;&gt;2.84s 소요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Nfoi/btsLCqx2vfE/iYXm12ubbC18ztQjZwKRW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Nfoi/btsLCqx2vfE/iYXm12ubbC18ztQjZwKRW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Nfoi/btsLCqx2vfE/iYXm12ubbC18ztQjZwKRW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Nfoi%2FbtsLCqx2vfE%2FiYXm12ubbC18ztQjZwKRW1%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;703&quot; height=&quot;417&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;417&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;no-offset 방식으로 변경한 조회 api 호출: &lt;span style=&quot;background-color: #ef6f53;&quot;&gt;85ms 소요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yjQMV/btsLC15L3c5/Mk601zkAESiCUZt683e8O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yjQMV/btsLC15L3c5/Mk601zkAESiCUZt683e8O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yjQMV/btsLC15L3c5/Mk601zkAESiCUZt683e8O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyjQMV%2FbtsLC15L3c5%2FMk601zkAESiCUZt683e8O1%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;703&quot; height=&quot;406&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;406&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;b&gt;3-5. 테스트 코드로 성능 개선 확인&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;동일하게 100만개의 채팅 메세지 삽입 후 테스트 진행함&lt;/li&gt;
&lt;/ul&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;ChatMessageRepositoryTest&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735572601910&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootTest
class ChatMessageRepositoryTest {

    @Autowired
    private ChatRoomRepository chatRoomRepository;

    @Autowired
    private ChatMessageRepository chatMessageRepository;

    @Autowired
    private ChatMessageQueryRepository chatMessageQueryRepository;


    @Test
    @DisplayName(&quot;기존의 방식대로 100만개 중 마지막 페이지를 조회하면 1초 이상이 걸린다.&quot;)
    public void findChatMessagesLegacy() throws Exception {

        //given
        int limit = 20;
        int offset = 1089900;
        PageRequest pageRequest = PageRequest.of(offset / limit, limit,
                Sort.by(&quot;createdAt&quot;).descending());

        //when
        long startTime = System.nanoTime(); // 시작 시간 기록
        Page&amp;lt;ChatMessage&amp;gt; chatMessagesLegacy = chatMessageRepository.findChatMessagesByChatRoomId(pageRequest, 1L);
        long endTime = System.nanoTime(); // 종료 시간 기록
        System.out.println(&quot;성능 개선 전 실행 시간: &quot; + (double) (endTime - startTime)/1000000000 + &quot;s&quot;);


        //then
        assertThat(chatMessagesLegacy).hasSize(20);

        List&amp;lt;ChatMessage&amp;gt; legacyMessages = chatMessagesLegacy.getContent();
        for (ChatMessage legacyMessage : legacyMessages) {
            System.out.println(&quot;legacyMessage.getContent() = &quot; + legacyMessage.getContent());
        }
    }

    @Test
    @DisplayName(&quot;개선한 방식대로 100만개 중 마지막 페이지를 조회하면 1초 미만 (ms단위)으로 걸린다.&quot;)
    public void findChatMessagesNoOffset() throws Exception {

        //given
        int limit = 20;
        Pageable pageable = Pageable.ofSize(limit);

        //when
        long startTime = System.nanoTime(); // 시작 시간 기록
        Page&amp;lt;ChatMessage&amp;gt; chatMessagesNoOffset = chatMessageQueryRepository.findChatMessagesByChatRoomIdUsingNoOffset(
                pageable, 1L, 101L);
        long endTime = System.nanoTime(); // 종료 시간 기록
        System.out.println(&quot;성능 개선 후 실행 시간: &quot; + (double) (endTime - startTime)/1000000000 + &quot;s&quot;);

        //then
        assertThat(chatMessagesNoOffset).hasSize(20);

        // 추가: 메시지 내용 비교
        List&amp;lt;ChatMessage&amp;gt; noOffsetMessages = chatMessagesNoOffset.getContent();
        for (ChatMessage noOffsetMessage : noOffsetMessages) {
            System.out.println(&quot;noOffsetMessage.getContent() = &quot; + noOffsetMessage.getContent());
        }
    }
}&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;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;테스트 코드로 확인 결과 마지막 페이지 조회 기준으로 &lt;span style=&quot;background-color: #ee2323; color: #ffffff;&quot;&gt;약 84.3% 성능 개선&lt;/span&gt; 확인!&lt;/blockquote&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 style=&quot;width: 50%;&quot;&gt;성능 개선 전 조회 테스트&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;성능 개선 후 조회 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;1.799s&lt;/span&gt; 소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7oaB/btsLAcBbnkG/3fxffiFuEYXm3NKQ7f3JY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7oaB/btsLAcBbnkG/3fxffiFuEYXm3NKQ7f3JY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7oaB/btsLAcBbnkG/3fxffiFuEYXm3NKQ7f3JY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7oaB%2FbtsLAcBbnkG%2F3fxffiFuEYXm3NKQ7f3JY1%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;499&quot; height=&quot;624&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;0.283s&lt;/span&gt; 소요&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgY4ZL/btsLzXxyjhq/UCWD2nqmDZ6P0d0xdkgK51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgY4ZL/btsLzXxyjhq/UCWD2nqmDZ6P0d0xdkgK51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgY4ZL/btsLzXxyjhq/UCWD2nqmDZ6P0d0xdkgK51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgY4ZL%2FbtsLzXxyjhq%2FUCWD2nqmDZ6P0d0xdkgK51%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;519&quot; height=&quot;626&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 참고자료&lt;/b&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://github.com/Engineering-Student-An/rental-inhaee/blob/43c06301b9183c0b4a2d542e102fb0db38439f38/src/main/java/an/rentalinhaee/repository/RentalQueryRepository.java#L18&quot;&gt;https://github.com/Engineering-Student-An/rental-inhaee/blob/43c06301b9183c0b4a2d542e102fb0db38439f38/src/main/java/an/rentalinhaee/repository/RentalQueryRepository.java#L18&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thalals.tistory.com/349&quot;&gt;https://thalals.tistory.com/349&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://waterfogsw.tistory.com/50&quot;&gt;https://waterfogsw.tistory.com/50&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jojoldu.tistory.com/528&quot;&gt;https://jojoldu.tistory.com/528&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thalals.tistory.com/350&quot;&gt;https://thalals.tistory.com/350&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Trouble Shooting</category>
      <category>no-offset 페이지네이션</category>
      <category>querydsl no-offset</category>
      <category>querydsl 페이지네이션</category>
      <category>querydsl 페이징</category>
      <category>스프링 조회 성능 개선</category>
      <category>스프링 채팅 조회</category>
      <category>스프링 채팅 조회 성능 개선</category>
      <category>스프링 쿼리 개선</category>
      <category>스프링 페이지네이션 성능 개선</category>
      <category>커서 기반 페이지네이션</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/157</guid>
      <comments>https://blogan99.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 31 Dec 2024 00:35:56 +0900</pubDate>
    </item>
    <item>
      <title>[Trouble Shooting] JPA 사용 시 발생한 N+1 문제를 fetch join을 사용한 JPQL을 작성하여 해결</title>
      <link>https://blogan99.tistory.com/156</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제 상황 파악&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠폰 보유 회원 목록 조회 시 CouponMember 테이블에서 특정 쿠폰 id에 해당하는 객체를 가져오는 메서드 호출함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// CouponAdminService.java 의 findCouponMembers() 메서드 내부
Page&amp;lt;CouponMember&amp;gt; couponMembers = couponMemberRepository.findByCouponId(pageRequest, couponId);

// CouponMemberRepository.java
Page&amp;lt;CouponMember&amp;gt; findByCouponId(Pageable pageable, Long couponId);&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;의도한 바는 쿠폰id를 비교해서 가져오는 쿼리 한 번 발생하는 것임&lt;br /&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 그러나 의도한 쿼리 이외에 쿼리가 3개 더 생성되었음!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAJuym/btsLBgDeAbO/SYilfTlZiXCtD5O6OeaPD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAJuym/btsLBgDeAbO/SYilfTlZiXCtD5O6OeaPD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAJuym/btsLBgDeAbO/SYilfTlZiXCtD5O6OeaPD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAJuym%2FbtsLBgDeAbO%2FSYilfTlZiXCtD5O6OeaPD0%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;350&quot; height=&quot;799&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVI1U/btsLAey5rJY/uvpgixrZYRVWMiOw8WgVok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVI1U/btsLAey5rJY/uvpgixrZYRVWMiOw8WgVok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVI1U/btsLAey5rJY/uvpgixrZYRVWMiOw8WgVok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVI1U%2FbtsLAey5rJY%2FuvpgixrZYRVWMiOw8WgVok%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;350&quot; height=&quot;772&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;772&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;추가적으로 발생한 3개의 쿼리는 쿠폰을 보유한 회원을 조회하는 쿼리임을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wpQ4W/btsLBXQoiK8/7dpnIvIKiT51PmLfiSufMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wpQ4W/btsLBXQoiK8/7dpnIvIKiT51PmLfiSufMK/img.png&quot; data-alt=&quot;쿠폰을 보유한 회원 수: 3명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wpQ4W/btsLBXQoiK8/7dpnIvIKiT51PmLfiSufMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwpQ4W%2FbtsLBXQoiK8%2F7dpnIvIKiT51PmLfiSufMK%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;706&quot; height=&quot;335&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠폰을 보유한 회원 수: 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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 문제 발생 조건 파악&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// CouponAdminService.java 의 findCouponMembers() 메서드 내부
Page&amp;lt;CouponMember&amp;gt; couponMembers = couponMemberRepository.findByCouponId(pageRequest, couponId);

// CouponMemberRepository.java
Page&amp;lt;CouponMember&amp;gt; findByCouponId(Pageable pageable, Long couponId);&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;위의 코드까지는 쿼리가 의도한대로 (1번) 실행됨을 확인함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// CouponMember.java

@ManyToOne(fetch = FetchType.LAZY)  // 단방향 다대일 연관관계
@JoinColumn(name = &quot;member_id&quot;)
private Member member;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; CouponMember 엔티티에서 Member 객체에 대해서는 지연로딩이 설정되어 있기 때문에 프록시 객체를 조회함 &lt;br /&gt;&amp;nbsp; &amp;nbsp; (DB로 쿼리는 전송하지 않지만 객체가 조회됨)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;em.getReference()&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 데이터베이스 (실제) 조회를 미루는 가짜 엔티티 객체를 조회함&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; 껍데기만 갖고 있음&lt;br /&gt;&lt;br /&gt;- 프록시 객체 : 실제 객체의 참조 (target) 보관함 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - 프록시 객체를 호출하게 되면 프록시 객체가 실제 객체의 메소드를 호출하는 것&lt;/blockquote&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;그렇다면 왜 DB로 쿼리를 추가적으로 날리는 것인가?
&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;지연로딩 설정으로 프록시 객체로 조회했지만 실제 사용 시점에는 DB에 조회하는 쿼리를 날리기 때문!&lt;/li&gt;
&lt;li&gt;실제 사용 시점 관련 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 위에서 작성한 코드
Page&amp;lt;CouponMember&amp;gt; couponMembers = couponMemberRepository.findByCouponId(pageRequest, couponId);

// 위의 코드 실행 후 아래 코드가 실행됨 =&amp;gt; 실제 사용 시점!
// CouponMember를 CouponMemberResponseDto로 변환
List&amp;lt;CouponMemberResponseDto&amp;gt; dtos = couponMembers.stream()
        .map(couponMember -&amp;gt; CouponMapper.INSTANCE.toCouponMemberResponseDto(couponMember.getMember()))
        .collect(Collectors.toList());&lt;/code&gt;&lt;/pre&gt;
&amp;rArr; Member를 프록시 객체로 조회하고 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;couponMember.getMember()&lt;/b&gt;&lt;/span&gt; 를 통해서 실제 객체에 접근해야 할 때 DB에 조회하는 쿼리가 날라간 것임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;N+1 문제로 인한 발생 가능 문제점&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;지금은 쿠폰을 보유한 회원이 3명뿐이여서 쿼리가 3개(n개) 추가적으로 날라갔지만 &lt;br /&gt;만약 쿠폰 보유 회원이 백만명이라면?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; DB에 날리는 쿼리 수가 많아지면 많아질 수록 성능 저하가 심해질 것!&lt;/span&gt;&lt;br /&gt;&lt;br /&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;b&gt;3. 해결 방법 및 결과 검증&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;s&gt;3-1. 즉시 로딩 사용&lt;/s&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;&amp;ldquo;한 번에 가져오면 되지 않을까?&amp;rdquo; 라는 생각으로 즉시 로딩을 적용함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// CouponMember.java

@ManyToOne(fetch = FetchType.EAGER)  // 즉시 로딩 적용
@JoinColumn(name = &quot;member_id&quot;)
private Member member;
&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;전송된 쿼리 결과 확인 &amp;rArr; 해결 x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lEICw/btsLCH7pfcY/YfVnLeZmmp6GVd8NQ9dpr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lEICw/btsLCH7pfcY/YfVnLeZmmp6GVd8NQ9dpr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lEICw/btsLCH7pfcY/YfVnLeZmmp6GVd8NQ9dpr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlEICw%2FbtsLCH7pfcY%2FYfVnLeZmmp6GVd8NQ9dpr1%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;352&quot; height=&quot;667&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO7ciO/btsLCJYp0o6/h5FoCTDMAm4yavzmDHDsx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO7ciO/btsLCJYp0o6/h5FoCTDMAm4yavzmDHDsx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO7ciO/btsLCJYp0o6/h5FoCTDMAm4yavzmDHDsx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO7ciO%2FbtsLCJYp0o6%2Fh5FoCTDMAm4yavzmDHDsx1%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;350&quot; height=&quot;770&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;770&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;blockquote data-ke-style=&quot;style3&quot;&gt;여전히 N+1 문제가 발생하는 이유는?&lt;br /&gt;&lt;br /&gt;1. 조건에 맞는 CouponMember 객체를 조회함 &lt;br /&gt;2. Member 객체에 대해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;fetch = FetchType.EAGER&lt;/b&gt;&lt;/span&gt;&amp;nbsp;임을 확인하고 JPA가 조회한 모든 CouponMember에 대해&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; Member를 조회함 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 이 때 의도하지 않은 3개 (n개) 의 쿼리가 발생하는 것!&lt;/span&gt;&lt;/blockquote&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;3-2. fetch join 사용&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-1. fetch join 이란?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mlvnV/btsLAzXb9oX/kmQY9aXKmSkbgIH8VJK9K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mlvnV/btsLAzXb9oX/kmQY9aXKmSkbgIH8VJK9K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mlvnV/btsLAzXb9oX/kmQY9aXKmSkbgIH8VJK9K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmlvnV%2FbtsLAzXb9oX%2FkmQY9aXKmSkbgIH8VJK9K1%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;379&quot; height=&quot;226&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MYI8b/btsLz8evUD3/lUErsBbCUAQcZSRs7Pe0G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MYI8b/btsLz8evUD3/lUErsBbCUAQcZSRs7Pe0G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MYI8b/btsLz8evUD3/lUErsBbCUAQcZSRs7Pe0G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMYI8b%2FbtsLz8evUD3%2FlUErsBbCUAQcZSRs7Pe0G0%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;378&quot; height=&quot;267&quot; data-origin-width=&quot;378&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-2. fetch join 사용하여 문제 해결&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;서비스 단의 메서드(위의 코드)에서 Member 객체를 바로 사용하기 때문에 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(fetch) join 을 통해 한 번의 쿼리로 모두 가져오도록 해결해야 함&lt;/b&gt;&lt;/blockquote&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;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// CouponMemberRepository.java

Page&amp;lt;CouponMember&amp;gt; findByCouponId(Pageable pageable, Long couponId);&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;span style=&quot;color: #ee2323;&quot;&gt;?&lt;/span&gt;&lt;/b&gt; : 넘어오는 파라미터)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM coupon_member cm 
WHERE cm.coupon_id = ? 
LIMIT ? OFFSET ?
&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;fetch join 사용한 jpql 쿼리 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Query(&quot;SELECT cm &quot; +
        &quot;FROM CouponMember cm &quot; +
        &quot;JOIN FETCH cm.member &quot; +
        &quot;WHERE cm.coupon.id = :couponId&quot;)
Page&amp;lt;CouponMember&amp;gt; findByCouponId(@Param(&quot;couponId&quot;) Long couponId, Pageable pageable);&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;fetch join 결과 쿼리 로그 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAi6Rp/btsLBXCSwvZ/KrYMQAHf2iBUj80wpQIIOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAi6Rp/btsLBXCSwvZ/KrYMQAHf2iBUj80wpQIIOK/img.png&quot; data-alt=&quot;join 문을 포함한 쿼리 1회 발생!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAi6Rp/btsLBXCSwvZ/KrYMQAHf2iBUj80wpQIIOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAi6Rp%2FbtsLBXCSwvZ%2FKrYMQAHf2iBUj80wpQIIOK%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;386&quot; height=&quot;507&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;join 문을 포함한 쿼리 1회 발생!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; CouponMember와 Member를 join 한 쿼리가 단 한번만 나감을 확인함!&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;b&gt;3-2-3. 실제 사용 하는 코드 ( &lt;span style=&quot;color: #ee2323;&quot;&gt;couponMember.getMember()&lt;/span&gt; ) 는 변함이 없는데 왜 쿼리는 한 번만 나갈까?&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;조인 쿼리를 통해서 CouponMember와 관련된 Member 정보도 같이 db에서 조회함&lt;/li&gt;
&lt;li&gt;db에서 쿼리 결과를 받으면 &lt;span style=&quot;background-color: #006dd7;&quot;&gt;JPA가 결과를 엔티티 객체에 매핑함&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각 행은 CouponMember 엔티티와 관련된 Member 엔티티로 매핑됨&lt;/li&gt;
&lt;li&gt;JPA는 각 필드를 적절한 엔티티 필드에 바인딩함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #006dd7;&quot;&gt;매핑된 엔티티는 영속성 컨텍스트에 저장됨&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;여기서는 CouponMember 객체, Member객체가 모두 영속성 컨텍스트에 저장됨&lt;/li&gt;
&lt;li&gt;이후에 &lt;span style=&quot;background-color: #006dd7;&quot;&gt;실제사용 (참조) 할 때는 쿼리가 발생하지 않는 것!&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;b&gt;3-2-4. 영속성 컨텍스트에 CouponMember 객체, Member 객체가 모두 저장되었는지 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 기존 코드
Page&amp;lt;CouponMember&amp;gt; couponMembers = couponMemberRepository.findByCouponId(couponId, pageRequest);

// 영속성 컨텍스트에서 객체를 가져와 확인하는 코드
for (CouponMember couponMember : couponMembers.getContent()) {
    // CouponMember가 영속성 컨텍스트에 있는지 확인
    if (entityManager.contains(couponMember)) {
        System.out.println(&quot;CouponMember ID &quot; + couponMember.getId() + &quot; is managed.&quot;);
    } else {
        System.out.println(&quot;CouponMember ID &quot; + couponMember.getId() + &quot; is NOT managed.&quot;);
    }

    // Member 객체가 영속성 컨텍스트에 있는지 확인
    Member member = couponMember.getMember();
    if (entityManager.contains(member)) {
        System.out.println(&quot;Member ID &quot; + member.getId() + &quot; is managed.&quot;);
    } else {
        System.out.println(&quot;Member ID &quot; + member.getId() + &quot; is NOT managed.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KYbgs/btsLBWjFJkI/XZ5pr3yV8tasP8HMKQWfLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KYbgs/btsLBWjFJkI/XZ5pr3yV8tasP8HMKQWfLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KYbgs/btsLBWjFJkI/XZ5pr3yV8tasP8HMKQWfLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKYbgs%2FbtsLBWjFJkI%2FXZ5pr3yV8tasP8HMKQWfLk%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;240&quot; height=&quot;141&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;span style=&quot;color: #37352f;&quot; data-token-index=&quot;0&quot;&gt;&amp;rArr; &lt;/span&gt;&lt;span style=&quot;color: #37352f;&quot; data-token-index=&quot;1&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #37352f;&quot; data-token-index=&quot;1&quot;&gt;4. 해당 도메인에서 발생한 유사한 문제 해결&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 N+1 문제에 대해서도 같은 방법으로 해결함&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;b&gt;4-1. 1+n+n 회의 쿼리 발생 문제 해결&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-1-1. CouponService 와 CouponMemberRepository의 기존 코드와 문제점&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// CouponService.java의 findAllCoupons() 메서드 중 

Page&amp;lt;CouponMember&amp;gt; couponMembers;
if(includeInActiveCoupons) {     // 비활성화 쿠폰 포함
		couponMembers = couponMemberRepository.findByMemberId(pageRequest, loginMemberId);
} else {                        // 활성화 쿠폰만 조회
    couponMembers = couponMemberRepository.findByMemberIdAndCouponActiveIsAndUsed(pageRequest, loginMemberId, true, false);
}

List&amp;lt;CouponResponseDto&amp;gt; dtos = new ArrayList&amp;lt;&amp;gt;();

// coupon -&amp;gt; List&amp;lt;CouponResponseDto&amp;gt;
for (CouponMember couponMember : couponMembers) {

    CouponResponseDto couponResponseDto = CouponMapper.INSTANCE.toCouponResponseDto(couponMember.getCoupon());
    couponResponseDto.setUsed(couponMember.isUsed());   // 사용 여부 설정
    if(couponMember.isUsed()) couponResponseDto.setActive(false);
    dtos.add(couponResponseDto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735566524210&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// CouponMemberRepository.java 중
Page&amp;lt;CouponMember&amp;gt; findByMemberId(Pageable pageable, Long memberId);
Page&amp;lt;CouponMember&amp;gt; findByMemberIdAndCouponActiveIsAndUsed(Pageable pageable, Long memberId, boolean active, boolean used);&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;&amp;nbsp;문제점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 따라 CouponMember를 조회함 (쿼리 1회)&lt;/li&gt;
&lt;li&gt;조회한 CouponMember 를 DTO로 변환하는 과정에서 Mapper 클래스로 쿠폰을 넘김 &amp;rArr; 실제 사용! (couponMember.getCoupon() &amp;rArr; 쿼리 n회)&lt;/li&gt;
&lt;li&gt;Mapper 클래스 (Impl) 에서 카테고리 조회 &amp;rArr; 실제 사용! (getCategory() &amp;rArr; 쿼리 n회)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 총 1+n+n 회의 쿼리가 발생!&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;b&gt;4-1-2. fetch join 사용한 JPQL 작성하여 문제 해결&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// CouponService.java의 findAllCoupons() 메서드 중 

Page&amp;lt;CouponMember&amp;gt; couponMembers;
if(includeInActiveCoupons) {     // 비활성화 쿠폰 포함
    couponMembers = couponMemberRepository.findByMemberIdWithCouponsAndCategories(loginMemberId, pageRequest);
} else {                        // 활성화 쿠폰만 조회
    couponMembers = couponMemberRepository.findByMemberIdAndCouponActiveAndUsed(loginMemberId, true, false, pageRequest);
}

List&amp;lt;CouponResponseDto&amp;gt; dtos = new ArrayList&amp;lt;&amp;gt;();

// coupon -&amp;gt; List&amp;lt;CouponResponseDto&amp;gt;
for (CouponMember couponMember : couponMembers) {

    CouponResponseDto couponResponseDto = CouponMapper.INSTANCE.toCouponResponseDto(couponMember.getCoupon());
    couponResponseDto.setUsed(couponMember.isUsed());   // 사용 여부 설정
    if(couponMember.isUsed()) couponResponseDto.setActive(false);
    dtos.add(couponResponseDto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735566607449&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// CouponMemberRepository.java 중

@Query(&quot;SELECT cm FROM CouponMember cm &quot; +
        &quot;JOIN FETCH cm.coupon c &quot; +
        &quot;LEFT JOIN FETCH c.category &quot; +
        &quot;WHERE cm.member.id = :memberId &quot; +
        &quot;ORDER BY c.expiredAt ASC&quot;)
Page&amp;lt;CouponMember&amp;gt; findByMemberIdWithCouponsAndCategories(@Param(&quot;memberId&quot;) Long memberId, Pageable pageable);

@Query(&quot;SELECT cm FROM CouponMember cm &quot; +
        &quot;JOIN FETCH cm.coupon c &quot; +
        &quot;LEFT JOIN FETCH c.category &quot; +
        &quot;WHERE cm.member.id = :memberId AND c.active = :active AND cm.used = :used &quot; +
        &quot;ORDER BY c.expiredAt ASC&quot;)
Page&amp;lt;CouponMember&amp;gt; findByMemberIdAndCouponActiveAndUsed(@Param(&quot;memberId&quot;) Long memberId, @Param(&quot;active&quot;) boolean active, @Param(&quot;used&quot;) boolean used, Pageable pageable);&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/detv7n/btsLASvRGxj/gxKmRaYdvNUKsSynuZpKS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/detv7n/btsLASvRGxj/gxKmRaYdvNUKsSynuZpKS0/img.png&quot; data-alt=&quot;활성화 쿠폰만 조회시 &amp;amp;rArr; n+1 문제 해결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/detv7n/btsLASvRGxj/gxKmRaYdvNUKsSynuZpKS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdetv7n%2FbtsLASvRGxj%2FgxKmRaYdvNUKsSynuZpKS0%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;337&quot; height=&quot;629&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;활성화 쿠폰만 조회시 &amp;rArr; n+1 문제 해결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCxR3/btsLC1q9dzI/uM7eKG7uYUHlCRS2l3tQgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCxR3/btsLC1q9dzI/uM7eKG7uYUHlCRS2l3tQgK/img.png&quot; data-alt=&quot;비활성화 쿠폰도 모두 조회 시 &amp;amp;rArr; n+1 문제 해결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCxR3/btsLC1q9dzI/uM7eKG7uYUHlCRS2l3tQgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCxR3%2FbtsLC1q9dzI%2FuM7eKG7uYUHlCRS2l3tQgK%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;327&quot; height=&quot;553&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비활성화 쿠폰도 모두 조회 시 &amp;rArr; n+1 문제 해결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Trouble Shooting</category>
      <category>fetch join</category>
      <category>jpa n+1 문제</category>
      <category>JPQL</category>
      <category>jpql fetch join</category>
      <category>jpql n+1</category>
      <category>N+1 문제</category>
      <category>n+1 트러블슈팅</category>
      <category>스프링 jpql</category>
      <category>스프링 n+1</category>
      <category>스프링 n+1 fetch join</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/156</guid>
      <comments>https://blogan99.tistory.com/156#entry156comment</comments>
      <pubDate>Mon, 30 Dec 2024 22:59:50 +0900</pubDate>
    </item>
    <item>
      <title>[Trouble Shooting] 단위 테스트 작성 시 발생한 JpaAuditingHandler 빈 생성 오류 해결</title>
      <link>https://blogan99.tistory.com/155</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제 상황 파악&lt;/b&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: #ee2323;&quot;&gt;&lt;b&gt;@WebMvcTest&lt;/b&gt;&lt;/span&gt; 사용)시 아래와 같은 에러 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 에러가 발생한 테스트 코드

@WebMvcTest(CartController.class)
@AutoConfigureMockMvc(addFilters = false) // 필터 제외 (JWT 검증 제외)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@DisplayName(&quot;장바구니 컨트롤러 단위 테스트&quot;)
class CartControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CartService cartService;

    @Autowired
    private ObjectMapper objectMapper;

    // 기본 장바구니 컨트롤러의 URL
    private static final String URL = &quot;/api/carts&quot;;
    
    // 생략 ...
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsjRU/btsLz4wGYx1/S0KcZhKZrSIpRoxBL028e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsjRU/btsLz4wGYx1/S0KcZhKZrSIpRoxBL028e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsjRU/btsLz4wGYx1/S0KcZhKZrSIpRoxBL028e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsjRU%2FbtsLz4wGYx1%2FS0KcZhKZrSIpRoxBL028e1%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;691&quot; height=&quot;202&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BeanCreationException: Error creating bean with name 'jpaAuditingHandler'&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;JpaAuditingHandler 빈을 생성하는데 오류가 생겼다&amp;rdquo; 는 뜻임을 확인&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;b&gt;2. 문제 원인 파악&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. BeanCreationException 발생 이유&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;JPA 관련 빈이 제대로 설정되지 않았기 때문에 발생함&lt;/li&gt;
&lt;li&gt;JPA Auditing을 사용하고 있을 때 자주 발생&lt;/li&gt;
&lt;li&gt;JPA 관련 설정이 누락되었거나 잘못되었을 때 나타남&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;b&gt;2-2. 현재 상황에서 발생한 이유&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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;@WebMvcTest &lt;/span&gt;&lt;/b&gt;를 사용한 테스트에서 발생하는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;BeanCreationException&lt;/span&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;컨트롤러 단위 테스트 코드에서 서비스 레이어의 클래스를 모킹하여 사용하지만 CartService 내부에서 JPA 를 사용함!
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;CartService 내부에서 JPA Repository를 사용하는 경우, 해당 레포지토리와 관련된 JPA 빈들이 필요하게 됨!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한 프로젝트 내부에 아래와 같은 코드가 존재함&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableJpaAuditing
public class FitinsideApplication {

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

}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;@EnableJpaAuditing&lt;/span&gt;&lt;/b&gt; 어노테이션&lt;br /&gt;- 어노테이션 설명&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blogan99.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.09.07 - [Spring Boot] - [Spring Boot] Jpa Auditing (+ BaseEntity) 로 엔티티 관련 이벤트 자동 기록하기&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;- 어노테이션 삽입 이유: Jpa Auditing을 통해 엔티티 관련 생성, 수정일자를 자동으로 기록하게 설정하기 위해&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;&amp;rArr; @EnableJpaAuditing 어노테이션을 애플리케이션 클래스에 붙임으로써 모든 테스트가 JPA 관련 빈들을 필요로 하는 상태가 되어 문제가 발생한 것!&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로젝트 내에서 Spring 컨테이너를 활용하는 테스트를 진행할 때, 가장 기본이 되는 Application 클래스가 항상 로드 됨&lt;/li&gt;
&lt;li&gt;Application 클래스에 @EnableJpaAuditing 어노테이션이 추가되어 있어, 모든 테스트가 JPA 관련 Bean들을 필요로 하는 상태가 되어버린 것&lt;/li&gt;
&lt;li&gt;통합 테스트 &amp;rArr; 전체 컨텍스트를 로드하고 JPA를 포함한 모든 Bean들을 주입받기 때문에 문제 없음&lt;/li&gt;
&lt;li&gt;@WebMvcTest를 사용하는 단위 테스트 &amp;rArr; JPA 관련 Bean을 전혀 로드하지 않기 때문에, 여기서 에러가 발생함!&lt;/li&gt;
&lt;/ol&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;3. 해결 방법 및 결과 검증&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. @MockBean(JpaMetamodelMappingContext.class) 어노테이션으로 해결&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-1-1. &lt;/b&gt;&lt;b&gt;@MockBean&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;스프링 프레임워크에서 주로 테스트를 위해 사용하는 어노테이션임&lt;/li&gt;
&lt;li&gt;스프링의 테스트 컨텍스트에서 특정 빈을 mocking 할 때 사용&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;3-1-2. &lt;b&gt;JpaMetamodelMappingContext&lt;/b&gt;&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;JPA의 메타모델을 처리하는 컨텍스트&lt;/li&gt;
&lt;li&gt;JPA 사용 시 엔티티의 메타 정보를 제공하는 역할을 함&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;3-1-3. &lt;b&gt;@MockBean(JpaMetamodelMappingContext.class)&lt;/b&gt;&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;스프링의 테스트 컨텍스트에 JpaMetamodelMappingContext 클래스를 모킹하여 주입함&lt;/li&gt;
&lt;li&gt;아래의 코드와 동일한 내용임&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;@MockBean 
private JpaMetamodelMappingContext jpaMetamodelMappingContext;
&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-1-4. 테스트 코드에 반영하여 해결&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@WebMvcTest(CartController.class)
@AutoConfigureMockMvc(addFilters = false)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

// JpaMetamodelMappingContext 클래스를 모킹하여 테스트 컨텍스트에 주입
@MockBean(JpaMetamodelMappingContext.class)

@DisplayName(&quot;장바구니 컨트롤러 단위 테스트&quot;)
class CartControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CartService cartService;

    @Autowired
    private ObjectMapper objectMapper;

    // 기본 장바구니 컨트롤러의 URL
    private static final String URL = &quot;/api/carts&quot;;
    
    // 생략 ...
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhzKjU/btsLAVTsSJQ/K7tu1k3gtZa1E0kvf2eUr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhzKjU/btsLAVTsSJQ/K7tu1k3gtZa1E0kvf2eUr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhzKjU/btsLAVTsSJQ/K7tu1k3gtZa1E0kvf2eUr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhzKjU%2FbtsLAVTsSJQ%2FK7tu1k3gtZa1E0kvf2eUr1%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;1369&quot; height=&quot;254&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 단위 테스트가 통과됨을 확인!&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;3-2. JpaAuditingConfig 클래스로 해결&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-2-1. JpaAuditingConfig 클래스를 별도로 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}

&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;별도의 클래스로 분리하여 JPA Auditing 활성화&lt;br /&gt;1. 기본 애플리케이션 클래스에서 JPA 관련 빈들을 로드하지 않고도 JPA Auditing 기능 사용 가능&lt;br /&gt;2. JPA 관련 설정을 분리하여, 테스트 시 불필요한 빈의 로드를 피할 수 있음!&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&amp;rArr; &lt;b&gt;@WebMvcTest 사용 시 JPA 관련 빈들이 로드되지 않기 때문에 테스트에서 발생하던 BeanCreationException을 피할 수 있음!&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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-2-2. 결과 확인&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;테스트 코드는 기존의 코드로 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swrpf/btsLBlxhPp1/BVxsdko9lJa3U7bqcdjMs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swrpf/btsLBlxhPp1/BVxsdko9lJa3U7bqcdjMs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swrpf/btsLBlxhPp1/BVxsdko9lJa3U7bqcdjMs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fswrpf%2FbtsLBlxhPp1%2FBVxsdko9lJa3U7bqcdjMs0%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;1373&quot; height=&quot;228&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&amp;rArr; 단위 테스트가 통과됨을 확인!&lt;/span&gt;&lt;/p&gt;</description>
      <category>Trouble Shooting</category>
      <category>@EnableJPAAuditing</category>
      <category>@MockBean</category>
      <category>@WebMvcTest</category>
      <category>BeanCreationException</category>
      <category>error creating bean with name 'jpaauditinghandler'</category>
      <category>jpametamodelmappingcontext</category>
      <category>단위 테스트 beancreationexception</category>
      <category>단위 테스트 jpa 에러</category>
      <category>단위 테스트 트러블 슈팅</category>
      <category>스프링 트러블 슈팅</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/155</guid>
      <comments>https://blogan99.tistory.com/155#entry155comment</comments>
      <pubDate>Mon, 30 Dec 2024 14:12:40 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] AWS ELB 사용하여 로드 밸런싱 적용하기</title>
      <link>https://blogan99.tistory.com/154</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 로드 밸런싱&lt;/b&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;/li&gt;
&lt;li&gt;하나의 서버에 부하가 집중되는 것을 방지 &amp;rArr; 애플리케이션의 가용성과 성능 높일 수 있음!&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;b&gt;1-1. 로드 밸런싱 필요성&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 많은 애플리케이션 &amp;rArr; 모든 요청이 단일 서버로 들어오면 해당 서버가 과부하 &amp;rArr; 성능 저하&lt;/li&gt;
&lt;li&gt;로드 밸런서는 트래픽을 여러 서버로 분산시켜 이 문제를 해결 가능&lt;/li&gt;
&lt;/ul&gt;
&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;서버 중 하나가 장애가 발생하더라도 로드 밸런서는 자동으로 다른 서버로 트래픽을 우회시킴 &amp;rArr; 서비스의 지속성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장애 조치(Failover)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 서버에 장애 발생 &amp;rArr; 이를 감지하고 자동으로 다른 서버로 요청 전환 &amp;rArr; 서비스 중단을 최소화할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&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;사용자가 증가함 &amp;rArr; 서버 추가, 수평 확장 해야할 때 &amp;rArr; 로드 밸런서는 새로운 서버를 쉽게 통합하여 트래픽을 분산시킴&lt;/li&gt;
&lt;/ul&gt;
&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;각 서버의 상태를 모니터링 &amp;rArr; 가장 적절한 서버에 요청 전달 &amp;rArr; 응답 시간 단축 + 사용자 경험 개선 가능&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;b&gt;1-2. AWS ELB&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;ELB (Elastic Load Balancing)
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트래픽 증가 &amp;rArr; 로드 밸런서 수를 자동으로 증가&lt;/li&gt;
&lt;li&gt;트래픽 감소 &amp;rArr; 로드 밸런서 수를 자동으로 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주기적인 health check
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ELB와 연결된 서버들의 상태를 주기적으로 체크&lt;/li&gt;
&lt;li&gt;장애 발생 or 부하 집중 &amp;rArr; 다른 서버로 요청 전송함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다양한 종류
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Application Load Balancer (ALB)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;HTTP 및 HTTPS 트래픽 처리&lt;/li&gt;
&lt;li&gt;URL 기반 라우팅, 웹소켓 지원, HTTP/2 지원&lt;/li&gt;
&lt;li&gt;마이크로서비스 아키텍처 or 웹 애플리케이션에 적합함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Network Load Balancer (NLB)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;TCP 및 UDP 트래픽 처리 &amp;rArr; 고속의 성능 제공&lt;/li&gt;
&lt;li&gt;수백만 개의 요청을 초당 처리 가능&lt;/li&gt;
&lt;li&gt;실시간 데이터 처리 또는 대량의 트래픽을 요구하는 애플리케이션에 적합함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gateway Load Balancer (GLB)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;가상 어플라이언스 (ex. 방화벽, IDS/IPS) 의 배포와 관리를 용이하게 함&lt;/li&gt;
&lt;li&gt;트래픽을 자동으로 가상 어플라이언스로 전달&lt;/li&gt;
&lt;li&gt;보안 및 네트워크 서비스를 제공하는 경우에 유용함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/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;b&gt;1-3. ELB 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;로드 밸런서 (Load Balancer)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ELB의 핵심 컴포넌트&lt;/li&gt;
&lt;li&gt;클라이언트 요청 수신 &amp;rarr; 리스너로 전달 &amp;rarr; (리스너가 대상 그룹을 선택하면) &amp;rarr; 대상 그룹 내 서버들의 헬스 체크 진행 &amp;rarr; 트래픽을 적절한 서버로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;헬스 체크 (Health Check)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;로드 밸런서가 각 대상의 상태를 확인하는 방법&lt;/li&gt;
&lt;li&gt;설정한 주기마다 각 대상(서버)으로 요청을 보냄 &amp;rArr; 정상 응답을 받지 못하는 경우, 해당 대상을 비활성화함&lt;/li&gt;
&lt;li&gt;위의 과정으로 트래픽이 정상 상태의 대상으로만 전달되도록 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리스너 (Listener)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;로드 밸런서가 수신하는 요청의 프로토콜과 포트 정의&lt;/li&gt;
&lt;li&gt;HTTP, HTTPS, TCP, UDP 등 다양한 프로토콜 지원&lt;/li&gt;
&lt;li&gt;요청을 적절한 대상 그룹으로 라우팅 하는 규칙(리스너 규칙) 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리스너 규칙 (Linstener Rules)
&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;대상 그룹 (Target Group)
&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;/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;b&gt;1-4. ELB 동작 과정&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트 요청: 사용자가 웹 브라우저나 애플리케이션을 통해 로드 밸런서의 DNS 이름 또는 IP 주소로 요청 보냄&lt;/li&gt;
&lt;li&gt;로드 밸런서 수신: ELB가 클라이언트의 요청을 수신함
&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;리스너 규칙 적용: 로드 밸런서는 요청의 프로토콜과 포트에 따라 리스너 규칙을 확인함
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;요청의 URL 경로, 헤더, 메소드 등을 기준으로 어떤 대상 그룹으로 라우팅할지를 결정.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대상 선택: 헬스 체크를 통과한 대상 인스턴스 중에서 로드 밸런서는 부하 분산 알고리즘(ex. 라운드 로빈, 최소 연결 등)에 따라 최적의 인스턴스를 선택함&lt;/li&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;응답 수신 및 전달: 대상 인스턴스가 클라이언트의 요청을 처리하고 응답을 생성함 &amp;rarr; 로드 밸런서는 이 응답을 다시 클라이언트에게 전달함&lt;/li&gt;
&lt;li&gt;모니터링 및 로그 기록: ELB는 트래픽 패턴, 응답 시간, 오류 등의 데이터를 모니터링하고, 필요 시 로그를 기록하여 성능을 분석함&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blk7hM/btsKGDfSo8I/oXKk2zEGJOl6xtXLLHVSOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blk7hM/btsKGDfSo8I/oXKk2zEGJOl6xtXLLHVSOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blk7hM/btsKGDfSo8I/oXKk2zEGJOl6xtXLLHVSOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblk7hM%2FbtsKGDfSo8I%2FoXKk2zEGJOl6xtXLLHVSOk%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;884&quot; height=&quot;398&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;398&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;style5&quot; /&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;2. AWS ELB 사용하기&lt;/b&gt;&lt;/h2&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;2-1. 예시 상황 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYJRNo/btsKIeejtJs/sQgieivssTeXNjggPABxSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYJRNo/btsKIeejtJs/sQgieivssTeXNjggPABxSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYJRNo/btsKIeejtJs/sQgieivssTeXNjggPABxSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYJRNo%2FbtsKIeejtJs%2FsQgieivssTeXNjggPABxSk%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;887&quot; height=&quot;441&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;441&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client VPC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CLIENT-Public-Subnet
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ClientEC2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Server VPC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SERVER-Public-Subnet-1
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SERVER-EC2-1&lt;/li&gt;
&lt;li&gt;SERVER-EC2-2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SERVER-Public-Subnet-2
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SERVER-EC2-3&lt;/li&gt;
&lt;li&gt;SERVER-EC2-4&lt;/li&gt;
&lt;li&gt;SERVER-EC2-5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;foo, bar 디렉토리 설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;foo 디렉토리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버: SERVER-EC2-1&lt;/li&gt;
&lt;li&gt;위치: /var/www/html/foo&lt;/li&gt;
&lt;li&gt;이 디렉토리 내부에 index.html 파일이 생성됨&lt;/li&gt;
&lt;li&gt;파일의 내용은 &quot;foo page in SERVER-EC2-1&quot;임. 이는 SERVER-EC2-1에 접속했을 때 보여지는 웹 페이지의 내용임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;bar 디렉토리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버: SERVER-EC2-3&lt;/li&gt;
&lt;li&gt;위치: /var/www/html/bar&lt;/li&gt;
&lt;li&gt;이 디렉토리 내부에 index.html 파일이 생성됨&lt;/li&gt;
&lt;li&gt;파일의 내용은 &quot;bar page in SERVER-EC2-3&quot;임. 이는 SERVER-EC2-3에 접속했을 때 보여지는 웹 페이지의 내용임&lt;/li&gt;
&lt;/ul&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;b&gt;2-2. ALB&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-2-1. 대상 그룹 생성&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;검색창에 EC2 검색 &amp;rarr; 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOSxdA/btsKHKLLZcy/zkIhsAvsX6cKSS4NNM3lWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOSxdA/btsKHKLLZcy/zkIhsAvsX6cKSS4NNM3lWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOSxdA/btsKHKLLZcy/zkIhsAvsX6cKSS4NNM3lWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOSxdA%2FbtsKHKLLZcy%2FzkIhsAvsX6cKSS4NNM3lWk%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;1058&quot; height=&quot;503&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;503&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;왼쪽의 대상 그룹 클릭 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUtdgY/btsKHX5apAY/VAgwvvKemOZ3WlDBkKJNFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUtdgY/btsKHX5apAY/VAgwvvKemOZ3WlDBkKJNFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUtdgY/btsKHX5apAY/VAgwvvKemOZ3WlDBkKJNFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUtdgY%2FbtsKHX5apAY%2FVAgwvvKemOZ3WlDBkKJNFk%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;1097&quot; height=&quot;647&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;647&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;인스턴스 선택 &amp;rarr; 대상 그룹 이름 입력 &amp;rarr; SERVER-VPC 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNatv/btsKHv2dHHT/285reS9u91g0KLft3FPOS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNatv/btsKHv2dHHT/285reS9u91g0KLft3FPOS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNatv/btsKHv2dHHT/285reS9u91g0KLft3FPOS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNatv%2FbtsKHv2dHHT%2F285reS9u91g0KLft3FPOS1%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;1093&quot; height=&quot;644&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpMHY9/btsKIBG92ub/u3aq1BqWr1BikPqEZLmnSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpMHY9/btsKIBG92ub/u3aq1BqWr1BikPqEZLmnSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpMHY9/btsKIBG92ub/u3aq1BqWr1BikPqEZLmnSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpMHY9%2FbtsKIBG92ub%2Fu3aq1BqWr1BikPqEZLmnSk%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;1090&quot; height=&quot;643&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;643&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;모든 인스턴스 선택 &amp;rarr; 아래에 보류 중인 것으로 포함 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B4nUb/btsKIc8E1rV/ELKIaCixbAVaDtPoohSXS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B4nUb/btsKIc8E1rV/ELKIaCixbAVaDtPoohSXS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B4nUb/btsKIc8E1rV/ELKIaCixbAVaDtPoohSXS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB4nUb%2FbtsKIc8E1rV%2FELKIaCixbAVaDtPoohSXS0%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;1094&quot; height=&quot;646&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;646&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;모든 인스턴스가 대상으로 추가됨을 확인 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VTO8K/btsKIQD2Tpt/0s9e4K1akP1edhwOgbEDY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VTO8K/btsKIQD2Tpt/0s9e4K1akP1edhwOgbEDY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VTO8K/btsKIQD2Tpt/0s9e4K1akP1edhwOgbEDY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVTO8K%2FbtsKIQD2Tpt%2F0s9e4K1akP1edhwOgbEDY0%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;1091&quot; height=&quot;641&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;641&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2cq1/btsKHubcnCJ/vtGjGld0OaEkqFGuOKYMD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2cq1/btsKHubcnCJ/vtGjGld0OaEkqFGuOKYMD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2cq1/btsKHubcnCJ/vtGjGld0OaEkqFGuOKYMD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2cq1%2FbtsKHubcnCJ%2FvtGjGld0OaEkqFGuOKYMD0%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;853&quot; height=&quot;65&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;65&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;b&gt;2-2-2. ALB 생성&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;왼쪽의 로드밸런서 클릭 &amp;rarr; 로드 밸런서 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/21i9V/btsKH3xnjgb/egQXwocmEn3sDjV3R43xnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/21i9V/btsKH3xnjgb/egQXwocmEn3sDjV3R43xnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/21i9V/btsKH3xnjgb/egQXwocmEn3sDjV3R43xnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F21i9V%2FbtsKH3xnjgb%2FegQXwocmEn3sDjV3R43xnK%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;1093&quot; height=&quot;648&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;648&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;Application Load Balancer 탭의 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yvyrD/btsKH8ZGHYG/959IjG68Gm30fyc5sPTcx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yvyrD/btsKH8ZGHYG/959IjG68Gm30fyc5sPTcx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yvyrD/btsKH8ZGHYG/959IjG68Gm30fyc5sPTcx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyvyrD%2FbtsKH8ZGHYG%2F959IjG68Gm30fyc5sPTcx0%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;1092&quot; height=&quot;731&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;731&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;로드 밸런서 이름 입력 &amp;rarr; SERVER-VPC 선택 &amp;rarr; 가용 영역 모두 체크 &amp;rarr; 보안 그룹 선택 &amp;rarr; (리스너 및 라우팅에서) 다음으로 전달: 이전에 생성한 대상 그룹 선택 &amp;rarr; 로드 밸런서 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/43AZu/btsKGYqikde/dggrKfQbwqDga317kkpkO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/43AZu/btsKGYqikde/dggrKfQbwqDga317kkpkO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/43AZu/btsKGYqikde/dggrKfQbwqDga317kkpkO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F43AZu%2FbtsKGYqikde%2FdggrKfQbwqDga317kkpkO1%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;1094&quot; height=&quot;629&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oL9wI/btsKHLqejJ0/JpNuXGFI2mFK1jYWkKnTPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oL9wI/btsKHLqejJ0/JpNuXGFI2mFK1jYWkKnTPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oL9wI/btsKHLqejJ0/JpNuXGFI2mFK1jYWkKnTPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoL9wI%2FbtsKHLqejJ0%2FJpNuXGFI2mFK1jYWkKnTPk%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;1095&quot; height=&quot;631&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMbwC/btsKH9RNrBa/XVEKDhYe7xKjk9qjTkXNZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMbwC/btsKH9RNrBa/XVEKDhYe7xKjk9qjTkXNZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMbwC/btsKH9RNrBa/XVEKDhYe7xKjk9qjTkXNZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMbwC%2FbtsKH9RNrBa%2FXVEKDhYe7xKjk9qjTkXNZK%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;1096&quot; height=&quot;628&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VJyL7/btsKIvUCkl9/ClaATBpRatU15MmwGecxN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VJyL7/btsKIvUCkl9/ClaATBpRatU15MmwGecxN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VJyL7/btsKIvUCkl9/ClaATBpRatU15MmwGecxN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVJyL7%2FbtsKIvUCkl9%2FClaATBpRatU15MmwGecxN0%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;1096&quot; height=&quot;627&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIUNV/btsKH8yA2tX/xPRrYpa2C3khkxojyJGcl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIUNV/btsKH8yA2tX/xPRrYpa2C3khkxojyJGcl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIUNV/btsKH8yA2tX/xPRrYpa2C3khkxojyJGcl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIUNV%2FbtsKH8yA2tX%2FxPRrYpa2C3khkxojyJGcl1%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;1096&quot; height=&quot;217&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;217&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;시간이 지나고 새로고침 클릭 &amp;rarr; 상태가 (프로비저닝 중) &amp;rArr; (활성) 으로 변경됨을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlIL4t/btsKIQRz524/KoTJzW4UxosGKfxZBzlTYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlIL4t/btsKIQRz524/KoTJzW4UxosGKfxZBzlTYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlIL4t/btsKIQRz524/KoTJzW4UxosGKfxZBzlTYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlIL4t%2FbtsKIQRz524%2FKoTJzW4UxosGKfxZBzlTYK%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;1093&quot; height=&quot;628&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;628&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-2-3. ALB 동작 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽의 인스턴스 클릭 &amp;rarr; CLIENT-EC2 체크 &amp;rarr; 퍼블릭 IPv4 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVYJ3/btsKICTtWNf/04GtP6OosLVQqTKlCnti2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVYJ3/btsKICTtWNf/04GtP6OosLVQqTKlCnti2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVYJ3/btsKICTtWNf/04GtP6OosLVQqTKlCnti2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVYJ3%2FbtsKICTtWNf%2F04GtP6OosLVQqTKlCnti2K%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;1082&quot; height=&quot;631&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;631&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;터미널 실행 &amp;rarr; ssh로 CLIENT-EC2 인스턴스 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ssh -i PEM키 이름.pem 인스턴스 계정이름@퍼블릭IPv4

# 예시
ssh -i myPemKey.pem ec2-user@3.36.69.141
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMkZD7/btsKHXqzJtl/bPWu4KNwkvLbTKK0CeLHUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMkZD7/btsKHXqzJtl/bPWu4KNwkvLbTKK0CeLHUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMkZD7/btsKHXqzJtl/bPWu4KNwkvLbTKK0CeLHUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMkZD7%2FbtsKHXqzJtl%2FbPWu4KNwkvLbTKK0CeLHUK%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;650&quot; height=&quot;326&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;650&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS에서 왼쪽의 로드 밸런서 클릭 &amp;rarr; 생성한 로드 밸런서 체크 &amp;rarr; DNS 이름 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI1UvN/btsKGGwQSFR/SwmpKlwV6hKBIOrVV1zI8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI1UvN/btsKGGwQSFR/SwmpKlwV6hKBIOrVV1zI8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI1UvN/btsKGGwQSFR/SwmpKlwV6hKBIOrVV1zI8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI1UvN%2FbtsKGGwQSFR%2FSwmpKlwV6hKBIOrVV1zI8K%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;1099&quot; height=&quot;626&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;626&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;ALB의 DNS 이름을 환경 변수로 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;Test_ALB=test-ALB-1447934206.ap-northeast-2.elb.amazonaws.com

# 확인
echo $Test_ALB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj0MWP/btsKHWLX9d3/KUCKHl17cgckiioG4Eu2Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj0MWP/btsKHWLX9d3/KUCKHl17cgckiioG4Eu2Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj0MWP/btsKHWLX9d3/KUCKHl17cgckiioG4Eu2Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj0MWP%2FbtsKHWLX9d3%2FKUCKHl17cgckiioG4Eu2Ak%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;668&quot; height=&quot;69&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;69&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;ALB에 연결된 A 레코드 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;dig $Test_ALB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsmzWX/btsKIEDMTn8/FyBRHjnWMSTBRJ1KfKQk11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsmzWX/btsKIEDMTn8/FyBRHjnWMSTBRJ1KfKQk11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsmzWX/btsKIEDMTn8/FyBRHjnWMSTBRJ1KfKQk11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsmzWX%2FbtsKIEDMTn8%2FFyBRHjnWMSTBRJ1KfKQk11%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;833&quot; height=&quot;429&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; ALB에 연결된 A 레코드가 2개임!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; A 레코드 2개 = 퍼블릭 IP 2개 = 서브넷 1, 2에 각각 존재하는 ENI에 할당된 퍼블릭 IP&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;ALB 도메인으로 100번 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;for i in {1..100}; do curl $Test_ALB --silent ; done | sort | uniq -c | sort -n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (23).png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TOI4U/btsKGM4DPWN/CWjvdMC42KQxczYKmatxT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TOI4U/btsKGM4DPWN/CWjvdMC42KQxczYKmatxT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TOI4U/btsKGM4DPWN/CWjvdMC42KQxczYKmatxT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTOI4U%2FbtsKGM4DPWN%2FCWjvdMC42KQxczYKmatxT1%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;831&quot; height=&quot;343&quot; data-filename=&quot;image (23).png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 1 ~ 5의 서버로 요청이 분산되어 전달됨을 확인 가능!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ALB : 교차 영역 로드 밸런싱이 기본적으로 활성화됨&lt;br /&gt;&lt;br /&gt;&amp;rArr; 서브넷 (가용 영역 당 하나) 내 인스턴스 수가 달라도 대상 그룹내에서 고르게 부하 분산해줌!&lt;/blockquote&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;2-3. ALB 경로 기반 라우팅&lt;/b&gt;&lt;/h3&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-3-1. ALB 경로 기반 라우팅 설정&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;왼쪽의 대상 그룹 클릭 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (24).png&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9H9yv/btsKIdzJ3VN/4rLKPZMfWbjtcm6U7eikD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9H9yv/btsKIdzJ3VN/4rLKPZMfWbjtcm6U7eikD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9H9yv/btsKIdzJ3VN/4rLKPZMfWbjtcm6U7eikD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9H9yv%2FbtsKIdzJ3VN%2F4rLKPZMfWbjtcm6U7eikD0%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;1109&quot; height=&quot;630&quot; data-filename=&quot;image (24).png&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;630&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;인스턴스 선택 &amp;rarr; 대상 그룹 이름 입력 &amp;rarr; SERVER-VPC 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (25).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmgk01/btsKIbBX9sN/8YziSrmT6KF1L5cvfa7igk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmgk01/btsKIbBX9sN/8YziSrmT6KF1L5cvfa7igk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmgk01/btsKIbBX9sN/8YziSrmT6KF1L5cvfa7igk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmgk01%2FbtsKIbBX9sN%2F8YziSrmT6KF1L5cvfa7igk%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;1093&quot; height=&quot;630&quot; data-filename=&quot;image (25).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (26).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMbSt/btsKHydx68p/QHATfgaP5nYziIykvlz1o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMbSt/btsKHydx68p/QHATfgaP5nYziIykvlz1o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMbSt/btsKHydx68p/QHATfgaP5nYziIykvlz1o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMbSt%2FbtsKHydx68p%2FQHATfgaP5nYziIykvlz1o0%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;1093&quot; height=&quot;736&quot; data-filename=&quot;image (26).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;736&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;SERVER-EC2-1, SERVER-EC2-2 체크 &amp;rarr; 아래에 보류 중인 것으로 포함 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (27).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYtppT/btsKHsLmqNH/pFNoVrZdOiTITuxwDKEgb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYtppT/btsKHsLmqNH/pFNoVrZdOiTITuxwDKEgb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYtppT/btsKHsLmqNH/pFNoVrZdOiTITuxwDKEgb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYtppT%2FbtsKHsLmqNH%2FpFNoVrZdOiTITuxwDKEgb1%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;1095&quot; height=&quot;663&quot; data-filename=&quot;image (27).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;663&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;체크한 인스턴스가 대상으로 추가됨을 확인 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (28).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbtKdB/btsKHM3I5v7/IvKKy0DsEARiPW0w7MGHT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbtKdB/btsKHM3I5v7/IvKKy0DsEARiPW0w7MGHT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbtKdB/btsKHM3I5v7/IvKKy0DsEARiPW0w7MGHT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbtKdB%2FbtsKHM3I5v7%2FIvKKy0DsEARiPW0w7MGHT0%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;1097&quot; height=&quot;504&quot; data-filename=&quot;image (28).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;504&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;동일한 작업 반복 *(이때, 인스턴스는 SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5를 체크함!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (29).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykBrS/btsKHpOEzOw/e06JQImZwbHqSeS10ufaPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykBrS/btsKHpOEzOw/e06JQImZwbHqSeS10ufaPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykBrS/btsKHpOEzOw/e06JQImZwbHqSeS10ufaPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykBrS%2FbtsKHpOEzOw%2Fe06JQImZwbHqSeS10ufaPK%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;1096&quot; height=&quot;665&quot; data-filename=&quot;image (29).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (30).png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wAngw/btsKHINXXHK/kRc65LHLLD2lKgvqkteez1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wAngw/btsKHINXXHK/kRc65LHLLD2lKgvqkteez1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wAngw/btsKHINXXHK/kRc65LHLLD2lKgvqkteez1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwAngw%2FbtsKHINXXHK%2FkRc65LHLLD2lKgvqkteez1%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;1100&quot; height=&quot;532&quot; data-filename=&quot;image (30).png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;532&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;왼쪽에서 로드밸런서 클릭 &amp;rarr; test-ALB 체크 &amp;rarr; 리스너 및 규칙 탭 클릭 &amp;rarr; HTTP:80 체크 &amp;rarr; 규칙 관리 클릭 &amp;rarr; 규칙 추가 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (31).png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OSw7t/btsKHxMvTnt/k3ZVFN8IDtHiBW5ReANPuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OSw7t/btsKHxMvTnt/k3ZVFN8IDtHiBW5ReANPuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OSw7t/btsKHxMvTnt/k3ZVFN8IDtHiBW5ReANPuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOSw7t%2FbtsKHxMvTnt%2Fk3ZVFN8IDtHiBW5ReANPuK%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;1112&quot; height=&quot;660&quot; data-filename=&quot;image (31).png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;660&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;규칙 이름 입력 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (32).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ub4x/btsKGMQ5i0Z/jgZBQYcfkEFC6to8kzTlG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ub4x/btsKGMQ5i0Z/jgZBQYcfkEFC6to8kzTlG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ub4x/btsKGMQ5i0Z/jgZBQYcfkEFC6to8kzTlG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ub4x%2FbtsKGMQ5i0Z%2FjgZBQYcfkEFC6to8kzTlG1%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;1106&quot; height=&quot;536&quot; data-filename=&quot;image (32).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;536&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;조건 추가 클릭 &amp;rarr; 규칙 조건 유형: 경로 선택 &amp;rarr; 경로에 &amp;ldquo;/foo/*&amp;rdquo; 입력 &amp;rarr; 확인 클릭 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (33).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP0zTo/btsKHYQn1jI/QhVFbWUWbGgDlETssDDAF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP0zTo/btsKHYQn1jI/QhVFbWUWbGgDlETssDDAF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP0zTo/btsKHYQn1jI/QhVFbWUWbGgDlETssDDAF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP0zTo%2FbtsKHYQn1jI%2FQhVFbWUWbGgDlETssDDAF0%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;1106&quot; height=&quot;518&quot; data-filename=&quot;image (33).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (34).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7HyaR/btsKHXc34pZ/J1EQKdzW4xlpFKytEYU6Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7HyaR/btsKHXc34pZ/J1EQKdzW4xlpFKytEYU6Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7HyaR/btsKHXc34pZ/J1EQKdzW4xlpFKytEYU6Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7HyaR%2FbtsKHXc34pZ%2FJ1EQKdzW4xlpFKytEYU6Zk%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;1106&quot; height=&quot;664&quot; data-filename=&quot;image (34).png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;664&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;대상 그룹으로 전달 선택 &amp;rarr; 대상 그룹 (test-Foo-target-group) 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (35).png&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pOGtT/btsKIyDDvgS/IzHYKem1KgckxqA97L6ok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pOGtT/btsKIyDDvgS/IzHYKem1KgckxqA97L6ok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pOGtT/btsKIyDDvgS/IzHYKem1KgckxqA97L6ok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpOGtT%2FbtsKIyDDvgS%2FIzHYKem1KgckxqA97L6ok0%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;1091&quot; height=&quot;666&quot; data-filename=&quot;image (35).png&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;666&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;우선 순위 1 입력 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (36).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mppTe/btsKGRY2wSk/hDNuuCtkxOW1aBqWbNOIn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mppTe/btsKGRY2wSk/hDNuuCtkxOW1aBqWbNOIn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mppTe/btsKGRY2wSk/hDNuuCtkxOW1aBqWbNOIn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmppTe%2FbtsKGRY2wSk%2FhDNuuCtkxOW1aBqWbNOIn1%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;1096&quot; height=&quot;667&quot; data-filename=&quot;image (36).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;667&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (37).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XpRP1/btsKIRiEYTI/ywBSIxCiZGrUfbiVRZNKX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XpRP1/btsKIRiEYTI/ywBSIxCiZGrUfbiVRZNKX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XpRP1/btsKIRiEYTI/ywBSIxCiZGrUfbiVRZNKX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXpRP1%2FbtsKIRiEYTI%2FywBSIxCiZGrUfbiVRZNKX1%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;1095&quot; height=&quot;667&quot; data-filename=&quot;image (37).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;667&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;동일한 과정 진행 (규칙을 1개 더 생성함)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규칙 이름 : test_Bar&lt;/li&gt;
&lt;li&gt;경로 : /bar/*&lt;/li&gt;
&lt;li&gt;대상 그룹 : test-Bar-target-group 선택&lt;/li&gt;
&lt;li&gt;우선 순위 : 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (38).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPgaH/btsKIyczsmw/itpwKJ7gDaJ6xmAxBfqYuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPgaH/btsKIyczsmw/itpwKJ7gDaJ6xmAxBfqYuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPgaH/btsKIyczsmw/itpwKJ7gDaJ6xmAxBfqYuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPgaH%2FbtsKIyczsmw%2FitpwKJ7gDaJ6xmAxBfqYuK%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;1094&quot; height=&quot;667&quot; data-filename=&quot;image (38).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;667&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;b&gt;2-3-2. ALB 경로 기반 라우팅 동작 확인&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;foo 경로에 대한 경로 기반 라우팅 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;for i in {1..100}; do curl $Test_ALB/foo/ --silent ; done | sort | uniq -c | sort -n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (39).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3hIZ2/btsKHtXFJnW/k4HUbU7TkUDyEaMjQVYsU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3hIZ2/btsKHtXFJnW/k4HUbU7TkUDyEaMjQVYsU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3hIZ2/btsKHtXFJnW/k4HUbU7TkUDyEaMjQVYsU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3hIZ2%2FbtsKHtXFJnW%2Fk4HUbU7TkUDyEaMjQVYsU1%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;835&quot; height=&quot;84&quot; data-filename=&quot;image (39).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; foo 경로로 요청함 &amp;rarr; 우선 순위 1 규칙인 경로 기반 라우팅이 먼저 이루어짐 &amp;rarr; SERVER EC2-1, SERVER EC2-2로만 라우팅됨 &amp;rarr; 우선순위 마지막 규칙에 따라 균등하게 부하 분산됨&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;bar 경로에 대한 경로 기반 라우팅 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;for i in {1..100}; do curl $Test_ALB/bar/ --silent ; done | sort | uniq -c | sort -n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (40).png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI4uin/btsKHtct39n/UqLVgXg4dADpxB7aq3Y2a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI4uin/btsKHtct39n/UqLVgXg4dADpxB7aq3Y2a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI4uin/btsKHtct39n/UqLVgXg4dADpxB7aq3Y2a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI4uin%2FbtsKHtct39n%2FUqLVgXg4dADpxB7aq3Y2a0%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;837&quot; height=&quot;99&quot; data-filename=&quot;image (40).png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; bar 경로로 요청함 &amp;rarr; 우선 순위 2 규칙인 경로 기반 라우팅이 먼저 이루어짐 &amp;rarr; SERVER EC2-3, SERVER EC2-4, SERVER EC2-5로만 라우팅됨 &amp;rarr; 우선순위 마지막 규칙에 따라 균등하게 부하 분산됨&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;2-4. NLB&lt;/b&gt;&lt;/h3&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-4-1. 대상 그룹 생성&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;왼쪽의 대상 그룹 클릭 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (41).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ExW1/btsKHLX20jJ/k3ev0URKDsqZJp6fmq7gV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ExW1/btsKHLX20jJ/k3ev0URKDsqZJp6fmq7gV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ExW1/btsKHLX20jJ/k3ev0URKDsqZJp6fmq7gV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ExW1%2FbtsKHLX20jJ%2Fk3ev0URKDsqZJp6fmq7gV0%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;1096&quot; height=&quot;665&quot; data-filename=&quot;image (41).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;665&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;인스턴스 선택 &amp;rarr; 대상 그룹 이름 입력 &amp;rarr; 프로토콜: UDP 선택 &amp;rarr; 포트: 161 입력 &amp;rarr; SERVER-VPC 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (42).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V4fye/btsKHgxvoLA/u0cOF3Qxm7cziKyj8UM7s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V4fye/btsKHgxvoLA/u0cOF3Qxm7cziKyj8UM7s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V4fye/btsKHgxvoLA/u0cOF3Qxm7cziKyj8UM7s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV4fye%2FbtsKHgxvoLA%2Fu0cOF3Qxm7cziKyj8UM7s1%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;1093&quot; height=&quot;664&quot; data-filename=&quot;image (42).png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (43).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDyH7d/btsKHaqGsxH/EfvAS2fH4ujTT2IlM5HyO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDyH7d/btsKHaqGsxH/EfvAS2fH4ujTT2IlM5HyO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDyH7d/btsKHaqGsxH/EfvAS2fH4ujTT2IlM5HyO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDyH7d%2FbtsKHaqGsxH%2FEfvAS2fH4ujTT2IlM5HyO0%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;1094&quot; height=&quot;657&quot; data-filename=&quot;image (43).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;657&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;상태 검사 프로토콜: HTTP 선택 &amp;rarr; 고급 상태 검사 설정 탭 열기 &amp;rarr; 상태 검사 포트 : 재정의 선택 &amp;rarr; 80 입력 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (44).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PM18Z/btsKH8eliHH/MN0PJEW3KffpSHnLgKb9d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PM18Z/btsKH8eliHH/MN0PJEW3KffpSHnLgKb9d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PM18Z/btsKH8eliHH/MN0PJEW3KffpSHnLgKb9d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPM18Z%2FbtsKH8eliHH%2FMN0PJEW3KffpSHnLgKb9d0%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;1094&quot; height=&quot;664&quot; data-filename=&quot;image (44).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (45).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OrOO3/btsKGWlHttb/KFPkckTFAD63x8RhP1Kvjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OrOO3/btsKGWlHttb/KFPkckTFAD63x8RhP1Kvjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OrOO3/btsKGWlHttb/KFPkckTFAD63x8RhP1Kvjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOrOO3%2FbtsKGWlHttb%2FKFPkckTFAD63x8RhP1Kvjk%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;1092&quot; height=&quot;664&quot; data-filename=&quot;image (45).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;664&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;모든 인스턴스 선택 &amp;rarr; 아래에 보류 중인 것으로 포함 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (46).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0y5jx/btsKHvOLWVs/s3rX12BSDzWAx2fBBkY5Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0y5jx/btsKHvOLWVs/s3rX12BSDzWAx2fBBkY5Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0y5jx/btsKHvOLWVs/s3rX12BSDzWAx2fBBkY5Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0y5jx%2FbtsKHvOLWVs%2Fs3rX12BSDzWAx2fBBkY5Tk%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;1095&quot; height=&quot;628&quot; data-filename=&quot;image (46).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;628&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;모든 인스턴스가 대상으로 추가됨을 확인 &amp;rarr; 대상 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (47).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boL7ea/btsKIacb9oY/spk8jBT1yrDedT13Qx7ub0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boL7ea/btsKIacb9oY/spk8jBT1yrDedT13Qx7ub0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boL7ea/btsKIacb9oY/spk8jBT1yrDedT13Qx7ub0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboL7ea%2FbtsKIacb9oY%2Fspk8jBT1yrDedT13Qx7ub0%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;1094&quot; height=&quot;621&quot; data-filename=&quot;image (47).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;621&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;b&gt;2-4-2. NLB 생성&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;왼쪽에서 로드밸런서 클릭 &amp;rarr; 로드 밸런서 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (48).png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ct6ul/btsKIzCxN7m/mfkm6TctDoXPVlw8kEDKW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ct6ul/btsKIzCxN7m/mfkm6TctDoXPVlw8kEDKW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ct6ul/btsKIzCxN7m/mfkm6TctDoXPVlw8kEDKW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCt6ul%2FbtsKIzCxN7m%2Fmfkm6TctDoXPVlw8kEDKW1%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;1108&quot; height=&quot;641&quot; data-filename=&quot;image (48).png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;641&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;Network Load Balancer 탭의 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (49).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qSXw0/btsKHcV9g8G/Sm39m5cZA3zz5eJaUxI70k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qSXw0/btsKHcV9g8G/Sm39m5cZA3zz5eJaUxI70k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qSXw0/btsKHcV9g8G/Sm39m5cZA3zz5eJaUxI70k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqSXw0%2FbtsKHcV9g8G%2FSm39m5cZA3zz5eJaUxI70k%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;1092&quot; height=&quot;709&quot; data-filename=&quot;image (49).png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;709&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;로드 밸런서 이름 입력 &amp;rarr; SERVER-VPC 선택 &amp;rarr; 가용 영역 모두 체크 &amp;rarr; 보안 그룹 선택 &amp;rarr; 프로토콜: UDP 선택 &amp;rarr; 포트: 161 입력 &amp;rarr; 다음으로 전달: 생성한 대상 그룹 선택 &amp;rarr; 로드 밸런서 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (50).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SsrOP/btsKIwlHbdt/hdRERKVhlGB2rT20KeQx11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SsrOP/btsKIwlHbdt/hdRERKVhlGB2rT20KeQx11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SsrOP/btsKIwlHbdt/hdRERKVhlGB2rT20KeQx11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSsrOP%2FbtsKIwlHbdt%2FhdRERKVhlGB2rT20KeQx11%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;1094&quot; height=&quot;709&quot; data-filename=&quot;image (50).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (51).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tCHvk/btsKHeTWZuJ/LoamxpvpAQEBRKfRMQHrX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tCHvk/btsKHeTWZuJ/LoamxpvpAQEBRKfRMQHrX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tCHvk/btsKHeTWZuJ/LoamxpvpAQEBRKfRMQHrX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtCHvk%2FbtsKHeTWZuJ%2FLoamxpvpAQEBRKfRMQHrX0%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;1095&quot; height=&quot;709&quot; data-filename=&quot;image (51).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (52).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buuKHN/btsKHqz5pgX/XCYZnRqWMbLEkCRmhuXUdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buuKHN/btsKHqz5pgX/XCYZnRqWMbLEkCRmhuXUdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buuKHN/btsKHqz5pgX/XCYZnRqWMbLEkCRmhuXUdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuuKHN%2FbtsKHqz5pgX%2FXCYZnRqWMbLEkCRmhuXUdk%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;1097&quot; height=&quot;378&quot; data-filename=&quot;image (52).png&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (53).png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlenTi/btsKG87qobd/kKxK1i0XlY1oXDTqLuLca1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlenTi/btsKG87qobd/kKxK1i0XlY1oXDTqLuLca1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlenTi/btsKG87qobd/kKxK1i0XlY1oXDTqLuLca1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlenTi%2FbtsKG87qobd%2FkKxK1i0XlY1oXDTqLuLca1%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;1098&quot; height=&quot;548&quot; data-filename=&quot;image (53).png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (54).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGQNte/btsKIy4Kfgk/Zuy0vd7l2pmVblyh4KCMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGQNte/btsKIy4Kfgk/Zuy0vd7l2pmVblyh4KCMQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGQNte/btsKIy4Kfgk/Zuy0vd7l2pmVblyh4KCMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGQNte%2FbtsKIy4Kfgk%2FZuy0vd7l2pmVblyh4KCMQk%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;1096&quot; height=&quot;711&quot; data-filename=&quot;image (54).png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;711&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;시간이 지나고 새로고침 클릭 &amp;rarr; 상태가 (프로비저닝 중) &amp;rArr; (활성) 으로 변경됨을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (55).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxgEMD/btsKHXc4MHB/5J4BahTDbdDoloM8sOHlHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxgEMD/btsKHXc4MHB/5J4BahTDbdDoloM8sOHlHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxgEMD/btsKHXc4MHB/5J4BahTDbdDoloM8sOHlHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxgEMD%2FbtsKHXc4MHB%2F5J4BahTDbdDoloM8sOHlHk%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;1094&quot; height=&quot;709&quot; data-filename=&quot;image (55).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;709&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;b&gt;2-4-3. NLB 동작 확인&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;DNS 이름 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (56).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GlZE0/btsKHJMUtWY/VeztubuCDUFZwRhVv20OZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GlZE0/btsKHJMUtWY/VeztubuCDUFZwRhVv20OZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GlZE0/btsKHJMUtWY/VeztubuCDUFZwRhVv20OZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGlZE0%2FbtsKHJMUtWY%2FVeztubuCDUFZwRhVv20OZk%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;1095&quot; height=&quot;709&quot; data-filename=&quot;image (56).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;709&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;터미널 실행 &amp;rarr; ssh로 CLIENT-EC2 인스턴스 접속&lt;/li&gt;
&lt;/ul&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;NLB의 DNS 이름을 환경 변수로 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;Test_NLB=test-NLB-edf781ea8ff75454.elb.ap-northeast-2.amazonaws.com

# 확인
echo $Test_NLB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (57).png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4IbiB/btsKIba4lDh/UmHw3LJsNkQWMCIYlKpBN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4IbiB/btsKIba4lDh/UmHw3LJsNkQWMCIYlKpBN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4IbiB/btsKIba4lDh/UmHw3LJsNkQWMCIYlKpBN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4IbiB%2FbtsKIba4lDh%2FUmHw3LJsNkQWMCIYlKpBN0%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;717&quot; height=&quot;60&quot; data-filename=&quot;image (57).png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;60&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;NLB에 연결된 A 레코드 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;dig $Test_NLB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (58).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bntk9i/btsKIEX69Ky/yc1oX3RENl9VCm6pJRUSKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bntk9i/btsKIEX69Ky/yc1oX3RENl9VCm6pJRUSKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bntk9i/btsKIEX69Ky/yc1oX3RENl9VCm6pJRUSKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbntk9i%2FbtsKIEX69Ky%2Fyc1oX3RENl9VCm6pJRUSKK%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;835&quot; height=&quot;429&quot; data-filename=&quot;image (58).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; NLB에 연결된 A 레코드가 2개임!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; A 레코드 2개 = 퍼블릭 IP 2개 = 서브넷 1, 2에 각각 존재하는 ENI에 할당된 퍼블릭 IP&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;NLB 도메인으로 100번 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;for i in {1..100}; do snmpget -v2c -c public $Test_NLB 1.3.6.1.2.1.1.5.0; done | sort | uniq -c | sort -n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (59).png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/colYwV/btsKGJUuP9V/XT3NuNQvlUjLcZnfRIcru1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/colYwV/btsKGJUuP9V/XT3NuNQvlUjLcZnfRIcru1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/colYwV/btsKGJUuP9V/XT3NuNQvlUjLcZnfRIcru1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcolYwV%2FbtsKGJUuP9V%2FXT3NuNQvlUjLcZnfRIcru1%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;841&quot; height=&quot;141&quot; data-filename=&quot;image (59).png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 서브넷 1 (SERVER-EC2-1, SERVER-EC2-2) : 23 + 27 = 50&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 서브넷 2 (SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5) : 15 + 14 + 21 = 50&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 가용 영역을 기준으로 고르게 분산함! (NLB는 교차 영역 로드 밸런싱이 기본적으로 비활성화 상태이므로)&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;2-5. NLB 교차 영역 로드 밸런싱&lt;/b&gt;&lt;/h3&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-5-1. NLB 교차 영역 로드 밸런싱 활성화&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;왼쪽의 로드밸런서 클릭 &amp;rarr; 생성한 NLB 체크 &amp;rarr; 속성 탭 클릭 &amp;rarr; 편집 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (60).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckpsDV/btsKGJUuRtV/6k02ptVJxzSKJEcidye490/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckpsDV/btsKGJUuRtV/6k02ptVJxzSKJEcidye490/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckpsDV/btsKGJUuRtV/6k02ptVJxzSKJEcidye490/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckpsDV%2FbtsKGJUuRtV%2F6k02ptVJxzSKJEcidye490%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;1095&quot; height=&quot;710&quot; data-filename=&quot;image (60).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;710&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;교차 영역 로드 밸런싱 활성화 체크 &amp;rarr; 변경 내용 저장 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (61).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oiKHu/btsKGFxVmMC/8tpsvzOQWsmjQgT0BzWIEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oiKHu/btsKGFxVmMC/8tpsvzOQWsmjQgT0BzWIEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oiKHu/btsKGFxVmMC/8tpsvzOQWsmjQgT0BzWIEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoiKHu%2FbtsKGFxVmMC%2F8tpsvzOQWsmjQgT0BzWIEK%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;1094&quot; height=&quot;708&quot; data-filename=&quot;image (61).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;708&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (62).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/basoEt/btsKIB78Shf/JJyHk09K0LefkAcBdRfp81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/basoEt/btsKIB78Shf/JJyHk09K0LefkAcBdRfp81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/basoEt/btsKIB78Shf/JJyHk09K0LefkAcBdRfp81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbasoEt%2FbtsKIB78Shf%2FJJyHk09K0LefkAcBdRfp81%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;1094&quot; height=&quot;711&quot; data-filename=&quot;image (62).png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;711&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;b&gt;2-5-2. NLB 교차 영역 로드 밸런싱 동작 확인&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;NLB 도메인으로 100번 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;for i in {1..100}; do snmpget -v2c -c public $Test_NLB 1.3.6.1.2.1.1.5.0; done | sort | uniq -c | sort -n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (63).png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cj66Q/btsKHHhe7Zz/ph5mGNzkadkLzkJN1RxDMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cj66Q/btsKHHhe7Zz/ph5mGNzkadkLzkJN1RxDMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cj66Q/btsKHHhe7Zz/ph5mGNzkadkLzkJN1RxDMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCj66Q%2FbtsKHHhe7Zz%2Fph5mGNzkadkLzkJN1RxDMk%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;837&quot; height=&quot;138&quot; data-filename=&quot;image (63).png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 서브넷 1 (SERVER-EC2-1, SERVER-EC2-2) : 20 + 21 = 41&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 서브넷 2 (SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5) : 22 + 17 + 20 = 59&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 모든 인스턴스에 고르게 분산됨! (가용 영역 내 인스턴스의 수가 불균등하더라도 각 인스턴스는 균등한 부하를 부여받음!)&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>alb</category>
      <category>Application Load Balancer</category>
      <category>aws elb</category>
      <category>Network Load Balancer</category>
      <category>NLB</category>
      <category>경로 기반 라우팅</category>
      <category>교차 영역 로드 밸런싱</category>
      <category>로드 밸런서</category>
      <category>로드 밸런싱</category>
      <category>스프링 aws elb</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/154</guid>
      <comments>https://blogan99.tistory.com/154#entry154comment</comments>
      <pubDate>Wed, 13 Nov 2024 17:48:34 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Spring 프로젝트 AWS CodePipeline 사용한 배포 자동화 적용 방법</title>
      <link>https://blogan99.tistory.com/153</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. AWS 이용한 배포 자동화&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. AWS CodePipeline&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;소스 코드 변경 사항을 자동으로 감지하고, 빌드 및 배포 프로세스를 자동화하여 지속적인 통합 및 배포(CI/CD)를 지원하는 서비스&lt;/li&gt;
&lt;li&gt;주로 세 가지 주요 스테이지로 구성됨
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;일반적으로 GitHub, AWS CodeCommit, S3 등의 소스 리포지토리에서 소스를 가져옴&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&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;AWS CodeBuild 사용하여 이 과정을 자동화함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&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;다양한 AWS 서비스(AWS Elastic Beanstalk, Amazon ECS, AWS Lambda 등)를 통해 배포 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&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;b&gt;1-2. 배포 자동화 과정&lt;/b&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;소스 리포지토리에 새로운 커밋이 발생하거나 특정 이벤트(push, PR 등)가 발생하면, CodePipeline이 해당 이벤트를 감지&lt;/li&gt;
&lt;li&gt;코드 변경 시 소스 스테이지가 트리거됨 &amp;rArr; 변경된 코드 가져옴&lt;/li&gt;
&lt;li&gt;가져온 소스를 빌드 스테이지로 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&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;AWS CodeBuild 가 Docker 이미지나 ZIP 파일 등 원하는 형식으로 애플리케이션을 패키징함&lt;/li&gt;
&lt;li&gt;빌드 완료 시 빌드 아티팩트 (JAR 파일, Docker 이미지 등)가 생성됨&lt;/li&gt;
&lt;li&gt;빌드 과정에서의 테스트 결과도 확인 가능&lt;/li&gt;
&lt;li&gt;생성된 빌드 아티팩트를 배포 스테이지로 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&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;선택된 AWS 서비스에 따라 환경 설정 이루어짐 &amp;rArr; 새로운 버전의 애플리케이션 배포됨&lt;/li&gt;
&lt;li&gt;배포 완료 시 필요에 따라 롤백 기능, 알림 기능 등을 통해 배포 상태 모니터링 가능&lt;/li&gt;
&lt;li&gt;배포 후 테스트 통해 애플리케이션의 정상 작동 여부 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&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;2. 배포 자동화 적용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-0. 사전 준비&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-0-1. 스프링 프로젝트에 아래의 파일들을 상황에 맞게 수정 및 추가할 것&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;buildspec.yml
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodeBuild가 빌드할 때 참고할 buildspec 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto17
    commands:
      - echo &quot;Installing dependencies...&quot;
      - sudo chmod 777 gradlew
      - ./gradlew build -x test
  pre_build:
    commands:
      - echo &quot;Setting up environment variables...&quot;
      - echo &quot;&quot; &amp;gt; src/main/resources/application.properties
      - echo &quot;spring.datasource.url=$DB_URL&quot; &amp;gt;&amp;gt; src/main/resources/application.yml
      - echo &quot;spring.datasource.username=$DB_USERNAME&quot; &amp;gt;&amp;gt; src/main/resources/application.yml
      - echo &quot;spring.datasource.password=$DB_PASSWORD&quot; &amp;gt;&amp;gt; src/main/resources/application.yml
  build:
    commands:
      - echo &quot;Build started on `date`&quot;
      - ./gradlew clean build -x test
      - echo &quot;Build completed on `date`&quot;
  post_build:
    commands:
      - echo &quot;Post-build steps&quot;
      - ls build/libs/
      - echo &quot;Build completed. Preparing to deploy.&quot;
artifacts:
  files:
    - appspec.yml
    - build/libs/*.jar
    - scripts/*
  discard-paths: yes

cache:
  paths:
    - ~/.gradle/caches/**&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;&amp;nbsp;appspec.yml
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodeDeploy Agent가 EC2에서 파일 실행 시 필요한 사항 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;version: 0.0
os: linux
files:
  - source: .
    destination: /home/ec2-user/build
    overwrite: yes

permissions:
  - object: /
    pattern : &quot;**&quot;
    mode : 755
    owner : ec2-user
    group : ec2-user

hooks:
  ApplicationStart:
    - location: start.sh
      timeout: 300
      runas: ec2-user

  ApplicationStop:
    - location: stop.sh
      timeout: 300
      runas: ec2-user

&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;scripts &amp;gt; &lt;a href=&quot;http://start.sh&quot;&gt;start.sh&lt;/a&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;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# 기존 애플리케이션 종료
PID=$(pgrep -f 'java -jar /home/ec2-user/build/프로젝트 이름-0.0.1-SNAPSHOT.jar')
if [ -n &quot;$PID&quot; ]; then
    sudo kill -9 $PID
fi

# 새 애플리케이션 시작
nohup java -jar /home/ec2-user/build/프로젝트 이름-0.0.1-SNAPSHOT.jar &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
&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;scripts &amp;gt; &lt;a href=&quot;http://stop.sh&quot;&gt;stop.sh&lt;/a&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;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# 기존 애플리케이션 종료
PID=$(pgrep -f 'java -jar /home/ec2-user/build/프로젝트 이름-0.0.1-SNAPSHOT.jar')
if [ -n &quot;$PID&quot; ]; then
    sudo kill -9 $PID
fi
&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;&amp;nbsp;application.yml
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CodeBuild의 환경변수로부터 DB 연결 설정을 받아오도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 아래와 같이 수정
spring:
  datasource:
    url: ${DB_URL}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver
&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-0-2. 스프링 프로젝트를 깃헙에 올리기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdh6b/btsKHfqnCxZ/qso0tyyX5cvhtM5l0584Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdh6b/btsKHfqnCxZ/qso0tyyX5cvhtM5l0584Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdh6b/btsKHfqnCxZ/qso0tyyX5cvhtM5l0584Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftdh6b%2FbtsKHfqnCxZ%2Fqso0tyyX5cvhtM5l0584Q1%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;701&quot; height=&quot;645&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;645&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;b&gt;2-1. 파이프라인 생성&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;AWS의 CodePipeline 검색 및 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QVMzU/btsKGzQGVrc/2Y3rccPS5JVcrySgX0IqE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QVMzU/btsKGzQGVrc/2Y3rccPS5JVcrySgX0IqE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QVMzU/btsKGzQGVrc/2Y3rccPS5JVcrySgX0IqE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQVMzU%2FbtsKGzQGVrc%2F2Y3rccPS5JVcrySgX0IqE0%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;1061&quot; height=&quot;796&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;796&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvKWz/btsKG9wV1pr/hKyjaKi5sTWlkW6BZExqA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvKWz/btsKG9wV1pr/hKyjaKi5sTWlkW6BZExqA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvKWz/btsKG9wV1pr/hKyjaKi5sTWlkW6BZExqA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvKWz%2FbtsKG9wV1pr%2FhKyjaKi5sTWlkW6BZExqA0%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;1334&quot; height=&quot;524&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;524&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;Build custom pipeline 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XcvFn/btsKG9RfMaV/NK8ZhLCl8v63mId42uqj80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XcvFn/btsKG9RfMaV/NK8ZhLCl8v63mId42uqj80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XcvFn/btsKG9RfMaV/NK8ZhLCl8v63mId42uqj80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXcvFn%2FbtsKG9RfMaV%2FNK8ZhLCl8v63mId42uqj80%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;1132&quot; height=&quot;458&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;458&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw9lSz/btsKFgxMOTh/sTDJo0OLXkKQXm4WX1aDv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw9lSz/btsKFgxMOTh/sTDJo0OLXkKQXm4WX1aDv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw9lSz/btsKFgxMOTh/sTDJo0OLXkKQXm4WX1aDv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw9lSz%2FbtsKFgxMOTh%2FsTDJo0OLXkKQXm4WX1aDv0%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;910&quot; height=&quot;724&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;724&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;소스 공급자: GitHub(버전 2) 선택 &amp;rarr; GitHub에 연결 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi9zWN/btsKFbp0uyy/gQkE3WPIAxg0PFDJ6gqHRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi9zWN/btsKFbp0uyy/gQkE3WPIAxg0PFDJ6gqHRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi9zWN/btsKFbp0uyy/gQkE3WPIAxg0PFDJ6gqHRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi9zWN%2FbtsKFbp0uyy%2FgQkE3WPIAxg0PFDJ6gqHRk%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;912&quot; height=&quot;727&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;727&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;AWS-GitHub 간 연결 이름 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKSB8/btsKF6OHQVt/CNAB2M3nukVvxowbaq8xrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKSB8/btsKF6OHQVt/CNAB2M3nukVvxowbaq8xrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKSB8/btsKF6OHQVt/CNAB2M3nukVvxowbaq8xrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKSB8%2FbtsKF6OHQVt%2FCNAB2M3nukVvxowbaq8xrK%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;593&quot; height=&quot;545&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;545&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;AWS 연결을 위한 권한 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9vMUd/btsKGRDkU69/HILcPQKfQbJqbqHgmfqmxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9vMUd/btsKGRDkU69/HILcPQKfQbJqbqHgmfqmxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9vMUd/btsKGRDkU69/HILcPQKfQbJqbqHgmfqmxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9vMUd%2FbtsKGRDkU69%2FHILcPQKfQbJqbqHgmfqmxK%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;573&quot; height=&quot;524&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;524&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;새 앱 설치 클릭 &amp;rarr; 접근 레포 선택 및 Install &amp;amp; Authorize 클릭 &amp;rarr; 비밀번호 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/benOQh/btsKGMB1ufZ/LlAEiG5HFQa7BtS0eHSd61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/benOQh/btsKGMB1ufZ/LlAEiG5HFQa7BtS0eHSd61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/benOQh/btsKGMB1ufZ/LlAEiG5HFQa7BtS0eHSd61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbenOQh%2FbtsKGMB1ufZ%2FLlAEiG5HFQa7BtS0eHSd61%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;590&quot; height=&quot;507&quot; data-filename=&quot;image (8).png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXqORx/btsKGNgByip/Su7C4vYuBYxr2GsHicIjKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXqORx/btsKGNgByip/Su7C4vYuBYxr2GsHicIjKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXqORx/btsKGNgByip/Su7C4vYuBYxr2GsHicIjKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXqORx%2FbtsKGNgByip%2FSu7C4vYuBYxr2GsHicIjKK%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;581&quot; height=&quot;885&quot; data-filename=&quot;image (9).png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;885&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;앱 설치 드롭다운에서 연결할 계정 선택 &amp;rarr; 연결 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5qCt7/btsKGJesZoK/t1foGqHxIRZ3bLidhjDDJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5qCt7/btsKGJesZoK/t1foGqHxIRZ3bLidhjDDJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5qCt7/btsKGJesZoK/t1foGqHxIRZ3bLidhjDDJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5qCt7%2FbtsKGJesZoK%2Ft1foGqHxIRZ3bLidhjDDJ0%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;866&quot; height=&quot;619&quot; data-filename=&quot;image (10).png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;619&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uF5Qp/btsKG9DIjGR/0pyQFKfy63VuBQcem15040/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uF5Qp/btsKG9DIjGR/0pyQFKfy63VuBQcem15040/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uF5Qp/btsKG9DIjGR/0pyQFKfy63VuBQcem15040/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuF5Qp%2FbtsKG9DIjGR%2F0pyQFKfy63VuBQcem15040%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;913&quot; height=&quot;726&quot; data-filename=&quot;image (11).png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;726&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;트리거 설정 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBxk4H/btsKHertFWD/sDbJK4xpJvD2REfVVkxrc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBxk4H/btsKHertFWD/sDbJK4xpJvD2REfVVkxrc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBxk4H/btsKHertFWD/sDbJK4xpJvD2REfVVkxrc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBxk4H%2FbtsKHertFWD%2FsDbJK4xpJvD2REfVVkxrc0%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;952&quot; height=&quot;724&quot; data-filename=&quot;image (12).png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 위에 선택했던 브랜치 (master) 푸시 되면 자동으로 배포되게 설정하는 것임&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;빌드 공급자: Other build providers 선택 &amp;rarr; AWS CodeBuild 선택 &amp;rarr; 프로젝트 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxzjDB/btsKG9X1qtd/GOcevxKE5KemnBbW3beto0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxzjDB/btsKG9X1qtd/GOcevxKE5KemnBbW3beto0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxzjDB/btsKG9X1qtd/GOcevxKE5KemnBbW3beto0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxzjDB%2FbtsKG9X1qtd%2FGOcevxKE5KemnBbW3beto0%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;950&quot; height=&quot;642&quot; data-filename=&quot;image (13).png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;642&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTtSmF/btsKGq7kjFY/p0h2YYBSg6CIa1aQ4xxM1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTtSmF/btsKGq7kjFY/p0h2YYBSg6CIa1aQ4xxM1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTtSmF/btsKGq7kjFY/p0h2YYBSg6CIa1aQ4xxM1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTtSmF%2FbtsKGq7kjFY%2Fp0h2YYBSg6CIa1aQ4xxM1k%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;582&quot; height=&quot;458&quot; data-filename=&quot;image (14).png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;458&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;buildspec 파일 사용 선택 &amp;rarr; buildspec.yml 입력 &amp;rarr; (하단의) CodePipeline으로 계속 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NUUmQ/btsKGYPYmeA/MwtHsSPK5N0KDqiCERMV3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NUUmQ/btsKGYPYmeA/MwtHsSPK5N0KDqiCERMV3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NUUmQ/btsKGYPYmeA/MwtHsSPK5N0KDqiCERMV3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNUUmQ%2FbtsKGYPYmeA%2FMwtHsSPK5N0KDqiCERMV3K%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;581&quot; height=&quot;352&quot; data-filename=&quot;image (15).png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;352&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;환경 변수 3개 추가 (아래 사진 참고) &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLEMU/btsKE4j8Lxe/Mkp5ZqpqkkNKOw8ohwtnX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLEMU/btsKE4j8Lxe/Mkp5ZqpqkkNKOw8ohwtnX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLEMU/btsKE4j8Lxe/Mkp5ZqpqkkNKOw8ohwtnX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLEMU%2FbtsKE4j8Lxe%2FMkp5ZqpqkkNKOw8ohwtnX0%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;594&quot; height=&quot;632&quot; data-filename=&quot;image (16).png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wmkyu/btsKFJlYfwo/OrmhgtG4Rt7EKqsdYxwjs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wmkyu/btsKFJlYfwo/OrmhgtG4Rt7EKqsdYxwjs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wmkyu/btsKFJlYfwo/OrmhgtG4Rt7EKqsdYxwjs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWmkyu%2FbtsKFJlYfwo%2FOrmhgtG4Rt7EKqsdYxwjs0%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;794&quot; height=&quot;548&quot; data-filename=&quot;image (17).png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;548&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;DB_URL : jdbc:mysql://RDS의 엔드포인트:3306/데이터베이스 이름&lt;/li&gt;
&lt;li&gt;DB_USERNAME : RDS 사용자 이름 (root)&lt;/li&gt;
&lt;li&gt;DB_PASSWORD : RDS 사용자 비밀번호&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tEuyy/btsKFcCuciT/9yED1BKrlRoDEVqgh4Lsd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tEuyy/btsKFcCuciT/9yED1BKrlRoDEVqgh4Lsd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tEuyy/btsKFcCuciT/9yED1BKrlRoDEVqgh4Lsd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtEuyy%2FbtsKFcCuciT%2F9yED1BKrlRoDEVqgh4Lsd0%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;1204&quot; height=&quot;545&quot; data-filename=&quot;image (18).png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;545&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ㅁ1.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXhibN/btsKGsjJAwu/iAtXkL4I3nCYcrudvRUep0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXhibN/btsKGsjJAwu/iAtXkL4I3nCYcrudvRUep0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXhibN/btsKGsjJAwu/iAtXkL4I3nCYcrudvRUep0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXhibN%2FbtsKGsjJAwu%2FiAtXkL4I3nCYcrudvRUep0%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;702&quot; height=&quot;456&quot; data-filename=&quot;ㅁ1.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;456&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dASSAv/btsKGjUXE3N/gRbQDdKix751TZV1dtNQJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dASSAv/btsKGjUXE3N/gRbQDdKix751TZV1dtNQJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dASSAv/btsKGjUXE3N/gRbQDdKix751TZV1dtNQJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdASSAv%2FbtsKGjUXE3N%2FgRbQDdKix751TZV1dtNQJk%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;1186&quot; height=&quot;674&quot; data-filename=&quot;image (19).png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;674&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;b&gt;2-2. CodeDeploy 역할 생성&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;검색 창에 IAM 검색 &amp;rarr; 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Njf17/btsKEZiLKXJ/8jkHgikVTkuNmXgiQCPorK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Njf17/btsKEZiLKXJ/8jkHgikVTkuNmXgiQCPorK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Njf17/btsKEZiLKXJ/8jkHgikVTkuNmXgiQCPorK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjf17%2FbtsKEZiLKXJ%2F8jkHgikVTkuNmXgiQCPorK%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;1095&quot; height=&quot;568&quot; data-filename=&quot;image (20).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;568&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;왼쪽의 역할 클릭 &amp;rarr; 역할 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVhNb/btsKEZQAH2L/qz3esOqunTFsqOLUmGVgGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVhNb/btsKEZQAH2L/qz3esOqunTFsqOLUmGVgGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVhNb/btsKEZQAH2L/qz3esOqunTFsqOLUmGVgGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVhNb%2FbtsKEZQAH2L%2Fqz3esOqunTFsqOLUmGVgGk%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;1186&quot; height=&quot;745&quot; data-filename=&quot;image (21).png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;745&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;AWS 서비스 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GNIbu/btsKFbjeUN3/jNRsHqCmsxxdKbxhLzPEl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GNIbu/btsKFbjeUN3/jNRsHqCmsxxdKbxhLzPEl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GNIbu/btsKFbjeUN3/jNRsHqCmsxxdKbxhLzPEl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGNIbu%2FbtsKFbjeUN3%2FjNRsHqCmsxxdKbxhLzPEl0%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;1185&quot; height=&quot;518&quot; data-filename=&quot;image (22).png&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;518&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;CodeDeploy 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (23).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MVqT9/btsKGjN89kq/QpK5RI5ypgEeK1KVhXRGdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MVqT9/btsKGjN89kq/QpK5RI5ypgEeK1KVhXRGdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MVqT9/btsKGjN89kq/QpK5RI5ypgEeK1KVhXRGdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMVqT9%2FbtsKGjN89kq%2FQpK5RI5ypgEeK1KVhXRGdk%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;1187&quot; height=&quot;482&quot; data-filename=&quot;image (23).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;482&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;AWSCodeDeployRole 확인 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (24).png&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJiYs/btsKE1VekXG/rcl4fzQpHD4SYgY9Ft3jck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJiYs/btsKE1VekXG/rcl4fzQpHD4SYgY9Ft3jck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJiYs/btsKE1VekXG/rcl4fzQpHD4SYgY9Ft3jck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJiYs%2FbtsKE1VekXG%2Frcl4fzQpHD4SYgY9Ft3jck%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;1155&quot; height=&quot;481&quot; data-filename=&quot;image (24).png&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;481&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;역할 이름 작성 &amp;rarr; 역할 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (25).png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biEcjV/btsKFdVM8x9/KsIIq0ClLvnkkZtraR6Rek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biEcjV/btsKFdVM8x9/KsIIq0ClLvnkkZtraR6Rek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biEcjV/btsKFdVM8x9/KsIIq0ClLvnkkZtraR6Rek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiEcjV%2FbtsKFdVM8x9%2FKsIIq0ClLvnkkZtraR6Rek%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;1184&quot; height=&quot;743&quot; data-filename=&quot;image (25).png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (26).png&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JIV1Z/btsKHbn1sW1/h2HhSS6NsJXFLmFK4ONCP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JIV1Z/btsKHbn1sW1/h2HhSS6NsJXFLmFK4ONCP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JIV1Z/btsKHbn1sW1/h2HhSS6NsJXFLmFK4ONCP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJIV1Z%2FbtsKHbn1sW1%2Fh2HhSS6NsJXFLmFK4ONCP1%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;1147&quot; height=&quot;565&quot; data-filename=&quot;image (26).png&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;565&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;b&gt;2-3. 배포 그룹 생성&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;검색창에 codedeploy 검색 &amp;rarr; 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (27).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO32WX/btsKGFJUA1b/MduPbvmcAc0xVGSfIAAni1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO32WX/btsKGFJUA1b/MduPbvmcAc0xVGSfIAAni1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO32WX/btsKGFJUA1b/MduPbvmcAc0xVGSfIAAni1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO32WX%2FbtsKGFJUA1b%2FMduPbvmcAc0xVGSfIAAni1%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;1095&quot; height=&quot;464&quot; data-filename=&quot;image (27).png&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;464&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;왼쪽의 배포 &amp;rarr; 애플리케이션 클릭 &amp;rarr; 애플리케이션 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (28).png&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX6PsL/btsKFFRn7uz/SVVS1JRVDPeHajpfDZXjEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX6PsL/btsKFFRn7uz/SVVS1JRVDPeHajpfDZXjEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX6PsL/btsKFFRn7uz/SVVS1JRVDPeHajpfDZXjEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX6PsL%2FbtsKFFRn7uz%2FSVVS1JRVDPeHajpfDZXjEK%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;1205&quot; height=&quot;571&quot; data-filename=&quot;image (28).png&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;571&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;애플리케이션 이름 작성 &amp;rarr; 컴퓨팅 플랫폼: EC2/온프레미스 선택 &amp;rarr; 애플리케이션 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (29).png&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drnyZo/btsKEYqCP5a/6hpjFUWr0iZCslSyE3FOBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drnyZo/btsKEYqCP5a/6hpjFUWr0iZCslSyE3FOBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drnyZo/btsKEYqCP5a/6hpjFUWr0iZCslSyE3FOBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrnyZo%2FbtsKEYqCP5a%2F6hpjFUWr0iZCslSyE3FOBK%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;1163&quot; height=&quot;597&quot; data-filename=&quot;image (29).png&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;597&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;애플리케이션 생성 확인 &amp;rarr; 배포 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (30).png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNwIl1/btsKFGCLSIp/TlBUF1RKbx5HGKQap0kM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNwIl1/btsKFGCLSIp/TlBUF1RKbx5HGKQap0kM9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNwIl1/btsKFGCLSIp/TlBUF1RKbx5HGKQap0kM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNwIl1%2FbtsKFGCLSIp%2FTlBUF1RKbx5HGKQap0kM9k%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;1188&quot; height=&quot;748&quot; data-filename=&quot;image (30).png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;748&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;배포 그룹 이름 작성 &amp;rarr; 서비스 역할 (IAM에서 생성한 역할) 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (31).png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMy3GK/btsKF4XJXgZ/4KxUy8BykJqG9gameoI560/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMy3GK/btsKF4XJXgZ/4KxUy8BykJqG9gameoI560/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMy3GK/btsKF4XJXgZ/4KxUy8BykJqG9gameoI560/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMy3GK%2FbtsKF4XJXgZ%2F4KxUy8BykJqG9gameoI560%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;1194&quot; height=&quot;745&quot; data-filename=&quot;image (31).png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;745&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;(환경 구성) Amazon EC2 인스턴스 선택 &amp;rarr; 키: Name 입력 &amp;rarr; 값: EC2 인스턴스 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (32).png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OUA89/btsKFAphQXh/ZxWeVK9SwgPVAFntFrY2dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OUA89/btsKFAphQXh/ZxWeVK9SwgPVAFntFrY2dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OUA89/btsKFAphQXh/ZxWeVK9SwgPVAFntFrY2dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOUA89%2FbtsKFAphQXh%2FZxWeVK9SwgPVAFntFrY2dk%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;1192&quot; height=&quot;655&quot; data-filename=&quot;image (32).png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;655&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;로드 밸런싱 활성화 체크 해제 &amp;rarr; 배포 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (33).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjdzL/btsKGXQ2UmN/3BJ2pgbCRM9DtCq2KUphJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjdzL/btsKGXQ2UmN/3BJ2pgbCRM9DtCq2KUphJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjdzL/btsKGXQ2UmN/3BJ2pgbCRM9DtCq2KUphJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsjdzL%2FbtsKGXQ2UmN%2F3BJ2pgbCRM9DtCq2KUphJK%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;1187&quot; height=&quot;530&quot; data-filename=&quot;image (33).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;530&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (34).png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjONzX/btsKGH11Ptn/8hfshoj0UuOKCD1ZEkeXrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjONzX/btsKGH11Ptn/8hfshoj0UuOKCD1ZEkeXrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjONzX/btsKGH11Ptn/8hfshoj0UuOKCD1ZEkeXrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjONzX%2FbtsKGH11Ptn%2F8hfshoj0UuOKCD1ZEkeXrk%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;529&quot; height=&quot;38&quot; data-filename=&quot;image (34).png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;38&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;b&gt;2-4. 파이프라인에 배포 스테이지 추가&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;왼쪽의 파이프라인 &amp;rarr; 파이프라인 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (35).png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMTUBK/btsKGKxHFTo/DZR5wl7JASlL4kbE0NFbn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMTUBK/btsKGKxHFTo/DZR5wl7JASlL4kbE0NFbn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMTUBK/btsKGKxHFTo/DZR5wl7JASlL4kbE0NFbn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMTUBK%2FbtsKGKxHFTo%2FDZR5wl7JASlL4kbE0NFbn1%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;1194&quot; height=&quot;748&quot; data-filename=&quot;image (35).png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;748&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (36).png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxIbjZ/btsKGXctmFt/n8D3RJCQPE1us9bVwYgfT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxIbjZ/btsKGXctmFt/n8D3RJCQPE1us9bVwYgfT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxIbjZ/btsKGXctmFt/n8D3RJCQPE1us9bVwYgfT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxIbjZ%2FbtsKGXctmFt%2Fn8D3RJCQPE1us9bVwYgfT1%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;1199&quot; height=&quot;468&quot; data-filename=&quot;image (36).png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;468&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (37).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0BOV8/btsKGE5iO8C/ABo6HdH8Ubd9dKtEDiHXXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0BOV8/btsKGE5iO8C/ABo6HdH8Ubd9dKtEDiHXXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0BOV8/btsKGE5iO8C/ABo6HdH8Ubd9dKtEDiHXXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0BOV8%2FbtsKGE5iO8C%2FABo6HdH8Ubd9dKtEDiHXXk%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;1167&quot; height=&quot;586&quot; data-filename=&quot;image (37).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;586&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (38).png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQbNX/btsKGKRXmqP/rIx3ElbuqOlkx42mBvGKc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQbNX/btsKGKRXmqP/rIx3ElbuqOlkx42mBvGKc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQbNX/btsKGKRXmqP/rIx3ElbuqOlkx42mBvGKc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQbNX%2FbtsKGKRXmqP%2FrIx3ElbuqOlkx42mBvGKc0%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;1171&quot; height=&quot;748&quot; data-filename=&quot;image (38).png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;748&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;스테이지 이름 입력 &amp;rarr; 스테이지 추가 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (39).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqMWYe/btsKG8LAp4c/PoPEkxGCnr4smAtttAv0W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqMWYe/btsKG8LAp4c/PoPEkxGCnr4smAtttAv0W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqMWYe/btsKG8LAp4c/PoPEkxGCnr4smAtttAv0W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqMWYe%2FbtsKG8LAp4c%2FPoPEkxGCnr4smAtttAv0W0%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;1167&quot; height=&quot;361&quot; data-filename=&quot;image (39).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;361&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (40).png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfTtXK/btsKFadALSY/LY5TyLuUtaiovUFDqlgWR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfTtXK/btsKFadALSY/LY5TyLuUtaiovUFDqlgWR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfTtXK/btsKFadALSY/LY5TyLuUtaiovUFDqlgWR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfTtXK%2FbtsKFadALSY%2FLY5TyLuUtaiovUFDqlgWR1%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;843&quot; height=&quot;325&quot; data-filename=&quot;image (40).png&quot; data-origin-width=&quot;843&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 편집 설정 &amp;rarr; 완료 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;222222.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;845&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ipSc/btsKHeZkLRC/2smqyuHgHh3DqBKpSMFPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ipSc/btsKHeZkLRC/2smqyuHgHh3DqBKpSMFPMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ipSc/btsKHeZkLRC/2smqyuHgHh3DqBKpSMFPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ipSc%2FbtsKHeZkLRC%2F2smqyuHgHh3DqBKpSMFPMk%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;1032&quot; height=&quot;845&quot; data-filename=&quot;222222.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;845&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;li&gt;작업 공급자 : AWS CodeDeploy 선택&lt;/li&gt;
&lt;li&gt;리전 : 아시아 태평양 (서울) 선택&lt;/li&gt;
&lt;li&gt;입력 아티팩트 : BuildArtifact 선택&lt;/li&gt;
&lt;li&gt;애플리케이션 이름 : AWS CodeDeploy 에서 생성한 애플리케이션 선택&lt;/li&gt;
&lt;li&gt;배포 그룹 : AWS CodeDeploy 에서 생성한 배포 그룹 선택&lt;/li&gt;
&lt;/ul&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;완료 클릭 &amp;rarr; 상단의 저장 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (41).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxXyNj/btsKFqNGBih/PxGXthBiNjEa55yKFkGYsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxXyNj/btsKFqNGBih/PxGXthBiNjEa55yKFkGYsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxXyNj/btsKFqNGBih/PxGXthBiNjEa55yKFkGYsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxXyNj%2FbtsKFqNGBih%2FPxGXthBiNjEa55yKFkGYsk%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;835&quot; height=&quot;424&quot; data-filename=&quot;image (41).png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (42).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beSnhI/btsKE4j9gLn/BaVIiqxAIO8xI8pIqW8yM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beSnhI/btsKE4j9gLn/BaVIiqxAIO8xI8pIqW8yM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beSnhI/btsKE4j9gLn/BaVIiqxAIO8xI8pIqW8yM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeSnhI%2FbtsKE4j9gLn%2FBaVIiqxAIO8xI8pIqW8yM1%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;1169&quot; height=&quot;296&quot; data-filename=&quot;image (42).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;296&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;b&gt;2-5. EC2 역할 설정&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;IAM 진입 &amp;rarr; 왼쪽의 역할 클릭 &amp;rarr; 역할 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (43).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJigoT/btsKFfyTBQH/NhYOuR1eKD55GGbHah4l1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJigoT/btsKFfyTBQH/NhYOuR1eKD55GGbHah4l1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJigoT/btsKFfyTBQH/NhYOuR1eKD55GGbHah4l1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJigoT%2FbtsKFfyTBQH%2FNhYOuR1eKD55GGbHah4l1K%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;1167&quot; height=&quot;625&quot; data-filename=&quot;image (43).png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;625&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;신뢰할 수 있는 엔터티 유형 : AWS Service 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (44).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPGGZ/btsKE3rZe3Q/SpjuZNnIWIPpX0PmUNGMOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPGGZ/btsKE3rZe3Q/SpjuZNnIWIPpX0PmUNGMOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPGGZ/btsKE3rZe3Q/SpjuZNnIWIPpX0PmUNGMOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPGGZ%2FbtsKE3rZe3Q%2FSpjuZNnIWIPpX0PmUNGMOk%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;1169&quot; height=&quot;514&quot; data-filename=&quot;image (44).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;514&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;서비스 또는 사용 사례, 사용 사례 : EC2 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (45).png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBsIt5/btsKFMwe0S1/YiW5wtKWs2kR1XaX55oIBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBsIt5/btsKFMwe0S1/YiW5wtKWs2kR1XaX55oIBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBsIt5/btsKFMwe0S1/YiW5wtKWs2kR1XaX55oIBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBsIt5%2FbtsKFMwe0S1%2FYiW5wtKWs2kR1XaX55oIBk%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;1125&quot; height=&quot;684&quot; data-filename=&quot;image (45).png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;684&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;아래의 4개 권한 검색 후 추가 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (46).png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6NBdJ/btsKGS92JMh/Wwg7vJyWKteMkK6QMkp0C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6NBdJ/btsKGS92JMh/Wwg7vJyWKteMkK6QMkp0C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6NBdJ/btsKGS92JMh/Wwg7vJyWKteMkK6QMkp0C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6NBdJ%2FbtsKGS92JMh%2FWwg7vJyWKteMkK6QMkp0C0%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;1170&quot; height=&quot;737&quot; data-filename=&quot;image (46).png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;737&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;AmazonS3FullAccess&lt;/li&gt;
&lt;li&gt;AWSCodeDeployFullAccess&lt;/li&gt;
&lt;li&gt;AWSCodeDeployRole&lt;/li&gt;
&lt;li&gt;CloudWatchLogsFullAccess&lt;/li&gt;
&lt;/ul&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;EC2 역할의 이름 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (47).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/utSN3/btsKGUUl0M4/R5eL7DwnDKYoQ1rfMW9al0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/utSN3/btsKGUUl0M4/R5eL7DwnDKYoQ1rfMW9al0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/utSN3/btsKGUUl0M4/R5eL7DwnDKYoQ1rfMW9al0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FutSN3%2FbtsKGUUl0M4%2FR5eL7DwnDKYoQ1rfMW9al0%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;1169&quot; height=&quot;469&quot; data-filename=&quot;image (47).png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;469&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;추가한 4개의 권한 정책 확인 &amp;rarr; 역할 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (48).png&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSlg5f/btsKEYqDfMq/QtpYi1Z3CDWlZPmLOJqoNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSlg5f/btsKEYqDfMq/QtpYi1Z3CDWlZPmLOJqoNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSlg5f/btsKEYqDfMq/QtpYi1Z3CDWlZPmLOJqoNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSlg5f%2FbtsKEYqDfMq%2FQtpYi1Z3CDWlZPmLOJqoNk%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;1175&quot; height=&quot;689&quot; data-filename=&quot;image (48).png&quot; data-origin-width=&quot;1175&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 역할 생성 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (49).png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F4TUy/btsKFbwNue0/8OvrBPeMpNpDxSnembBQ21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F4TUy/btsKFbwNue0/8OvrBPeMpNpDxSnembBQ21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F4TUy/btsKFbwNue0/8OvrBPeMpNpDxSnembBQ21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF4TUy%2FbtsKFbwNue0%2F8OvrBPeMpNpDxSnembBQ21%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;894&quot; height=&quot;50&quot; data-filename=&quot;image (49).png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;50&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;EC2 진입 &amp;rarr; 왼쪽의 인스턴스 클릭 &amp;rarr; 적용할 인스턴스 선택 &amp;rarr; 작업 클릭 &amp;rarr; 보안 클릭 &amp;rarr; IAM 역할 수정 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (50).png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXB7co/btsKF7mzdo6/DH9OHlhqKg5K7vYVUhQnq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXB7co/btsKF7mzdo6/DH9OHlhqKg5K7vYVUhQnq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXB7co/btsKF7mzdo6/DH9OHlhqKg5K7vYVUhQnq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXB7co%2FbtsKF7mzdo6%2FDH9OHlhqKg5K7vYVUhQnq1%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;1174&quot; height=&quot;409&quot; data-filename=&quot;image (50).png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;409&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;생성한 EC2 역할 선택 &amp;rarr; IAM 역할 업데이트 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (51).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VBS56/btsKGXQ3q1A/IV60jKuK5eu5aF9hRjRyD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VBS56/btsKGXQ3q1A/IV60jKuK5eu5aF9hRjRyD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VBS56/btsKGXQ3q1A/IV60jKuK5eu5aF9hRjRyD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVBS56%2FbtsKGXQ3q1A%2FIV60jKuK5eu5aF9hRjRyD0%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;1187&quot; height=&quot;410&quot; data-filename=&quot;image (51).png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;410&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;EC2 인스턴스와 생성한 역할이 연결됨을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (52).png&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZL2Ua/btsKGPS6Scc/YKEFJvHvFNyFT7auJoTbnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZL2Ua/btsKGPS6Scc/YKEFJvHvFNyFT7auJoTbnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZL2Ua/btsKGPS6Scc/YKEFJvHvFNyFT7auJoTbnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZL2Ua%2FbtsKGPS6Scc%2FYKEFJvHvFNyFT7auJoTbnk%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;995&quot; height=&quot;38&quot; data-filename=&quot;image (52).png&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;38&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;b&gt;2-6. EC2 사용자 추가&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;IAM 진입 &amp;rarr; 왼쪽의 액세스 관리 &amp;rarr; 사용자 그룹 클릭 &amp;rarr; 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (53).png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPdYQ/btsKF7GVcNm/nddxccklvaahByvAq7lR2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPdYQ/btsKF7GVcNm/nddxccklvaahByvAq7lR2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPdYQ/btsKF7GVcNm/nddxccklvaahByvAq7lR2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPdYQ%2FbtsKF7GVcNm%2FnddxccklvaahByvAq7lR2K%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;1246&quot; height=&quot;493&quot; data-filename=&quot;image (53).png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;493&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;사용자 그룹 이름 입력 &amp;rarr; 사용자 그룹 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (54).png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blZTLJ/btsKE0vgtxZ/B0HH5GsnKE7KSaBJ4DkW7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blZTLJ/btsKE0vgtxZ/B0HH5GsnKE7KSaBJ4DkW7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blZTLJ/btsKE0vgtxZ/B0HH5GsnKE7KSaBJ4DkW7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblZTLJ%2FbtsKE0vgtxZ%2FB0HH5GsnKE7KSaBJ4DkW7K%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;1232&quot; height=&quot;564&quot; data-filename=&quot;image (54).png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;564&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (55).png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsMJJq/btsKGlSIuPn/kraLpMgxHqA6RDRw1yzDNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsMJJq/btsKGlSIuPn/kraLpMgxHqA6RDRw1yzDNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsMJJq/btsKGlSIuPn/kraLpMgxHqA6RDRw1yzDNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsMJJq%2FbtsKGlSIuPn%2FkraLpMgxHqA6RDRw1yzDNK%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;970&quot; height=&quot;47&quot; data-filename=&quot;image (55).png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;47&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (56).png&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XIrZO/btsKFkAfL0A/xvUAHXLiEPyXWZrlNH9Q8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XIrZO/btsKFkAfL0A/xvUAHXLiEPyXWZrlNH9Q8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XIrZO/btsKFkAfL0A/xvUAHXLiEPyXWZrlNH9Q8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXIrZO%2FbtsKFkAfL0A%2FxvUAHXLiEPyXWZrlNH9Q8K%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;1245&quot; height=&quot;445&quot; data-filename=&quot;image (56).png&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;445&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;권한 탭 클릭 &amp;rarr; 권한 추가 클릭 &amp;rarr; 인라인 정책 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (57).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6vP9E/btsKFjOUR0K/rrPaD2Tks9kO5WXnSVuVZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6vP9E/btsKFjOUR0K/rrPaD2Tks9kO5WXnSVuVZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6vP9E/btsKFjOUR0K/rrPaD2Tks9kO5WXnSVuVZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6vP9E%2FbtsKFjOUR0K%2FrrPaD2Tks9kO5WXnSVuVZ1%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;1247&quot; height=&quot;711&quot; data-filename=&quot;image (57).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;711&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;JSON 탭 클릭 &amp;rarr; 아래 내용 붙여넣기 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  IAM 정책 정의 JSON&lt;br /&gt;&lt;br /&gt;
&lt;pre id=&quot;code_1731400875635&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&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;autoscaling:*&quot;,
                &quot;codedeploy:*&quot;,
                &quot;ec2:*&quot;,
                &quot;lambda:*&quot;,
                &quot;elasticloadbalancing:*&quot;,
                &quot;s3:*&quot;,
                &quot;cloudwatch:*&quot;,
                &quot;logs:*&quot;,
                &quot;sns:*&quot;
            ],
            &quot;Resource&quot;: &quot;*&quot;
        }
    ]
}​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;- Version : 정책의 버전 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;2012-10-17&amp;rdquo; : 현재 AWS에서 사용되는 최신 정책 버전 &lt;br /&gt;- Statement : 정책의 주요 내용을 포함하는 배열 &lt;br /&gt;- Effect : 정책의 효과 정의 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;Allow&amp;rdquo; : 지정된 액션을 허용함을 의미 &lt;br /&gt;- Action : 허용되는 AWS 서비스의 특정 작업 나열 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;autoscaling:*&amp;rdquo; &amp;rarr; Auto Scaling 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;codedeploy:*&amp;rdquo; &amp;rarr; CodeDeploy 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;ec2:*&amp;rdquo; &amp;rarr; EC2(Elastic Compute Cloud) 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;lambda:*&amp;rdquo; &amp;rarr; AWS Lambda 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;elasticloadbalancing:*&amp;rdquo; &amp;rarr; Elastic Load Balancing 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;s3:*&amp;rdquo; &amp;rarr; S3(Simple Storage Service) 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;cloudwatch:*&amp;rdquo; &amp;rarr; CloudWatch 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;logs:*&amp;rdquo; &amp;rarr; CloudWatch Logs 관련 모든 작업 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &amp;ldquo;sns:*&amp;rdquo; &amp;rarr; SNS(Simple Notification Service) 관련 모든 작업 &lt;br /&gt;- Resource: 정책이 적용되는 리소스 지정 &lt;br /&gt;&amp;nbsp; &amp;nbsp; - &quot;*&quot; : 모든 리소스에 대해 위의 작업이 허용됨을 의미 &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (58).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Y8FF/btsKFGv1k6T/mX140ksKzpIzOx742zoEv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Y8FF/btsKFGv1k6T/mX140ksKzpIzOx742zoEv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Y8FF/btsKFGv1k6T/mX140ksKzpIzOx742zoEv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Y8FF%2FbtsKFGv1k6T%2FmX140ksKzpIzOx742zoEv0%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;1233&quot; height=&quot;731&quot; data-filename=&quot;image (58).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;731&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;정책 이름 입력 &amp;rarr; 정책 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (59).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgSem1/btsKEZ39sKd/eVxiThaDyGirHYJc628gEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgSem1/btsKEZ39sKd/eVxiThaDyGirHYJc628gEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgSem1/btsKEZ39sKd/eVxiThaDyGirHYJc628gEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgSem1%2FbtsKEZ39sKd%2FeVxiThaDyGirHYJc628gEk%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;1233&quot; height=&quot;751&quot; data-filename=&quot;image (59).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;751&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (60).png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6oXNC/btsKGYJc8C3/sf9jKMGMhPyoIhzIH6Kpvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6oXNC/btsKGYJc8C3/sf9jKMGMhPyoIhzIH6Kpvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6oXNC/btsKGYJc8C3/sf9jKMGMhPyoIhzIH6Kpvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6oXNC%2FbtsKGYJc8C3%2Fsf9jKMGMhPyoIhzIH6Kpvk%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;968&quot; height=&quot;47&quot; data-filename=&quot;image (60).png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;47&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;왼쪽의 사용자 클릭 &amp;rarr; 사용자 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (61).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxKblK/btsKE1AVcm6/Oq6OPvNb3Se8EwsGzUf8Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxKblK/btsKE1AVcm6/Oq6OPvNb3Se8EwsGzUf8Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxKblK/btsKE1AVcm6/Oq6OPvNb3Se8EwsGzUf8Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxKblK%2FbtsKE1AVcm6%2FOq6OPvNb3Se8EwsGzUf8Dk%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;1247&quot; height=&quot;438&quot; data-filename=&quot;image (61).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;438&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;사용자 이름 입력 &amp;rarr; 체크박스 체크 &amp;rarr; IAM 사용자 생성 체크 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (62).png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohEqL/btsKGAISoun/npEW97WhgHhw44JbYqIaj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohEqL/btsKGAISoun/npEW97WhgHhw44JbYqIaj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohEqL/btsKGAISoun/npEW97WhgHhw44JbYqIaj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohEqL%2FbtsKGAISoun%2FnpEW97WhgHhw44JbYqIaj1%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;1230&quot; height=&quot;714&quot; data-filename=&quot;image (62).png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;714&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;생성해 둔 사용자 그룹 선택 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (63).png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zK62I/btsKGI7KqHj/eKL6Zgw9k6WgBn5MtJC9f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zK62I/btsKGI7KqHj/eKL6Zgw9k6WgBn5MtJC9f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zK62I/btsKGI7KqHj/eKL6Zgw9k6WgBn5MtJC9f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzK62I%2FbtsKGI7KqHj%2FeKL6Zgw9k6WgBn5MtJC9f1%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;1248&quot; height=&quot;727&quot; data-filename=&quot;image (63).png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;727&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;생성 정보 검토 &amp;rarr; 사용자 생성 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (64).png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct1VI8/btsKFnpWWmb/KKa8HqufgmVU58Wq2FXbFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct1VI8/btsKFnpWWmb/KKa8HqufgmVU58Wq2FXbFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct1VI8/btsKFnpWWmb/KKa8HqufgmVU58Wq2FXbFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct1VI8%2FbtsKFnpWWmb%2FKKa8HqufgmVU58Wq2FXbFK%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;1234&quot; height=&quot;746&quot; data-filename=&quot;image (64).png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;746&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;.csv 파일 다운로드 클릭 (로그인 정보 파일) &amp;rarr; 사용자 보기 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (65).png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZEReh/btsKF5oM9YZ/NAEd0Mkq8kkcoxoKgsKhZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZEReh/btsKF5oM9YZ/NAEd0Mkq8kkcoxoKgsKhZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZEReh/btsKF5oM9YZ/NAEd0Mkq8kkcoxoKgsKhZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZEReh%2FbtsKF5oM9YZ%2FNAEd0Mkq8kkcoxoKgsKhZk%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;1246&quot; height=&quot;749&quot; data-filename=&quot;image (65).png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;749&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;보안 자격 증명 탭 클릭 &amp;rarr; 아래의 액세스 키 만들기 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (66).png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXUtQd/btsKFmSnmBH/eEOKFVpgw6wVRV4FjfZ5q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXUtQd/btsKFmSnmBH/eEOKFVpgw6wVRV4FjfZ5q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXUtQd/btsKFmSnmBH/eEOKFVpgw6wVRV4FjfZ5q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXUtQd%2FbtsKFmSnmBH%2FeEOKFVpgw6wVRV4FjfZ5q0%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;1228&quot; height=&quot;745&quot; data-filename=&quot;image (66).png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (67).png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0cont/btsKGP6z465/4VSwKefd4o11gkM8iZuziK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0cont/btsKGP6z465/4VSwKefd4o11gkM8iZuziK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0cont/btsKGP6z465/4VSwKefd4o11gkM8iZuziK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0cont%2FbtsKGP6z465%2F4VSwKefd4o11gkM8iZuziK%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;882&quot; height=&quot;260&quot; data-filename=&quot;image (67).png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;260&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;Command Line Interface (CLI) 선택 &amp;rarr; 확인 체크박스 체크 &amp;rarr; 다음 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (68).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vAFAR/btsKGSoGMn5/g27M2gzkWO8uARKTix0vgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vAFAR/btsKGSoGMn5/g27M2gzkWO8uARKTix0vgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vAFAR/btsKGSoGMn5/g27M2gzkWO8uARKTix0vgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvAFAR%2FbtsKGSoGMn5%2Fg27M2gzkWO8uARKTix0vgK%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;1233&quot; height=&quot;747&quot; data-filename=&quot;image (68).png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (69).png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Gybu/btsKGMWlKVs/asBIfdZ4jZ4DovMCx9xyi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Gybu/btsKGMWlKVs/asBIfdZ4jZ4DovMCx9xyi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Gybu/btsKGMWlKVs/asBIfdZ4jZ4DovMCx9xyi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Gybu%2FbtsKGMWlKVs%2FasBIfdZ4jZ4DovMCx9xyi1%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;1234&quot; height=&quot;317&quot; data-filename=&quot;image (69).png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;317&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;설명 태그 값 입력 (선택) &amp;rarr; 액세스 키 만들기 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (70).png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kR7NS/btsKF8y3KyY/XIAPfZLwaPoRcseLLefjRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kR7NS/btsKF8y3KyY/XIAPfZLwaPoRcseLLefjRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kR7NS/btsKF8y3KyY/XIAPfZLwaPoRcseLLefjRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkR7NS%2FbtsKF8y3KyY%2FXIAPfZLwaPoRcseLLefjRK%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;1248&quot; height=&quot;433&quot; data-filename=&quot;image (70).png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;433&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;.csv 파일 다운로드 (액세스 키) &amp;rarr; 완료 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (71).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4F99s/btsKGtwcK16/Nz7pNtKjzjkFv5tS92wTH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4F99s/btsKGtwcK16/Nz7pNtKjzjkFv5tS92wTH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4F99s/btsKGtwcK16/Nz7pNtKjzjkFv5tS92wTH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4F99s%2FbtsKGtwcK16%2FNz7pNtKjzjkFv5tS92wTH1%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;1247&quot; height=&quot;746&quot; data-filename=&quot;image (71).png&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;rArr; 이 페이지를 벗어나면 액세스 키를 확인할 수 없으므로 꼭 .csv 파일 다운로드 해놓을 것!&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;2-7. EC2 환경 설정&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;터미널 접속 &amp;rarr; EC2 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ssh -i [키페어 이름].pem [인스턴스의 계정 이름]@[인스턴스의 퍼블릭 IPv4 DNS]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (72).png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUwYq/btsKGUGOidy/tRzBD85ALURoZrYKvmpLH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUwYq/btsKGUGOidy/tRzBD85ALURoZrYKvmpLH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUwYq/btsKGUGOidy/tRzBD85ALURoZrYKvmpLH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUwYq%2FbtsKGUGOidy%2FtRzBD85ALURoZrYKvmpLH1%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;1078&quot; height=&quot;346&quot; data-filename=&quot;image (72).png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;346&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;EC2에 aws-cli 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;cd ~
sudo yum update -y
sudo yum install -y aws-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (73).png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qls3s/btsKGhJyNHY/cnwlaYe0DKa8ufitljPHv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qls3s/btsKGhJyNHY/cnwlaYe0DKa8ufitljPHv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qls3s/btsKGhJyNHY/cnwlaYe0DKa8ufitljPHv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQls3s%2FbtsKGhJyNHY%2FcnwlaYe0DKa8ufitljPHv0%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;1075&quot; height=&quot;661&quot; data-filename=&quot;image (73).png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;661&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;설치된 aws-cli 버전 확인 (설치 확인겸)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;aws --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (74).png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9PC57/btsKHeE31OT/u7g0IlMHOK1f5VyxYLpaq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9PC57/btsKHeE31OT/u7g0IlMHOK1f5VyxYLpaq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9PC57/btsKHeE31OT/u7g0IlMHOK1f5VyxYLpaq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9PC57%2FbtsKHeE31OT%2Fu7g0IlMHOK1f5VyxYLpaq0%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;831&quot; height=&quot;44&quot; data-filename=&quot;image (74).png&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;44&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;aws-cli 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo aws configure

# 위의 명령어를 치고 아래의 정보들을 순서대로 기입할 것&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;AWS Access Key ID : 다운받은 액세스 키 파일의 Access Key Id&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. AWS Secret Access Key : 다운받은 액세스 키 파일의 Secret access key&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Default region name : ap-northeast-2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Default output format : json&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot at Nov 11 16-08-03.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWr7yE/btsKGUNCcdK/kuKNYx0YOgkVnphX2EkuLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWr7yE/btsKGUNCcdK/kuKNYx0YOgkVnphX2EkuLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWr7yE/btsKGUNCcdK/kuKNYx0YOgkVnphX2EkuLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWr7yE%2FbtsKGUNCcdK%2FkuKNYx0YOgkVnphX2EkuLk%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;594&quot; height=&quot;98&quot; data-filename=&quot;Screenshot at Nov 11 16-08-03.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;98&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;Ruby 설치 및 버전 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo yum install -y ruby
ruby --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (75).png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qN7UI/btsKFduFVfW/zEq5OnXrnLkjX2PUZOYsK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qN7UI/btsKFduFVfW/zEq5OnXrnLkjX2PUZOYsK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qN7UI/btsKFduFVfW/zEq5OnXrnLkjX2PUZOYsK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqN7UI%2FbtsKFduFVfW%2FzEq5OnXrnLkjX2PUZOYsK1%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;478&quot; height=&quot;44&quot; data-filename=&quot;image (75).png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;44&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;CodeDeploy Agent Installer 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;wget &amp;lt;https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (76).png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWZ2et/btsKFMC2eOZ/QLEiPNdkenAR189isBeBu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWZ2et/btsKFMC2eOZ/QLEiPNdkenAR189isBeBu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWZ2et/btsKFMC2eOZ/QLEiPNdkenAR189isBeBu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWZ2et%2FbtsKFMC2eOZ%2FQLEiPNdkenAR189isBeBu0%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;1082&quot; height=&quot;256&quot; data-filename=&quot;image (76).png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;256&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;CodeDeploy Agent Installer 실행 &amp;rarr; CodeDeploy Agent 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;# 실행 권한 추가
sudo chmod +x install

# install 파일 실행
sudo ./install auto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (77).png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bINN6O/btsKFAXaiNl/53rFBZ4DKcRUctCXknxVv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bINN6O/btsKFAXaiNl/53rFBZ4DKcRUctCXknxVv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bINN6O/btsKFAXaiNl/53rFBZ4DKcRUctCXknxVv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbINN6O%2FbtsKFAXaiNl%2F53rFBZ4DKcRUctCXknxVv0%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;1077&quot; height=&quot;686&quot; data-filename=&quot;image (77).png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;686&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;CodeDeploy Agent 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 에디터 열기
sudo vim /etc/init.d/codedeploy-startup.sh

# 아래 내용 입력
echo 'Starting codedeploy-agent'
sudo service codedeploy-agent restart

# 저장 및 나가기
esc -&amp;gt; :wq

# 실행 권한 추가
sudo chmod +x /etc/init.d/codedeploy-startup.sh
&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;build 디렉토리 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;cd /home/ec2-user
mkdir build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (78).png&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpmxrU/btsKGSvtl1p/Si4xhsZt4Mxa0nvP4gzRmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpmxrU/btsKGSvtl1p/Si4xhsZt4Mxa0nvP4gzRmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpmxrU/btsKGSvtl1p/Si4xhsZt4Mxa0nvP4gzRmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpmxrU%2FbtsKGSvtl1p%2FSi4xhsZt4Mxa0nvP4gzRmk%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;758&quot; height=&quot;78&quot; data-filename=&quot;image (78).png&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;78&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;CodeDeploy Agent 실행 상태 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sudo service codedeploy-agent status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (79).png&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc1woC/btsKFq73V3g/f3uhLGeTgumqvaEQalvfF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc1woC/btsKFq73V3g/f3uhLGeTgumqvaEQalvfF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc1woC/btsKFq73V3g/f3uhLGeTgumqvaEQalvfF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc1woC%2FbtsKFq73V3g%2Ff3uhLGeTgumqvaEQalvfF0%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;548&quot; height=&quot;42&quot; data-filename=&quot;image (79).png&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;42&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;b&gt;3. 자동 배포 결과 확인&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (80).png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biSnQI/btsKFIghKWQ/UaiwpkiuddXqfnnEagVBZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biSnQI/btsKFIghKWQ/UaiwpkiuddXqfnnEagVBZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biSnQI/btsKFIghKWQ/UaiwpkiuddXqfnnEagVBZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiSnQI%2FbtsKFIghKWQ%2FUaiwpkiuddXqfnnEagVBZ1%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;1532&quot; height=&quot;592&quot; data-filename=&quot;image (80).png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (81).png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR4j5r/btsKFBhrei7/6EHqv2yYKDR9GgJQ7xlXZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR4j5r/btsKFBhrei7/6EHqv2yYKDR9GgJQ7xlXZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR4j5r/btsKFBhrei7/6EHqv2yYKDR9GgJQ7xlXZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR4j5r%2FbtsKFBhrei7%2F6EHqv2yYKDR9GgJQ7xlXZk%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;1532&quot; height=&quot;750&quot; data-filename=&quot;image (81).png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 푸시하면 Source, Build, Deploy 스테이지가 (진행중) &amp;rarr; (성공)으로 바뀌는 모습을 볼 수 있음&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. build 디렉토리 확인하면 GitHub &amp;rarr; EC2로 실행에 필요한 파일들이 잘 옮겨온 것을 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (82).png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cyp5D/btsKHbn3bhl/gszX1kHMUNGFlkhdukfvp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cyp5D/btsKHbn3bhl/gszX1kHMUNGFlkhdukfvp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cyp5D/btsKHbn3bhl/gszX1kHMUNGFlkhdukfvp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCyp5D%2FbtsKHbn3bhl%2FgszX1kHMUNGFlkhdukfvp1%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;713&quot; height=&quot;228&quot; data-filename=&quot;image (82).png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;228&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;b&gt;3-1. 첫번째 배포 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// 컨트롤러의 일부
@RestController
@AllArgsConstructor
public class TestController {

    @CrossOrigin(origins = &quot;*&quot;, methods = {RequestMethod.POST, RequestMethod.GET, RequestMethod.OPTIONS})
    @GetMapping
    public String home() {
		    return &quot;첫번째 버전&quot;;
    }
    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 인스턴스의 퍼블릭 IPv4DNS:8080 으로 접속한 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (83).png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqelm4/btsKG94O5Yp/lp50LRvArLXWK0zF33nxD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqelm4/btsKG94O5Yp/lp50LRvArLXWK0zF33nxD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqelm4/btsKG94O5Yp/lp50LRvArLXWK0zF33nxD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqelm4%2FbtsKG94O5Yp%2Flp50LRvArLXWK0zF33nxD1%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;651&quot; height=&quot;562&quot; data-filename=&quot;image (83).png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;562&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;b&gt;3-2. 코드 수정 후 두번째 배포 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// 컨트롤러의 일부
@RestController
@AllArgsConstructor
public class TestController {

    @CrossOrigin(origins = &quot;*&quot;, methods = {RequestMethod.POST, RequestMethod.GET, RequestMethod.OPTIONS})
    @GetMapping
    public String home() {
		    return &quot;두번째 버전&quot;;  // 이 부분 코드 수정함!
    }
    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 수정한 코드 내용을 깃헙 레포에 푸시하여 반영!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 위와 같이 파이프라인에서 (진행중) &amp;rarr; (성공) 으로 변화!&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;EC2 인스턴스의 퍼블릭 IPv4DNS:8080 으로 접속한 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (84).png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CTaFA/btsKF53vyci/M2yK8exMJ6uTDYl7rGZCk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CTaFA/btsKF53vyci/M2yK8exMJ6uTDYl7rGZCk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CTaFA/btsKF53vyci/M2yK8exMJ6uTDYl7rGZCk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCTaFA%2FbtsKF53vyci%2FM2yK8exMJ6uTDYl7rGZCk0%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;651&quot; height=&quot;567&quot; data-filename=&quot;image (84).png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;567&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;b&gt;4. 배포 단계에서 에러가 발생한 경우 (AccessDeniedException)&lt;/b&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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;sudo tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (85).png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOGtGL/btsKFleP99b/pSjDo9iJrZBsQVgSPWuiH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOGtGL/btsKFleP99b/pSjDo9iJrZBsQVgSPWuiH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOGtGL/btsKFleP99b/pSjDo9iJrZBsQVgSPWuiH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOGtGL%2FbtsKFleP99b%2FpSjDo9iJrZBsQVgSPWuiH1%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;1310&quot; height=&quot;293&quot; data-filename=&quot;image (85).png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;293&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;EC2의 보안 그룹에서 인바운드 규칙에 HTTPS 규칙 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (86).png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFsuUO/btsKGuhAOCX/LQ1LDhBnGB00PZfhgzwB50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFsuUO/btsKGuhAOCX/LQ1LDhBnGB00PZfhgzwB50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFsuUO/btsKGuhAOCX/LQ1LDhBnGB00PZfhgzwB50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFsuUO%2FbtsKGuhAOCX%2FLQ1LDhBnGB00PZfhgzwB50%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;1320&quot; height=&quot;246&quot; data-filename=&quot;image (86).png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;246&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;build 디렉토리 제거 후 재생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;# build 디렉토리 제거
rm -rf build

# build 디렉토리 재생성
mkdir build
&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;CodeDeploy Agent 중지 &amp;rarr; 배포 버전 삭제 &amp;rarr; 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# CodeDeploy Agent 중지
sudo service codedeploy-agent stop

# CodeDeploy Agent 배포 버전 삭제
sudo rm -rf /opt/codedeploy-agent/deployment-root

# CodeDeploy Agnet 시작
sudo service codedeploy-agent start

# CodeDeploy Agnet 상태 확인 (실행 중인지)
sudo service codedeploy-agent statsu
&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;AWS의 CodePipeline 콘솔에서 실패한 작업 재시도 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (87).png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTTYKM/btsKE0PwI2O/0I3kAtlkkChocxRCb85lQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTTYKM/btsKE0PwI2O/0I3kAtlkkChocxRCb85lQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTTYKM/btsKE0PwI2O/0I3kAtlkkChocxRCb85lQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTTYKM%2FbtsKE0PwI2O%2F0I3kAtlkkChocxRCb85lQK%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;440&quot; height=&quot;211&quot; data-filename=&quot;image (87).png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps/CI,CD</category>
      <category>AWS</category>
      <category>aws ci/cd</category>
      <category>AWS CICD</category>
      <category>aws codebuild</category>
      <category>aws codepipeline</category>
      <category>aws ec2 배포 자동화</category>
      <category>aws github cicd</category>
      <category>aws github 연동 배포 자동화</category>
      <category>aws 배포 자동화</category>
      <category>스프링 aws cicd</category>
      <author>공대생안씨</author>
      <guid isPermaLink="true">https://blogan99.tistory.com/153</guid>
      <comments>https://blogan99.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 12 Nov 2024 17:53:31 +0900</pubDate>
    </item>
  </channel>
</rss>