<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 노트</title>
    <link>https://taek2.tistory.com/</link>
    <description>기초가 가장 중요하다</description>
    <language>ko</language>
    <pubDate>Wed, 5 Aug 2026 03:47:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>태기</managingEditor>
    <image>
      <title>개발 노트</title>
      <url>https://tistory1.daumcdn.net/tistory/4760884/attach/537df6a7e1714acab5f18939db6c73a3</url>
      <link>https://taek2.tistory.com</link>
    </image>
    <item>
      <title>[트러블슈팅] EC2 서버 멀쩡한데 서비스가 전부 안 될 때: SSL 인증서 만료였다</title>
      <link>https://taek2.tistory.com/167</link>
      <description>&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;Spring Boot + Nginx + Let&amp;rsquo;s Encrypt 환경에서 실제로 겪은 장애 복구 기록&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;1. 갑자기 서비스가 모두 안됐다&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;외주 개발을 완료한지 6개월이 지난 지금, 고객사에서 연락이 왔다.&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;저희 홈페이지 관리자 로그인이 안돼요 ㅠㅠ&lt;br /&gt;홈페이지도 안들어가져요...&lt;br /&gt;확인 한번 부탁드립니다!&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;홈페이지 확인을 해보니 데이터가 undefined로 내려오고 있고, 관리자 페이지 로그인도 500에러로 뜨고 있었다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&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;DB가 죽었나?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;서버가 내려갔나?&lt;/li&gt;
&lt;li&gt;배포를 잘못했었나?&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;근데 이상한 점이 하나 있었다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;2. 서버에 들어가보니... 다 살아있다?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;배포되어있는 AWS EC2에 접속해서 확인해봤다.&lt;/p&gt;
&lt;pre id=&quot;code_1768293481927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ps -ef | grep app.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPr3ZI/dJMcagxsC4S/LA4KPdkzHkYPg6GCgn1C1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPr3ZI/dJMcagxsC4S/LA4KPdkzHkYPg6GCgn1C1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPr3ZI/dJMcagxsC4S/LA4KPdkzHkYPg6GCgn1C1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPr3ZI%2FdJMcagxsC4S%2FLA4KPdkzHkYPg6GCgn1C1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1620&quot; height=&quot;110&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;백엔드 살아있음&lt;/p&gt;
&lt;pre id=&quot;code_1768296573302&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ss -lntp | grep java&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRDHY/dJMcacPmZCs/Kn7X3mbHzlq1eIsBd1PFt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRDHY/dJMcacPmZCs/Kn7X3mbHzlq1eIsBd1PFt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRDHY/dJMcacPmZCs/Kn7X3mbHzlq1eIsBd1PFt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRDHY%2FdJMcacPmZCs%2FKn7X3mbHzlq1eIsBd1PFt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1618&quot; height=&quot;88&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;포트도 정상&lt;/p&gt;
&lt;pre id=&quot;code_1768296618782&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -i http://127.0.0.1:8080/actuator/health&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;헬스체크도 정상 (이건 구현안되어있으면 프론트에서 호출하는 컨트롤러 URL로 체크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  DB도, 서버도, 백엔드도 멀쩡한데 서비스는 안 된다?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서부터 &quot;외부에서 들어오는 경로&quot;를 의심했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 프론트에서 호출하는 서버 API 주소로 확인해봤다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버에서 직접 호출해봤다.&lt;/p&gt;
&lt;pre id=&quot;code_1768296870663&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -i https://(api URL)/actuator/health&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하하... 범인을 찾았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;나온 에러는 다음과 같다   (해결 완료 후 글 작성하는거라 기간 만료 에러 캡처 못함)&lt;/p&gt;
&lt;pre id=&quot;code_1768297048808&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl: (60) SSL certificate problem: certificate has expired 
More details here: https://curl.se/docs/sslcerts.html 

curl failed to verify the legitimacy of the server and therefore could not 
establish a secure connection to it. To learn more about this situation 
and how to fix it, please visit the webpage mentioned above.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 원인은 SSL 인증서 완료였다&lt;/h2&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;358&quot; data-ke-size=&quot;size18&quot;&gt;일단 Nginx 설정 파일에서 인증서 위치 확인&lt;/p&gt;
&lt;pre id=&quot;code_1768297401207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nginx -T | grep ssl_certificate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhoGNQ/dJMcafyyDfK/bKjnpklx8RK4lqE9dVU9Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhoGNQ/dJMcafyyDfK/bKjnpklx8RK4lqE9dVU9Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhoGNQ/dJMcafyyDfK/bKjnpklx8RK4lqE9dVU9Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhoGNQ%2FdJMcafyyDfK%2FbKjnpklx8RK4lqE9dVU9Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1431&quot; height=&quot;241&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인증서 상태를 직접 확인해봤다&lt;/p&gt;
&lt;pre id=&quot;code_1768297735456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo openssl x509 -in /etc/letsencrypt/live/(api URL)/fullchain.pem -noout -dates&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결과 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mse6i/dJMcadHtq09/0XW0mq8hQL7hExRGIi07d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mse6i/dJMcadHtq09/0XW0mq8hQL7hExRGIi07d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mse6i/dJMcadHtq09/0XW0mq8hQL7hExRGIi07d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmse6i%2FdJMcadHtq09%2F0XW0mq8hQL7hExRGIi07d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2184&quot; height=&quot;142&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &lt;span&gt; 이미 만료됨 &lt;/span&gt;&lt;/b&gt;&lt;span&gt;(캡처는 새로 갱신한거임)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 한 줄로 모든 증상이 설명됐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;왜 이렇게 보였냐면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1408&quot; data-start=&quot;1394&quot;&gt;HTTPS 인증서 만료&lt;/li&gt;
&lt;li data-end=&quot;1430&quot; data-start=&quot;1409&quot;&gt;브라우저에서 API 요청 자체 차단&lt;/li&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1431&quot;&gt;프론트에서 데이터 전부 못 받음&lt;/li&gt;
&lt;li data-end=&quot;1478&quot; data-start=&quot;1451&quot;&gt;배열이 비어서 undefined 에러 발생&lt;/li&gt;
&lt;li data-end=&quot;1506&quot; data-start=&quot;1479&quot;&gt;결과적으로 &amp;ldquo;서비스 전체가 죽은 것처럼&amp;rdquo; 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;백엔드는 사실 아무 잘못도 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt; &lt;b&gt;여기서 잠깐&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;장애는 &lt;b&gt;서버/DB 문제보다 인증서 만료가 더 무섭다&lt;/b&gt;&lt;br /&gt;내부 테스트는 다 정상인데, 실제 사용자만 다 막히기 때문이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 해결 방법 : 인증서 갱신 + Nginx 재시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 서버는 &lt;b&gt;Nginx + Let&amp;rsquo;s Encrypt(Certbot)&lt;/b&gt; 구조다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;1️⃣ 인증서 갱신&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1768298599430&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo certbot renew&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;성공 시 :&lt;/p&gt;
&lt;pre id=&quot;code_1768298671864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Congratulations, all renewals succeeded.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ Nginx 재시작 (중요)&lt;/h3&gt;
&lt;pre id=&quot;code_1768298738169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl reload nginx
# 또는
sudo systemctl restart nginx&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 다시 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1768298805724&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -i https://(api URL)/actuator/health&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프론트 새로고침 &amp;rarr; &lt;b&gt;모든 데이터 정상 복구&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 재발 방지: 자동 갱신 설정 꼭 확인하자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 장애의 진짜 원인은&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;b&gt;Certbot 자동 갱신이 안 되어 있었던 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;타이머 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1768298894677&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl list-timers | grep certbot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;없다면 바로 추가 :&lt;/p&gt;
&lt;pre id=&quot;code_1768298909701&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 90일마다 자동 갱신된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 정리하면서 느낀점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번 장애에서 제일 무서웠던 점은 이거였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2386&quot; data-start=&quot;2379&quot;&gt;서버 정상&lt;/li&gt;
&lt;li data-end=&quot;2394&quot; data-start=&quot;2387&quot;&gt;DB 정상&lt;/li&gt;
&lt;li data-end=&quot;2406&quot; data-start=&quot;2395&quot;&gt;로그에 에러 없음&lt;/li&gt;
&lt;li data-end=&quot;2416&quot; data-start=&quot;2407&quot;&gt;헬스체크 OK&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 &lt;b&gt;서비스는 완전히 죽어 보인다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2481&quot; data-start=&quot;2444&quot; data-ke-size=&quot;size18&quot;&gt;그래서 앞으로 이런 증상이 나오면 나는 무조건 이 순서로 본다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2540&quot; data-start=&quot;2483&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2493&quot; data-start=&quot;2483&quot;&gt;서버 프로세스&lt;/li&gt;
&lt;li data-end=&quot;2504&quot; data-start=&quot;2494&quot;&gt;내부 헬스체크&lt;/li&gt;
&lt;li data-end=&quot;2519&quot; data-start=&quot;2505&quot;&gt;외부 HTTPS 호출&lt;/li&gt;
&lt;li data-end=&quot;2540&quot; data-start=&quot;2520&quot;&gt;&lt;b&gt;SSL 인증서 만료 여부&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 같은 환경이라면 꼭 체크해보자&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2590&quot; data-start=&quot;2571&quot;&gt;EC2 + Spring Boot&lt;/li&gt;
&lt;li data-end=&quot;2606&quot; data-start=&quot;2591&quot;&gt;Nginx 리버스 프록시&lt;/li&gt;
&lt;li data-end=&quot;2627&quot; data-start=&quot;2607&quot;&gt;Let&amp;rsquo;s Encrypt 사용 중&lt;/li&gt;
&lt;li data-end=&quot;2651&quot; data-start=&quot;2628&quot;&gt;&amp;ldquo;배포 안 했는데 갑자기 서비스 장애&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  이 조합이면 &lt;b&gt;인증서 만료부터 의심하는 게 정답&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번 건은 &amp;ldquo;서버가 죽은 게 아니라, &lt;b&gt;입구가 닫혀 있었던 상황&lt;/b&gt;&amp;rdquo; 이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;혹시 나처럼 &lt;b&gt;서버는 멀쩡한데 서비스가 전부 안 될 때 &lt;/b&gt;이 글이 도움이 됐으면 좋겠다.&lt;/p&gt;</description>
      <category>웹 개발/Spring&amp;amp;JPA</category>
      <category>EC2</category>
      <category>letsencrypt</category>
      <category>Nginx</category>
      <category>springboot</category>
      <category>SSL인증서만료</category>
      <category>백엔드트러블슈팅</category>
      <category>서버장애</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/167</guid>
      <comments>https://taek2.tistory.com/167#entry167comment</comments>
      <pubDate>Tue, 13 Jan 2026 19:20:23 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 왜 Java String은 조심해서 써야 할까 - JVM과 성능 관점에서</title>
      <link>https://taek2.tistory.com/166</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: center;&quot;&gt;예전에 개발 팀장으로 있을 때 인턴으로 들어와 함께 일했던 동생과 오랜만에 술자리를 가졌다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: center;&quot;&gt;근황 얘기를 하면서 내가 이직 준비중이라고 하니, &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: center;&quot;&gt;동생이 본인 회사 면접 준비 해보라면서 면접에 대한 얘기를 했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: center;&quot;&gt;본인 회사에서 주로 묻는 질문중의 예시로 한가지 질문을 해 주었다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333; text-align: center;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span&gt;Java에서 String을 사용할 때 왜 조심해야 한다고 생각하나요?&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;순간 머릿속이 복잡해졌다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;자바 개발만 5년째 하고 있지만, 막상 그 질문을 정리해서 설명하려니 선뜻 말이 나오지 않았다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&quot;String은 불변 객체라서 연산할 때마다 객체가 새로 생성되고, 그게 쌓이면 GC에 부담을 준다&quot;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;이 정도 설명밖에 하지 못했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;대답을 하고 나서도 마음 한켠이 찝찝했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;틀린 말은 아니지만, &lt;u&gt;어딘가 부족하다는 느낌&lt;/u&gt;이 계속 남았다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;String이 왜 실무와 면접에서 이렇게 자주 언급되는지,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;정말로 조심해야 할 포인트가 GC 하나뿐인지 스스로 확신이 없었기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 이 글에서는, &lt;b&gt;JVM 관점에서 Java String을 사용할 때 왜 '조심해야 한다'고 말하는지&lt;/b&gt;를 다시 정리해보려고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;막연한 성능 이슈 이야기가 아니라,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;객체 생성, 메모리 사용, 문자열 결합, 그리고 실무에서 자주 마주치는 패턴들을 중심으로 차근차근 짚어볼 예정이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;✅ String은 왜 불변(immutable)인가?&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Java에서 String이 불변 객체라는 사실은 대부분 알고 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;한 번 생성된 문자열은 내용을 바꿀 수 없고, 변경이 필요한 경우에는 항상 새로운 String 객체가 만들어진다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 설계는 단순한 구현 선택이 아니라, Java 언어와 JVM 전반에 깊게 연결된 결정이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;가장 먼저 떠올릴 수 있는 이유는 &lt;b&gt;안정성&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;String은 파일 경로, 클래스 이름, 환경 변수, 네트워크 요청, SQL, 로그 메세지 등 시스템 전반에서 광범위하게 사용된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;만약 문자열이 가변 객체였다면, 한 곳에서 수정된 문자열이 의도치 않게 다른 로직에 영향을 주는 일이 발생할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;특히 여러 스레드가 같은 문자열을 참조하는 환경에서는 문자열이 불변이라는 사실 자체가 강력한 안전장치가 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;또 하나의 중요한 이유는 &lt;b&gt;성능 최적화와 캐싱 전략&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Java에는 문자열 리터럴을 재사용하기 위한 &lt;u&gt;&lt;b&gt;String Pool&lt;/b&gt;&lt;/u&gt;이 존재한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&quot;hello&quot; 같은 리터럴은 매번 새로운 객체를 만드는 대신, 이미 존재하는 동일한 문자열을 재사용한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 방식이 가능한 이유 역시 String이 불변이기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;마지막으로, String은 HashMap의 key처럼 &lt;b&gt;hash 기반 컬렉션에서 자주 사용&lt;/b&gt;된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;불변이기 때문에 hash 값이 변하지 않고, 컬렉션의 동작이 안정적으로 유지된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;결국 String의 불변성은&lt;b&gt; 스레드 안정성, 메모리 재사용, 컬렉션 안정성&lt;/b&gt;을 동시에 만족시키기 위한 선택이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;다만 이 선택의 대가로, 문자열을 변경하는 모든 순간마다 &lt;b&gt;새로운 객체가 생성된다&lt;/b&gt;는 점을 반드시 인지하고 있어야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;✅ String 연산은 JVM 메모리에서 어떻게 동작할까?&lt;/h2&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;1️⃣ JVM 메모리 구조부터 짚고 넘어가자&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh8cJ7/dJMcacPlCOt/aC7KxgGBDcw0FKHkdB3FQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh8cJ7/dJMcacPlCOt/aC7KxgGBDcw0FKHkdB3FQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh8cJ7/dJMcacPlCOt/aC7KxgGBDcw0FKHkdB3FQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh8cJ7%2FdJMcacPlCOt%2FaC7KxgGBDcw0FKHkdB3FQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;238&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Java 애플리케이션이 실행되면, JVM은 메모리를 역할별로 나누어 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;String과 직접적으로 관련 있는 영역은 크게 &lt;b&gt;Stack&lt;/b&gt;과 &lt;b&gt;Heap&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저 &lt;b&gt;Stack 영역&lt;/b&gt;에는 메서드 호출 정보와 지역 변수, 그리고 객체를 가리키는 &lt;b&gt;참조(reference)&lt;/b&gt; 가 저장된다.&lt;br /&gt;여기에는 실제 객체 데이터가 아니라, &amp;ldquo;이 객체는 Heap의 어디에 있다&amp;rdquo;는 주소 정보만 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;반면 &lt;b&gt;Heap 영역&lt;/b&gt;은 실제 객체 인스턴스가 생성되는 공간이다.&lt;br /&gt;new String()이든, 문자열 연산의 결과든, &lt;b&gt;String 객체 자체는 모두 Heap에 생성된다.&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;857&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2uSxx/dJMcaaxecKr/ptq4tvGkckKXFjuQRV35K1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2uSxx/dJMcaaxecKr/ptq4tvGkckKXFjuQRV35K1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2uSxx/dJMcaaxecKr/ptq4tvGkckKXFjuQRV35K1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2uSxx%2FdJMcaaxecKr%2Fptq4tvGkckKXFjuQRV35K1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;218&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Heap 내부는 다시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;616&quot; data-start=&quot;548&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;582&quot; data-start=&quot;548&quot;&gt;&lt;b&gt;Young Generation&lt;/b&gt; (새로 생성된 객체)&lt;/li&gt;
&lt;li data-end=&quot;616&quot; data-start=&quot;583&quot;&gt;&lt;b&gt;Old Generation&lt;/b&gt; (오래 살아남은 객체)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;688&quot; data-start=&quot;618&quot; data-ke-size=&quot;size18&quot;&gt;으로 나뉘는데,&lt;br /&gt;문자열 연산에서 문제가 되는 객체들은 대부분 &lt;b&gt;Young 영역에 대량으로 생성됐다가 빠르게 사라진다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;2️⃣ String 객체는 JVM 메모리 어디에 생성될까?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNi93N/dJMcabJGMCg/fsPcIV4QH9t0KCmO8MpsQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNi93N/dJMcabJGMCg/fsPcIV4QH9t0KCmO8MpsQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNi93N/dJMcabJGMCg/fsPcIV4QH9t0KCmO8MpsQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNi93N%2FdJMcabJGMCg%2FfsPcIV4QH9t0KCmO8MpsQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;385&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;String은 조금 특이하다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모든 String 객체는 Heap에 생성되지만,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;그 중 일부는 &lt;b&gt;String Pool&lt;/b&gt;이라는 별도의 관리 영역에서 재사용된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HTR47/dJMcacaJ69m/vkPAFys2NrOKLFS2WlCgSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HTR47/dJMcacaJ69m/vkPAFys2NrOKLFS2WlCgSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HTR47/dJMcacaJ69m/vkPAFys2NrOKLFS2WlCgSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHTR47%2FdJMcacaJ69m%2FvkPAFys2NrOKLFS2WlCgSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;286&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;예를 들어:&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;949&quot; data-start=&quot;876&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;912&quot; data-start=&quot;876&quot;&gt;&quot;Cat&quot; 같은 문자열 리터럴 &amp;rarr; String Pool&lt;/li&gt;
&lt;li data-end=&quot;949&quot; data-start=&quot;913&quot;&gt;new String(&quot;Cat&quot;) &amp;rarr; 일반 Heap 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1021&quot; data-start=&quot;951&quot; data-ke-size=&quot;size18&quot;&gt;String Pool 역시 Heap의 일부이지만,&lt;br /&gt;&lt;b&gt;&amp;ldquo;공유 가능한 문자열만 모아둔 공간&amp;rdquo;&lt;/b&gt; 이라는 점에서 의미가 있다.&lt;/p&gt;
&lt;p data-end=&quot;1021&quot; data-start=&quot;951&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1127&quot; data-start=&quot;1023&quot; data-ke-size=&quot;size18&quot;&gt;중요한 건 이 둘 모두 &lt;b&gt;불변 객체&lt;/b&gt;라는 사실이다.&lt;br /&gt;즉, 한 번 생성된 문자열은 수정되지 않고,&lt;br /&gt;변경이 필요한 순간마다 &lt;b&gt;새로운 String 객체가 Heap에 만들어진다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;3️⃣ 이제 문자열 연산을 JVM 흐름으로 보자&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;다음과 같은 코드가 있다고 가정해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1767961201058&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String result = &quot;a&quot; + &quot;b&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 코드는 단순해 보이지만, JVM 입장에서는 다음과 같은 과정을 거친다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;먼저 컴파일러는 문자열 결합을 내부적으로 StringBuilder 기반 코드로 변환한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&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;StringBuilder 객체가 Heap에 생성되고&lt;/li&gt;
&lt;li&gt;&quot;a&quot;, &quot;b&quot;가 내부 버퍼로 복사된 뒤&lt;/li&gt;
&lt;li&gt;toString()이 호출되면서 &lt;b&gt;새로운 String 객체가 Heap에 생성된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&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;임시 객체(StringBuilder)&lt;/li&gt;
&lt;li&gt;내부 배열 복사&lt;/li&gt;
&lt;li&gt;최종 String 객체 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이라는 단계를 거친다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;❗️반복문에서 문제가 커지는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 연산이 &lt;b&gt;반복문 안&lt;/b&gt;으로 들어가는 순간, 상황이 달라진다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&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;매 반복마다 새로운 String 객체가 생성되고&lt;/li&gt;
&lt;li&gt;이전 String은 더 이상 참조되지 않아 garbege가 된다&lt;/li&gt;
&lt;li&gt;이 객체들은 대부분 Young Generation에 쌓였다가 빠르게 수거된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;결과적으로 JVM은:&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;잦은 Young GC&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;를 계속 감당하게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 &quot;String을 많이 쓰면 GC가 늘어난다&quot;는 말의 정확한 의미는,&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;String 연산이 Heap에 단명 객체를 대량으로 만들어내는 구조를 쉽게 만들기 때문&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;✅ String vs StringBuilder - 무엇이 어떻게 다를까?&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;앞에서 살펴본 것처럼, String 연산에서 문제가 되는 지점은 &lt;b&gt;불변 객체라는 특성 때문에 발생하는 반복적인 객체 생성&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 문제를 해결하기 위해 Java가 제공하는 대표적인 도구가 바로 &lt;b&gt;StringBuilder&lt;/b&gt;다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;StringBuilder&lt;/b&gt;는 &lt;b&gt;String&lt;/b&gt;과 달리 &lt;b&gt;가변 객체(mutable)&lt;/b&gt;다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;한 번 생성된 이후에도 내부 상태를 변경할 수 있고,&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;문자열을 누적하는 과정에서 &lt;b&gt;새 객체를 계속 만들지 않는다는 점&lt;/b&gt;이 가장 큰 차이점이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;1️⃣ StringBuilder는 JVM 메모리에서 어떻게 동작할까?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciEbKO/dJMcaacVDfm/P4WZtYqPkoakglrgPQsS1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciEbKO/dJMcaacVDfm/P4WZtYqPkoakglrgPQsS1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciEbKO/dJMcaacVDfm/P4WZtYqPkoakglrgPQsS1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciEbKO%2FdJMcaacVDfm%2FP4WZtYqPkoakglrgPQsS1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;342&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;StringBuilder는 내부적으로 &lt;b&gt;문자 배열(char[] 또는 byte[])을 버퍼로 유지&lt;/b&gt;한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;문자열을 추가할 때마다 새로운 객체를 만드는 대신,&lt;br /&gt;이 내부 버퍼에 내용을 계속 덧붙이는 방식으로 동작한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;691&quot; data-start=&quot;660&quot; data-ke-size=&quot;size18&quot;&gt;예를 들어, 문자열을 누적하는 코드가 있다고 가정해보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;882&quot; data-start=&quot;693&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;736&quot; data-start=&quot;693&quot;&gt;StringBuilder 객체는 &lt;b&gt;단 한 번만 Heap에 생성&lt;/b&gt;된다&lt;/li&gt;
&lt;li data-end=&quot;772&quot; data-start=&quot;737&quot;&gt;append() 호출 시, 내부 버퍼에 문자열이 추가된다&lt;/li&gt;
&lt;li data-end=&quot;809&quot; data-start=&quot;773&quot;&gt;버퍼가 부족해질 경우에만, 더 큰 배열을 새로 만들어 복사한다&lt;/li&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;810&quot;&gt;모든 작업이 끝난 뒤, toString()을 호출하면
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;882&quot; data-start=&quot;846&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;846&quot;&gt;&lt;b&gt;그 시점에 한 번만 새로운 String 객체가 생성된다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;943&quot; data-start=&quot;884&quot; data-ke-size=&quot;size18&quot;&gt;즉, 문자열을 100번 이어 붙이더라도&lt;br /&gt;중간 과정에서는 &lt;b&gt;String 객체가 계속 생기지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;945&quot; data-ke-size=&quot;size18&quot;&gt;이 점이 String 연산과 결정적으로 다른 부분이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;2️⃣ 코드로 이해하기&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt; String을 사용한 문자열 누적&lt;/p&gt;
&lt;pre id=&quot;code_1767964214329&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sampleString = &quot;Welcome&quot;;

sampleString = sampleString + &quot; everyone&quot;;
sampleString = sampleString + &quot;,&quot;;
sampleString = sampleString + &quot; how are you?&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JVM에서 실제로 벌어지는 일&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 코드는 겉보기엔 sampleString 하나만 계속 바뀌는 것처럼 보이지만, 실제로 &lt;b&gt;매 줄마다 새로운 String 객체가 생성&lt;/b&gt;된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;개념적으로는 이런 식이다:&lt;/p&gt;
&lt;pre id=&quot;code_1767964397717&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String s1 = &quot;Welcome&quot;;
String s2 = s1 + &quot; everyone&quot;;			// &quot;Welcome everyone&quot;
String s3 = s2 + &quot;,&quot;;					// &quot;Welcome everyone,&quot;
String s4 = s3 + &quot; how are you?&quot;;		// &quot;Welcome everyone, how are you?&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;s1, s2, s3, s4 &amp;rarr; &lt;b&gt;모두 다른 String 객체&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;변수 sampleString은 마지막 s4만 참조&lt;/li&gt;
&lt;li&gt;s1, s2, s3는 참조가 끊어져 &lt;b&gt;GC 대상&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt; StringBuilder를 사용한 문자열 누적&lt;/p&gt;
&lt;pre id=&quot;code_1767964750969&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;StringBuilder sampleString = new StringBuilder();

sampleString.append(&quot;Welcome&quot;);
sampleString.append(&quot; everyone&quot;);
sampleString.append(&quot;,&quot;);
sampleString.append(&quot; how are you?&quot;);

String result = sampleString.toString();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JVM 관점에서의 차이&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;StringBuilder 객체는 &lt;b&gt;한 번만 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;내부 버퍼에 문자열이 계속 추가됨&lt;/li&gt;
&lt;li&gt;중간 결과를 위한 String 객체는 생성되지 않음&lt;/li&gt;
&lt;li&gt;toString() 호출 시점에서만 &lt;b&gt;최종 String 객체 1개 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ 그래서 언제 무엇을 써야 할까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정리하면 기준은 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1636&quot; data-start=&quot;1432&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1496&quot; data-start=&quot;1432&quot;&gt;&lt;b&gt;문자열 결합이 한두 번이고, 가독성이 중요한 코드&lt;/b&gt;&lt;br /&gt;&amp;rarr; String과 + 연산을 사용해도 문제 없다&lt;/li&gt;
&lt;li data-end=&quot;1558&quot; data-start=&quot;1498&quot;&gt;&lt;b&gt;반복문 안에서 문자열을 누적하는 구조&lt;/b&gt;&lt;br /&gt;&amp;rarr; 반드시 StringBuilder를 사용하는 것이 좋다&lt;/li&gt;
&lt;li data-end=&quot;1636&quot; data-start=&quot;1560&quot;&gt;&lt;b&gt;멀티스레드 환경에서 하나의 문자열을 여러 스레드가 수정해야 하는 경우&lt;/b&gt;&lt;br /&gt;&amp;rarr; StringBuffer 또는 명시적인 동기화 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1722&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size18&quot;&gt;대부분의 문자열 관련 성능 이슈는 String 자체의 문제라기보다,&lt;br /&gt;&lt;b&gt;누적 문자열 처리에 맞지 않는 도구를 사용한 결과&lt;/b&gt;인 경우가 많다.&lt;/p&gt;
&lt;p data-end=&quot;1722&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여기까지 정리하면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 질문에 이렇게 답할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Java에서 String을 사용할 때 조심해야 하는 이유는,&lt;br /&gt;불변 객체 특성상 문자열 연산 과정에서 단명 객체가 대량으로 생성되고&lt;br /&gt;반복되는 경우 GC 부담과 성능 저하로 이어질 수 있기 때문이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;String은 Java에서 가장 자주 사용되는 클래스 중 하나지만,&lt;br /&gt;그만큼 &lt;b&gt;아무 생각 없이 사용하기 쉬운 객체&lt;/b&gt;이기도 하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;268&quot; data-start=&quot;161&quot; data-ke-size=&quot;size18&quot;&gt;이번 글에서는 &amp;ldquo;String은 불변이라서 GC 부담이 된다&amp;rdquo;라는 한 줄 설명 뒤에 숨겨진&lt;br /&gt;JVM 메모리 구조, 객체 생성 흐름, 그리고 문자열 연산의 실제 동작을 차근차근 정리해보았다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;268&quot; data-start=&quot;161&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;406&quot; data-start=&quot;270&quot; data-ke-size=&quot;size18&quot;&gt;중요한 건 String을 피하자는 게 아니라, &lt;b&gt;어떤 상황에서 어떤 비용이 발생하는지 알고 선택하는 것&lt;/b&gt;이다.&lt;br /&gt;특히 반복되는 문자열 누적과 같은 패턴에서는 String과 StringBuilder의 차이가 곧 성능 차이로 이어진다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;554&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;554&quot; data-start=&quot;408&quot; data-ke-size=&quot;size18&quot;&gt;다음 글에서는 &amp;ldquo;String + 연산도 내부적으로 StringBuilder를 쓰는데,&lt;br /&gt;그럼 우리는 왜 여전히 문자열 연산을 조심해야 할까?&amp;rdquo;라는 질문을 중심으로 컴파일러 최적화의 한계와 반복문에서 성능 차이가 발생하는 이유를 이어서 정리해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학습/CS</category>
      <category>GC</category>
      <category>java</category>
      <category>Java 면접</category>
      <category>Java 성능</category>
      <category>JVM</category>
      <category>string</category>
      <category>StringBuilder</category>
      <category>메모리 관리</category>
      <category>백엔드 개발</category>
      <category>성능 최적화</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/166</guid>
      <comments>https://taek2.tistory.com/166#entry166comment</comments>
      <pubDate>Fri, 9 Jan 2026 22:58:02 +0900</pubDate>
    </item>
    <item>
      <title>[보안패치] Next.js &amp;middot; React 보안 패치 적용기 (CVE-2025-55182) - 운영 중인 서비스에 React RSC 취약점 패치하기</title>
      <link>https://taek2.tistory.com/165</link>
      <description>&lt;p data-end=&quot;491&quot; data-start=&quot;312&quot; data-ke-size=&quot;size18&quot;&gt;최근 외부 파트너사에서 &amp;ldquo;React Server Components(RSC) 취약점(CVE-2025-55182)&amp;rdquo; 관련 보안 점검 요청을 받았다.&lt;/p&gt;
&lt;p data-end=&quot;491&quot; data-start=&quot;312&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;문제는&amp;hellip; 내가 개발했던 프로젝트가&amp;nbsp;Next.js App Router 기반이라는 점.&lt;br /&gt;즉 구조적으로 취약 버전의 영향을 받을 가능성이 있어 보였다.&lt;/p&gt;
&lt;p data-end=&quot;491&quot; data-start=&quot;312&quot; data-ke-size=&quot;size18&quot;&gt;그래도 운영 중인 서비스라 보안 패치는 바로 대응해야 했다.&lt;/p&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;493&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;이번 글에서는 &lt;b&gt;React 19 / Next.js 15 환경에서 보안 패치를 적용하며 겪은 과정들을 기록&lt;/b&gt;해본다.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size26&quot;&gt;1. 상황 파악 &amp;mdash; &lt;b&gt;어떤 취약점인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;React 19 계열의 RSC 관련 패키지에서 &lt;b&gt;원격 코드 실행(RCE)&lt;/b&gt; 취약점이 발견되었다는 내용이었다.&lt;br /&gt;취약 버전은 아래와 같고, 보안 패치는 해당 라인별로 발표된 상태.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;814&quot; data-ke-size=&quot;size18&quot;&gt;  취약 버전&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;936&quot; data-start=&quot;827&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;890&quot; data-start=&quot;827&quot;&gt;react-server-dom-webpack: 19.0 / 19.1.0 / 19.1.1 / 19.2.0&lt;/li&gt;
&lt;li data-end=&quot;936&quot; data-start=&quot;891&quot;&gt;Next.js 역시 App Router + RSC 기반이라 영향 가능성이 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;950&quot; data-start=&quot;938&quot; data-ke-size=&quot;size18&quot;&gt;  안전 버전&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1000&quot; data-start=&quot;951&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;975&quot; data-start=&quot;951&quot;&gt;React 패치: &lt;b&gt;19.1.2&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1000&quot; data-start=&quot;976&quot;&gt;Next.js 패치: &lt;b&gt;15.2.6&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;문제는 우리 프로젝트가 딱 아래 버전을 쓰고 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1765204693994&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Next.js 15.2.4  
React 19.1.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;그리고 App Router 기반이기 때문에 내부적으로 RSC 기능을 기본 사용한다. (&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&quot;use server&quot;&lt;/span&gt;를 사용하지 않아도 구조적으로 연결됨)&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1177&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size18&quot;&gt;즉, &lt;b&gt;패치가 필요한 상태&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size26&quot;&gt;2. 프로젝트 환경 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;package.json&lt;/span&gt;을 보면 다음과 같이 되어 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1765204894456&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;dependencies&quot;: {
  &quot;next&quot;: &quot;^15.2.4&quot;,
  &quot;react&quot;: &quot;^19.1.0&quot;,
  &quot;react-dom&quot;: &quot;^19.1.0&quot;,
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;직접 &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;use server&lt;/span&gt;를 사용하지는 않지만,&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;Next.js App Router는 기본적으로 RSC 기반이기 때문에 패치가 필요하다는 결론이다.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size26&quot;&gt;3. 대응 전략 수집&lt;/h2&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;요약하면 3단계로 정리할 수 있었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1565&quot; data-start=&quot;1472&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1472&quot;&gt;React/Next.js 버전을 보안 패치 버전으로 올린다.&lt;/li&gt;
&lt;li data-end=&quot;1535&quot; data-start=&quot;1511&quot;&gt;전체 의존성 재설치 및 빌드 테스트&lt;/li&gt;
&lt;li data-end=&quot;1565&quot; data-start=&quot;1536&quot;&gt;프로덕션 모드 테스트 &amp;rarr; Vercel 자동 배포&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1567&quot; data-ke-size=&quot;size18&quot;&gt;이 과정에서 주의해야 할 게 하나 있었는데,&lt;br /&gt;&lt;b&gt;npm audit fix --force&lt;/b&gt;를 누르면 메이저 버전까지 강제로 올려버려서&lt;br /&gt;App Router + React 19 환경이 깨질 수 있다.&lt;br /&gt;그래서 절대 강제 업데이트는 하지 않는 방향으로 대응했다.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1752&quot; data-start=&quot;1722&quot; data-ke-size=&quot;size26&quot;&gt;4. React / Next.js 보안 패치 적용&lt;/h2&gt;
&lt;p data-end=&quot;1778&quot; data-start=&quot;1754&quot; data-ke-size=&quot;size18&quot;&gt;작업 브랜치를 하나 새로 만들어서 적용했다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765205185351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -b chore/security-react-rsc-patch&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1853&quot; data-start=&quot;1836&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1853&quot; data-start=&quot;1836&quot; data-ke-size=&quot;size18&quot;&gt;그리고 패치 버전으로 업데이트:&lt;/p&gt;
&lt;pre id=&quot;code_1765205211900&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install next@15.2.6 react@19.1.2 react-dom@19.1.2 --save&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1963&quot; data-start=&quot;1929&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1963&quot; data-start=&quot;1929&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;eslint-config-next&lt;/span&gt;도 버전에 맞춰 업데이트:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765205236864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install eslint-config-next@15.2.6 --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;2027&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2060&quot; data-start=&quot;2027&quot; data-ke-size=&quot;size20&quot;&gt;  package.json 수정 후 자연스러운 현상&lt;/h4&gt;
&lt;p data-end=&quot;2179&quot; data-start=&quot;2061&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;package-lock.json&lt;/span&gt;도 자동으로 변한다.&lt;br /&gt;npm install을 하면 의존성 트리가 재정리되기 때문에 &lt;b&gt;package.json + package-lock.json 둘 다 커밋하는 게 맞다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size26&quot;&gt;5. 빌드 테스트&lt;/h2&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;업데이트 후 바로 빌드를 돌렸다.&lt;/p&gt;
&lt;pre id=&quot;code_1765205511390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;에러 없이 빌드 성공!&lt;br /&gt;이 단계에서 에러가 나면 대체로 아래 문제들이다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2420&quot; data-start=&quot;2303&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2303&quot;&gt;react-dom mismatched version&lt;/li&gt;
&lt;li data-end=&quot;2353&quot; data-start=&quot;2336&quot;&gt;ESLint 호환성 문제&lt;/li&gt;
&lt;li data-end=&quot;2390&quot; data-start=&quot;2354&quot;&gt;Server Components 경로 mismatching&lt;/li&gt;
&lt;li data-end=&quot;2420&quot; data-start=&quot;2391&quot;&gt;특정 UI 라이브러리의 React 19 대응 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2452&quot; data-start=&quot;2422&quot; data-ke-size=&quot;size18&quot;&gt;다행히 우리 프로젝트에서는 깨지는 부분 없이 통과했다.&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size26&quot;&gt;6. 프로덕션 모드 테스트&lt;/h2&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;빌드 성공 후, 실제 프로덕션 모드 실행:&lt;/p&gt;
&lt;pre id=&quot;code_1765205572506&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;577&quot; data-ke-size=&quot;size18&quot;&gt;이제 http://localhost:3000&lt;span aria-hidden=&quot;true&quot;&gt;&lt;/span&gt; 에 접속해서 다음 페이지들을 확인했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2641&quot; data-start=&quot;2574&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2582&quot; data-start=&quot;2574&quot;&gt;메인 페이지&lt;/li&gt;
&lt;li data-end=&quot;2597&quot; data-start=&quot;2583&quot;&gt;스크롤 애니메이션 정상&lt;/li&gt;
&lt;li data-end=&quot;2614&quot; data-start=&quot;2598&quot;&gt;Swiper 슬라이더 정상&lt;/li&gt;
&lt;li data-end=&quot;2630&quot; data-start=&quot;2615&quot;&gt;관리자 페이지 진입 정상&lt;/li&gt;
&lt;li data-end=&quot;2641&quot; data-start=&quot;2631&quot;&gt;콘솔 에러 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2695&quot; data-start=&quot;2643&quot; data-ke-size=&quot;size18&quot;&gt;서버 액션을 사용하지 않는 구조라 더 단순했고, 덕분에 특별한 문제 없이 정상적으로 동작했다.&lt;/p&gt;
&lt;p data-end=&quot;2695&quot; data-start=&quot;2643&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2695&quot; data-start=&quot;2643&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2695&quot; data-start=&quot;2643&quot; data-ke-size=&quot;size26&quot;&gt;7. 배포 &amp;mdash; main merge &amp;rarr; Vercel 자동 배포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 작업 브랜치를 main에 PR &amp;rarr; merge만 하면 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2849&quot; data-start=&quot;2776&quot; data-ke-size=&quot;size18&quot;&gt;Vercel은 main 브랜치 변경을 감지하면 자동으로 CI/CD가 실행되어 배포된다.&lt;br /&gt;별도 서버 재부팅이나 작업은 필요 없다.&lt;/p&gt;
&lt;p data-end=&quot;2849&quot; data-start=&quot;2776&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2893&quot; data-start=&quot;2851&quot; data-ke-size=&quot;size18&quot;&gt;배포 후 실제 사이트를 확인해봤고, 화면 전환&amp;middot;이미지&amp;middot;라우팅 모두 정상.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2916&quot; data-start=&quot;2900&quot; data-ke-size=&quot;size26&quot;&gt;8. 조치 완료 후 회신&lt;/h2&gt;
&lt;p data-end=&quot;2937&quot; data-start=&quot;2918&quot; data-ke-size=&quot;size18&quot;&gt;파트너사에는 아래 내용을 전달했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3033&quot; data-start=&quot;2939&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2967&quot; data-start=&quot;2939&quot;&gt;React / Next.js 보안 패치 완료&lt;/li&gt;
&lt;li data-end=&quot;2988&quot; data-start=&quot;2968&quot;&gt;RSC 취약점 영향 여부 검토&lt;/li&gt;
&lt;li data-end=&quot;3014&quot; data-start=&quot;2989&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;use server&lt;/span&gt;&amp;nbsp;미사용 확인&lt;/li&gt;
&lt;li data-end=&quot;3033&quot; data-start=&quot;3015&quot;&gt;프로덕션 테스트 문제 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3110&quot; data-start=&quot;3035&quot; data-ke-size=&quot;size18&quot;&gt;요청받았던 &lt;b&gt;1) 버전 확인, 2) Server Actions 확인, 3) 보안 패치 적용&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;모두 완벽히 대응 완료.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 회고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;운영 중인 프레임워크를 업데이트하는 건 항상 부담된다.&lt;br /&gt;특히 React 19 / Next.js 15은 아직 변화가 많은 시기라 조심스러웠다.&lt;/p&gt;
&lt;p data-end=&quot;3224&quot; data-start=&quot;3209&quot; data-ke-size=&quot;size18&quot;&gt;그럼에도 이번 경험을 통해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3332&quot; data-start=&quot;3226&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3249&quot; data-start=&quot;3226&quot;&gt;버전 명확히 고정해서 패치하는 습관&lt;/li&gt;
&lt;li data-end=&quot;3276&quot; data-start=&quot;3250&quot;&gt;main 브랜치 자동 배포 구조의 중요성&lt;/li&gt;
&lt;li data-end=&quot;3307&quot; data-start=&quot;3277&quot;&gt;App Router + RSC 구조에 대한 이해&lt;/li&gt;
&lt;li data-end=&quot;3332&quot; data-start=&quot;3308&quot;&gt;보안 공지를 항상 체크해야 한다는 점&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3347&quot; data-start=&quot;3334&quot; data-ke-size=&quot;size18&quot;&gt;을 다시 한 번 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Next.js</category>
      <category>app router</category>
      <category>CVE-2025-55182</category>
      <category>Next.js</category>
      <category>react</category>
      <category>react server components</category>
      <category>react19</category>
      <category>Security Patch</category>
      <category>troubleshooting</category>
      <category>vercel</category>
      <category>보안 패치</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/165</guid>
      <comments>https://taek2.tistory.com/165#entry165comment</comments>
      <pubDate>Tue, 9 Dec 2025 00:04:13 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Route53으로 도메인 사서 EC2에 연결 방법 기록 (DNS 설정하면서 헷갈렸던 것들)</title>
      <link>https://taek2.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;EC2&amp;nbsp;서버&amp;nbsp;띄워놓고&amp;nbsp;Public&amp;nbsp;IP로만&amp;nbsp;접근하다가&lt;br /&gt;이제&amp;nbsp;도메인을&amp;nbsp;붙이기&amp;nbsp;위해&amp;nbsp;AWS&amp;nbsp;Route53을&amp;nbsp;만져봤다.&lt;br /&gt;&lt;br /&gt;Route53으로&amp;nbsp;도메인&amp;nbsp;등록하고&amp;nbsp;EC2에&amp;nbsp;연결하는&amp;nbsp;과정에서&lt;br /&gt;A&amp;nbsp;레코드,&amp;nbsp;CNAME,&amp;nbsp;네임서버&amp;nbsp;설정이&amp;nbsp;생각보다&amp;nbsp;헷갈려서&lt;br /&gt;나중에&amp;nbsp;다시&amp;nbsp;보려고&amp;nbsp;정리해둔다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;글은&amp;nbsp;AWS&amp;nbsp;Route53으로&amp;nbsp;도메인을&amp;nbsp;구매하고&lt;br /&gt;EC2에&amp;nbsp;연결하면서&amp;nbsp;실제로&amp;nbsp;했던&amp;nbsp;순서&amp;nbsp;위주로&amp;nbsp;적은&amp;nbsp;기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ Route53이란?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  한 줄 요약 : &lt;u&gt;&lt;b&gt;도메인을 발급하고 관리해주는 서비스&lt;/b&gt;&lt;/u&gt;이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;www.naver.com&lt;/span&gt;, &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;daum.net&lt;/span&gt;, &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;youtube.com&lt;/span&gt;처럼 문자 형태로 표현된 인터넷 주소를 &lt;u&gt;&lt;b&gt;도메인(Domain)&lt;/b&gt;&lt;/u&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AWS의 &lt;b&gt;Route 53&lt;/b&gt;은 이러한 도메인을 구매하고 관리할 수 있는 서비스이며, 더 정확히는 &lt;b&gt;DNS(Domain Name System) 서비스&lt;/b&gt;에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이제 DNS가 뭔지 간단히 알아보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ DNS(Domain Name System)란?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인터넷 초창기에는 특정 컴퓨터와 통신하기 위해 &lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;123.123.123.123&lt;/span&gt;&amp;nbsp;같은 IP 주소를 직접 입력해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;IP는 &lt;b&gt;컴퓨터를 식별하는 핵심 주소&lt;/b&gt;지만, 숫자로만 이루어져 있어 사람이 기억하거나 관리하기에는 비효율적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자 입장에서는 직관적인 이름을 사용하고 싶지만, 컴퓨터는 기본적으로 숫자 기반의 값을 처리하는 데 최적화되어 있다.&lt;br /&gt;따라서 단순히 IP 주소를 문자로 대체하는 방식만으로는 문제를 해결하기 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 문제를 해결하기 위해 &lt;b&gt;문자로 된 이름을 숫자로 이루어진 IP 주소로 변환해주는 시스템&lt;/b&gt;, 즉 하나의 중간 서버가 필요해졌다. 이렇게 해서 등장한 것이 바로 &lt;u&gt;&lt;b&gt;DNS(Domain Name System)&lt;/b&gt;&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DNS는 사용자가 입력한 도메인 이름을 내부적으로 IP 주소로 변환해주는 역할을 수행하며, 이를 통해 우리는 더 이상 복잡한 IP를 외울 필요 없이, 도메인만으로 원하는 서비스에 접근할 수 있게 됐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUoHFY/dJMcacVLkWI/3bRK8PERDB1KP7MBBgfj4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUoHFY/dJMcacVLkWI/3bRK8PERDB1KP7MBBgfj4K/img.png&quot; data-alt=&quot;출처 : https://gcore.com/learning/dns-servers-what-they-are-and-how-they-work/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUoHFY/dJMcacVLkWI/3bRK8PERDB1KP7MBBgfj4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUoHFY%2FdJMcacVLkWI%2F3bRK8PERDB1KP7MBBgfj4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;666&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://gcore.com/learning/dns-servers-what-they-are-and-how-they-work/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ 도메인 연결&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;1. 도메인 구매&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Route53 &amp;gt; 대시보드 &amp;gt; 도메인 등록 &amp;gt; 도메인 검색 &amp;gt; 선택 &amp;gt; 결제 진행 &amp;gt; 요금 확인 &amp;gt; 연락처 정보 입력&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2261&quot; data-origin-height=&quot;1127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PxRdl/dJMcafdS1Th/Bk1CkrbPrkefk8gZwvzCz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PxRdl/dJMcafdS1Th/Bk1CkrbPrkefk8gZwvzCz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PxRdl/dJMcafdS1Th/Bk1CkrbPrkefk8gZwvzCz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPxRdl%2FdJMcafdS1Th%2FBk1CkrbPrkefk8gZwvzCz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2261&quot; height=&quot;1127&quot; data-origin-width=&quot;2261&quot; data-origin-height=&quot;1127&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;1229&quot; data-origin-height=&quot;957&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lycMG/dJMcaaKpMHo/KXkRKtqM41BN2ulAXH6RV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lycMG/dJMcaaKpMHo/KXkRKtqM41BN2ulAXH6RV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lycMG/dJMcaaKpMHo/KXkRKtqM41BN2ulAXH6RV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlycMG%2FdJMcaaKpMHo%2FKXkRKtqM41BN2ulAXH6RV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;957&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;957&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;1370&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mtuHU/dJMcabo1kcu/Lk8xGMUaJvbATvLUZwR0QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mtuHU/dJMcabo1kcu/Lk8xGMUaJvbATvLUZwR0QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mtuHU/dJMcabo1kcu/Lk8xGMUaJvbATvLUZwR0QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmtuHU%2FdJMcabo1kcu%2FLk8xGMUaJvbATvLUZwR0QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;397&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;397&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;1096&quot; data-origin-height=&quot;1154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4JrUS/dJMcabvMYtB/lzIQlJBU8gWOHl3uUMpty0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4JrUS/dJMcabvMYtB/lzIQlJBU8gWOHl3uUMpty0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4JrUS/dJMcabvMYtB/lzIQlJBU8gWOHl3uUMpty0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4JrUS%2FdJMcabvMYtB%2FlzIQlJBU8gWOHl3uUMpty0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;1154&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Tip. &lt;/b&gt;도메인에서 .link 가 가장 저렴한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot; data-token-index=&quot;0&quot;&gt;&lt;b&gt;주의)&lt;/b&gt; &lt;/span&gt;다른 건 몰라도 이메일은 정확히 입력해야 한다. 10~20분 있다가 등록한 이메일로 메일이 날라온다. 이 메일을 확인해야만 정상적으로 도메인이 등록된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게하면 Route53에서 등록된 도메인을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VozWO/dJMcaiaBVyq/ilL9KJQeTgfnKrtIm7uF8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VozWO/dJMcaiaBVyq/ilL9KJQeTgfnKrtIm7uF8K/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VozWO/dJMcaiaBVyq/ilL9KJQeTgfnKrtIm7uF8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVozWO%2FdJMcaiaBVyq%2FilL9KJQeTgfnKrtIm7uF8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;342&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOAB8t/dJMcahv0nrT/1iOQJ2UQawFxPt4Qq1gw30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOAB8t/dJMcahv0nrT/1iOQJ2UQawFxPt4Qq1gw30/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOAB8t/dJMcahv0nrT/1iOQJ2UQawFxPt4Qq1gw30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOAB8t%2FdJMcahv0nrT%2F1iOQJ2UQawFxPt4Qq1gw30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;429&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;2. EC2에 연결하기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;1. Route 53의 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;호스팅 영역&lt;/span&gt; 메뉴에 들어가서 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;레코드 생성&lt;/span&gt; 버튼 누르기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcYmsO/dJMcaap61Yg/GAbXaFeaKObfs9CUv7SYC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcYmsO/dJMcaap61Yg/GAbXaFeaKObfs9CUv7SYC0/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcYmsO/dJMcaap61Yg/GAbXaFeaKObfs9CUv7SYC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcYmsO%2FdJMcaap61Yg%2FGAbXaFeaKObfs9CUv7SYC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;585&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NSkHp/dJMcacIezYZ/JE2qqtxYIqUt9J00HjdR10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NSkHp/dJMcacIezYZ/JE2qqtxYIqUt9J00HjdR10/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NSkHp/dJMcacIezYZ/JE2qqtxYIqUt9J00HjdR10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNSkHp%2FdJMcacIezYZ%2FJE2qqtxYIqUt9J00HjdR10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;561&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;2. &lt;span data-token-index=&quot;0&quot;&gt;레코드 생성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7MpCy/dJMcahJxESh/dgPURWFVTW8FgGNhJuTjV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7MpCy/dJMcahJxESh/dgPURWFVTW8FgGNhJuTjV1/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7MpCy/dJMcahJxESh/dgPURWFVTW8FgGNhJuTjV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7MpCy%2FdJMcahJxESh%2FdgPURWFVTW8FgGNhJuTjV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;756&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4II32/dJMcaaRbtqK/ACnjd8cBafBpZOoV0opk00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4II32/dJMcaaRbtqK/ACnjd8cBafBpZOoV0opk00/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4II32/dJMcaaRbtqK/ACnjd8cBafBpZOoV0opk00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4II32%2FdJMcaaRbtqK%2FACnjd8cBafBpZOoV0opk00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;534&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 설정할 경우 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;jscode-edu.link&lt;/span&gt;의 도메인으로 접속했을 때 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;52.79.34.240&lt;/span&gt;의 IP 주소로 연결시켜준다는 뜻이다. 레코드 유형은 아래에서 자세히 설명하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;api.jscode-edu.link&lt;/span&gt;의 도메인으로 접속했을 때 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;52.79.34.240&lt;/span&gt;의 IP 주소로 연결시켜주고 싶다면 레코드 이름의 빈칸에 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;api&lt;/span&gt;를 적으면 된다. 이와 같이 하나의 도메인만 구매하더라도 여러 개의 서브 도메인을 사용할 수 있다. (&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;jscode-edu.link&lt;/span&gt;가 주 도메인이고, &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;___.jscode-edu.link&lt;/span&gt; 형태의 도메인이 서브 도메인이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;3. 접속 확인&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  A 레코드로 추가하고나서 도메인이 적용되는데 5~10분 정도 걸린다. 조금 기다렸다가 도메인에 접속해보자.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HI8ls/dJMcaihnAp2/eu2gQuSFbglSeplkgsopmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HI8ls/dJMcaihnAp2/eu2gQuSFbglSeplkgsopmK/img.png&quot; data-alt=&quot;출처 : jscode 강의 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HI8ls/dJMcaihnAp2/eu2gQuSFbglSeplkgsopmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHI8ls%2FdJMcaihnAp2%2Feu2gQuSFbglSeplkgsopmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;248&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : jscode 강의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;b&gt;A 레코드 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;- 도메인을 &lt;u&gt;&lt;b&gt;특정 IPv4 주소에 연결시키고 싶을 때 사용&lt;/b&gt;&lt;/u&gt;하는 레코드 유형이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;b&gt;CNAME 레코드 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;- 도메인을 &lt;u&gt;&lt;b&gt;특정 도메인 주소에 연결시키고 싶을 때 사용&lt;/b&gt;&lt;/u&gt;하는 레코드 유형이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 CNAME 레코드의 값으로 www.naver.com을 적었다고 가정하자. 그러면 해당 도메인으로 접속했을 때, www.naver.com으로 연결되어 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ 무료 도메인 구매해서 연결하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://xn--220b31d95hq8o.xn--3e0b707e/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763113980621&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;내도메인.한국 - 한글 무료 도메인 등록센터&quot; data-og-description=&quot;한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공&quot; data-og-host=&quot;xn--220b31d95hq8o.xn--3e0b707e&quot; data-og-source-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; data-og-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;내도메인.한국 - 한글 무료 도메인 등록센터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;xn--220b31d95hq8o.xn--3e0b707e&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cloud-information.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud-information.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763113992051&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;무료 도메인 서비스 내도메인.한국 사용 방법&quot; data-og-description=&quot;내도메인.한국은 무료 도메인을 사용할 수 도록 제공해 주는 서비스입니다. 나만의 도메인을 무료로 만들어 네이버 블로그, 티스토리 등 다양한 곳에 연결하여 사용할 수 있으며, 무료 도메인을&quot; data-og-host=&quot;cloud-information.tistory.com&quot; data-og-source-url=&quot;https://cloud-information.tistory.com/11&quot; data-og-url=&quot;https://cloud-information.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cY2TUU/hyZNwKH6uM/KCJtOeFkhdFWdfLikSXiok/img.jpg?width=800&amp;amp;height=313&amp;amp;face=0_0_800_313,https://scrap.kakaocdn.net/dn/cc5nBS/hyZN0Zlvyn/bphPKXxQnIUKlVXUKWRdXK/img.jpg?width=800&amp;amp;height=313&amp;amp;face=0_0_800_313,https://scrap.kakaocdn.net/dn/HA89B/hyZNwKH6wD/ZggwNBWY40Re39a9Z4YJxK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://cloud-information.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cloud-information.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cY2TUU/hyZNwKH6uM/KCJtOeFkhdFWdfLikSXiok/img.jpg?width=800&amp;amp;height=313&amp;amp;face=0_0_800_313,https://scrap.kakaocdn.net/dn/cc5nBS/hyZN0Zlvyn/bphPKXxQnIUKlVXUKWRdXK/img.jpg?width=800&amp;amp;height=313&amp;amp;face=0_0_800_313,https://scrap.kakaocdn.net/dn/HA89B/hyZNwKH6wD/ZggwNBWY40Re39a9Z4YJxK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;무료 도메인 서비스 내도메인.한국 사용 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;내도메인.한국은 무료 도메인을 사용할 수 도록 제공해 주는 서비스입니다. 나만의 도메인을 무료로 만들어 네이버 블로그, 티스토리 등 다양한 곳에 연결하여 사용할 수 있으며, 무료 도메인을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cloud-information.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;주의)&lt;/b&gt;&lt;/span&gt; 실제 운영할 서버에는 무료 도메인을 사용하지 말자. 무료 도메인은 생각보다 불안정하다. 중간에 도메인을 통한 접속이 끊기기도 한다. 즉, 서비스가 중단되는 경우가 발생할 수 있다는 뜻이다.&lt;/p&gt;</description>
      <category>웹 개발/AWS(Amazon Web Server)</category>
      <category>A 레코드</category>
      <category>AWS</category>
      <category>AWS Route53</category>
      <category>cname</category>
      <category>DNS 설정</category>
      <category>EC2</category>
      <category>EC2 도메인 연결</category>
      <category>Route53</category>
      <category>네임서버</category>
      <category>도메인 연결</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/164</guid>
      <comments>https://taek2.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 14 Nov 2025 21:17:32 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Spring Boot 서버를 EC2에 배포하기</title>
      <link>https://taek2.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;AWS EC2(Elastic Compute Cloud) 인스턴스에 Spring&amp;nbsp;Boot&amp;nbsp;애플리케이션을&amp;nbsp;직접&amp;nbsp;배포해봤다.&lt;br /&gt;&lt;br /&gt;EC2 환경에서 JDK 설치부터 애플리케이션 실행까지 순서대로&amp;nbsp;정리해보았다.&lt;br /&gt;&lt;br /&gt;이 글을 보면 EC2에서&amp;nbsp;Spring&amp;nbsp;Boot&amp;nbsp;서버를&amp;nbsp;띄우는&amp;nbsp;전체&amp;nbsp;흐름을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ Ubuntu 환경에 JDK 설치&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;spring boot를 배포하려면 java가 설치되어야한다. EC2 인스턴스에 접속해서 jdk를 설치하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;각자 필요한 jdk를 설치하면 되는데, 나는 &lt;u&gt;&lt;b&gt;jdk 17&lt;/b&gt;&lt;/u&gt; 버전 설치를 할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762866308503&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# root 권한 변경
sudo su

# jdk17 버전 설치 (그대로 2줄 복붙하면 됨)
sudo apt update &amp;amp;&amp;amp; /
sudo apt install openjdk-17-jdk -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;jdk가 잘 설치됐는지 확인&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1762866569210&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Dqmx/dJMcabJiXLL/IYhzXhkEzLl09o5C682Mt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Dqmx/dJMcabJiXLL/IYhzXhkEzLl09o5C682Mt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Dqmx/dJMcabJiXLL/IYhzXhkEzLl09o5C682Mt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Dqmx%2FdJMcabJiXLL%2FIYhzXhkEzLl09o5C682Mt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;202&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;span&gt; github 프로젝트 클론&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1762866660855&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/JSCODE-EDU/ec2-spring-boot-sample.git
cd ec2-spring-boot-sample&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;본인 프로젝트 소스코드를 클론하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;나는 강의에서 제공해준 예제 프로젝트를 클론받아서 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ application.yml 파일 생성&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;application.yml&lt;/span&gt; 와 같은 민감한 정보가 포함된 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;application.yml&lt;/span&gt; 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 &lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;application.yml&lt;/span&gt;&lt;span style=&quot;color: #ef5369; text-align: start;&quot;&gt; &lt;/span&gt;파일을 EC2 인스턴스에 올리는 작업보다는, &lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;application.yml&lt;/span&gt; 파일을 직접 만드는 게 훨씬 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;src/main/resources/application.yml&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762866961192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 경로 접속
cd src/main/resources

# application.yml 파일 생성 및 편집
vi application.yml

# 아래 내용 추가
server:
  port: 80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVZIEY/dJMcajm2fvi/adAWXO9D3TTf8NssKZwhw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVZIEY/dJMcajm2fvi/adAWXO9D3TTf8NssKZwhw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVZIEY/dJMcajm2fvi/adAWXO9D3TTf8NssKZwhw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVZIEY%2FdJMcajm2fvi%2FadAWXO9D3TTf8NssKZwhw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;78&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs5k0L/dJMcaap5L74/kVnjUlIMzC0zo2vkhzr61k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs5k0L/dJMcaap5L74/kVnjUlIMzC0zo2vkhzr61k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs5k0L/dJMcaap5L74/kVnjUlIMzC0zo2vkhzr61k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs5k0L%2FdJMcaap5L74%2FkVnjUlIMzC0zo2vkhzr61k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;213&quot; height=&quot;92&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;:wq&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ 서버 실행&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1762867436657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 프로젝트 경로로 이동
cd ../../

# 기존 빌드된 파일을 삭제하고 새롭게 JAR로 빌드
./gradlew clean build
cd build/libs
sudo java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar

# 참고 - 백그라운드에서 실행시키기
sudo nohup java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c47aNT/dJMcaf50yIZ/KxCAQuQvbVQ50esqmMNuY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c47aNT/dJMcaf50yIZ/KxCAQuQvbVQ50esqmMNuY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c47aNT/dJMcaf50yIZ/KxCAQuQvbVQ50esqmMNuY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc47aNT%2FdJMcaf50yIZ%2FKxCAQuQvbVQ50esqmMNuY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1588&quot; height=&quot;66&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;66&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;3014&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnoIcw/dJMcafroJKt/NLnnf76FxGQNWD5mOp1nv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnoIcw/dJMcafroJKt/NLnnf76FxGQNWD5mOp1nv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnoIcw/dJMcafroJKt/NLnnf76FxGQNWD5mOp1nv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnoIcw%2FdJMcafroJKt%2FNLnnf76FxGQNWD5mOp1nv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3014&quot; height=&quot;1056&quot; data-origin-width=&quot;3014&quot; data-origin-height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;libs 폴더 들어가면 저렇게 .jar파일이 2개가 생성되어 있고, plain이 아닌 것을 실행시키면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 하고 우리가 이전에 할당받았던 탄력적 IP를 접속해보면 다음과 같이 뜬다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcSxL/dJMb99Luj7z/6fyGpjyMilJooPFz50mvck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcSxL/dJMb99Luj7z/6fyGpjyMilJooPFz50mvck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcSxL/dJMb99Luj7z/6fyGpjyMilJooPFz50mvck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcSxL%2FdJMb99Luj7z%2F6fyGpjyMilJooPFz50mvck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;486&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ 비용 나가지 않게 깔끔하게 EC2 종료&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인스턴스와 탄력적 IP만 삭제하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 인스턴스 종료(삭제)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buBnvo/dJMcagKBZKJ/roNY8EMGqkw9KKK2XOiK40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buBnvo/dJMcagKBZKJ/roNY8EMGqkw9KKK2XOiK40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buBnvo/dJMcagKBZKJ/roNY8EMGqkw9KKK2XOiK40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuBnvo%2FdJMcagKBZKJ%2FroNY8EMGqkw9KKK2XOiK40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;351&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 탄력적 IP 삭제(릴리즈)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDyP74/dJMcacOYSvG/fj3zAQKSeTJlk1wlOqdMkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDyP74/dJMcacOYSvG/fj3zAQKSeTJlk1wlOqdMkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDyP74/dJMcacOYSvG/fj3zAQKSeTJlk1wlOqdMkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDyP74%2FdJMcacOYSvG%2Ffj3zAQKSeTJlk1wlOqdMkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;620&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/AWS(Amazon Web Server)</category>
      <category>AWS</category>
      <category>AWS EC2</category>
      <category>AWS 사바</category>
      <category>EC2</category>
      <category>EC2 서버 배포</category>
      <category>Java 서버 배포</category>
      <category>Spring Boot</category>
      <category>Spring Boot 배포</category>
      <category>백엔드 개발</category>
      <category>클라우드 서버</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/163</guid>
      <comments>https://taek2.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 11 Nov 2025 23:05:08 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 인스턴스 탄력적 IP(Elastic IP) 설정</title>
      <link>https://taek2.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;AWS EC2 인스턴스는 기본 할당된 퍼블릭 IP가 인스턴스를&amp;nbsp;중지했다&amp;nbsp;다시&amp;nbsp;시작하면&amp;nbsp;바뀐다.&lt;br /&gt;&lt;br /&gt;그래서 중지/재시작해도 변하지 않는 &lt;b&gt;고정 IP&lt;/b&gt;가 필요해서 &lt;u&gt;&lt;b&gt;Elastic&amp;nbsp;IP(탄력적&amp;nbsp;IP)&lt;/b&gt;&lt;/u&gt;를&amp;nbsp;설정해봤다.&lt;br /&gt;&lt;br /&gt;이 글은 EC2 인스턴스에 Elastic IP를 할당하고 연결하는 순서를 기록한다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;탄력적 IP가 왜 필요할까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스를 생성하면 IP를 할당받는다. 하지만 이렇게 할당받은 IP는 임시적인 IP이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7fKLc/dJMcahvY8o4/YMBZfHmLlzjQU1hfH5AvIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7fKLc/dJMcahvY8o4/YMBZfHmLlzjQU1hfH5AvIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7fKLc/dJMcahvY8o4/YMBZfHmLlzjQU1hfH5AvIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7fKLc%2FdJMcahvY8o4%2FYMBZfHmLlzjQU1hfH5AvIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;152&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;152&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;1654&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX2IiV/dJMb99SfT49/FEKd4uivRMk8LxKChN7Yb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX2IiV/dJMb99SfT49/FEKd4uivRMk8LxKChN7Yb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX2IiV/dJMb99SfT49/FEKd4uivRMk8LxKChN7Yb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX2IiV%2FdJMb99SfT49%2FFEKd4uivRMk8LxKChN7Yb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;836&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;836&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;1372&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccKbS7/dJMcagDQtOd/bOxYnKbMmhaG90JphDVgfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccKbS7/dJMcagDQtOd/bOxYnKbMmhaG90JphDVgfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccKbS7/dJMcagDQtOd/bOxYnKbMmhaG90JphDVgfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccKbS7%2FdJMcagDQtOd%2FbOxYnKbMmhaG90JphDVgfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;924&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 EC2 인스턴스를 잠깐 중지시켰다가 다시 실행시켜보면 IP가 바뀌어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스를 중지시켰다가 다시 실행시킬 때마다 IP가 바뀌면 굉장히 불편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 중지시켰다가 다시 실행시켜도 바뀌지 않는 고정 IP를 할당받아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그게 바로 &lt;u&gt;&lt;b&gt;탄력적 IP&lt;/b&gt;&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;탄력적 IP 설정 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DaSiN/dJMcabWP66y/RKQVJhgAiTLRivrVxidVl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DaSiN/dJMcabWP66y/RKQVJhgAiTLRivrVxidVl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DaSiN/dJMcabWP66y/RKQVJhgAiTLRivrVxidVl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDaSiN%2FdJMcabWP66y%2FRKQVJhgAiTLRivrVxidVl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;1006&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;화면 좌측에 &lt;b&gt;네트워크 및 보안&lt;/b&gt; 그룹에 '&lt;u&gt;&lt;b&gt;탄력적 IP&lt;/b&gt;&lt;/u&gt;'를 선택한 후 우측 상단에 '&lt;u&gt;&lt;b&gt;탄력적 IP 주소 할당&lt;/b&gt;&lt;/u&gt;' 을 클릭한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3008&quot; data-origin-height=&quot;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7mav/dJMcad1qlkH/LUaOPidfp81kuUej5PbgV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7mav/dJMcad1qlkH/LUaOPidfp81kuUej5PbgV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7mav/dJMcad1qlkH/LUaOPidfp81kuUej5PbgV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7mav%2FdJMcad1qlkH%2FLUaOPidfp81kuUej5PbgV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3008&quot; height=&quot;1302&quot; data-origin-width=&quot;3008&quot; data-origin-height=&quot;1302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;2528&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGZXJB/dJMcab3BFFP/JQCsHQ8TPVqBK0HiUSVD7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGZXJB/dJMcab3BFFP/JQCsHQ8TPVqBK0HiUSVD7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGZXJB/dJMcab3BFFP/JQCsHQ8TPVqBK0HiUSVD7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGZXJB%2FdJMcab3BFFP%2FJQCsHQ8TPVqBK0HiUSVD7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2528&quot; height=&quot;752&quot; data-origin-width=&quot;2528&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그럼 이렇게 할당된 주소가 나오고 우측상단에 &lt;u&gt;&lt;b&gt;작업&lt;/b&gt;&lt;/u&gt;을 눌러 &lt;u&gt;&lt;b&gt;탄력적 IP 주소 연결&lt;/b&gt;&lt;/u&gt;을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3006&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCIn8/dJMcahCKMcf/K0uUtH4R0eD9PHh0bYFcxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCIn8/dJMcahCKMcf/K0uUtH4R0eD9PHh0bYFcxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCIn8/dJMcahCKMcf/K0uUtH4R0eD9PHh0bYFcxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCIn8%2FdJMcahCKMcf%2FK0uUtH4R0eD9PHh0bYFcxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3006&quot; height=&quot;1114&quot; data-origin-width=&quot;3006&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 우리가 생성했던 인스턴스를 선택하여 연결을 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv0lWX/dJMcaiuTumm/cjQvPXdyk9484X8wwRJGD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv0lWX/dJMcaiuTumm/cjQvPXdyk9484X8wwRJGD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv0lWX/dJMcaiuTumm/cjQvPXdyk9484X8wwRJGD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv0lWX%2FdJMcaiuTumm%2FcjQvPXdyk9484X8wwRJGD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;942&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인스턴스에서 다시 확인해보면 할당받은 IP가 이렇게 설정된 것을 확인할 수 있다.&amp;nbsp;&lt;br /&gt;좀더 확실하게 확인하기위해 처음처럼 인스턴스를 중지했다가 다시 시작을 해도 IP가 그대로일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/AWS(Amazon Web Server)</category>
      <category>AWS</category>
      <category>AWS EC2</category>
      <category>AWS 서버</category>
      <category>EC2</category>
      <category>EC2 고정 IP</category>
      <category>EC2 탄력적 IP</category>
      <category>Elastic IP</category>
      <category>백엔드 개발</category>
      <category>서버 세팅</category>
      <category>클라우드 서버</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/162</guid>
      <comments>https://taek2.tistory.com/162#entry162comment</comments>
      <pubDate>Tue, 11 Nov 2025 21:27:28 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 인스턴스 정보 확인 및 SSH 접속</title>
      <link>https://taek2.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;AWS EC2 인스턴스를 만들고 나서, 실제&amp;nbsp;서버에&amp;nbsp;어떻게&amp;nbsp;접속하는지&amp;nbsp;헷갈려서&amp;nbsp;정리해둔다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;글은&amp;nbsp;EC2&amp;nbsp;인스턴스의&amp;nbsp;퍼블릭&amp;nbsp;IP/상태&amp;nbsp;같은&amp;nbsp;기본&amp;nbsp;정보를&amp;nbsp;보고,&lt;br /&gt;SSH로 접속하는 과정까지 순서대로 적은 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;/span&gt; 생성된 인스턴스 정보 해석하기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 세부 정보&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VF4np/dJMcad1p4VR/SJlatosCxuV24bGFUwt4yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VF4np/dJMcad1p4VR/SJlatosCxuV24bGFUwt4yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VF4np/dJMcad1p4VR/SJlatosCxuV24bGFUwt4yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVF4np%2FdJMcad1p4VR%2FSJlatosCxuV24bGFUwt4yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1476&quot; height=&quot;551&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;세부 정보에서 눈여겨 봐야 할 부분은 2가지 밖에 없다. &lt;u&gt;&lt;b&gt;퍼블릭 IPv4 주소&lt;/b&gt;&lt;/u&gt;와 &lt;u&gt;&lt;b&gt;인스턴스 상태&lt;/b&gt;&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;u&gt;&lt;b&gt;퍼블릭 IPv4 주소&lt;/b&gt;&lt;/u&gt; : EC2 인스턴스가 생성되면서 부여받은 IP 주소이다. EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;-&lt;/i&gt; &lt;u&gt;&lt;b&gt;&lt;u&gt;&lt;b&gt;인스턴스 상태&lt;/b&gt;&lt;/u&gt;&lt;/b&gt;&lt;/u&gt; : 말그대로 EC2 인스턴스가 실행 중이라는 뜻은 컴퓨터가 켜져있다는 뜻이다.&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;3&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCemWp/dJMcabCw0hf/SktG0LMyraP72GYTHE60lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCemWp/dJMcabCw0hf/SktG0LMyraP72GYTHE60lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCemWp/dJMcabCw0hf/SktG0LMyraP72GYTHE60lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCemWp%2FdJMcabCw0hf%2FSktG0LMyraP72GYTHE60lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;182&quot; height=&quot;166&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 인스턴스 중지 : 컴퓨터를 종료 (전원끄기)&lt;br /&gt;2. 인스턴스 시작 : 컴퓨터를 실행 (전원켜기)&lt;br /&gt;3. 인스턴스 재부팅 : 컴퓨터 재부팅&lt;br /&gt;4. 인스턴스 최대 절전 모드 : 컴퓨터 절전 모드&lt;br /&gt;5. 인스턴스 종료(삭제) : 인스턴스 삭제 - 컴퓨터를 아예 삭제시킨다는 걸 의미한다. &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp; &amp;gt;&amp;gt; EC2 인스턴스를 한 번 종료하면 도중에 취소할 수 없으니 조심해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 보안 (보안 그룹)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/63Je9/dJMcadUEuc9/x9B84KI1mW4uXbeHfAOQ51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/63Je9/dJMcadUEuc9/x9B84KI1mW4uXbeHfAOQ51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/63Je9/dJMcadUEuc9/x9B84KI1mW4uXbeHfAOQ51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F63Je9%2FdJMcadUEuc9%2Fx9B84KI1mW4uXbeHfAOQ51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1477&quot; height=&quot;635&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인스턴스 생성 시 설정한 보안 그룹에 대한 정보가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 네트워킹&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJha1a/dJMcafSs7OQ/MoLHck5WVuAKBU8HDRpKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJha1a/dJMcafSs7OQ/MoLHck5WVuAKBU8HDRpKl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJha1a/dJMcafSs7OQ/MoLHck5WVuAKBU8HDRpKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJha1a%2FdJMcafSs7OQ%2FMoLHck5WVuAKBU8HDRpKl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;1109&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일단 네트워킹에서는 그냥 퍼블릭 IPv4 주소만 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 스토리지&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeMDx/dJMcafdRxez/kHZJ4OYHQHk6pwTOorG2nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeMDx/dJMcafdRxez/kHZJ4OYHQHk6pwTOorG2nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeMDx/dJMcafdRxez/kHZJ4OYHQHk6pwTOorG2nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeMDx%2FdJMcafdRxez%2FkHZJ4OYHQHk6pwTOorG2nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1633&quot; height=&quot;368&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형은 EBS이고 볼륨 크기가 우리가 설정한 30GB라는 것을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 모니터링&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEwJD/dJMcaesupCu/nYY0ePGnDs0iFM0N9LOQy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEwJD/dJMcaesupCu/nYY0ePGnDs0iFM0N9LOQy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEwJD/dJMcaesupCu/nYY0ePGnDs0iFM0N9LOQy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEwJD%2FdJMcaesupCu%2FnYY0ePGnDs0iFM0N9LOQy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1637&quot; height=&quot;606&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스에 관련한 여러가지 정보를 볼 수 있는 창이다. AWS를 처음 입문할 때는 자주 볼 일이 없는 창이지만, 나중에 &lt;u&gt;&lt;b&gt;실제 서버를 운영할 때는 자주 보게되는 창&lt;/b&gt;&lt;/u&gt;이다. EC2 인스턴스가 정상적으로 작동하고 있는 지, EC2 인스턴스의 성능을 향상시켜주어야 하는 건 아닌 지 아래 지표를 통해 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인스턴스 접속하기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1647&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cekTqP/dJMcacBrnXd/0kZKukKwkPjxRsNVvyxvHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cekTqP/dJMcacBrnXd/0kZKukKwkPjxRsNVvyxvHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cekTqP/dJMcacBrnXd/0kZKukKwkPjxRsNVvyxvHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcekTqP%2FdJMcacBrnXd%2F0kZKukKwkPjxRsNVvyxvHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1647&quot; height=&quot;579&quot; data-origin-width=&quot;1647&quot; data-origin-height=&quot;579&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;1657&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lb9rr/dJMcafZeFhB/h7jh6t30OGR1cscB0injaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lb9rr/dJMcafZeFhB/h7jh6t30OGR1cscB0injaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lb9rr/dJMcafZeFhB/h7jh6t30OGR1cscB0injaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flb9rr%2FdJMcafZeFhB%2Fh7jh6t30OGR1cscB0injaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1657&quot; height=&quot;618&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;618&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;921&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y4T8s/dJMcajAy8mQ/KLAnkvttjkiRIKeLAobYB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y4T8s/dJMcajAy8mQ/KLAnkvttjkiRIKeLAobYB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y4T8s/dJMcajAy8mQ/KLAnkvttjkiRIKeLAobYB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy4T8s%2FdJMcajAy8mQ%2FKLAnkvttjkiRIKeLAobYB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;976&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연결하면 이렇게 ubuntu가 설치된 컴퓨터에 접속하게 되고, pwd 명령어를 입력해서 현재 위치를 확인해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/AWS(Amazon Web Server)</category>
      <category>AWS</category>
      <category>AWS EC2</category>
      <category>AWS 서버</category>
      <category>EC2</category>
      <category>EC2 SSH</category>
      <category>EC2 인스턴스</category>
      <category>EC2 접속</category>
      <category>ssh 접속</category>
      <category>백엔드 개발</category>
      <category>서버 접속</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/161</guid>
      <comments>https://taek2.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 11 Nov 2025 03:04:35 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2 인스턴스 생성 및 기본 세팅</title>
      <link>https://taek2.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;백엔드 개발을 하고나면 배포를 해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대표적인 서비스인 AWS(Amazon Web Server)를 사용하여 배포를 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 설정 과정에서 리전,&amp;nbsp;인스턴스&amp;nbsp;유형,&amp;nbsp;키&amp;nbsp;페어,&amp;nbsp;보안&amp;nbsp;그룹&amp;nbsp;같은&amp;nbsp;것들이&lt;br /&gt;자주 안하다 보니까 헷갈려서 나중에&amp;nbsp;다시&amp;nbsp;보려고&amp;nbsp;정리해둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 글은 AWS EC2 인스턴스를 생성하고 기본&amp;nbsp;세팅까지&amp;nbsp;진행한&amp;nbsp;실제&amp;nbsp;순서&amp;nbsp;기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;/span&gt;&amp;nbsp;EC2(Elastic Compute Cloud)&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;한&amp;nbsp;줄&amp;nbsp;요약&amp;nbsp;:&amp;nbsp;컴퓨터를&amp;nbsp;빌려서&amp;nbsp;원격으로&amp;nbsp;접속해&amp;nbsp;사용하는&amp;nbsp;서비스&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;&lt;b&gt;EC2&lt;/b&gt;&lt;/u&gt;를 쉽게 얘기하면 &lt;b&gt;&lt;u&gt;하나의 컴퓨터&lt;/u&gt;&lt;/b&gt;를 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버를 배포하기 위해서는 컴퓨터가 필요하다. 내가 가진 컴퓨터에서 서버를 배포해 다른 사용자들이 인터넷을 통해 접근할 수 있게 만들 수도 있다. 하지만 내 컴퓨터로 서버를 배포하면 24시간 동안 컴퓨터를 켜놔야 한다. 그리고 인터넷을 통해 내 컴퓨터에 접근할 수 있게 만들다보니 보안적으로도 위험할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 불편함 때문에 내가 가지고 있는 컴퓨터를 사용하지 않고, AWS EC2라는 컴퓨터를 빌려서 사용하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현업에서도 실제 서버를 배포할 때 AWS EC2를 아주 많이 사용한다. 백엔드 서버를 배포해야 할 때면 EC2에 서버를 배포해서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅&lt;/span&gt;&amp;nbsp;리전(Region)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;리전(Region)이란 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RzqTN/dJMcahirFEJ/41YMXfRFObDh88vlrYv57K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RzqTN/dJMcahirFEJ/41YMXfRFObDh88vlrYv57K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RzqTN/dJMcahirFEJ/41YMXfRFObDh88vlrYv57K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRzqTN%2FdJMcahirFEJ%2F41YMXfRFObDh88vlrYv57K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;618&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2를 통해 빌려서 쓸 수 있는 컴퓨터들이 전 세계적으로 다양하게 분포해있다. 이렇게 컴퓨터들이 위치한 위치를 보고 AWS에서는 &lt;u&gt;&lt;b&gt;리전(Region)&lt;/b&gt;&lt;/u&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 리전(Region)의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;각 Region은 고유의 이름을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;ex) &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;us-east-1 &lt;/span&gt;, &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;ap-northeast-2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SoIYO/dJMcabiemRY/QbZaBMxY6NHXimucdzDowK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SoIYO/dJMcabiemRY/QbZaBMxY6NHXimucdzDowK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SoIYO/dJMcabiemRY/QbZaBMxY6NHXimucdzDowK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSoIYO%2FdJMcabiemRY%2FQbZaBMxY6NHXimucdzDowK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;330&quot; height=&quot;357&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 리전(Region)을 선택하는 기준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사람들이 애플리케이션을 사용할 때는 네트워크를 통해 통신하게 된다. 이 때, 사용자의 위치와 애플리케이션을 실행시키고 있는 컴퓨터와 위치가 멀면 멀수록 속도가 느려진다. 따라서 &lt;u&gt;&lt;b&gt;애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전(Region)을 선택하는 것이 유리&lt;/b&gt;&lt;/u&gt;하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 한국 유저들이 주로 사용하는 서비스를 만들거라면 리전(Region)을 &lt;u&gt;&lt;b&gt;아시아 태평양(서울)&lt;/b&gt;&lt;/u&gt;로 선택하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;리전(Region)마다 EC2가 따로따로 관리가 되고 있으니 이 점 유의하자.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;EC2 세팅하기 - 인스턴스 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5T9Or/dJMcagw4Bxx/CKpCsyYvGmlZL185Iie6F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5T9Or/dJMcagw4Bxx/CKpCsyYvGmlZL185Iie6F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5T9Or/dJMcagw4Bxx/CKpCsyYvGmlZL185Iie6F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5T9Or%2FdJMcagw4Bxx%2FCKpCsyYvGmlZL185Iie6F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;389&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 이름 및 태그&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvx253/dJMcajm1Xpp/YBV4JPyunKlJEAKCIwBYp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvx253/dJMcajm1Xpp/YBV4JPyunKlJEAKCIwBYp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvx253/dJMcajm1Xpp/YBV4JPyunKlJEAKCIwBYp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvx253%2FdJMcajm1Xpp%2FYBV4JPyunKlJEAKCIwBYp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;141&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2의 이름을 설정하는 곳이다. 이름을 지을 때는 이 컴퓨터가 어떤 역할을 하는 지 알아볼 수 있게 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통 서비스명-server 이렇게 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;instagram-server&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Application and OS Images (Amazon Machine Image)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Ubuntu 24.04 LTS 선택&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C53rA/dJMcaawRaX0/9cMHmZuHwGG9atARytK2WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C53rA/dJMcaawRaX0/9cMHmZuHwGG9atARytK2WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C53rA/dJMcaawRaX0/9cMHmZuHwGG9atARytK2WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC53rA%2FdJMcaawRaX0%2F9cMHmZuHwGG9atARytK2WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;677&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;OS를 선택하는 단계이다. Windows나 Mac OS는 생각보다 용량도 많이 차지하고 성능도 많이 잡아먹는다. 그래서 서버를 배포할 컴퓨터의 OS는 훨씬 가벼운 &lt;u&gt;&lt;b&gt;Ubuntu&lt;/b&gt;&lt;/u&gt;를 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 인스턴스 유형&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 &lt;b&gt;인스턴스&lt;/b&gt;라는 뜻부터 정리하고 가자. &lt;b&gt;인스턴스&lt;/b&gt;란, &lt;b&gt;AWS EC2에서 빌리는 컴퓨터 1대를 의미&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;그럼&amp;nbsp;&lt;/span&gt;&lt;b&gt;인스턴스 유형&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;은 무슨 뜻일까?&amp;nbsp;&lt;/span&gt;&lt;b&gt;컴퓨터 사양을 의미&lt;/b&gt;한다. 컴퓨터 사양이 좋으면 좋을수록 많은 수의 요청을 처리할 수 있고, 무거운 서버나 프로그램을 돌릴 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yy1U4/dJMcafSs6yQ/bCZ4G9s8adJ8Lwkctnj7o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yy1U4/dJMcafSs6yQ/bCZ4G9s8adJ8Lwkctnj7o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yy1U4/dJMcafSs6yQ/bCZ4G9s8adJ8Lwkctnj7o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyy1U4%2FdJMcafSs6yQ%2FbCZ4G9s8adJ8Lwkctnj7o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;211&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리 티어에 해당하는 &lt;b&gt;t3.micro&lt;/b&gt;를 사용할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 키 페어(로그인)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키 페어(Key Pair)는 무슨 뜻일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 컴퓨터에 접근할 때 사용하는 비밀번호라고 생각하면 된다. 말 그대로 열쇠(Key, 키)의 역할을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK8SAi/dJMcacuFOtg/qmTM39QYnZzIugn6KJQsV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK8SAi/dJMcacuFOtg/qmTM39QYnZzIugn6KJQsV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK8SAi/dJMcacuFOtg/qmTM39QYnZzIugn6KJQsV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK8SAi%2FdJMcacuFOtg%2FqmTM39QYnZzIugn6KJQsV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1088&quot; height=&quot;178&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키 페어 이름 : &lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;instagram-server-key-pair&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N8eft/dJMcaajj2vt/0RkPH3MzNL60zzlTrVQ4O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N8eft/dJMcaajj2vt/0RkPH3MzNL60zzlTrVQ4O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N8eft/dJMcaajj2vt/0RkPH3MzNL60zzlTrVQ4O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN8eft%2FdJMcaajj2vt%2F0RkPH3MzNL60zzlTrVQ4O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;573&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;u&gt;&lt;b&gt;키 페어 이름&lt;/b&gt;&lt;/u&gt;은 어떤 EC2에 접근하기 위한 키 페어였는 지 알아볼 수 있게 지정하면 좋다. &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;RSA&lt;/span&gt;와 &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;.pem&lt;/span&gt;을 선택한 후에 키 페어를 생성하면 된다. &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;ED25519&lt;/span&gt;가 뭔지, &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;.ppk&lt;/span&gt;가 뭔지는 몰라도 된다. 중요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 키 페어를 생성하면 파일이 하나 다운받아질텐데, 그 파일은 잃어버리면 안 되니 잘 보관해놔야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 참고) 아래에서는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;키 페어&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;를 활용해서 EC2에 접근하지 않고, 더 편한 방법으로 접근할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 네트워크 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLsaMY/dJMcaaXVuOs/9NCyJT8PQWMU9Im6vBlP01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLsaMY/dJMcaaXVuOs/9NCyJT8PQWMU9Im6vBlP01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLsaMY/dJMcaaXVuOs/9NCyJT8PQWMU9Im6vBlP01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLsaMY%2FdJMcaaXVuOs%2F9NCyJT8PQWMU9Im6vBlP01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;611&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;611&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;977&quot; data-origin-height=&quot;1123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWRYCq/dJMcad8bGlJ/LoeQ9GvCNCoEBw0FYxxZY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWRYCq/dJMcad8bGlJ/LoeQ9GvCNCoEBw0FYxxZY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWRYCq/dJMcad8bGlJ/LoeQ9GvCNCoEBw0FYxxZY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWRYCq%2FdJMcad8bGlJ%2FLoeQ9GvCNCoEBw0FYxxZY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;1123&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;1123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;외부에서 EC2로 접근할 포트는 &lt;u&gt;&lt;b&gt;22번 포트&lt;/b&gt;&lt;/u&gt;와 &lt;u&gt;&lt;b&gt;80번 포트&lt;/b&gt;&lt;/u&gt;라고 생각해서 이 2가지에 대해 인바운드 보안 그룹 규칙을 추가했다. 왜냐하면 22번 포트는 우리가 EC2에 원격 접속할 때 사용하는 포트이고, 80번 포트에는 백엔드 서버를 띄울 예정이기 때문이다. 그리고 어떤 IP에서든 전부 접근할 수 있게 만들기 위해 소스 유형은 &lt;u&gt;&lt;b&gt;위치 무관&lt;/b&gt;&lt;/u&gt;으로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;네트워크 설정 칸을 보면&amp;nbsp;&lt;/span&gt;&lt;b&gt;VPC&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;와&amp;nbsp;&lt;/span&gt;&lt;b&gt;Security Groups(보안 그룹)&lt;/b&gt;가 보인다. 여기서 VPC라는 개념은 AWS를 입문하는 입장에서는 크게 중요하지 않으니 넘어가자. 나중에 AWS에 어느 정도 익숙해졌을 때 VPC를 학습하도록 하자. VPC를 몰라도 서버를 배포하는 데 아무 문제가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 Security Groups(보안 그룹)은 서버를 배포할 때 중요한 개념이므로 자세히 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[보안 그룹]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;&lt;b&gt;보안 그룹(Security Group)&lt;/b&gt;&lt;/u&gt;이란 &lt;u&gt;&lt;b&gt;AWS 클라우드에서의 네트워크 보안&lt;/b&gt;&lt;/u&gt;을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0MGJp/dJMcajHkHbV/y41WCYTtA1qHhhOGa8EKz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0MGJp/dJMcajHkHbV/y41WCYTtA1qHhhOGa8EKz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0MGJp/dJMcajHkHbV/y41WCYTtA1qHhhOGa8EKz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0MGJp%2FdJMcajHkHbV%2Fy41WCYTtA1qHhhOGa8EKz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;309&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;EC2 인스턴스&lt;/b&gt;를 &lt;b&gt;집&lt;/b&gt;이라고 생각한다면, &lt;b&gt;보안 그룹&lt;/b&gt;은 &lt;b&gt;집 바깥 쪽에 쳐져있는 울타리와 대문&lt;/b&gt;이라고 생각하면 된다. 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 보안 요원이 검사를 하는 것과 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인터넷에서 일부 사용자가 EC2 인스턴스에 접근(액세스)하려고 한다고 가정해보자. 위 그림과 같이 EC2 인스턴스 주위에 방화벽 역할을 할 &lt;u&gt;&lt;b&gt;보안 그룹(Security Group)&lt;/b&gt;&lt;/u&gt;을 만들고 보안 그룹에 규칙을 지정한다. 이 보안 규칙에는 &lt;u&gt;&lt;b&gt;인바운드 트래픽(즉, 외부에서 EC2 인스턴스로 보내는 트래픽)&lt;/b&gt;&lt;/u&gt;에서 어떤 트래픽만 허용할 지 설정할 수 있고, &lt;b&gt;&lt;u&gt;아웃바운드 트래픽(즉, EC2 인스턴스에서 외부로 나가는 트래픽)&lt;/u&gt;&lt;/b&gt;에서 어떤 트래픽만 허용할 지 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안 그룹을 설정할 때는 허용할 &lt;u&gt;&lt;b&gt;IP 범위&lt;/b&gt;&lt;/u&gt;와 &lt;u&gt;&lt;b&gt;포트(port)&lt;/b&gt;&lt;/u&gt;를 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 스토리지(볼륨)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리가 쓰고 있는 노트북이나 데스크톱 컴퓨터는 전부 하드디스크를 가지고 있다. 하드디스크는 컴퓨터에서 파일을 저장하는 공간이다. EC2도 하나의 컴퓨터이다보니 여러 파일들을 저장할 저장 공간이 필요하다. 이 저장 공간을 보고 &lt;u&gt;&lt;b&gt;EBS(Elastic Block Storage)&lt;/b&gt;&lt;/u&gt;라고 부른다. 즉, EBS란 EC2 안에 부착되어 있는 일종의 하드디스크라고 생각하면 된다. EBS와 같은 저장 공간을 조금 더 포괄적인 용어로 &lt;u&gt;&lt;b&gt;스토리지(Storage)&lt;/b&gt;&lt;/u&gt;, &lt;u&gt;&lt;b&gt;볼륨(Volume)&lt;/b&gt;&lt;/u&gt;이라고 부른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMhJYS/dJMcagKBIs6/9zEZ5ORhJg49JWn0WTX7k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMhJYS/dJMcagKBIs6/9zEZ5ORhJg49JWn0WTX7k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMhJYS/dJMcagKBIs6/9zEZ5ORhJg49JWn0WTX7k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMhJYS%2FdJMcagKBIs6%2F9zEZ5ORhJg49JWn0WTX7k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;793&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스토리지의 종류를 보면 gp3 이외에도 여러가지 종류의 스토리지가 있다. 하지만 가성비가 좋은 &lt;u&gt;&lt;b&gt;gp3&lt;/b&gt;&lt;/u&gt;를 선택해주자. 용량을 &lt;u&gt;&lt;b&gt;30GiB&lt;/b&gt;&lt;/u&gt;를 설정한 이유는 프리 티어에서 30GiB까지 무료로 제공해주기 때문이다. 이 스토리지의 크기는 추후에 늘릴 수도 있으므로 처음 설정할 때 너무 큰 고민을 할 필요는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 실행 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPtnvB/dJMcaboZOdb/gkLPVGlHZ461WevdUcuTd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPtnvB/dJMcaboZOdb/gkLPVGlHZ461WevdUcuTd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPtnvB/dJMcaboZOdb/gkLPVGlHZ461WevdUcuTd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPtnvB%2FdJMcaboZOdb%2FgkLPVGlHZ461WevdUcuTd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1573&quot; height=&quot;237&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;좌측 메뉴에서 인스턴스 들어가보면 생성한 인스턴스가 실행되고 있는것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/AWS(Amazon Web Server)</category>
      <category>AWS</category>
      <category>AWS EC2</category>
      <category>AWS 서버</category>
      <category>AWS 서버 세팅</category>
      <category>EC2</category>
      <category>EC2 인스턴스</category>
      <category>EC2 인스턴스 생성</category>
      <category>백엔드 개발</category>
      <category>서버 배포</category>
      <category>클라우드 서버</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/160</guid>
      <comments>https://taek2.tistory.com/160#entry160comment</comments>
      <pubDate>Tue, 11 Nov 2025 02:28:20 +0900</pubDate>
    </item>
    <item>
      <title>[서버] IP와 Port 개념 정리</title>
      <link>https://taek2.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;서버 개발/운영할 때 &lt;b&gt;IP와 Port의 차이&lt;/b&gt;를 정확히 알고 있어야 네트워크&amp;nbsp;통신이&amp;nbsp;명확해진다.&lt;br /&gt;&lt;br /&gt;IP는 &lt;b&gt;네트워크상의 컴퓨터 주소&lt;/b&gt;를,&lt;br /&gt;Port는 &lt;b&gt;그 컴퓨터 내부에서 서비스/프로그램을 구분하는 번호&lt;/b&gt;를 의미한다.&lt;br /&gt;&lt;br /&gt;이 글은 IP와 Port 개념을 쉽게 이해하기 위해 정리해본다.&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;IP의 개념&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;nbsp;한&amp;nbsp;줄&amp;nbsp;요약&amp;nbsp;:&amp;nbsp;네트워크&amp;nbsp;상에서의&amp;nbsp;특정&amp;nbsp;컴퓨터를&amp;nbsp;가리키는&amp;nbsp;주소&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같은 값이 IP 주소이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;13.250.15.132&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;IP는 특정 컴퓨터의 주소를 가리킨다. 예를 들면, &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;naver.com&lt;/span&gt;이라는 서비스도 IP 주소를 가지고 있다. 저 IP 주소는 네이버가 운영하고 있는 컴퓨터의 주소이기도 하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/onz2m/dJMcagX806G/JtWDwnpvDCsu4GStISFMfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/onz2m/dJMcagX806G/JtWDwnpvDCsu4GStISFMfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/onz2m/dJMcagX806G/JtWDwnpvDCsu4GStISFMfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fonz2m%2FdJMcagX806G%2FJtWDwnpvDCsu4GStISFMfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;160&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;Port의 개념&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  한 줄 요약 : 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같은 값에서 :3000 부분이 포트 번호를 의미한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;13.250.15.132:3000&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한 컴퓨터 내에서 여러 프로그램이 실행되고 있을 것이다. 내가 지금 사용하고 있는 노트북만 보더라도 크롬, 카카오톡, 슬랙, VSCode 등 여러가지 프로그램이 동시에 실행되고 있다. 실제 서버를 운영하는 컴퓨터도 동일하다. 하나의 컴퓨터에서 여러가지의 프로그램이 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그럼 외부에서 특정 컴퓨터 내부에 있는 Spring Boot라는 서버에 통신을 하고 싶다고 가정하자. 하지만 외부에서 IP 주소만 알아서는 실행되고 있는 여러 프로그램 중 어떤 프로그램과 통신을 해야 할 지 알 수가 없다. 그래서 특정 서버와 통신을 할 때는 &lt;u&gt;&lt;b&gt;IP 주소&lt;/b&gt;&lt;/u&gt;와 서버가 실행되고 있는 &lt;u&gt;&lt;b&gt;포트 번호&lt;/b&gt;&lt;/u&gt;까지 알고 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;브라우저 창에 포트 번호를 입력하지 않는 이유?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 설명에서 분명 특정 서버와 통신하기 위해서는 &lt;b&gt;IP 주소&lt;/b&gt;와 &lt;b&gt;포트 번호&lt;/b&gt;를 둘 다 알아야 된다고 했다. 도메인 주소를 통해서 알 수 있는 건 &lt;b&gt;IP 주소&lt;/b&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;454&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZ4My/dJMcafSs7dR/WsLUhmtsNNZ1uLipz5oMxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZ4My/dJMcafSs7dR/WsLUhmtsNNZ1uLipz5oMxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZ4My/dJMcafSs7dR/WsLUhmtsNNZ1uLipz5oMxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZ4My%2FdJMcafSs7dR%2FWsLUhmtsNNZ1uLipz5oMxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;104&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주소창에 도메인 주소를 입력해서 엔터를 누르면, &lt;b&gt;브라우저(크롬, 익스플로러 등)는 기본적으로 80번 포트로 통신을 보내게 설정되어 있다.&lt;/b&gt; 그래서 포트 번호를 입력해주지 않아도 통신이 잘 됐던 것이었다. 만약 80번 포트로 통신하고 싶지 않고, 3000번 포트로 통신하고 싶다면 아래와 같이 주소창에 입력해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGhgeH/dJMcabvLtQH/liN099QC8m4IKi9K6qdKzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGhgeH/dJMcabvLtQH/liN099QC8m4IKi9K6qdKzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGhgeH/dJMcabvLtQH/liN099QC8m4IKi9K6qdKzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGhgeH%2FdJMcabvLtQH%2FliN099QC8m4IKi9K6qdKzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;82&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;✅ &lt;/span&gt;잘 알려진 포트(well-known port)란 ?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt; &amp;zwj;  포트(Port)에는 잘 알려진 포트(well-known port)라는 개념이 있다. 이 개념에 대해 알아보자.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;포트 번호는 &lt;b&gt;0 ~ 65,535번&lt;/b&gt;까지 사용할 수 있다. 그 중에서 &lt;b&gt;0 ~ 1023번&lt;/b&gt;까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져 있다. 이렇게 &lt;b&gt;규약을 통해 역할이 정해져있는 포트 번호&lt;/b&gt;를 보고 &lt;u&gt;&lt;b&gt;잘 알려진 포트(well-known port)&lt;/b&gt;&lt;/u&gt;라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;규약으로 정해져 있는 포트 번호 중 자주 사용되는 포트 번호에 대해서만 알아보자.&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;22번 (SSH, Secure Shell Protocol)&lt;/b&gt; : 원격 접속을 위한 포트 번호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 인스턴스에 연결할 때 22번 포트를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;80번 (HTTP)&lt;/b&gt; : HTTP로 통신을 할 때 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;443번 (HTTPS)&lt;/b&gt; : HTTPS로 통신을 할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 착각하면 안 되는 점은 위에서 정해놓은 규약을 꼭 지키지 않아도 된다. 즉, 규약으로 정해져 있는 포트 번호와 다르게 사용해도 된다는 뜻이다. 예를 들어, 특정 서버와 HTTP 통신을 할 때 80번 포트를 쓰지 않고 3000번 포트나 8080번 포트를 써도 상관 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Server</category>
      <category>AWS</category>
      <category>ip</category>
      <category>IP와 Port</category>
      <category>Port</category>
      <category>네트워크 기초</category>
      <category>백엔드 개발</category>
      <category>서버 기초</category>
      <category>서버 네트워크</category>
      <category>웹 서버</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/159</guid>
      <comments>https://taek2.tistory.com/159#entry159comment</comments>
      <pubDate>Tue, 11 Nov 2025 02:01:21 +0900</pubDate>
    </item>
    <item>
      <title>[리팩토링] OpenFeign으로 외부 API 호출 리팩토링한 기록 (Resilience4j 적용)</title>
      <link>https://taek2.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Spring 프로젝트에서 외부 API 호출을 &lt;b&gt;기존 RestTemplate과 자체 HTTP Client로 처리&lt;/b&gt;하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;API 호출 코드가 늘어나면서 유지보수와 테스트가 점점 불편해져서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OpenFeign으로 전환&lt;/b&gt;하는 리팩토링을 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;전환 과정에서 외부 API 장애로 인한 서버 부하를 줄이기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Resilience4j를 적용&lt;/b&gt;해 &lt;b&gt;서킷 브레이커 패턴&lt;/b&gt;도 함께 적용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;이 글은 RestTemplate 기반 외부 API 호출을&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OpenFeign&amp;nbsp;+&amp;nbsp;Resilience4j&amp;nbsp;구조&lt;/b&gt;로&amp;nbsp;리팩토링한&amp;nbsp;기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[핵심 요약]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 자체 HTTP Client 및 RestTemplate을 OpenFeign으로 전환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존에는 &lt;b&gt;RestTemplate&lt;/b&gt;이나 &lt;b&gt;직접 구현한 HTTP Client&lt;/b&gt;를 사용하여 외부 API를 호출했지만, 이를 &lt;b&gt;OpenFeign&lt;/b&gt;으로 변경했다.&lt;/li&gt;
&lt;li&gt;OpenFeign을 사용하면 API 호출을 &lt;b&gt;인터페이스 기반으로 선언형&lt;/b&gt;으로 작성할 수 있어 &lt;b&gt;코드가 간결&lt;/b&gt;해지고 유지보수가 쉬워진다.&lt;/li&gt;
&lt;li&gt;테스트 시에도 API 호출을 &lt;b&gt;Mock 객체&lt;/b&gt;로&amp;nbsp; 대체하기 쉬워 &lt;b&gt;테스트 용이성&lt;/b&gt;이 증가한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. OpenFeign + Resilience4j로 서킷 브레이커 패턴 적용&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;기존 HTTP Client에서 네트워크 장애가 발생하면, 응답 시간이 지연되거나 서버 부하가 증가하는 문제가 있었다.&lt;/li&gt;
&lt;li&gt;이를 &lt;b&gt;Resilience4j&lt;/b&gt;의 &lt;b&gt;서킷 브레이커 패턴&lt;/b&gt;을 활용해 해결했다.&lt;/li&gt;
&lt;li&gt;OpenFeign을 사용할 때 Resilience4j를 적용하면, 장애 발생 시 &lt;b&gt;즉시 실패 처리&lt;/b&gt;하고, 특정 시간 동안 API 호출을 차단하여 &lt;b&gt;서버가 과부하되지 않도록 보호&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. [Before] 기존 RestTemplate 사용 방식 (예시)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743870097576&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;

@Service
public class UserService {
	
    private final RestTemplate restTemplate = new RestTemplate();
    
    public String getUserInfo(Long userId) {
    	String url = &quot;http://localhost:8080/users/&quot; + userId;
        ResponseEntity&amp;lt;String&amp;gt; response = restTemplate.getForEntity(url, String.class);
        return response.getBody();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[문제점]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- HTTP 요청을 직접 생성해야 하고, 예외 처리 및 장애 대응을 수동으로 구현해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- API 호출 코드가 많아지고 테스트하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. [After] OpenFeign 적용 방식&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743870304783&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = &quot;userClient&quot;, url = &quot;https://api.example.com&quot;)
public interface UserClient {

    @GetMapping(&quot;/users/{id}&quot;)
    String getUserInfo(@PathVariable(&quot;id&quot;) Long userId);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[장점]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;API 호출&lt;/b&gt; 로직이 &lt;b&gt;인터페이스 선언만으로 간결&lt;/b&gt;해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 테스트 시 이 인터페이스를 &lt;b&gt;Mock 객체&lt;/b&gt;로 대체가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. [Resilience4j 적용] 서킷 브레이커 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1743870611832&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserClient userClient;

    public UserService(UserClient userClient) {
        this.userClient = userClient;
    }

    @CircuitBreaker(name = &quot;userService&quot;, fallbackMethod = &quot;fallbackUserInfo&quot;)
    public String getUserInfo(Long userId) {
        return userClient.getUserInfo(userId);
    }

    public String fallbackUserInfo(Long userId, Throwable t) {
        return &quot;Default User Info&quot;; // 장애 발생 시 기본 응답 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[서킷 브레이커 기능]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- API 요청이 반복적으로 실패하면, 일정 기간 동안 요청을 차단하여 서버 과부하를 방지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 장애 발생 시 fallbackUserInfo() 메서드를 호출하여 &lt;b&gt;기본 응답을 반환&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- Resilience4j 덕분에 &lt;b&gt;안정적인 API 호출 구조&lt;/b&gt;를 유지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.&amp;nbsp; 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 기존의 HTTP Clinet, RestTemplate을 OpenFeign으로 전환하여 코드를 간결화하고 테스트 용이성을 증가시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- OpenFeign에 &lt;b&gt;Resilience4j 서킷 브레이커 패턴&lt;/b&gt;을 적용하여, API 장애 발생 시 &lt;b&gt;즉시 실패 처리&lt;/b&gt;하고 &lt;b&gt;서버 과부하를 방지&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정리하면, 외부 API 호출이 많은 Spring 프로젝트에서는 RestTemplate&amp;nbsp;기반&amp;nbsp;구조보다&amp;nbsp;&amp;nbsp;&lt;br /&gt;OpenFeign&amp;nbsp;+&amp;nbsp;Resilience4j&amp;nbsp;조합이&amp;nbsp;유지보수와&amp;nbsp;안정성&amp;nbsp;측면에서&amp;nbsp;훨씬&amp;nbsp;효과적이었다.&lt;/p&gt;</description>
      <category>웹 개발/Spring&amp;amp;JPA</category>
      <category>API 리팩토링</category>
      <category>feign</category>
      <category>openfeign</category>
      <category>resilience4j</category>
      <category>spring</category>
      <category>Spring Boot</category>
      <category>마이크로서비스</category>
      <category>백엔드 개발</category>
      <category>서킷 브레이커</category>
      <category>외부 API 호출</category>
      <author>태기</author>
      <guid isPermaLink="true">https://taek2.tistory.com/158</guid>
      <comments>https://taek2.tistory.com/158#entry158comment</comments>
      <pubDate>Sun, 6 Apr 2025 01:44:52 +0900</pubDate>
    </item>
  </channel>
</rss>