<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SU_DING_GI</title>
    <link>https://sua-su-ding-gi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 06:12:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Soonga00</managingEditor>
    <image>
      <title>SU_DING_GI</title>
      <url>https://tistory1.daumcdn.net/tistory/6633914/attach/c40cc8691bb7457bb1ae59a14e248629</url>
      <link>https://sua-su-ding-gi.tistory.com</link>
    </image>
    <item>
      <title>  로그를 보면 보인다: 우리는 어디를 먼저 최적화해야 할까?</title>
      <link>https://sua-su-ding-gi.tistory.com/53</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;  이상하게 느려진다?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알록(ALOC) 서버를 운영하면서 문득 이런 생각이 들었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금 API가 느린 건가?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;뭐가 문제지? 어디를 먼저 개선해야 하지?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 당시 상황은 이랬다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청이 느려도 로그만 보면 &lt;b&gt;느린 건지 알 수 없음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;예외는 로그로 찍히지만, &lt;b&gt;평균 응답 시간은 안 나옴&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;성능 개선을 하고 싶어도 &lt;b&gt;&quot;어디부터?&quot;&lt;/b&gt;가 막막했다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  그래서 시작했다: AOP 기반 로깅 시스템&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 고민 끝에 나온 해결책은 명확했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;성능 병목을 알고 싶으면, 먼저 전체 흐름을 로깅하자.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 로그를 찍는 수준이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 컨트롤러 API 요청의 시작과 끝을 로깅&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파라미터 값&lt;/b&gt;과 &lt;b&gt;실행 시간&lt;/b&gt;을 수집&lt;/li&gt;
&lt;li&gt;&lt;b&gt;500ms 이상 지연된 요청&lt;/b&gt;은 &lt;b&gt;디스코드 알림&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Prometheus로 수집하고, Grafana로 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 통합적인 관측 시스템을 만들기로 했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  설계 및 구현&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  AOP 적용 범위&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@Around(&quot;execution(* com.aloc.aloc..controller..*(..))&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨트롤러 전역에 적용&lt;/li&gt;
&lt;li&gt;메서드명, 파라미터, 시작/종료 시각, 소요 시간 자동 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏱ 실행 시간 측정 &amp;amp; 메트릭 저장&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;long duration = System.currentTimeMillis() - start;

meterRegistry
  .timer(&quot;api.execution.time&quot;, &quot;method&quot;, method)
  .record(duration, TimeUnit.MILLISECONDS);
&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;Micrometer를 통해 실행 시간 저장&lt;/li&gt;
&lt;li&gt;Prometheus에서 수집 가능하도록 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 슬로우 API 실시간 알림&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;if (duration &amp;gt; 500) {
  asyncWebhookNotifier.notifySlowApi(method, duration);
}
&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;비동기(@Async)로 디스코드에 슬랙 스타일 알림 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qiB4e/btsNE2bma2o/zfGWmJbWqIUakvH5Whv1Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qiB4e/btsNE2bma2o/zfGWmJbWqIUakvH5Whv1Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qiB4e/btsNE2bma2o/zfGWmJbWqIUakvH5Whv1Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqiB4e%2FbtsNE2bma2o%2FzfGWmJbWqIUakvH5Whv1Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1764&quot; height=&quot;162&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  도입 후 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 도입 전 도입 후&lt;/p&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;API별 실행 시간&lt;/td&gt;
&lt;td&gt;❌ 없음&lt;/td&gt;
&lt;td&gt;✅ 평균/최대 실행 시간 확인 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;병목 구간 식별&lt;/td&gt;
&lt;td&gt;❌ 감으로 추정&lt;/td&gt;
&lt;td&gt;✅ 데이터 기반 파악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;슬로우 요청 탐지&lt;/td&gt;
&lt;td&gt;❌ 수동 로그 검색&lt;/td&gt;
&lt;td&gt;✅ 실시간 알림 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시각화&lt;/td&gt;
&lt;td&gt;❌ 로그만 존재&lt;/td&gt;
&lt;td&gt;✅ Grafana 대시보드 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병목 API가 어디인지 명확히 보이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드에 오는 알림 덕분에 &lt;b&gt;느린 API에 실시간 대응&lt;/b&gt;이 가능해졌다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zeJQy/btsNFkQoRDV/HPt6KOF2AisbjG9h823gkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zeJQy/btsNFkQoRDV/HPt6KOF2AisbjG9h823gkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zeJQy/btsNFkQoRDV/HPt6KOF2AisbjG9h823gkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzeJQy%2FbtsNFkQoRDV%2FHPt6KOF2AisbjG9h823gkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;810&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  얻은 인사이트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ &lt;b&gt;로그는 &quot;분석 가능한 형태&quot;로 남겨야 의미가 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ 단순한 로그보다 &lt;b&gt;관측 가능한 시스템&lt;/b&gt;을 구축하는 게 훨씬 강력하다.&lt;/li&gt;
&lt;li&gt;✅ AOP는 코드 침투 없이도 서비스 전체 흐름을 파악할 수 있게 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그를 분석해서 제일 오래 걸리거나 자주 호출되는 API를 최적화 해보자!&lt;/li&gt;
&lt;li&gt;그라파나 대시보드에 더 추가해서 보면 좋을 것을 추가해보자!&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>BACK-END</category>
      <category>aop</category>
      <category>Grafana</category>
      <category>log</category>
      <category>springboot</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/53</guid>
      <comments>https://sua-su-ding-gi.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 29 Apr 2025 20:12:06 +0900</pubDate>
    </item>
    <item>
      <title>  뭐? 우리 서버가 공격 받고 있다고?</title>
      <link>https://sua-su-ding-gi.tistory.com/52</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;EC2 서버 장애 분석 및 대응 기록&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근, 알록 서버에 Grafana와 Prometheus를 활용한 모니터링 시스템을 적용해보고 있었다. 그리고 서버의 CPU 사용량, 메모리 사용량이 많아지거나 Spring 서버에서 500 에러가 발생하면, 디스코드 웹훅으로 알람을 받도록 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 어느 순간부터...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTd0d5/btsNFSMzO3N/BgONtqsEkWw2rdhxwaANRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTd0d5/btsNFSMzO3N/BgONtqsEkWw2rdhxwaANRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTd0d5/btsNFSMzO3N/BgONtqsEkWw2rdhxwaANRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTd0d5%2FbtsNFSMzO3N%2FBgONtqsEkWw2rdhxwaANRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;636&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 알림이 계속 뜨더니 알람이 resolve되지 않고 서버 도커 컨테이너(Spring 애플리케이션)가 exited 상태로 떨어지는 사건이 발생했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;처음 생각한 원인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 그냥 &quot;EC2 프리티어 스펙이 낮아서 그런가?&quot; 하고 단순하게 넘겼다. 그래서 컨테이너를 재시작했는데, &lt;b&gt;두 번째&lt;/b&gt; 반복될 때 느낌이 이상했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이거 진짜 문제가 있는 거 같은데? 제대로 원인 파악해보자.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 원인 분석을 시작했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Spring 서버 로그 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 컨테이너 안에서 Spring 로그를 확인했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJeRUM/btsNE9uMuQY/OupH3Hxjeu2NBuohkMSzrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJeRUM/btsNE9uMuQY/OupH3Hxjeu2NBuohkMSzrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJeRUM/btsNE9uMuQY/OupH3Hxjeu2NBuohkMSzrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJeRUM%2FbtsNE9uMuQY%2FOupH3Hxjeu2NBuohkMSzrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;64&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발견된 에러: HikariCP - housekeeper - Thread starvation or clock leap detected&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 에러는 다음을 의미한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Thread starvation&lt;/b&gt;: 스레드가 부족하거나 CPU가 바빠서 housekeeper 스케줄링이 밀렸다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Clock leap&lt;/b&gt;: 시스템 시간이 비정상적으로 튀었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 로그에서는 &quot;50초&quot;, &quot;7분 24초&quot; 정도 housekeeper가 밀렸다고 나온다. 30초 주기 작업이 이 정도 밀렸다면 서버에 무슨 문제가 있었다는 뜻이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의심했던 원인들&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버 CPU, 메모리 과부하&lt;/li&gt;
&lt;li&gt;GC Stop-the-World 발생&lt;/li&gt;
&lt;li&gt;서버 시간 변경 (NTP 동기화)&lt;/li&gt;
&lt;li&gt;디스크 I/O 과부하&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NTP 시간 동기화&lt;/b&gt;로 7분이 튈 리 없다고 생각했다. 그래서 1번, CPU/메모리 문제에 집중해서 보게 됐다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 서버 상태 모니터링&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. Grafana 대시보드 확인&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csSSDb/btsNE99pzwD/t8AiLHQcp5pykCoIfTWjXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csSSDb/btsNE99pzwD/t8AiLHQcp5pykCoIfTWjXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csSSDb/btsNE99pzwD/t8AiLHQcp5pykCoIfTWjXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsSSDb%2FbtsNE99pzwD%2Ft8AiLHQcp5pykCoIfTWjXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1463&quot; height=&quot;795&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u3YgP/btsNFstQn2L/8tUy6HIjCvKBhPw4XoBTzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u3YgP/btsNFstQn2L/8tUy6HIjCvKBhPw4XoBTzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u3YgP/btsNFstQn2L/8tUy6HIjCvKBhPw4XoBTzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu3YgP%2FbtsNFstQn2L%2F8tUy6HIjCvKBhPw4XoBTzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;406&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;406&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;CPU 사용량: 0%~5% (거의 사용 안 함)&lt;/li&gt;
&lt;li&gt;JVM Heap/Non-Heap 메모리: 충분히 여유 있음&lt;/li&gt;
&lt;li&gt;JVM Thread 수: 약 25개 (정상)&lt;/li&gt;
&lt;li&gt;GC 상태:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Minor GC만 간간히 발생 (정상 범위)&lt;/li&gt;
&lt;li&gt;Full GC는 거의 없음&lt;/li&gt;
&lt;li&gt;GC Pause 시간도 5~10ms 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;서버 애플리케이션(Spring)은 문제 없어 보인다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. EC2 시스템 로그 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dmesg 명령어로 시스템 로그를 확인했더니...&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;Out of memory: Killed process 259723 (java)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM 프로세스가 &lt;b&gt;메모리 부족(OOM)&lt;/b&gt; 으로 강제 종료됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 journalctl -xe 로그를 보니&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;systemd-journald: Under memory pressure, flushing caches
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 전체가 메모리 압박을 받고 있었다는 사실도 확인했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. CloudWatch 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS EC2 모니터링 지표를 확인했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 사용률: 99% 이상 급등&lt;/li&gt;
&lt;li&gt;네트워크 트래픽: 입출력 급증&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVgmH/btsNFr2NDyX/4m6MKbwWbIPZ16NsuR9ad0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVgmH/btsNFr2NDyX/4m6MKbwWbIPZ16NsuR9ad0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVgmH/btsNFr2NDyX/4m6MKbwWbIPZ16NsuR9ad0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVgmH%2FbtsNFr2NDyX%2F4m6MKbwWbIPZ16NsuR9ad0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;729&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;외부에서 트래픽이 엄청나게 몰려왔다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 비정상 트래픽 분석 (Nginx Access Log)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 최근 HTTP 요청 확인&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;sudo cat /var/log/nginx/access.log | tail -n 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 보니 이상한 요청들이 엄청 많이 들어왔다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 이상 요청 패턴 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 경로 설명 의심 행위&lt;/p&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;/.git/objects/info/&lt;/td&gt;
&lt;td&gt;Git 리포지토리 정보 탐색&lt;/td&gt;
&lt;td&gt;소스코드 유출 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/.env&lt;/td&gt;
&lt;td&gt;환경변수 파일 접근 시도&lt;/td&gt;
&lt;td&gt;DB 비번 탈취 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/cgi-bin/../bin/sh&lt;/td&gt;
&lt;td&gt;시스템 명령어 실행 경로 접근&lt;/td&gt;
&lt;td&gt;리모트 코드 실행(RCE) 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php&lt;/td&gt;
&lt;td&gt;PHP 취약점 공격&lt;/td&gt;
&lt;td&gt;원격 명령 실행 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 IP에서 지속적으로 공격 시도가 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 공격 IP 목록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소 주요 행위&lt;/p&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;195.211.191.76&lt;/td&gt;
&lt;td&gt;.git 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78.153.140.158&lt;/td&gt;
&lt;td&gt;.env 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;223.130.11.165&lt;/td&gt;
&lt;td&gt;RCE 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 보안 강화 조치 (1차)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 악성 IP 차단&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 악성 IP 차단
deny 195.211.191.76;
deny 78.153.140.158;
deny 223.130.11.165;
allow all;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 악성 IP 차단 완료&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 민감 경로 차단&lt;/h3&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;location ~* /\\.(git|env|htaccess|htpasswd) {
    deny all;
}

location ~* (eval-stdin|phpinfo|vendor) {
    deny all;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ .git, .env, vendor/ 등 접근 차단&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 요청 속도 제한&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

server {
    location / {
        limit_req zone=one burst=20 nodelay;
        proxy_pass &amp;lt;http://127.0.0.1:8080&amp;gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 1초에 10회 요청 제한 (봇 공격 방어)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 타임아웃 설정&lt;/h3&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 요청 지연 공격(슬로우로리스) 방어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그 결과,&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLn4ku/btsNFmHqu8W/QkcBh10H2YxbLaO5QMtcw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLn4ku/btsNFmHqu8W/QkcBh10H2YxbLaO5QMtcw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLn4ku/btsNFmHqu8W/QkcBh10H2YxbLaO5QMtcw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLn4ku%2FbtsNFmHqu8W%2FQkcBh10H2YxbLaO5QMtcw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;742&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxmwC/btsNER80yn1/eisxhJgkX38gq5PQUDfDcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxmwC/btsNER80yn1/eisxhJgkX38gq5PQUDfDcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxmwC/btsNER80yn1/eisxhJgkX38gq5PQUDfDcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxmwC%2FbtsNER80yn1%2FeisxhJgkX38gq5PQUDfDcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;861&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;861&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 아직 부족한 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 적용 후에도&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 IP로 계속 스캐닝 공격이 발생하고 있음&lt;/li&gt;
&lt;li&gt;nginx 차단만으로는 완벽 방어 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음 단계로 &lt;b&gt;fail2ban&lt;/b&gt; 적용을 준비 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fail2ban은 nginx 로그를 분석해서 비정상 요청을 자동으로 감지하고, 방화벽(IP 차단)을 걸어주는 도구다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 목표: fail2ban으로 자동 차단 시스템 구축하기!  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순한 모니터링만으로는 서버를 지킬 수 없다.&lt;/li&gt;
&lt;li&gt;자동 방어 시스템이 반드시 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;는 걸 제대로 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 &lt;b&gt;nginx + fail2ban&lt;/b&gt; 조합으로 더 튼튼한 서버를 만들 예정이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가로 디스코드로 오는 웹훅으로 바로 어떤 경고인지 알면 좋을 것 같아서 각 경고 규칙마다 커스텀해서 디스코드로 오도록 수정했다!&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>INFRA</category>
      <category>AWS</category>
      <category>DDos</category>
      <category>Grafana</category>
      <category>nginx</category>
      <category>Prometheus</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/52</guid>
      <comments>https://sua-su-ding-gi.tistory.com/52#entry52comment</comments>
      <pubDate>Tue, 29 Apr 2025 19:51:47 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 3. CI/CD 코드 및 여러 설정 파일 수정하기</title>
      <link>https://sua-su-ding-gi.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sua-su-ding-gi.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.06 - [INFRA] - [AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 2. EC2 인스턴스 생성하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738805204525&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 2. EC2 인스턴스 생성하기&quot; data-og-description=&quot;2025.02.04 - [INFRA] - [AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업&amp;nbsp;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업기존에 운영하던 알고리즘&quot; data-og-host=&quot;sua-su-ding-gi.tistory.com&quot; data-og-source-url=&quot;https://sua-su-ding-gi.tistory.com/50&quot; data-og-url=&quot;https://sua-su-ding-gi.tistory.com/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cit6sR/hyYcfjACb6/aBAAoI5vHl5HkvtbjkGrn0/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/j6xek/hyYciHoIoC/moKkjQA9RvupdJGa8gkvnK/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227&quot;&gt;&lt;a href=&quot;https://sua-su-ding-gi.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sua-su-ding-gi.tistory.com/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cit6sR/hyYcfjACb6/aBAAoI5vHl5HkvtbjkGrn0/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/j6xek/hyYciHoIoC/moKkjQA9RvupdJGa8gkvnK/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 2. EC2 인스턴스 생성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2025.02.04 - [INFRA] - [AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업&amp;nbsp;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업기존에 운영하던 알고리즘&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sua-su-ding-gi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 EC2와 RDS 연결까지 완료했었다. 원래 우리는 깃 action을 통해 CI/CD를 구현해놨지만 내가 그 설정을 담당하지 않았어서.. 처음 부터 다시 공부하면서 EC2 서버에 배포할 수 있도록 설정해 보겠다!&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;1. CI/CD란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI(Continuous Integration)/CD(Continuous Deployment)는 소프트웨어 개발 및 배포를 자동화하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD를 적용하면 코드 변경이 자동으로 테스트 되고, 빌드되며, 배포까지 자동으로 이루어질 수 있기 때문에 이를 통해 개발 속도를 높이고, 오류를 줄이며, 운영 효율성을 개선할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-1. CI(Continuous Integration, 지속적 통합)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI는 코드 변경이 생길 때마다 자동으로 테스트하고 빌드하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ CI의 핵심 목표&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 변경 사항을 빠르게 검증하여 오류를 미리 발견&lt;/li&gt;
&lt;li&gt;여러 개발자가 동시에 작업하더라도 코드 충돌을 최소화&lt;/li&gt;
&lt;li&gt;자동화된 테스트로 안정적인 코드 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ CI 동작 방식&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 변경 사항을 Git에 푸시&lt;/li&gt;
&lt;li&gt;Github Actions, Jenkis, GitLab CI/CD같은 CI 서버가 자동으로 실행&lt;/li&gt;
&lt;li&gt;코드가 자동으로 빌드되고, 테스트 실행&lt;/li&gt;
&lt;li&gt;테스트를 통과하면 배포를 준비, 실패하면 즉시 개발자에게 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-2. CD(Continuous Deployment, 지속적 배포)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD는 CI이후, 테스트를 통과한 코드를 자동으로 서버에 배포하는 과정이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CD는 Continuous Deployment라는 지속적 배포외에도 추가로 Continuous Delivery라는 지속적 전달 방식도 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Continuous Delivery(지속적 전달)
&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;일반적으로 &quot;배포 버튼&quot;을 눌러야 실제 서버에 반영됨&lt;/li&gt;
&lt;li&gt;대기업에서는 주로 이 방식을 사용하여 실수를 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Continuous Deployment(지속적 배포)
&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;스타트업이나 DevOps 환경에서 많이 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;CD의 핵심 목표&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드가 안전하게 배포될 준비가 되었는지 확인&lt;/li&gt;
&lt;li&gt;배포 프로세스를 자동화하여 운영 부담 감소&lt;/li&gt;
&lt;li&gt;코드 변경이 빠르게 실제 서비스에 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;CD에서 수행하는 작업 (aloc 웹서버 기준)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CI 단계를 통과한 코드르 자동으로 Docker 이미지로 빌드&lt;/li&gt;
&lt;li&gt;Docker 이미지를 업로드&lt;/li&gt;
&lt;li&gt;EC2 서버에서 최신 Docker 이미지를 받아 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.&amp;nbsp; CI/CD 스크립트 및 EC2 서버 초기 설정하기&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1. CI/CD 스크립트 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 우리 CI 관련 스크립트는 프로젝트 폴더에 .github/workflows/gradle.yml에 작성되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 lightsail로 사용하고 있어서 PostgreSQL을 로컬로 설치하고 있었는데, 이제는 RDS를 사용해야 하므로 해당 내용을 수정해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ application.yml 수정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml의 db관련 설정(url, username, password) 정보를 반영한다.&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;그외에는 gradle.yml을 그대로 사용해도 되기때문에 특별한 수정은 안했다.&lt;/p&gt;
&lt;pre id=&quot;code_1738820816855&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: CI

on:
  push:
    branches: [ &quot;main&quot; ]
  pull_request:
    branches: [ &quot;main&quot; ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Make gradlew executable
      run: chmod +x gradlew

    - name: Cache Gradle packages
      uses: actions/cache@v3
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
        restore-keys: ${{ runner.os }}-gradle-

    - name: Create application.yml
      run: |
        mkdir -p ./src/main/resources
        cd ./src/main/resources
        echo &quot;${{ secrets.APPLICATION }}&quot; base64 -d &amp;gt; application.yml
        echo &quot;${{ secrets.JWT_APPLICATION }}&quot; base64 -d &amp;gt; application-jwt.yml
        echo &quot;${{ secrets.TEST_APPLICATION }}&quot; base64 -d &amp;gt; application-test.yml

    - name: Install PostgreSQL client
      run: sudo apt-get install -y postgresql-client

    - name: Build with Gradle Wrapper
      run: ./gradlew build --parallel --daemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ CD 스크립트를 수정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 CD 관련 스크립트는 프로젝트 폴더에 .github/workflows/deploy.yml에 작성되어있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드에 수정해야될 점은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CI/CD 스크립트로 수정 및 작업 분리&lt;/li&gt;
&lt;li&gt;lightsail 에서 EC2로변경&lt;/li&gt;
&lt;li&gt;EC2에서는 필요없는 네트워크 설정을 제거&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다. 따라서 해당 수정사항을 반영해서&lt;/p&gt;
&lt;pre id=&quot;code_1738820908690&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: CI/CD

on:
  push:
    branches: [ &quot;develop&quot; ]  # develop 브랜치에 푸시되면 실행

jobs:
  build:
    name: CI - Build &amp;amp; Test
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4

      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Make gradlew executable
        run: chmod +x gradlew

      - name: Cache Gradle packages
        uses: actions/cache@v3
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle-

      - name: Create application.yml
        run: |
          mkdir -p ./src/main/resources
          cd ./src/main/resources
          echo &quot;${{ secrets.APPLICATION }}&quot; base64 -d &amp;gt; application.yml
          echo &quot;${{ secrets.JWT_APPLICATION }}&quot; base64 -d &amp;gt; application-jwt.yml
          echo &quot;${{ secrets.TEST_APPLICATION }}&quot; base64 -d &amp;gt; application-test.yml

      - name: Install PostgreSQL client
        run: sudo apt-get install -y postgresql-client

      - name: Build with Gradle Wrapper
        run: ./gradlew build --parallel --daemon

      - name: Save JAR Artifact
        uses: actions/upload-artifact@v4
        with:
          name: built-jar
          path: build/libs/*.jar

  deploy:
    name: CD - Deploy to EC2
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source code
        uses: actions/checkout@v4

      - name: Download JAR Artifact
        uses: actions/download-artifact@v4
        with:
          name: built-jar
          path: build/libs/

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/aloc-spring:latest

      #   SSH 키 설정 (base64 디코딩 없이 원본 그대로 저장)
      - name: Setup SSH Key
        run: |
          echo &quot;${{ secrets.EC2_SSH_KEY }}&quot; &amp;gt; key.pem  #   디코딩 없이 저장
          chmod 600 key.pem

      # ✅ SSH 연결 테스트
      - name: Test SSH Connection
        run: ssh -i key.pem -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} &quot;echo '✅ SSH 연결 성공!'&quot;

      # ✅ SSH 실행 시 key_path 사용
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key_path: key.pem  #   key_path로 직접 지정
          script: |
            echo &quot;  Starting Deployment on EC2...&quot;
            docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}

            echo &quot;  Stopping and removing old container...&quot;
            if [ &quot;$(docker ps -q -f name=aloc-spring)&quot; ]; then
              docker stop aloc-spring
              docker rm aloc-spring
            fi

            echo &quot;  Pulling the latest image...&quot;
            docker pull ${{ secrets.DOCKER_USERNAME }}/aloc-spring:latest | exit 1

            echo &quot;  Running new container...&quot;
            docker run -d --name aloc-spring \
              -e TZ=Asia/Seoul \
              -p 8080:8080 \
              -v /home/ubuntu/upload/user:/app/upload \
              ${{ secrets.DOCKER_USERNAME }}/aloc-spring:latest

            echo &quot;✅ Deployment completed!&quot;

      - name: Send deployment status to Discord
        if: success()
        uses: tsickert/discord-webhook@v5.3.0
        with:
          webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
          content: |
            [aloc-spring]
              배포가 성공적으로 완료되었어요!
            커밋한 사람   ${{ github.actor }}
            ${{ github.event.head_commit.message }}

      - name: Send deployment failure to Discord
        if: failure()
        uses: tsickert/discord-webhook@v5.3.0
        with:
          webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
          content: |
            [aloc-spring]
            ❌ 배포 중 문제가 발생했어요!
            확인이 필요합니다.  
            잘못한 사람   ${{ github.actor }}
            URL: https://github.com/ALOC-UOS/aloc-backend/actions/runs/${{ github.run_id }}
            ${{ github.event.head_commit.message }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 수정해주고 github setting에서 secrets를 업데이트 해줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2. EC2 초기 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후, EC2의 보안 그룹에 가서 22, 80, 443, 8080 포트를 개방해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에 접속해 docker 와 docker-compose를 설치해준다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 develop 브랜치에 push 해주면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qfjwg/btsL9buzWjy/8OpNOSkwqRDR7W8nzCC4Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qfjwg/btsL9buzWjy/8OpNOSkwqRDR7W8nzCC4Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qfjwg/btsL9buzWjy/8OpNOSkwqRDR7W8nzCC4Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQfjwg%2FbtsL9buzWjy%2F8OpNOSkwqRDR7W8nzCC4Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;798&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜잔 완성이다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 DNS에 EC2 퍼블릭 ip 등록하고 Nginx 사용해서 ssl 설정까지 해주면 진짜 완성~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 ssl 인증서 등록하는 것도 작성하려 했지만.. 너무 지친 관계로 작성하지 못했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 되게 오래걸렸지만 다음에 또 이런 설정을 하게되면 순차적으로 잘 할 수 있을 것 같다!&lt;/p&gt;</description>
      <category>INFRA</category>
      <category>CD</category>
      <category>CI</category>
      <category>EC2</category>
      <category>nginx</category>
      <category>RDS</category>
      <category>SSL</category>
      <category>인증</category>
      <category>자동 배포</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/51</guid>
      <comments>https://sua-su-ding-gi.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 6 Feb 2025 17:21:51 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 2. EC2 인스턴스 생성하기</title>
      <link>https://sua-su-ding-gi.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sua-su-ding-gi.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.04 - [INFRA] - [AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738731686802&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업&quot; data-og-description=&quot;기존에 운영하던 알고리즘 웹사이트 Aloc은 개인 계정으로 운용하고 있어서 비용 문제가 발생하기 시작했기에 잠시 중단했다가, 공동 계정으로 서버를 옮기게 되면서 과정을 기록하면 좋겠다~ &quot; data-og-host=&quot;sua-su-ding-gi.tistory.com&quot; data-og-source-url=&quot;https://sua-su-ding-gi.tistory.com/49&quot; data-og-url=&quot;https://sua-su-ding-gi.tistory.com/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bull6Z/hyX7Tvwuzt/YChYhl4rtXLCdgD11l6vd1/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/W7Vfc/hyYceSpwsA/SHqv17U8LJ25BpEBdUNG20/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/GiLGX/hyX7Uuzb62/PZZr8OvN1akFpODiraGVrk/img.png?width=2320&amp;amp;height=1276&amp;amp;face=0_0_2320_1276&quot;&gt;&lt;a href=&quot;https://sua-su-ding-gi.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sua-su-ding-gi.tistory.com/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bull6Z/hyX7Tvwuzt/YChYhl4rtXLCdgD11l6vd1/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/W7Vfc/hyYceSpwsA/SHqv17U8LJ25BpEBdUNG20/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/GiLGX/hyX7Uuzb62/PZZr8OvN1akFpODiraGVrk/img.png?width=2320&amp;amp;height=1276&amp;amp;face=0_0_2320_1276');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기존에 운영하던 알고리즘 웹사이트 Aloc은 개인 계정으로 운용하고 있어서 비용 문제가 발생하기 시작했기에 잠시 중단했다가, 공동 계정으로 서버를 옮기게 되면서 과정을 기록하면 좋겠다~&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sua-su-ding-gi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 RDS에 DB 백업 복구를 완료하였으니 이제는 EC2 인스턴스를 생성해서 새로운 서버를 만들어보겠다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. EC2 인스턴스 생성하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz2Pd7/btsL7xRHMGl/00eKJTuuBFWuy0sBV84jKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz2Pd7/btsL7xRHMGl/00eKJTuuBFWuy0sBV84jKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz2Pd7/btsL7xRHMGl/00eKJTuuBFWuy0sBV84jKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz2Pd7%2FbtsL7xRHMGl%2F00eKJTuuBFWuy0sBV84jKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2094&quot; height=&quot;596&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 시작 버튼을 누르고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lLkpl/btsL7spwysp/NBTkr7WmFfiYi9O52Po2VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lLkpl/btsL7spwysp/NBTkr7WmFfiYi9O52Po2VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lLkpl/btsL7spwysp/NBTkr7WmFfiYi9O52Po2VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlLkpl%2FbtsL7spwysp%2FNBTkr7WmFfiYi9O52Po2VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1836&quot; height=&quot;1264&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;1264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu 서버가 익숙하기 때문에 ubuntu를 선택해줬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmmTBQ/btsL6JemXGV/pmjB9sue8kSArRZWoQhQ7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmmTBQ/btsL6JemXGV/pmjB9sue8kSArRZWoQhQ7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmmTBQ/btsL6JemXGV/pmjB9sue8kSArRZWoQhQ7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmmTBQ%2FbtsL6JemXGV%2FpmjB9sue8kSArRZWoQhQ7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1836&quot; height=&quot;440&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리티어를 사용할 것이기 때문에 t2.micro로 인스턴스 유형을 선택해주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/belXcK/btsL6YbeWDy/4fo3ljfU5TcewBH5YnvQPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/belXcK/btsL6YbeWDy/4fo3ljfU5TcewBH5YnvQPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/belXcK/btsL6YbeWDy/4fo3ljfU5TcewBH5YnvQPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbelXcK%2FbtsL6YbeWDy%2F4fo3ljfU5TcewBH5YnvQPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1874&quot; height=&quot;372&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키페어를 새로 생성해줬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwkFrW/btsL7eThUpW/SCYXuA4Z9rvinbtpx1Aj71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwkFrW/btsL7eThUpW/SCYXuA4Z9rvinbtpx1Aj71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwkFrW/btsL7eThUpW/SCYXuA4Z9rvinbtpx1Aj71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwkFrW%2FbtsL7eThUpW%2FSCYXuA4Z9rvinbtpx1Aj71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1858&quot; height=&quot;1024&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 네트워크 설정은 rds랑 같은 보안그룹을 선택해줬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6c0FE/btsL7pl4wkM/Y97Scg4CKPkWRkm0q6IWlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6c0FE/btsL7pl4wkM/Y97Scg4CKPkWRkm0q6IWlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6c0FE/btsL7pl4wkM/Y97Scg4CKPkWRkm0q6IWlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6c0FE%2FbtsL7pl4wkM%2FY97Scg4CKPkWRkm0q6IWlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;644&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 인스턴스 시작을 눌러주면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmhHP6/btsL7x5jIqS/Czt6IHMOqk5sQtnNN21Abk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmhHP6/btsL7x5jIqS/Czt6IHMOqk5sQtnNN21Abk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmhHP6/btsL7x5jIqS/Czt6IHMOqk5sQtnNN21Abk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmhHP6%2FbtsL7x5jIqS%2FCzt6IHMOqk5sQtnNN21Abk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2156&quot; height=&quot;1120&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 성공이 뜬다 이제 RDS 데이터 베이스 연결을 해보자&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. EC2와 RDS 보안그룹 추가하여 연결하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS 데이터 베이스 연결 버튼을 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SrEHn/btsL9JXPC2u/uVSpxQrFhKuL4gmi4bgK70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SrEHn/btsL9JXPC2u/uVSpxQrFhKuL4gmi4bgK70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SrEHn/btsL9JXPC2u/uVSpxQrFhKuL4gmi4bgK70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSrEHn%2FbtsL9JXPC2u%2FuVSpxQrFhKuL4gmi4bgK70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;1210&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1210&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;이런 화면이 뜨고 나는 postgreSQL을 쓰므로 인스턴스를 선택하면 내가 생성한 데이터베이스가 뜬다 연결버튼을 눌러주면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kM3Hf/btsL8JkekKt/18jZ7kzbg6CMGwJ9QlMj70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kM3Hf/btsL8JkekKt/18jZ7kzbg6CMGwJ9QlMj70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kM3Hf/btsL8JkekKt/18jZ7kzbg6CMGwJ9QlMj70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkM3Hf%2FbtsL8JkekKt%2F18jZ7kzbg6CMGwJ9QlMj70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;374&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 성공이 뜬다! 자동으로 보안그룹을 추가해서 연결해줌으로 쉽게 해결할 수 있다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 쉘로 직접 EC2 인스턴스에 접속하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMXmc1/btsL87LExs1/ztcUimlV1BPPeDjK3m2vp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMXmc1/btsL87LExs1/ztcUimlV1BPPeDjK3m2vp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMXmc1/btsL87LExs1/ztcUimlV1BPPeDjK3m2vp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMXmc1%2FbtsL87LExs1%2FztcUimlV1BPPeDjK3m2vp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1548&quot; height=&quot;336&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 선택하고 연결 버튼을 눌러주면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAj5cJ/btsL9ntUTes/QZONrSTBLkzpjEzVMjLP2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAj5cJ/btsL9ntUTes/QZONrSTBLkzpjEzVMjLP2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAj5cJ/btsL9ntUTes/QZONrSTBLkzpjEzVMjLP2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAj5cJ%2FbtsL9ntUTes%2FQZONrSTBLkzpjEzVMjLP2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1864&quot; height=&quot;948&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하단에 아주 상세하게 방법이 나와있다 해당 방법을 그대로 쉘에서 입력해주면 접속할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 접속이 안되면, 보안그룹에서 22번포트(ssh)를 추가했는지 확인해봐야 한다!&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;이렇게 하면 EC2 인스턴스 생성이 완료 된 것이다. 다음은 CI/CD 코드와 여러가지 yml파일, build 파일 등을 다 수정해 보겠다~&lt;/p&gt;</description>
      <category>INFRA</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>ec2 rds 연결</category>
      <category>EC2 인스턴스 생성</category>
      <category>서버</category>
      <category>프리티어</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/50</guid>
      <comments>https://sua-su-ding-gi.tistory.com/50#entry50comment</comments>
      <pubDate>Thu, 6 Feb 2025 10:24:28 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 기존 서버에서 새로운 서버로 마이그레이션 하기 - 1. RDS 생성 및 백업</title>
      <link>https://sua-su-ding-gi.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 운영하던 알고리즘 웹사이트 Aloc은 개인 계정으로 운용하고 있어서 비용 문제가 발생하기 시작했기에 잠시 중단했다가, 공동 계정으로 서버를 옮기게 되면서 과정을 기록하면 좋겠다~ 싶어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. RDS 복구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. EC2 인스턴스 생성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 기존 CI/CD 코드에 변경 사항 적용해서 서버 키기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 단계별로 구현해보려한다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. RDS 생성하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdLZqs/btsL4HUpzzE/MVxljLmIfWzquUpknkdAY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdLZqs/btsL4HUpzzE/MVxljLmIfWzquUpknkdAY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdLZqs/btsL4HUpzzE/MVxljLmIfWzquUpknkdAY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdLZqs%2FbtsL4HUpzzE%2FMVxljLmIfWzquUpknkdAY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1276&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 백업 파일을 스냅샷으로 받은게 아니라서 일단은! RDS 인스턴스부터 생성해보겠다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oYqz3/btsL5BGngtV/7z5kK3kk5EMNCGrjPxBxwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oYqz3/btsL5BGngtV/7z5kK3kk5EMNCGrjPxBxwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oYqz3/btsL5BGngtV/7z5kK3kk5EMNCGrjPxBxwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoYqz3%2FbtsL5BGngtV%2F7z5kK3kk5EMNCGrjPxBxwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;498&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS에 들어가서 새로운 데이터베이스를 생성해주고,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mS4t1/btsL4c1642C/ohwdOxbyHmv4VPNEfbRyGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mS4t1/btsL4c1642C/ohwdOxbyHmv4VPNEfbRyGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mS4t1/btsL4c1642C/ohwdOxbyHmv4VPNEfbRyGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmS4t1%2FbtsL4c1642C%2FohwdOxbyHmv4VPNEfbRyGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1128&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 PostgreSQL을 사용했어서 PostgreSQL 엔진을 선택해줬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kt3Fw/btsL4514RTE/OY9nzcH0IFeCJVc4QzseqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kt3Fw/btsL4514RTE/OY9nzcH0IFeCJVc4QzseqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kt3Fw/btsL4514RTE/OY9nzcH0IFeCJVc4QzseqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKt3Fw%2FbtsL4514RTE%2FOY9nzcH0IFeCJVc4QzseqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1128&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿은 프리티어를 선택하여 추가로 내는 비용 없이 사용할 수 있도록 하는데, 이때 추후 엔진 버전을 활용해 파라미터 그룹을 만들어야하기 때문에 엔진 버전을 기억해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj9rzU/btsL4LXeh28/h5hOKVbWBgIouvHBGNyTQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj9rzU/btsL4LXeh28/h5hOKVbWBgIouvHBGNyTQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj9rzU/btsL4LXeh28/h5hOKVbWBgIouvHBGNyTQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj9rzU%2FbtsL4LXeh28%2Fh5hOKVbWBgIouvHBGNyTQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1236&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 식별자나 자격 증명은 기존에 사용했던대로 그대로 옮겨줬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/40h9Y/btsL5QwBLng/exSszyw9ZVZaegbiIcI2zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/40h9Y/btsL5QwBLng/exSszyw9ZVZaegbiIcI2zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/40h9Y/btsL5QwBLng/exSszyw9ZVZaegbiIcI2zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F40h9Y%2FbtsL5QwBLng%2FexSszyw9ZVZaegbiIcI2zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1208&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리티어를 선택했기때문에 인스턴스나 스토리지 값은 기본값을 유지했고,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q0x3o/btsL45VksUS/2jy9jYQTHaBilCu2o3NXs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q0x3o/btsL45VksUS/2jy9jYQTHaBilCu2o3NXs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q0x3o/btsL45VksUS/2jy9jYQTHaBilCu2o3NXs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0x3o%2FbtsL45VksUS%2F2jy9jYQTHaBilCu2o3NXs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;278&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 과금이 되지 않도록 스토리지 자동 조정 활성화를 해제했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brs5n1/btsL4zJzQWp/g7MVlpqOQwFvLHeIGG58j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brs5n1/btsL4zJzQWp/g7MVlpqOQwFvLHeIGG58j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brs5n1/btsL4zJzQWp/g7MVlpqOQwFvLHeIGG58j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrs5n1%2FbtsL4zJzQWp%2Fg7MVlpqOQwFvLHeIGG58j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1160&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후에, 아직 EC2를 생성하지 않았기 때문에 EC2컴퓨팅 리소스에 연결하지 않고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfHRiI/btsL6a9vSGS/0ZqdHRpJLXURY0mPyjVWi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfHRiI/btsL6a9vSGS/0ZqdHRpJLXURY0mPyjVWi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfHRiI/btsL6a9vSGS/0ZqdHRpJLXURY0mPyjVWi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfHRiI%2FbtsL6a9vSGS%2F0ZqdHRpJLXURY0mPyjVWi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1108&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2를 생성하기 전에 로컬에서 DB에 직접 연결해서 백업 데이터를 복구하고 로컬에서 잘 접속이 되는지 확인할 예정이기 때문에 퍼블릭 엑세스를 &lt;b&gt;&quot;예&quot;&lt;/b&gt;로 바꿔주고 나머지는 기본 값을 유지해줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vjas9/btsL6b8nBrN/FJv4XKQq6Cq2CETHy8Qar1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vjas9/btsL6b8nBrN/FJv4XKQq6Cq2CETHy8Qar1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vjas9/btsL6b8nBrN/FJv4XKQq6Cq2CETHy8Qar1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvjas9%2FbtsL6b8nBrN%2FFJv4XKQq6Cq2CETHy8Qar1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;1238&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1238&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANQx8/btsL58KCxFG/GE2yR5VEEzC6Sq3X1R1yk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANQx8/btsL58KCxFG/GE2yR5VEEzC6Sq3X1R1yk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANQx8/btsL58KCxFG/GE2yR5VEEzC6Sq3X1R1yk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANQx8%2FbtsL58KCxFG%2FGE2yR5VEEzC6Sq3X1R1yk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;766&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후에 아래 데이터베이스 생성을 누르면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bziljS/btsL6qc39Gs/1iCWJGPF5YxwC8YrQCEPw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bziljS/btsL6qc39Gs/1iCWJGPF5YxwC8YrQCEPw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bziljS/btsL6qc39Gs/1iCWJGPF5YxwC8YrQCEPw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbziljS%2FbtsL6qc39Gs%2F1iCWJGPF5YxwC8YrQCEPw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2264&quot; height=&quot;362&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 데이터베이스가 생성된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. RDS 초기 필수 설정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AeeNT/btsL4dtfHSZ/RcU5t43bHtr39I4NLv3Up1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AeeNT/btsL4dtfHSZ/RcU5t43bHtr39I4NLv3Up1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AeeNT/btsL4dtfHSZ/RcU5t43bHtr39I4NLv3Up1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeeNT%2FbtsL4dtfHSZ%2FRcU5t43bHtr39I4NLv3Up1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2264&quot; height=&quot;676&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 새로운 파라미터그룹을 생성해야한다! 우측의 버튼을 눌러 새로운 파라미터 그룹을 생성하여&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clNUJc/btsL4ZVjc2q/keC63fQJQewFsYoNficeo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clNUJc/btsL4ZVjc2q/keC63fQJQewFsYoNficeo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clNUJc/btsL4ZVjc2q/keC63fQJQewFsYoNficeo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclNUJc%2FbtsL4ZVjc2q%2FkeC63fQJQewFsYoNficeo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;976&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서, 기억해두었던 엔진 버전으로 새로운 파라미터 그룹을 생성한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erwSN7/btsL5kLILVN/hYyNobqvoXQNd8sj89JBUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erwSN7/btsL5kLILVN/hYyNobqvoXQNd8sj89JBUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erwSN7/btsL5kLILVN/hYyNobqvoXQNd8sj89JBUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerwSN7%2FbtsL5kLILVN%2FhYyNobqvoXQNd8sj89JBUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;810&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 생성한 파라미터를 선택하고 작업-편집을 누르고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bih3SZ/btsL6tATvwz/EdviGPdzndGYvGOPI4BjaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bih3SZ/btsL6tATvwz/EdviGPdzndGYvGOPI4BjaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bih3SZ/btsL6tATvwz/EdviGPdzndGYvGOPI4BjaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbih3SZ%2FbtsL6tATvwz%2FEdviGPdzndGYvGOPI4BjaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;506&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;timezone을 UTC -&amp;gt; UTC+9로 바꾼 후 변경사항저장을 눌러준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 데이터 베이스로 돌아가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t2woN/btsL6lCVV6t/B1AU6UKayA6KBk4XHxKeIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t2woN/btsL6lCVV6t/B1AU6UKayA6KBk4XHxKeIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t2woN/btsL6lCVV6t/B1AU6UKayA6KBk4XHxKeIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft2woN%2FbtsL6lCVV6t%2FB1AU6UKayA6KBk4XHxKeIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;384&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만든 데이터베이스를 선택하고 수정을 눌러준 후&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V7RHj/btsL5iAk9vD/IxUmkVSFd6jztchCeNEvx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V7RHj/btsL5iAk9vD/IxUmkVSFd6jztchCeNEvx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V7RHj/btsL5iAk9vD/IxUmkVSFd6jztchCeNEvx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV7RHj%2FbtsL5iAk9vD%2FIxUmkVSFd6jztchCeNEvx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;384&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 구성에서 방금 만든 새로운 파라미터 그룹으로 교체해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 초기 설정 끝!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.&amp;nbsp; 로컬 환경에서 RDS에 접속해 기존 데이터 백업 하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YmyfD/btsL50zeTFD/At6pS568K57xS3xF6rNNIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YmyfD/btsL50zeTFD/At6pS568K57xS3xF6rNNIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YmyfD/btsL50zeTFD/At6pS568K57xS3xF6rNNIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYmyfD%2FbtsL50zeTFD%2FAt6pS568K57xS3xF6rNNIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2872&quot; height=&quot;1142&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2 - 보안그룹 - default로 들어가 인바운드 규칙을 편집해 내 로컬 PC에서도 데이터베이스에 접속할 수 있도록 규칙을 생성해주자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXlXY/btsL4GhCWXo/kYZ0vDmcWgKOyKom3pGkF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXlXY/btsL4GhCWXo/kYZ0vDmcWgKOyKom3pGkF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXlXY/btsL4GhCWXo/kYZ0vDmcWgKOyKom3pGkF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXlXY%2FbtsL4GhCWXo%2FkYZ0vDmcWgKOyKom3pGkF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2872&quot; height=&quot;925&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙 추가 버튼을 누르고 PostgreSQL을 선택하고 내 IP를 추가한 후 규칙을 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q0u3N/btsL4G2TCoI/IfGZsGdvej0k0PPbRdLOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q0u3N/btsL4G2TCoI/IfGZsGdvej0k0PPbRdLOpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q0u3N/btsL4G2TCoI/IfGZsGdvej0k0PPbRdLOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0u3N%2FbtsL4G2TCoI%2FIfGZsGdvej0k0PPbRdLOpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;1578&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 인텔리제이의 데이터 베이스 연결 탭에서&lt;br /&gt;host -&amp;gt; 엔드포인트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user -&amp;gt; 기존에 설정한 마스터 사용자 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password -&amp;gt; 기존에 설정한 마스터 사용자 이름&lt;br /&gt;database -&amp;gt; 데이터베이스 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력하고 테스트 connection을 눌렀을 때 잘 된다면 연결이 잘 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 연결이 잘된다는 것을 확인했으면 로컬에서 백업파일을 전부 실행해 보자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjfcjM/btsL5AgSYzR/GFBBZHQCgGbat0k3mKDKS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjfcjM/btsL5AgSYzR/GFBBZHQCgGbat0k3mKDKS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjfcjM/btsL5AgSYzR/GFBBZHQCgGbat0k3mKDKS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjfcjM%2FbtsL5AgSYzR%2FGFBBZHQCgGbat0k3mKDKS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1276&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 확인해보니 스키마 생성 코드(DML)은 없고 데이터 관련 코드(DDL)만 있는 상황이라 우선 Schema 파일부터 만들어주겠다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 로컬에서 사용하던 postgresql이 14버전이라 16버전으로 재설치 해준 후,&lt;/p&gt;
&lt;pre id=&quot;code_1738629712951&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pg_dump -h localhost -U postgres -d aloc --schema-only &amp;gt; schema.sql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드로 shcema 파일을 만들어줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkf85u/btsL6CLA19m/RK3eYG3Swyi60ZBhW6Rho0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkf85u/btsL6CLA19m/RK3eYG3Swyi60ZBhW6Rho0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkf85u/btsL6CLA19m/RK3eYG3Swyi60ZBhW6Rho0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkf85u%2FbtsL6CLA19m%2FRK3eYG3Swyi60ZBhW6Rho0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1994&quot; height=&quot;1242&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 파일들이 있는 폴더에 schema.sql 파일을 옮겨주고&lt;/p&gt;
&lt;pre id=&quot;code_1738630071795&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;psql -h &amp;lt;RDS_엔드포인트&amp;gt; -U &amp;lt;DB_사용자&amp;gt; -d &amp;lt;DB_이름&amp;gt; -f aloc_backup.sql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DML 코드를 실행 시켰고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XcJ4r/btsL6mbbvNN/zfl2gIoEjfcyWX15qDcSU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XcJ4r/btsL6mbbvNN/zfl2gIoEjfcyWX15qDcSU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XcJ4r/btsL6mbbvNN/zfl2gIoEjfcyWX15qDcSU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXcJ4r%2FbtsL6mbbvNN%2Fzfl2gIoEjfcyWX15qDcSU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;1240&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 추가된 것을 확인할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 이제 데이터만 복구하면 되는데... 코드르 잘보니 INSERT코드가 아니라 전부 UPDATE로만 이루어진 코드 였다.. 허허..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음 데이터쪽이라 망가지면.. 안되기 때문에.. 노가다를 조금 해보려고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관관계 고려해서 가장 말단 엔티티 코드를 GPT한테 insert 코드로 바꿔달라고 하고 하나씩 위에 코드로 실행시켜줬다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이마저도 너무 로우가 많은 테이블들은 할 수가 없어서 파이썬으로 코드 짜서 수정해줬다 ㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1907&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLthkW/btsL6six8i2/WCuQvEbp5INrK4eJTOEymk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLthkW/btsL6six8i2/WCuQvEbp5INrK4eJTOEymk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLthkW/btsL6six8i2/WCuQvEbp5INrK4eJTOEymk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLthkW%2FbtsL6six8i2%2FWCuQvEbp5INrK4eJTOEymk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1907&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1907&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짠~ 백업 성공~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>INFRA</category>
      <category>AWS</category>
      <category>postgresql</category>
      <category>RDS</category>
      <category>RDS생성</category>
      <category>spring</category>
      <category>마이그레이션</category>
      <category>백업</category>
      <category>복구</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/49</guid>
      <comments>https://sua-su-ding-gi.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 4 Feb 2025 14:15:13 +0900</pubDate>
    </item>
    <item>
      <title>RESTful API</title>
      <link>https://sua-su-ding-gi.tistory.com/46</link>
      <description>&lt;h1&gt;API&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  API란 Application Programming Interface의 약자로 프로그램을 실행하는 인터페이스이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API를 통해 프로그램에 요청을 전달하기 위한 통로 혹은 방법이다.&lt;/li&gt;
&lt;li&gt;라이브러리를 설치하고 호출하는 함수도 API이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;REST API&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  REST는 REpresentational State Transfer라는 용어의 약자로 HTTP method별로 역할 명시한 API&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;REST API 디자인 가이드&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;URL은 정보의 자원을 표현해야 한다.
&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;code&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;/members/1&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;자원의 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;GET /members/1&lt;/span&gt;&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;URL 설계 시 주의할 점&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;li&gt;URL 마지막 문자로 슬래시(/)를 포함하지 않는다.&lt;/li&gt;
&lt;li&gt;하이픈(-)은 URL 가독성을 높이는데 사용한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;불가피하게 긴 URL 경로를 사용한다면 하이픈을 사용해 가독성을 높일 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;밑줄(_)은 URL에 사용하지 않는다.
&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;/li&gt;
&lt;li&gt;URL경로에는 소문자가 적합하다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RFC 3986(URL 문법 형식)은 URL 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;파일 확장자는 URL에 포함시키지 않는다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Accept header를 사용하여 파일 명시&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;GET /members/soccer/245/photo HTTP/1.1 Host: restapi.example.com Accept: imgae/jpg&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자원을 표현하는 Collection과 Document&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Documen&lt;/b&gt;t : 문서 혹은 객체 (단수로 표현) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;Collection&lt;/b&gt; : 문서들의 집합 혹은 객체들의 집합 (복수로 표현)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 상태 코드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;200&lt;/span&gt;&lt;/code&gt; : 클라이언트의 요청을 정상적으로 수행&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;201&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; : 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨 (POST를 통한 리소스 생성 작업 시)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;400&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; : 클라이언트의 요청이 부적절 할 경우 사용하는 응답 코드&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;401&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; : 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을 때 사용하는 응답 코드
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ex) 로그인 하지 않은 유저가 로그인 했을 때, 요청 가능한 리소스를 요청했을 대&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;403&lt;/span&gt;&lt;/code&gt; : 유저 인증 상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 사용하는 응답 코드
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;403 보다는 400이나 404를 사용할 것을 권고. 403 자체가 리소스가 존재한다는 의미 내포&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;405&lt;/span&gt;&lt;/code&gt; : 클라이언트가 요청한 리소스에서는 사용 불가능한 메소드를 이용했을 경우 사용하는 응답 코드&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;301&lt;/span&gt;&lt;/code&gt; : 클라이언트가 요청한 리소스에 대한 URL이 변경되었을 때 사용하는 응답 코드
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;응답 시 Location header에 변경된 URL을 적어줘야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;500&lt;/span&gt;&lt;/code&gt; : 서버에 문제가 있을 경우 사용하는 응답 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;CRUD vs REST&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CRUD&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;img src=&quot;https://www.notion.so/icons/database_green.svg&quot; alt=&quot;https://www.notion.so/icons/database_green.svg&quot; width=&quot;33&quot; height=&quot;33&quot; /&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;CRUD는 CREATE, READ, UPDATE, DELETE의 약자로, 데이터 베이스 응용프로그램에서 실행되는 네 가지 기본 작업을 나타내는 데 사용되는 약어&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;REST&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;img src=&quot;https://www.notion.so/icons/globe_blue.svg&quot; alt=&quot;https://www.notion.so/icons/globe_blue.svg&quot; width=&quot;31&quot; height=&quot;31&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST는 클라이언트와 서버 간의 HTTP 프로토콜 인터페이스를 표준화하기 위해 만들어진 웹 API에서 널리 사용되는 디자인 스타일 중 하나&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;REST와 CRUD의 유사점&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;REST&lt;/th&gt;
&lt;th&gt;CRUD&lt;/th&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터베이스에 새 레코드 생성&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;CREATE&lt;/td&gt;
&lt;td&gt;insert 문을 통해 새 레코드 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터베이스에서 가져온 정보를 읽기&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;READ/RETRIEVE&lt;/td&gt;
&lt;td&gt;입력 매개변수를 기반으로 데이터를 가져옴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개체를 업데이트&lt;/td&gt;
&lt;td&gt;PUT/PATCH&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;td&gt;데이터를 덮어쓰지 않고 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터베이스에서 레코드 제거&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;데이터 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;REST와 CRUD의 차이점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRUD는 데이터베이스 설정에서 영구적인 기록을 하기 위한 주기이고, RESTful 아키텍처의 목표를 준수하기 위해 REST 명령에 매핑 된다&lt;/li&gt;
&lt;li&gt;즉 REST api는 표준이고, CRUD는 함수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leejincha.tistory.com/101&quot;&gt;[04] CRUD vs REST 무슨 의미인가?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@couchcoding/%EA%B0%9C%EB%B0%9C-%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-RESTful-API-%EC%84%A4%EA%B3%84-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;개발 초보를 위한 RESTful API 설계 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>BACK-END</category>
      <category>API</category>
      <category>CRUD</category>
      <category>HTTP 상태 코드</category>
      <category>REST</category>
      <category>REST API 설계</category>
      <category>restful</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/46</guid>
      <comments>https://sua-su-ding-gi.tistory.com/46#entry46comment</comments>
      <pubDate>Wed, 27 Mar 2024 11:30:13 +0900</pubDate>
    </item>
    <item>
      <title>[9663] N-Queen</title>
      <link>https://sua-su-ding-gi.tistory.com/45</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;N-Queen 문제는&amp;nbsp;크기가 N &amp;times; N인 체스판 위에 퀸 N개를&amp;nbsp;서로 공격할 수 없게 놓는&amp;nbsp;문제이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 N이 주어진다. (1 &amp;le; N &amp;lt; 15)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는&amp;nbsp;경우의 수를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;8&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;92&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; n-queen은 사이서울에서 한번 구현한 적이 있어서 이미 알고 있는 문제였다 그때는 2차원배열로 구현했어서 이번에는 인덱스를 이용해서 일차원 배열을 활용하여 n-queen을 구하려고했다. 그런데 자꾸 시간초과가 나서.. pypy로 했더니 시간초과가 나지 않는다.. 흠 어떤게 문제인지 모르겠으나 추후에 시간이 날때 pypy랑 python3의 차이를 알아봐야겠다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구현 방법은 윗행부터부터 오른쪽으로 한칸씩 배치해놨다고 가정한 후, 같은 열에 이미 queen이 있는지와 왼쪽 대각선 위, 오른쪽 대각선 위에 queen 이 있는지 검사해줬다. 2차원 배열로 그것도 c언어로 구현할때 꽤나 길게 작성했던 것 같은데 파이썬으로 짜니까 훨씬 간단했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710666091068&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(input())
queen = [0 for _ in range(n)]
cnt = 0

def is_possible(x):
    for i in range(x):
        if queen[x] == queen[i] or abs(queen[x] - queen[i]) == abs(x-i):
            return False
    return True

def n_queen(x):
    global cnt
    if x == n:
        cnt +=1
        return
    
    for y in range(n):
        queen[x] = y
        if is_possible(x):
            n_queen(x+1)
n_queen(0)
print(cnt)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING TEST/Algorithm Problem</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/45</guid>
      <comments>https://sua-su-ding-gi.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 17 Mar 2024 18:01:37 +0900</pubDate>
    </item>
    <item>
      <title>[1107] 리모컨</title>
      <link>https://sua-su-ding-gi.tistory.com/44</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수빈이가 지금 보고 있는 채널은 100번이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 &amp;le; N &amp;le; 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 &amp;le; M &amp;le; 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;5457
3
6 7 8&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;6&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 2&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;100
5
0 1 2 3 4&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 2&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 3&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-3&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;500000
8
0 2 3 4 6 7 8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 3&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-3&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;11117&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 4&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-4&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;100
3
1 0 5&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 4&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-4&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 5&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-5&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;14124
0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 5&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-5&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 6&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-6&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;1
9
1 2 3 4 5 6 7 8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 6&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-6&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 7&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-7&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;80000
2
8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 7&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-7&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;2228&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아이디어는 채널 N과의 차이의 절대값이 가장 작은 값으로 우선 이동하고 그다음 그 차이만큼 이동한 수와 그냥 100번에서 차이만큼 이동한 수 중 min 값을 출력하려고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;뭔가 처음에는 중복 순열을 이용해서 가능한 시간 복잡도를 낮추려고 했는데 괜히 더 복잡해지기만 했다.. 그래서 나중에 그냥 모든 숫자를 돌면서 가장 작은 값을 출력하도록 구현했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710663031599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(input())
m = int(input())
if m:
    broken_btn = list(map(int, input().split()))
else:
    broken_btn = []

min_cnt = abs(n-100)

for i in range(1000001):
    num = str(i)
    for j in range(len(num)):
        if int(num[j]) in broken_btn:
            break
        elif j == len(num)-1:
            min_cnt = min(min_cnt, len(num) + abs(n-i))
print(min_cnt)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING TEST/Algorithm Problem</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/44</guid>
      <comments>https://sua-su-ding-gi.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 17 Mar 2024 17:10:38 +0900</pubDate>
    </item>
    <item>
      <title>[14888] 연산자 끼워넣기</title>
      <link>https://sua-su-ding-gi.tistory.com/43</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(&amp;times;), 나눗셈(&amp;divide;)으로만 이루어져 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(&amp;times;) 1개, 나눗셈(&amp;divide;) 1개인 경우에는 총 60가지의 식을 만들 수 있다. 예를 들어, 아래와 같은 식을 만들 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+2+3-4&amp;times;5&amp;divide;6&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1&amp;divide;2+3+4-5&amp;times;6&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+2&amp;divide;3&amp;times;4-5+6&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1&amp;divide;2&amp;times;3-4+5+6&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;식의 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행해야 한다. 또, 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 C++14의 기준을 따른다. 즉, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다. 이에 따라서, 위의 식 4개의 결과를 계산해보면 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+2+3-4&amp;times;5&amp;divide;6 = 1&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1&amp;divide;2+3+4-5&amp;times;6 = 12&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+2&amp;divide;3&amp;times;4-5+6 = 5&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1&amp;divide;2&amp;times;3-4+5+6 = 7&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;N개의 수와 N-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수의 개수 N(2 &amp;le; N &amp;le; 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 &amp;le; Ai&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(&amp;times;)의 개수, 나눗셈(&amp;divide;)의 개수이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 만들 수 있는 식의 결과의 최댓값을, 둘째 줄에는 최솟값을 출력한다. 연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 또한, 앞에서부터 계산했을 때, 중간에 계산되는 식의 결과도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;2
5 6
0 0 1 0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;30
30&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 2&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;3
3 4 5
1 0 1 0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 2&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;35
17&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 3&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-3&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;6
1 2 3 4 5 6
2 1 1 1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 3&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-3&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;54
-24&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;dfs를 돌면서 남아있는 연산자의 개수를 바탕으로 모든 경우의수를 탐색하도록 코드를 작성했다. 근데 계속 예제 3에서 최댓값이 48이나와서 왜 틀렸나 하니, 처음에 div 연산 할때 몫만 필요하다길래 // 연산자를 이용해서 계산해줬는데 그렇게 구해줬을 때 -1 // 3은 -1이 나온다 하지만 문제에서 의도한 답은 0이다 따라서 -1/3을 해주고 정수형으로 캐스팅하여 div를 구해줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtg8yY/btsFPc6uL7e/zlweYjnTlgCIBK3crjGrxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtg8yY/btsFPc6uL7e/zlweYjnTlgCIBK3crjGrxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtg8yY/btsFPc6uL7e/zlweYjnTlgCIBK3crjGrxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtg8yY%2FbtsFPc6uL7e%2FzlweYjnTlgCIBK3crjGrxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;92&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d28JAn/btsFOliwQ86/Ozr3zCqRwgDrfseVmJX0f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d28JAn/btsFOliwQ86/Ozr3zCqRwgDrfseVmJX0f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d28JAn/btsFOliwQ86/Ozr3zCqRwgDrfseVmJX0f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd28JAn%2FbtsFOliwQ86%2FOzr3zCqRwgDrfseVmJX0f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;368&quot; height=&quot;58&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;58&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;pre id=&quot;code_1710463791947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
def dfs(total, i, add, sub, mult, div):
    global max_num
    global min_num
    if i == N:
        max_num = max(max_num, total)
        min_num = min(min_num, total)
        return
    
    if add:
        dfs(total + arr[i], i+1, add-1, sub, mult, div)
    if sub:
        dfs(total - arr[i], i+1, add, sub-1, mult, div)
    if mult:
        dfs(total * arr[i], i+1, add, sub, mult-1, div)
    if div:
        dfs(int(total / arr[i]), i+1, add, sub, mult, div-1)

N = int(input())
arr = list(map(int, input().split()))
op = list(map(int, input().split()))

tmp_op = []
max_num = -sys.maxsize
min_num = sys.maxsize

dfs(arr[0], 1, op[0], op[1], op[2], op[3])
print(max_num)
print(min_num)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>CODING TEST/Algorithm Problem</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/43</guid>
      <comments>https://sua-su-ding-gi.tistory.com/43#entry43comment</comments>
      <pubDate>Fri, 15 Mar 2024 09:49:59 +0900</pubDate>
    </item>
    <item>
      <title>[1182] 부분수열의 합</title>
      <link>https://sua-su-ding-gi.tistory.com/42</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 &amp;le; N &amp;le; 20, |S| &amp;le; 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 입력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;5 0
-7 -3 -2 5 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 출력 1&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;html xml&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;후아 백트래킹 첨으로 이렇게 빨리 그리고 아무런 도움 없이 푼것 같다 약간 뿌듯 tmp 배열에 각 값을 넣고 sum 함수를 이용해 원하는 값이 나오면 그때 카운트 변수를 증가시켜주는 방식으로 코드를 짰다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710377769171&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(start, tmp, s):
    global cnt
    if sum(tmp) == s and len(tmp) &amp;gt; 0:
        cnt += 1
        # print(&quot;cnt = &quot;, cnt, &quot;tmp = &quot;, tmp)
        # print()
    if start == n:
        return
    for i in range(start, n):
        tmp.append(arr[i])
        # print(i, &quot;'s append : &quot;, arr[i], &quot; tmp = &quot;, tmp)
        dfs(i+1, tmp, s)
        tmp.pop(-1)
        # print(i, &quot;'s pop : &quot;, tmp.pop(-1), &quot; tmp = &quot;, tmp)
n, s = map(int, input().split())

arr = list(map(int, input().split()))
cnt = 0
tmp = []
dfs(0, tmp,s)
print(cnt)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING TEST/Algorithm Problem</category>
      <author>Soonga00</author>
      <guid isPermaLink="true">https://sua-su-ding-gi.tistory.com/42</guid>
      <comments>https://sua-su-ding-gi.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 14 Mar 2024 09:56:15 +0900</pubDate>
    </item>
  </channel>
</rss>