<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발은전투다</title>
    <link>https://devwar.tistory.com/</link>
    <description>다들 코딩은 가르쳐주지만 그 역사는 안 알려주죠. 프로그래밍 언어와 개발 도구가 걸어온 길, 개발 철학과 IT 트렌드를 풀어냅니다.</description>
    <language>ko</language>
    <pubDate>Tue, 20 Oct 2026 21:51:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발선생</managingEditor>
    <image>
      <title>개발은전투다</title>
      <url>https://tistory1.daumcdn.net/tistory/8542472/attach/ca6abcaeff154e2f96ae12ac9a594159</url>
      <link>https://devwar.tistory.com</link>
    </image>
    <item>
      <title>2038년 문제, Y2K 다음 시한폭탄은 이미 날짜가 정해져 있습니다</title>
      <link>https://devwar.tistory.com/entry/year-2038-problem-unix-time</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2038년 문제, 다가오는 시한폭탄.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VUzFt/dJMcafuVTpG/O7hKiCXp9XltCjvI39dguk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VUzFt/dJMcafuVTpG/O7hKiCXp9XltCjvI39dguk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VUzFt/dJMcafuVTpG/O7hKiCXp9XltCjvI39dguk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVUzFt%2FdJMcafuVTpG%2FO7hKiCXp9XltCjvI39dguk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;2038년 문제, Y2K 다음 시한폭탄은 이미 날짜가 정해져 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;2038년 문제, 다가오는 시한폭탄.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2038년 문제는 2038년 1월 19일 03:14:07(UTC)에 32비트 유닉스 시간이 넘쳐 1901년으로 돌아가는 버그입니다. 한국 시간으로는 그날 낮 12시 14분 7초이고, Y2K와 달리 날짜가 계산으로 딱 정해져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 컴퓨터가 시간을 어떤 숫자로 세길래 그 시각에 문제가 생기는지, Y2K와 무엇이 다른지, 리눅스와 C 라이브러리는 어디까지 고쳤는지, 그리고 64비트 서버를 쓰는데도 아직 조심해야 하는 곳이 어디인지를 다룹니다. 이미 이 문제와 같은 원리로 실제 장애가 난 사례와, 2038년 말고도 날짜가 정해진 비슷한 문제들도 정리했습니다. 제목은 &quot;시한폭탄&quot;이라고 했지만, 결론부터 말하면 모든 컴퓨터가 그날 멈추는 건 아닙니다. 어디가 위험하고 어디는 이미 안전한지를 나누는 게 이 글의 목표입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2038년 문제란, 초를 세는 숫자가 넘치는 날&lt;/li&gt;
&lt;li&gt;왜 1970년이고 왜 32비트였나&lt;/li&gt;
&lt;li&gt;넘치면 정확히 무슨 일이 생기나&lt;/li&gt;
&lt;li&gt;Y2K와 무엇이 다른가&lt;/li&gt;
&lt;li&gt;64비트로 바꾸면 끝일까&lt;/li&gt;
&lt;li&gt;리눅스와 C 라이브러리는 어디까지 고쳤나&lt;/li&gt;
&lt;li&gt;데이터베이스에 숨어 있는 2038년&lt;/li&gt;
&lt;li&gt;같은 원리로 이미 터진 사고&lt;/li&gt;
&lt;li&gt;2038년 말고도 날짜가 정해진 문제들&lt;/li&gt;
&lt;li&gt;지금 점검해 볼 것&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 2038년 문제란, 초를 세는 숫자가 넘치는 날&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터, 특히 유닉스 계열 운영체제는 시간을 &quot;1970년 1월 1일 0시 0분 0초(UTC)부터 몇 초가 지났는가&quot;라는 정수 하나로 저장합니다. 이걸 유닉스 시간(Unix time) 또는 에포크 시간이라고 부르고, 그 기준 시각을 에포크(epoch)라고 합니다. 예를 들어 이 글의 발행 시각인 2026년 10월 20일 19시(한국 시간)는 유닉스 시간으로 1,792,490,400입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이 숫자를 담는 그릇의 크기입니다. C 언어에서 시간을 담는 자료형 time_t가 오랫동안 부호 있는 32비트 정수였는데, 이 그릇에 들어가는 가장 큰 수는 2&lt;sup&gt;31&lt;/sup&gt;&amp;minus;1, 즉 2,147,483,647입니다. 1970년부터 2,147,483,647초를 더하면 정확히 2038년 1월 19일 03:14:07(UTC)이 됩니다. 그 1초 뒤에는 숫자를 더 담을 자리가 없습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 32%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;유닉스 시간 값&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;UTC 시각&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;한국 시간(KST)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;1970-01-01 00:00:00&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;1970-01-01 09:00:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1,792,490,400&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2026-10-20 10:00:00&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2026-10-20 19:00:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2,147,483,647 (32비트 최댓값)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2038-01-19 03:14:07&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2038-01-19 12:14:07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;&amp;minus;2,147,483,648 (넘친 직후 값)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;1901-12-13 20:45:52&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;1901-12-14 05:45:52&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 확인해 볼 수 있습니다. 리눅스나 macOS 터미널에서 아래 명령을 치면 32비트 최댓값이 가리키는 시각이 나옵니다. (macOS의 date는 -d 대신 -r 옵션을 씁니다.)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;date -u -d @2147483647
# Tue Jan 19 03:14:07 UTC 2038

date -u -d @-2147483648
# Fri Dec 13 20:45:52 UTC 1901&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 계산해도 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from datetime import datetime, timezone, timedelta

epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
print(epoch + timedelta(seconds=2**31 - 1))   # 2038-01-19 03:14:07+00:00
print(epoch + timedelta(seconds=-2**31))      # 1901-12-13 20:45:52+00:00&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  &quot;2038년 문제&quot;는 날짜가 아니라 그릇 크기의 문제입니다&lt;/b&gt;&lt;br /&gt;2038년이라는 해에 특별한 뜻이 있는 게 아닙니다. 1970년에서 출발해 1초씩 세는 숫자를 32비트에 담기로 한 순간, 넘치는 날이 2038년 1월 19일로 계산돼 버린 것입니다. 그래서 이 문제는 &quot;언젠가 터질지 모르는 버그&quot;가 아니라 &quot;몇 시 몇 분 몇 초에 터질지 아는 버그&quot;입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 1970년이고 왜 32비트였나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유닉스는 1969년 벨 연구소에서 켄 톰프슨과 데니스 리치가 만들기 시작한 운영체제입니다. 당시 컴퓨터는 메모리 한 바이트가 귀하던 시절이라, 시간을 32비트 정수 하나로 저장하는 건 꽤 넉넉한 선택이었습니다. 68년 뒤의 일까지 걱정할 이유가 없었던 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 알려진 이야기와 달리, 처음부터 &quot;1970년 1월 1일부터 초 단위&quot;였던 것도 아닙니다. 초기 유닉스 매뉴얼에는 시간을 1초의 60분의 1 단위로, 1971년 1월 1일을 기준으로 세었다는 기록이 남아 있습니다. 이렇게 세면 32비트로 2년 반 정도밖에 담지 못하기 때문에, 이후 기준을 1970년 1월 1일로 맞추고 단위를 1초로 바꿨다고 알려져 있습니다. 1970년이 고른 이유는 &quot;계산하기 쉬운 가까운 해의 첫날&quot;이었다는 설명이 일반적이고, 특별한 사건을 기념한 날은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부호 있는(signed) 정수를 쓴 것도 이유가 있습니다. 음수를 쓰면 1970년 이전 날짜도 표현할 수 있기 때문입니다. 대신 표현할 수 있는 범위의 절반을 과거에 썼으니, 미래 쪽은 2038년에서 끝나게 됐습니다. 부호 없는(unsigned) 32비트였다면 2106년 2월 7일까지 버틸 수 있었지만, 대신 1970년 이전은 표현할 수 없었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 넘치면 정확히 무슨 일이 생기나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수가 넘치는 현상을 오버플로라고 합니다. 부호 있는 32비트 정수는 맨 앞 비트가 부호를 뜻하는데, 2,147,483,647은 이진수로 0 뒤에 1이 31개 붙은 모양입니다. 여기에 1을 더하면 1 뒤에 0이 31개 붙은 모양이 되고, 이건 부호 있는 정수로 읽으면 가장 작은 음수인 &amp;minus;2,147,483,648입니다. 대부분의 시스템에서 그 결과 시계는 앞으로 1초 가는 대신 1901년 12월 13일로 136년을 거꾸로 뛰게 됩니다. (C 언어 표준에서 부호 있는 정수 오버플로는 정의되지 않은 동작이라, 이론적으로는 프로그램마다 결과가 다를 수 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;body1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YHv2e/dJMcafoiQ8W/Wy27mZOupNiITwJfjRlWYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YHv2e/dJMcafoiQ8W/Wy27mZOupNiITwJfjRlWYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YHv2e/dJMcafoiQ8W/Wy27mZOupNiITwJfjRlWYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYHv2e%2FdJMcafoiQ8W%2FWy27mZOupNiITwJfjRlWYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;2038년 문제, 32비트 유닉스 시간이 2038-01-19 03:14:07 UTC에 넘쳐 1901년으로 돌아가는 과정&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;720&quot; data-filename=&quot;body1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 C 코드는 32비트 정수에 담긴 시간이 넘치는 순간을 흉내 낸 것입니다. 오버플로를 일부러 일으키지 않으려고 부호 없는 정수로 더한 뒤 다시 32비트 부호 있는 값으로 바꿨습니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;inttypes.h&amp;gt;

int main(void) {
    int32_t t = INT32_MAX;                    /* 2147483647 = 2038-01-19 03:14:07 UTC */
    printf(&quot;before: %&quot; PRId32 &quot;\n&quot;, t);
    t = (int32_t)((uint32_t)t + 1u);          /* 1초 더하기 */
    printf(&quot;after : %&quot; PRId32 &quot;\n&quot;, t);               /* -2147483648 = 1901-12-13 20:45:52 UTC */
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계가 136년 뒤로 가면 증상은 다양합니다. 인증서가 &quot;아직 유효 기간이 시작되지 않았다&quot;고 판단해 HTTPS 연결이 실패할 수 있고, &quot;마지막 갱신 후 몇 초가 지났나&quot;를 계산하는 코드가 음수를 받아 타이머가 영원히 울리지 않거나 계속 울릴 수 있습니다. 로그 정렬이 엉키고, 예약 작업이 실행되지 않고, 만료 시각 비교가 거꾸로 됩니다. 시간은 거의 모든 프로그램이 조용히 쓰는 값이라, 어디서 무엇이 깨질지 미리 다 알기 어렵다는 게 진짜 위험입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Y2K와 무엇이 다른가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목에서 &quot;Y2K 다음 시한폭탄&quot;이라고 했지만, 두 문제는 원인이 꽤 다릅니다. Y2K는 사람이 연도를 두 자리 문자로 줄여 저장한 습관 때문에 생겼고, 2038년 문제는 기계가 시간을 이진 정수로 저장하는 방식 때문에 생깁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 32%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Y2K(2000년 문제)&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;2038년 문제&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;연도를 &quot;99&quot;처럼 두 자리로 저장&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;초를 부호 있는 32비트 정수로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;터지는 시각&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2000년 1월 1일 0시(각 지역 시간)&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2038년 1월 19일 03:14:07 UTC, 전 세계 같은 순간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;잘못되는 모습&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2000년을 1900년으로 해석&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;1901년 12월 13일로 되돌아감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주로 있는 곳&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;업무용 프로그램, 데이터 파일, 코볼 시스템&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;운영체제, C 라이브러리, 파일 형식, 임베디드 기기, DB 컬럼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;고치는 방법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;연도를 네 자리로 바꾸고 프로그램 수정&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;time_t를 64비트로 바꾸고 다시 빌드, 저장 형식 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y2K는 2000년이 무사히 지나가서 &quot;괜히 호들갑 떨었다&quot;는 평가를 받기도 하지만, 실제로는 전 세계가 수년 동안 큰돈을 들여 미리 고쳤기 때문에 큰 사고가 적었다는 시각이 많습니다. 2038년 문제도 같은 길을 가고 있습니다. 주요 운영체제와 라이브러리는 이미 상당 부분 고쳐졌고, 남은 건 오래된 기기와 데이터 형식처럼 눈에 잘 안 띄는 곳입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  &quot;그날 모든 컴퓨터가 멈춘다&quot;는 사실이 아닙니다&lt;/b&gt;&lt;br /&gt;지금 쓰는 64비트 리눅스, 윈도우, macOS의 시간 자료형은 이미 64비트라 2038년과 상관이 없습니다. 위험한 건 32비트 시간을 그대로 쓰는 기기와 프로그램, 그리고 64비트 시스템 위에서도 시간을 32비트 칸에 저장하는 파일&amp;middot;DB&amp;middot;프로토콜입니다. &quot;시한폭탄&quot;은 컴퓨터 전체가 아니라 그런 구석에 묻혀 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 64비트로 바꾸면 끝일까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간을 64비트 부호 있는 정수로 담으면 표현 범위는 약 2,920억 년으로 늘어납니다. 우주의 나이(약 138억 년)보다 훨씬 깁니다. 그래서 64비트 time_t로 바꾸는 것이 근본 해결책이고, 64비트 운영체제는 대부분 처음부터 time_t가 64비트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데도 &quot;64비트 서버니까 우리는 괜찮다&quot;고 끝낼 수 없는 이유가 세 가지 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 28%;&quot; /&gt;&lt;col style=&quot;width: 72%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;남는 위험&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;어떤 경우인가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;32비트 기기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;공장 제어기, 네트워크 장비, 셋톱박스, 자동차 부품처럼 오래 쓰는 임베디드 기기. 2038년에도 현장에서 돌아갈 가능성이 높고 업데이트가 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;저장 형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;파일 헤더, 바이너리 프로토콜, DB 컬럼이 시간을 4바이트로 정해 둔 경우. 프로그램이 64비트여도 저장하는 순간 잘림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;코드 속 형 변환&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;Java의 (int)(System.currentTimeMillis() / 1000)처럼 초 단위 시간을 int에 담는 코드. 언어나 OS와 상관없이 그 코드만 2038년에 깨짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째가 의외로 흔합니다. 예를 들어 자바의 System.currentTimeMillis()는 long(64비트)이라 안전하지만, 이걸 1,000으로 나눠 int 변수에 담는 순간 32비트 문제가 다시 생깁니다. 자바스크립트의 Date는 밀리초를 64비트 부동소수점으로 다뤄서 서기 275760년까지 표현할 수 있지만, 서버로 보낼 때 초 단위 정수를 32비트 필드에 넣는 API를 만나면 같은 문제가 생깁니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;long nowMillis = System.currentTimeMillis();   // 안전: 64비트
int  nowSec     = (int) (nowMillis / 1000);    // 위험: 2038-01-19 이후 음수
long nowSecOk   = nowMillis / 1000;            // 안전: long 유지
java.time.Instant now = java.time.Instant.now(); // 가장 권장&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 리눅스와 C 라이브러리는 어디까지 고쳤나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;64비트 운영체제는 원래 안전했으니, 실제 고칠 일이 많았던 곳은 32비트 리눅스였습니다. 32비트 시스템에서 time_t를 64비트로 바꾸면 그 자료형을 쓰는 모든 함수와 구조체의 모양이 바뀝니다. 이미 빌드된 프로그램과 라이브러리가 서로 맞지 않게 되기 때문에, 운영체제 커널, C 라이브러리, 배포판이 순서대로 바꿔야 했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 32%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시점&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;바뀐 것&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2019년 5월, 리눅스 5.1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;32비트 아키텍처용 64비트 시간 시스템 호출 추가&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;새 함수가 생김. 옛 함수도 그대로 남음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2020년 3월, 리눅스 5.6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;32비트 시스템의 남은 커널 내부 시간 처리까지 정리&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;커널 쪽 준비가 사실상 마무리됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2021년 8월, glibc 2.34&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;32비트에서도 _TIME_BITS=64를 지정하면 64비트 time_t로 빌드 가능&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;C 라이브러리가 선택지를 제공. 기본값은 여전히 32비트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2025년 8월, 데비안 13(trixie)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;i386을 뺀 32비트 아키텍처(armhf, armel 등)를 64비트 time_t로 전환&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;배포판 차원의 대규모 재빌드. i386은 옛 프로그램 호환을 위해 남김&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 눈여겨볼 점은 glibc가 32비트에서 64비트 time_t를 &quot;기본값&quot;으로 바꾸지 않고 &quot;선택&quot;으로 열어 뒀다는 것입니다. 기본값을 바꾸면 이미 배포된 프로그램과 라이브러리 사이의 호환이 깨지기 때문입니다. 그래서 32비트 리눅스용 프로그램을 직접 빌드한다면 아래처럼 옵션을 명시해야 합니다. _TIME_BITS=64는 _FILE_OFFSET_BITS=64와 함께 써야 합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;gcc -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -o app app.c&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프로그램과 함께 링크되는 모든 라이브러리가 같은 크기의 time_t로 빌드돼 있어야 합니다. 데비안이 수천 개의 패키지를 한꺼번에 다시 빌드한 이유가 이것입니다. 다만 데비안 13에서도 i386은 예외로 남았으니, 32비트 x86 시스템은 여전히 별도로 확인해야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 데이터베이스에 숨어 있는 2038년&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 개발자가 가장 먼저 만날 2038년 문제는 운영체제보다 데이터베이스일 가능성이 큽니다. MySQL의 TIMESTAMP 자료형은 공식 문서 기준으로 1970-01-01 00:00:01부터 2038-01-19 03:14:07(UTC)까지만 저장할 수 있습니다. 내부적으로 유닉스 시간을 쓰기 때문입니다. 64비트 서버의 최신 MySQL이라도 이 범위는 그대로입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;CREATE TABLE coupon (
  id         BIGINT PRIMARY KEY,
  expires_ts TIMESTAMP NULL,   -- 2038-01-19 03:14:07 UTC까지만
  expires_dt DATETIME  NULL    -- 9999-12-31 23:59:59까지
);

-- 20년짜리 보증 기간을 TIMESTAMP에 넣으면 범위를 벗어남
INSERT INTO coupon (id, expires_ts) VALUES (1, '2046-10-20 10:00:00');
-- strict 모드에서는 오류, 아니면 경고와 함께 0000-00-00 00:00:00으로 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 시점에도 이미 영향이 있습니다. 2038년보다 뒤에 끝나는 계약, 보증, 대출, 인증서, 장기 구독 만료일을 TIMESTAMP 컬럼에 담으면 오늘 당장 저장이 실패합니다. 미래 날짜가 들어갈 수 있는 컬럼은 DATETIME을 쓰고, 시간대는 애플리케이션에서 UTC로 맞추는 방식이 일반적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 쪽은 조금 나아졌습니다. MySQL 8.0.28부터 64비트 플랫폼에서는 FROM_UNIXTIME()과 UNIX_TIMESTAMP()가 3001년 1월 18일까지의 값을 다룰 수 있게 됐습니다. 하지만 이건 함수 이야기이고, TIMESTAMP 컬럼의 범위는 바뀌지 않았습니다. 유닉스 시간을 직접 INT 컬럼에 저장하는 설계라면 INT 대신 BIGINT를 써야 같은 문제를 피할 수 있습니다. 부호 없는 INT UNSIGNED로 버티는 방법도 있지만 2106년에 같은 일이 생깁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 같은 원리로 이미 터진 사고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2038년은 아직 오지 않았지만, 같은 원리, 즉 &quot;숫자가 32비트 부호 있는 정수 범위를 넘는&quot; 사고는 이미 일어났습니다. 가장 잘 알려진 사례는 마이크로소프트 익스체인지 서버의 2022년 새해 장애입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 1월 1일 0시가 지나자 전 세계의 온프레미스 익스체인지 2016&amp;middot;2019 서버에서 메일이 전송 대기열에 쌓인 채 나가지 않았습니다. 마이크로소프트 설명에 따르면 메일 악성코드 검사 엔진이 업데이트 버전 번호를 &quot;yymmddHHMM&quot; 형식의 숫자로 다뤘는데, 2022년 1월 1일 0시 1분 버전인 2201010001이 부호 있는 32비트 정수 최댓값 2,147,483,647보다 커서 검사 엔진이 실패한 것입니다. 2021년 마지막 날까지는 21로 시작하는 숫자라 아무 문제가 없었습니다. 이 사고는 &quot;Y2K22&quot;라는 별명으로 불렸고, 마이크로소프트는 버전 번호를 2112330001로 되돌리는 긴급 스크립트를 배포했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2006년에는 웹 서버 소프트웨어 AOLserver에서, 시간 제한 값을 &quot;약 10억 초 뒤&quot;로 설정해 둔 기본값이 현재 시각에 더해지면서 2038년을 넘어 오버플로가 났다는 보고도 있었습니다. 2006년에 10억 초(약 31.7년)를 더하면 2038년을 넘기 때문입니다. 이처럼 &quot;아주 먼 미래&quot;를 뜻하려고 큰 값을 더하는 코드는 2038년이 오기 전에 먼저 깨집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  2038년 문제는 2038년에만 터지지 않습니다&lt;/b&gt;&lt;br /&gt;만료일, 타임아웃, 장기 예약처럼 미래 시각을 계산하는 코드는 그 미래가 2038년을 넘는 순간 깨집니다. 20년 만기 계약을 다루는 시스템이라면 2018년에 이미 2038년 문제를 만났을 수 있습니다. 실제 위험은 2038년 1월 19일보다 앞에서 시작됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 2038년 말고도 날짜가 정해진 문제들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간을 일정한 크기의 숫자에 담는 시스템은 모두 언젠가 넘치는 날이 있습니다. 2038년 말고도 날짜가 이미 정해진 문제를 모아 보면 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 32%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;문제&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;날짜(UTC)&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;원인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;NTP 시대 넘김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2036년 2월 7일 06:28:16&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;인터넷 시간 동기화 프로토콜 NTP가 1900년부터의 초를 부호 없는 32비트로 표현. 프로토콜에 시대(era) 개념이 있어 구현이 맞으면 넘어갈 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;유닉스 시간 32비트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2038년 1월 19일 03:14:07&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;부호 있는 32비트 time_t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;GPS 주 번호 넘김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2038년 11월 21일 무렵&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;옛 GPS 신호 형식은 주 번호를 10비트(1,024주, 약 19.6년)로 표현. 1999년과 2019년에도 같은 넘김이 있었음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;부호 없는 32비트 유닉스 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;2106년 2월 7일 06:28:15&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;부호 없는 32비트로 버틴 경우의 한계&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPS 주 번호 넘김은 2019년 4월에도 있었고, 그때 일부 오래된 GPS 수신기와 장비에서 날짜가 1999년으로 돌아가는 문제가 보고됐습니다. 시간 문제는 한 번 고치고 끝나는 게 아니라, 표현 방식마다 따로 찾아 고쳐야 한다는 걸 보여 주는 사례입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img2.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDZRG9/dJMcahMZR7Y/f6vrW99MsucMnfHDNOsnck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDZRG9/dJMcahMZR7Y/f6vrW99MsucMnfHDNOsnck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDZRG9/dJMcahMZR7Y/f6vrW99MsucMnfHDNOsnck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDZRG9%2FdJMcahMZR7Y%2Ff6vrW99MsucMnfHDNOsnck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GPS 주 번호, NTP, 32비트 유닉스 시간 등 날짜가 넘치는 시점을 한 줄로 정리한 연표&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;720&quot; data-filename=&quot;img2.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 지금 점검해 볼 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2038년까지 12년 남짓 남았습니다. 길어 보이지만 지금 새로 설치하는 기기와 지금 만드는 데이터 형식이 그때도 돌아갈 가능성이 높다는 걸 생각하면 넉넉하지 않습니다. 개발자 입장에서 확인해 볼 곳을 정리하면 이렇습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 28%;&quot; /&gt;&lt;col style=&quot;width: 72%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;점검 대상&lt;/th&gt;
&lt;th style=&quot;text-align: center; vertical-align: middle; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;확인할 것&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DB 스키마&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;미래 날짜가 들어가는 TIMESTAMP 컬럼, 유닉스 시간을 담는 INT 컬럼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;애플리케이션 코드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;초 단위 시간을 int(32비트)에 담거나 형 변환하는 곳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;파일&amp;middot;프로토콜&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;시간 필드를 4바이트로 정의한 바이너리 형식, 외부 API 스펙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;32비트 시스템&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;32비트 리눅스, 임베디드 기기, 오래된 펌웨어. 제조사 지원 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;시스템 시계를 2038년 1월 19일 직전으로 돌려 놓고 돌려 보는 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 항목이 가장 확실합니다. 테스트 서버의 시계를 2038년 1월 19일 03:14:00(UTC)으로 맞추고 몇 분 돌려 보면, 문서로는 찾기 어려운 32비트 시간이 어디 숨어 있는지 드러납니다. 실제 서버에서 시계를 바꾸면 인증서와 예약 작업이 엉킬 수 있으니 반드시 격리된 환경에서 하셔야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제 스마트폰이나 노트북도 2038년에 고장 나나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 쓰는 64비트 운영체제(최신 윈도우, macOS, 안드로이드, iOS)는 시간 자료형이 이미 64비트라 운영체제 자체는 문제가 없습니다. 다만 그 위에서 도는 오래된 앱이나 외부 기기가 32비트 시간을 쓰면 그 부분만 문제가 생길 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2038년 1월 19일 한국 시간으로는 언제인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2038년 1월 19일 화요일 낮 12시 14분 7초(KST)가 32비트 유닉스 시간의 마지막 순간이고, 1초 뒤인 12시 14분 8초에 넘칩니다. UTC 기준으로는 03:14:07입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL TIMESTAMP를 DATETIME으로 바꾸면 차이가 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TIMESTAMP는 저장할 때 접속한 세션의 시간대를 UTC로 바꿔 저장하고 읽을 때 다시 바꿔 주지만, DATETIME은 넣은 값을 그대로 저장합니다. 그래서 DATETIME으로 바꿀 때는 &quot;모든 값을 UTC로 넣는다&quot;처럼 시간대 규칙을 애플리케이션에서 정해 두어야 합니다. 범위는 DATETIME이 9999년까지라 2038년 문제는 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2038년 문제는 날짜를 아는 버그라서 피할 수 있습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2038년 문제는 1970년부터 초를 세는 숫자를 32비트에 담기로 한 오래된 선택이 남긴 결과이고, 터지는 시각이 2038년 1월 19일 03:14:07(UTC)로 정해져 있습니다. 운영체제와 라이브러리는 이미 상당 부분 64비트로 옮겨 갔고, 남은 위험은 32비트 기기, 4바이트 시간 필드, int로 형 변환하는 코드처럼 눈에 띄지 않는 곳에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y2K가 큰 사고 없이 지나간 건 미리 고친 사람들이 있었기 때문입니다. 2038년도 마찬가지입니다. 오늘 만드는 테이블의 날짜 컬럼 하나, 오늘 짜는 코드의 형 변환 한 줄이 12년 뒤의 장애를 결정합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792323627881&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;리눅스 배포판 계보에 숨은 57년의 결별사, 유닉스부터 우분투까지&quot; data-og-description=&quot;리눅스 배포판 계보를 처음 펼쳐보면 누구나 당황합니다. 우분투, 데비안, 레드햇, 페도라, 아치, 알파인까지 이름만 수백 개가 넘는데, 어디서 갈라졌고 왜 갈라졌는지 한눈에 들어오지 않기 때&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B3%84%EB%B3%B4%EB%8F%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%A0%EB%8B%89%EC%8A%A4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%96%B8%EC%96%B4%EC%9D%98-%EA%B1%B0%EB%8C%80%ED%95%9C-%EC%97%AD%EC%82%AC&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B3%84%EB%B3%B4%EB%8F%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%A0%EB%8B%89%EC%8A%A4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%96%B8%EC%96%B4%EC%9D%98-%EA%B1%B0%EB%8C%80%ED%95%9C-%EC%97%AD%EC%82%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cvV8R7/dJMb9dHMR5T/9ZMWSTUNaHA4OVbYGKhueK/img.png?width=800&amp;amp;height=597&amp;amp;face=393_118_430_159,https://scrap.kakaocdn.net/dn/bI8wtH/dJMb8U9iJFD/lhqs0UQkrT4E5xh1ax135K/img.png?width=800&amp;amp;height=597&amp;amp;face=393_118_430_159,https://scrap.kakaocdn.net/dn/bbDm17/dJMb83SH8WU/fHrEddoRgl1E09e7txtxgK/img.png?width=1200&amp;amp;height=896&amp;amp;face=586_178_647_245&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B3%84%EB%B3%B4%EB%8F%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%A0%EB%8B%89%EC%8A%A4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%96%B8%EC%96%B4%EC%9D%98-%EA%B1%B0%EB%8C%80%ED%95%9C-%EC%97%AD%EC%82%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B3%84%EB%B3%B4%EB%8F%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%A0%EB%8B%89%EC%8A%A4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%96%B8%EC%96%B4%EC%9D%98-%EA%B1%B0%EB%8C%80%ED%95%9C-%EC%97%AD%EC%82%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cvV8R7/dJMb9dHMR5T/9ZMWSTUNaHA4OVbYGKhueK/img.png?width=800&amp;amp;height=597&amp;amp;face=393_118_430_159,https://scrap.kakaocdn.net/dn/bI8wtH/dJMb8U9iJFD/lhqs0UQkrT4E5xh1ax135K/img.png?width=800&amp;amp;height=597&amp;amp;face=393_118_430_159,https://scrap.kakaocdn.net/dn/bbDm17/dJMb83SH8WU/fHrEddoRgl1E09e7txtxgK/img.png?width=1200&amp;amp;height=896&amp;amp;face=586_178_647_245');&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;리눅스 배포판 계보에 숨은 57년의 결별사, 유닉스부터 우분투까지&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792323630927&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;컴퓨터는 언제 발명됐을까 - &amp;quot;세계 최초&amp;quot;가 여러 개인 이유&quot; data-og-description=&quot;컴퓨터가 언제 발명됐냐는 질문에는 깔끔한 답이 없습니다. 1941년이라는 사람도 있고, 1946년이라는 사람도 있고, 아예 19세기까지 거슬러 올라가는 사람도 있습니다. 어느 쪽도 완전히 틀린 말은&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B0%9C%EB%AA%85-%EC%8B%9C%EA%B8%B0-%ED%98%84%EB%8C%80-%EC%BB%B4%ED%93%A8%ED%8C%85%EC%9D%98-%EB%BF%8C%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B0%9C%EB%AA%85-%EC%8B%9C%EA%B8%B0-%ED%98%84%EB%8C%80-%EC%BB%B4%ED%93%A8%ED%8C%85%EC%9D%98-%EB%BF%8C%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djmYKO/dJMb8Yqke7M/xlgR8IqrBDZEn67Ch1SC30/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq6SMn/dJMb85Xilow/ttDuO0XLIJFpQ8NjT2bzBk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/5BldF/dJMb89yCHRb/vcDA05gKrkL8EVIO3Y3xH1/img.png?width=1024&amp;amp;height=817&amp;amp;face=0_0_1024_817&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B0%9C%EB%AA%85-%EC%8B%9C%EA%B8%B0-%ED%98%84%EB%8C%80-%EC%BB%B4%ED%93%A8%ED%8C%85%EC%9D%98-%EB%BF%8C%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B0%9C%EB%AA%85-%EC%8B%9C%EA%B8%B0-%ED%98%84%EB%8C%80-%EC%BB%B4%ED%93%A8%ED%8C%85%EC%9D%98-%EB%BF%8C%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djmYKO/dJMb8Yqke7M/xlgR8IqrBDZEn67Ch1SC30/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cq6SMn/dJMb85Xilow/ttDuO0XLIJFpQ8NjT2bzBk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/5BldF/dJMb89yCHRb/vcDA05gKrkL8EVIO3Y3xH1/img.png?width=1024&amp;amp;height=817&amp;amp;face=0_0_1024_817');&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;컴퓨터는 언제 발명됐을까 - &quot;세계 최초&quot;가 여러 개인 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터가 언제 발명됐냐는 질문에는 깔끔한 답이 없습니다. 1941년이라는 사람도 있고, 1946년이라는 사람도 있고, 아예 19세기까지 거슬러 올라가는 사람도 있습니다. 어느 쪽도 완전히 틀린 말은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792323634947&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;우분투는 어쩌다 서버의 기본값이 됐을까 - CentOS를 떠나 우분투로 온 개발자 이야기&quot; data-og-description=&quot;우분투(Ubuntu)는 오늘날 리눅스 서버와 클라우드에서 사실상 기본값처럼 쓰입니다. AWS, 구글 클라우드, 애저의 이미지 목록을 열면 가장 먼저 눈에 띄고, 새 프로젝트에서 서버 운영체제를 고를 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACUbuntu%EB%8A%94-%EC%99%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%ED%91%9C%EC%A4%80%EC%9D%B4-%EB%90%98%EC%97%88%EB%82%98-%EC%9D%B4%EB%A6%84-%EC%86%8D%EC%97%90-%EC%88%A8%EA%B2%A8%EC%A7%84-%EC%9D%B8%EB%AC%B8%ED%95%99%EC%A0%81-%EC%84%B1%EA%B3%B5-%EB%B9%84%EA%B2%B0&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACUbuntu%EB%8A%94-%EC%99%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%ED%91%9C%EC%A4%80%EC%9D%B4-%EB%90%98%EC%97%88%EB%82%98-%EC%9D%B4%EB%A6%84-%EC%86%8D%EC%97%90-%EC%88%A8%EA%B2%A8%EC%A7%84-%EC%9D%B8%EB%AC%B8%ED%95%99%EC%A0%81-%EC%84%B1%EA%B3%B5-%EB%B9%84%EA%B2%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7f0qH/dJMb83SH8WZ/7ktxkhlMZTel9WkHTD85y1/img.png?width=800&amp;amp;height=831&amp;amp;face=544_127_637_228,https://scrap.kakaocdn.net/dn/cb2HWo/dJMb8TCy29u/aORv2aEj4D3iaylRxIMPgK/img.png?width=800&amp;amp;height=831&amp;amp;face=544_127_637_228,https://scrap.kakaocdn.net/dn/Xod1F/dJMb9dHMR5X/8UBbwe3Pa9xFNn8FIgk990/img.png?width=944&amp;amp;height=981&amp;amp;face=631_151_750_281&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACUbuntu%EB%8A%94-%EC%99%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%ED%91%9C%EC%A4%80%EC%9D%B4-%EB%90%98%EC%97%88%EB%82%98-%EC%9D%B4%EB%A6%84-%EC%86%8D%EC%97%90-%EC%88%A8%EA%B2%A8%EC%A7%84-%EC%9D%B8%EB%AC%B8%ED%95%99%EC%A0%81-%EC%84%B1%EA%B3%B5-%EB%B9%84%EA%B2%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACUbuntu%EB%8A%94-%EC%99%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%ED%91%9C%EC%A4%80%EC%9D%B4-%EB%90%98%EC%97%88%EB%82%98-%EC%9D%B4%EB%A6%84-%EC%86%8D%EC%97%90-%EC%88%A8%EA%B2%A8%EC%A7%84-%EC%9D%B8%EB%AC%B8%ED%95%99%EC%A0%81-%EC%84%B1%EA%B3%B5-%EB%B9%84%EA%B2%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7f0qH/dJMb83SH8WZ/7ktxkhlMZTel9WkHTD85y1/img.png?width=800&amp;amp;height=831&amp;amp;face=544_127_637_228,https://scrap.kakaocdn.net/dn/cb2HWo/dJMb8TCy29u/aORv2aEj4D3iaylRxIMPgK/img.png?width=800&amp;amp;height=831&amp;amp;face=544_127_637_228,https://scrap.kakaocdn.net/dn/Xod1F/dJMb9dHMR5X/8UBbwe3Pa9xFNn8FIgk990/img.png?width=944&amp;amp;height=981&amp;amp;face=631_151_750_281');&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;우분투는 어쩌다 서버의 기본값이 됐을까 - CentOS를 떠나 우분투로 온 개발자 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우분투(Ubuntu)는 오늘날 리눅스 서버와 클라우드에서 사실상 기본값처럼 쓰입니다. AWS, 구글 클라우드, 애저의 이미지 목록을 열면 가장 먼저 눈에 띄고, 새 프로젝트에서 서버 운영체제를 고를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>2038년 문제</category>
      <category>32비트 오버플로</category>
      <category>glibc</category>
      <category>mysql timestamp</category>
      <category>time_t</category>
      <category>Y2K38</category>
      <category>리눅스 커널</category>
      <category>서버 점검</category>
      <category>에포크 타임</category>
      <category>유닉스 시간</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/189</guid>
      <comments>https://devwar.tistory.com/entry/year-2038-problem-unix-time#entry189comment</comments>
      <pubDate>Tue, 20 Oct 2026 19:00:03 +0900</pubDate>
    </item>
    <item>
      <title>비밀번호 해시와 암호화 차이, 운영자도 내 비밀번호를 모르는 이유</title>
      <link>https://devwar.tistory.com/entry/password-hash-vs-encryption</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;비밀번호 해시와 암호화의 차이.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG9Uxc/dJMcadjIm0q/aemYcGoWWVr1b5m5l5Cwz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG9Uxc/dJMcadjIm0q/aemYcGoWWVr1b5m5l5Cwz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG9Uxc/dJMcadjIm0q/aemYcGoWWVr1b5m5l5Cwz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG9Uxc%2FdJMcadjIm0q%2FaemYcGoWWVr1b5m5l5Cwz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;비밀번호 해시와 암호화 차이, 운영자도 내 비밀번호를 모르는 이유&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;비밀번호 해시와 암호화의 차이.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 해시와 암호화 차이를 한 줄로 말하면, 암호화는 되돌릴 수 있고 해시는 되돌릴 수 없다는 것입니다. 제대로 만든 서비스는 비밀번호를 해시로 저장하기 때문에, 운영자가 DB를 직접 열어 봐도 내 비밀번호가 뭔지 알 수 없습니다. &quot;비밀번호 찾기&quot;가 아니라 항상 &quot;재설정&quot;만 되는 이유도 여기 있습니다. 해시와 암호화는 둘 다 &quot;알아볼 수 없는 문자열로 바꾼다&quot;는 점이 같아서 자주 섞이지만, 목적은 반대입니다. 하나는 나중에 다시 꺼내 보려고 잠그는 것이고, 하나는 다시는 꺼내지 않으려고 갈아 넣는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 차이를 비유로 풀고, 로그인이 실제로 어떻게 돌아가는지, 그리고 PHP와 MySQL로 비밀번호를 저장할 때 뭘 써야 하는지까지 다룹니다. 개발을 처음 배우는 분, 회원가입 기능을 처음 만드는 분, &quot;우리 서비스는 안전한가&quot; 궁금한 운영자분께 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영자도 모른다는 게 무슨 뜻인가&lt;/li&gt;
&lt;li&gt;암호화란, 열쇠로 잠그고 여는 것&lt;/li&gt;
&lt;li&gt;해시란, 갈아 넣으면 되돌릴 수 없는 것&lt;/li&gt;
&lt;li&gt;둘의 차이 한눈에&lt;/li&gt;
&lt;li&gt;그러면 로그인은 어떻게 되는가&lt;/li&gt;
&lt;li&gt;해시만으로 부족한 이유, 솔트&lt;/li&gt;
&lt;li&gt;빠른 해시가 오히려 위험한 이유, bcrypt와 Argon2&lt;/li&gt;
&lt;li&gt;PHP와 MySQL로 제대로 저장하기&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 운영자도 모른다는 게 무슨 뜻인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호를 잊어서 &quot;비밀번호 찾기&quot;를 누르면, 원래 비밀번호를 알려주는 서비스는 없습니다. 메일로 재설정 링크를 보내고 새로 만들라고 합니다. 불친절해서가 아닙니다. 서버에 원래 비밀번호가 저장돼 있지 않아서 알려줄 수가 없는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 만든 서비스의 DB에는 비밀번호 대신 그 비밀번호를 해시라는 과정에 넣어 나온 결과값만 들어 있습니다. 이 결과값에서 원래 비밀번호로 되돌아가는 방법은 없습니다. 운영자가 DB를 열어 봐도, 해커가 DB를 통째로 훔쳐 가도 마찬가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 &quot;비밀번호 찾기&quot;를 눌렀더니 원래 비밀번호가 메일로 날아오는 서비스가 있다면, 그 서비스는 비밀번호를 그대로 저장하고 있거나 되돌릴 수 있는 방식으로 저장하고 있다는 뜻입니다. 둘 다 잘못 만든 겁니다. 그 비밀번호를 다른 곳에서도 쓰고 있다면 바로 바꾸는 게 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 암호화란, 열쇠로 잠그고 여는 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화는 금고에 넣고 잠그는 것과 같습니다. 내용물을 알아볼 수 없게 바꾸되, 열쇠(키)가 있으면 다시 원래대로 꺼낼 수 있습니다. 꺼내는 과정을 복호화라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오톡 메시지, 은행 앱의 통신, 노트북 디스크 암호화가 전부 이 방식입니다. 보내는 사람이 잠그고 받는 사람이 열어야 하니, 되돌릴 수 있어야 합니다. 암호화의 목적은 &quot;지금은 못 읽게, 나중엔 읽게&quot;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비밀번호 저장에 암호화를 쓰면 문제가 생깁니다. 열쇠가 어딘가에 있어야 하고, 그 열쇠를 가진 사람(운영자, 또는 서버를 뚫은 해커)은 모든 회원의 비밀번호를 원문으로 볼 수 있습니다. 금고가 아무리 튼튼해도 열쇠가 옆에 있으면 소용없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 해시란, 갈아 넣으면 되돌릴 수 없는 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시는 믹서기에 가깝습니다. 사과를 넣고 갈면 주스가 나오지만, 주스를 다시 사과로 만들 수는 없습니다. 해시 함수는 어떤 입력이든 정해진 길이의 문자열로 바꾸고, 그 문자열에서 입력을 되돌릴 방법이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시에는 세 가지 성질이 있습니다. 같은 입력은 항상 같은 결과가 나오고, 입력이 한 글자만 달라도 결과가 완전히 달라지며, 결과에서 입력으로 돌아갈 수 없습니다. 예를 들어 SHA-256이라는 해시 함수에 &quot;hello&quot;를 넣으면 항상 이 값이 나옵니다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;입력: hello
출력: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hello&quot;를 &quot;hellp&quot;로 바꾸면 출력은 전혀 닮지 않은 다른 값이 됩니다. 그리고 저 64자리 값을 아무리 들여다봐도 &quot;hello&quot;였다는 걸 알아낼 수 없습니다. 비밀번호 저장에 딱 맞는 성질입니다. 되돌릴 필요가 없으니까요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  해시는 암호화가 아닙니다&lt;/b&gt;&lt;br /&gt;&quot;비밀번호를 암호화해서 저장한다&quot;는 표현을 흔히 쓰지만 정확하지 않습니다. 암호화는 되돌리는 걸 전제로 하고, 비밀번호는 되돌리면 안 됩니다. 비밀번호는 해시로 저장합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 둘의 차이 한눈에&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 내용을 나란히 놓으면 이렇습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;암호화&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;해시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;되돌리기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능 (키로 복호화)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;키 필요&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;필요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;결과 길이&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;입력에 비례&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;항상 고정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;전송&amp;middot;보관 중 내용 숨기기&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;원문 없이 &quot;같은지&quot;만 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;쓰는 곳&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;메시지, 통신(HTTPS), 디스크&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;비밀번호, 파일 변조 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호에 필요한 건 &quot;나중에 꺼내 보기&quot;가 아니라 &quot;입력한 게 맞는지 확인하기&quot;뿐입니다. 그래서 해시가 맞습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 그러면 로그인은 어떻게 되는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문이 저장돼 있지 않은데 어떻게 로그인을 확인할까요. 답은 &quot;같은 방법으로 다시 갈아서 비교한다&quot;입니다. 가입할 때 비밀번호를 해시해서 저장하고, 로그인할 때 입력값을 똑같이 해시해서 저장된 값과 비교합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;서버가 하는 일&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;회원가입&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;입력한 비밀번호를 해시 &amp;rarr; 결과값만 DB에 저장 &amp;rarr; 원문은 버림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;로그인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;입력한 비밀번호를 같은 방식으로 해시 &amp;rarr; DB의 값과 비교 &amp;rarr; 같으면 통과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;비밀번호 찾기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;원문이 없으므로 알려줄 수 없음 &amp;rarr; 재설정 링크 발송&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 입력은 항상 같은 결과가 나온다는 해시의 성질 덕분에 가능한 방식입니다. 서버는 끝까지 원문을 모른 채로, 두 해시값이 같은지만 봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 해시만으로 부족한 이유, 솔트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지만 보면 SHA-256으로 해시해서 저장하면 끝일 것 같지만, 두 가지 구멍이 있습니다. 첫째, 같은 비밀번호는 같은 해시가 됩니다. &quot;123456&quot;을 쓰는 회원이 만 명이면 DB에 같은 값이 만 개 있고, 하나만 알아내면 만 명이 뚫립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 자주 쓰는 비밀번호의 해시값을 미리 계산해 둔 거대한 표가 이미 돌아다닙니다. DB를 훔친 사람은 이 표와 대조만 하면 됩니다. 되돌리는 게 아니라 &quot;답안지&quot;를 보는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책이 솔트(salt)입니다. 회원마다 다른 랜덤 문자열을 만들어 비밀번호 뒤에 붙인 뒤 해시합니다. 그러면 같은 &quot;123456&quot;이라도 회원마다 해시가 전부 달라지고, 미리 계산해 둔 표도 쓸모없어집니다. 솔트는 비밀이 아니라서 해시값 옆에 그대로 저장해도 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  솔트를 직접 만들 필요는 없습니다&lt;/b&gt;&lt;br /&gt;뒤에 나오는 bcrypt나 Argon2 같은 비밀번호 전용 해시 함수는 솔트를 자동으로 만들어 결과값 안에 같이 넣어 줍니다. 개발자가 따로 랜덤 문자열을 만들고 붙이는 코드를 짜면 오히려 실수가 생깁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 빠른 해시가 오히려 위험한 이유, bcrypt와 Argon2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔트를 붙여도 남는 문제가 하나 있습니다. SHA-256 같은 범용 해시는 너무 빠릅니다. 파일 검증용으로 설계돼서 1초에 수십억 번도 계산할 수 있습니다. 해커 입장에서는 비밀번호 후보를 1초에 수십억 개씩 넣어 볼 수 있다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비밀번호 전용 해시 함수는 일부러 느리게 만들어져 있습니다. 한 번 계산에 0.1초쯤 걸리게 하면, 사용자는 로그인 때 0.1초 기다리는 걸 느끼지 못하지만 해커는 후보 하나당 0.1초씩 써야 합니다. 수억 배 이상 느려지는 겁니다. 이 &quot;일부러 느리게&quot;의 정도를 작업 계수(cost, work factor)라고 부르고, 하드웨어가 빨라지면 숫자를 올려 따라갑니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;함수&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;비밀번호 저장 적합성 (OWASP Password Storage Cheat Sheet 기준)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;MD5, SHA-1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;쓰면 안 됨. 빠르고 이미 깨진 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;SHA-256&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;해시 자체는 안전하지만 너무 빨라서 비밀번호용으로 부적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;bcrypt&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기존 시스템에 적합. cost 10 이상, 입력 72바이트 제한 주의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Argon2id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;새 시스템 1순위 권고. 메모리도 많이 쓰게 해 GPU 공격에 강함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 새로 만든다면 Argon2id, 이미 bcrypt를 쓰고 있다면 cost를 10 이상으로 유지하면 됩니다. 둘 다 솔트를 자동으로 처리하고, 작업 계수를 결과값 안에 같이 저장해서 나중에 올리기도 쉽습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. PHP와 MySQL로 제대로 저장하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP에는 이 모든 걸 함수 두 개로 처리하는 &lt;code&gt;password_hash&lt;/code&gt;와 &lt;code&gt;password_verify&lt;/code&gt;가 내장돼 있습니다. 아래 코드는 동작 원리를 보여주는 예시이며 PHP 8.4 기준(2026년 시점)입니다. 가입 시에는 이렇게 저장합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
// 기본값은 bcrypt, PHP 8.4부터 cost 12
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);

// 새 시스템이면 Argon2id 권장 (PHP 7.3 이상)
$hash = password_hash($_POST['password'], PASSWORD_ARGON2ID);

$stmt = $db-&amp;gt;prepare('INSERT INTO users (email, password_hash) VALUES (?, ?)');
$stmt-&amp;gt;bind_param('ss', $email, $hash);
$stmt-&amp;gt;execute();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔트 생성, 작업 계수 적용, 결과 포맷까지 함수가 전부 처리합니다. 결과값은 &lt;code&gt;$2y$12$...&lt;/code&gt;(bcrypt, 60자) 또는 &lt;code&gt;$argon2id$...&lt;/code&gt;(97자 이상) 형태로 나오고, 그 안에 어떤 알고리즘과 설정을 썼는지가 함께 들어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 시에는 저장된 해시와 입력값을 &lt;code&gt;password_verify&lt;/code&gt;에 넘깁니다. 어떤 알고리즘으로 만든 해시든 알아서 판별합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
$stmt = $db-&amp;gt;prepare('SELECT password_hash FROM users WHERE email = ?');
$stmt-&amp;gt;bind_param('s', $email);
$stmt-&amp;gt;execute();
$row = $stmt-&amp;gt;get_result()-&amp;gt;fetch_assoc();

if ($row &amp;amp;&amp;amp; password_verify($_POST['password'], $row['password_hash'])) {
    // 로그인 성공
    if (password_needs_rehash($row['password_hash'], PASSWORD_ARGON2ID)) {
        // 오래된 방식이면 이 기회에 새 해시로 교체
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;password_needs_rehash&lt;/code&gt;는 저장된 해시가 지금 기준보다 약하면 알려줍니다. 로그인 성공 직후에 새 해시로 바꿔 저장하면, 사용자 모르게 bcrypt에서 Argon2id로 넘어가거나 cost를 올릴 수 있습니다. 전체 회원에게 비밀번호를 다시 받을 필요가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 쪽은 컬럼 하나면 됩니다. 알고리즘이 바뀌면 길이가 늘어나니 여유 있게 잡습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ALTER TABLE users
  ADD COLUMN password_hash VARCHAR(255) NOT NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름을 &lt;code&gt;password&lt;/code&gt;가 아니라 &lt;code&gt;password_hash&lt;/code&gt;로 두는 것도 권합니다. 나중에 코드를 보는 사람이 이 컬럼에 원문이 들어 있다고 착각하는 일을 막아 줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비밀번호를 메일로 알려주는 서비스는 왜 위험한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문을 저장하고 있거나 되돌릴 수 있게 저장하고 있다는 뜻이라, 그 서비스의 DB가 유출되면 비밀번호가 그대로 노출됩니다. 같은 비밀번호를 다른 곳에도 쓰고 있다면 그쪽까지 위험해집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SHA-256에 솔트를 붙이면 안전하지 않나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 계산된 표에는 막히지만, 너무 빨라서 후보를 하나씩 넣어 보는 공격에는 여전히 약합니다. OWASP는 SHA-256을 비밀번호 저장에 부적합하다고 명시합니다. bcrypt나 Argon2id를 쓰세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;bcrypt 쓰던 서비스를 Argon2id로 바꾸려면 전부 재가입해야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 로그인 성공 시점에 &lt;code&gt;password_needs_rehash&lt;/code&gt;로 확인해서 새 해시로 교체하면, 사용자가 다음에 로그인할 때 자동으로 넘어갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;되돌릴 수 없어야 안전한 유일한 데이터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화는 열쇠로 잠그고 여는 것이고, 해시는 갈아 넣어 되돌릴 수 없게 만드는 것입니다. 비밀번호는 나중에 꺼내 볼 일이 없고 &quot;같은지&quot;만 확인하면 되니 해시가 맞고, 그래서 제대로 만든 서비스는 운영자도 내 비밀번호를 모릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 해시면 다 되는 게 아니라, 솔트가 자동으로 붙고 일부러 느리게 설계된 bcrypt나 Argon2id를 써야 합니다. PHP라면 &lt;code&gt;password_hash&lt;/code&gt;와 &lt;code&gt;password_verify&lt;/code&gt; 두 함수가 그 조건을 전부 채워 주니, 직접 해시 로직을 짜는 것보다 그걸 쓰는 게 거의 항상 더 안전합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792135224128&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;API 멱등성이란? 결제 중복 요청 막는 실무 방법, 버튼 비활성화로는 못 막습니다&quot; data-og-description=&quot;API 멱등성이란 같은 요청을 여러 번 보내도 결과가 한 번 보낸 것과 똑같이 유지되는 성질을 말합니다. 결제 API에서 이게 지켜지지 않으면 손님 카드에서 돈이 두 번 빠지는 사고가 납니다.&amp;quot;결제&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/api-idempotency-payment-duplicate&quot; data-og-url=&quot;https://devwar.tistory.com/entry/api-idempotency-payment-duplicate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LXCWZ/dJMb81ghomQ/f2DQKZakz2oEwftoc4SDj1/img.png?width=800&amp;amp;height=600&amp;amp;face=526_65_614_162,https://scrap.kakaocdn.net/dn/bWJeLx/dJMb9kUrf4F/sIkcz3gjv2a6cnMmAYWVg0/img.png?width=800&amp;amp;height=600&amp;amp;face=526_65_614_162,https://scrap.kakaocdn.net/dn/eFfcJF/dJMb82M1UcL/rAz0qMT6Z85UFHexUm4KaK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=952_117_1112_293&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/api-idempotency-payment-duplicate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/api-idempotency-payment-duplicate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LXCWZ/dJMb81ghomQ/f2DQKZakz2oEwftoc4SDj1/img.png?width=800&amp;amp;height=600&amp;amp;face=526_65_614_162,https://scrap.kakaocdn.net/dn/bWJeLx/dJMb9kUrf4F/sIkcz3gjv2a6cnMmAYWVg0/img.png?width=800&amp;amp;height=600&amp;amp;face=526_65_614_162,https://scrap.kakaocdn.net/dn/eFfcJF/dJMb82M1UcL/rAz0qMT6Z85UFHexUm4KaK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=952_117_1112_293');&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;API 멱등성이란? 결제 중복 요청 막는 실무 방법, 버튼 비활성화로는 못 막습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API 멱등성이란 같은 요청을 여러 번 보내도 결과가 한 번 보낸 것과 똑같이 유지되는 성질을 말합니다. 결제 API에서 이게 지켜지지 않으면 손님 카드에서 돈이 두 번 빠지는 사고가 납니다.&quot;결제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792135220792&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;웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다&quot; data-og-description=&quot;웹 프론트엔드 성능 최적화와 백엔드 서버 방어에 있어서 스로틀링(Throttling)은 선택이 아닌 필수 기술입니다. 트래픽 폭주로 인한 브라우저 렌더링 지연과 백엔드 서버 마비를 막으려면 이 개념&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DjeOD/dJMb81ghomO/6wqslykpNeItQf44Es1nxk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/gzC7N/dJMb87gvkAx/9QIX1hdmrF5N92ye5KmNgk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/dbgYA9/dJMb88fpDk9/eOxNJuGrkIQmyStbPfImM0/img.png?width=1200&amp;amp;height=896&amp;amp;face=615_168_712_274&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DjeOD/dJMb81ghomO/6wqslykpNeItQf44Es1nxk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/gzC7N/dJMb87gvkAx/9QIX1hdmrF5N92ye5KmNgk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/dbgYA9/dJMb88fpDk9/eOxNJuGrkIQmyStbPfImM0/img.png?width=1200&amp;amp;height=896&amp;amp;face=615_168_712_274');&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;웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 프론트엔드 성능 최적화와 백엔드 서버 방어에 있어서 스로틀링(Throttling)은 선택이 아닌 필수 기술입니다. 트래픽 폭주로 인한 브라우저 렌더링 지연과 백엔드 서버 마비를 막으려면 이 개념&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792135216671&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;CORS는 왜 항상 프론트 개발자만 잡을까 - 동일 출처 정책의 역사와 현장 이야기&quot; data-og-description=&quot;CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 개발을 하다 보면 누구나 한 번쯤 마주치는 빨간 에러 메시지입니다. Access-Control-Allow-Origin 헤더가 없다느니, 프리플라이트(preflight) 요청&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boX5BH/dJMb82M1Ucu/bN8GllWlP7gmRqpT6StoV1/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cebfB3/dJMb88GtWPB/T8aIkN5aArjFWLg7ypG8qK/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/HCdRi/dJMb81ghomJ/gowDqhRLqprOeYOzo6Argk/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=765_220_870_334&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cors-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boX5BH/dJMb82M1Ucu/bN8GllWlP7gmRqpT6StoV1/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cebfB3/dJMb88GtWPB/T8aIkN5aArjFWLg7ypG8qK/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/HCdRi/dJMb81ghomJ/gowDqhRLqprOeYOzo6Argk/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=765_220_870_334');&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;CORS는 왜 항상 프론트 개발자만 잡을까 - 동일 출처 정책의 역사와 현장 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 개발을 하다 보면 누구나 한 번쯤 마주치는 빨간 에러 메시지입니다. Access-Control-Allow-Origin 헤더가 없다느니, 프리플라이트(preflight) 요청&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792135214009&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;CSRF란? 개념부터 방어까지 쉽게 정리&quot; data-og-description=&quot;CSRF(크로스 사이트 요청 위조)는 웹 보안을 공부하다 보면 XSS와 함께 가장 먼저 마주치는 공격입니다. 그런데 이름이 낯설다 보니 &amp;quot;결국 세션을 훔치는 거 아니야?&amp;quot;라고 오해하기 쉽습니다. 사실 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; data-og-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPquBC/dJMb887xnqR/U8Tae6hVK8udRLGh6MX9Vk/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/cvcvXh/dJMb85wdUov/n01YgRhFdSYQ805SHIjrf0/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/b3qdHc/dJMb9jgV2sy/zBbjnJ8JQYSZKc2HXE0zAk/img.png?width=1200&amp;amp;height=930&amp;amp;face=729_217_811_307&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPquBC/dJMb887xnqR/U8Tae6hVK8udRLGh6MX9Vk/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/cvcvXh/dJMb85wdUov/n01YgRhFdSYQ805SHIjrf0/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/b3qdHc/dJMb9jgV2sy/zBbjnJ8JQYSZKc2HXE0zAk/img.png?width=1200&amp;amp;height=930&amp;amp;face=729_217_811_307');&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;CSRF란? 개념부터 방어까지 쉽게 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CSRF(크로스 사이트 요청 위조)는 웹 보안을 공부하다 보면 XSS와 함께 가장 먼저 마주치는 공격입니다. 그런데 이름이 낯설다 보니 &quot;결국 세션을 훔치는 거 아니야?&quot;라고 오해하기 쉽습니다. 사실&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>argon2</category>
      <category>bcrypt</category>
      <category>OWASP</category>
      <category>password_hash</category>
      <category>PHP 보안</category>
      <category>비밀번호 저장</category>
      <category>비밀번호 해시</category>
      <category>솔트</category>
      <category>웹 보안</category>
      <category>해시와 암호화 차이</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/185</guid>
      <comments>https://devwar.tistory.com/entry/password-hash-vs-encryption#entry185comment</comments>
      <pubDate>Fri, 16 Oct 2026 16:20:34 +0900</pubDate>
    </item>
    <item>
      <title>티스토리 무료 스킨 동방생활_20261016 업데이트, 사이드바 세로형 광고가 정사각으로만 나오던 문제 해결</title>
      <link>https://devwar.tistory.com/entry/dongbang-skin-update-20261016</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;티스토리 무료 스킨 업데이트 안내.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqjXd/dJMb99OTeAl/nmPle8WKkUuakFtNztTEwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqjXd/dJMb99OTeAl/nmPle8WKkUuakFtNztTEwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqjXd/dJMb99OTeAl/nmPle8WKkUuakFtNztTEwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqjXd%2FdJMb99OTeAl%2FnmPle8WKkUuakFtNztTEwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;티스토리 무료 스킨 동방생활_20261016 업데이트, 사이드바 세로형 광고가 정사각으로만 나오던 문제 해결&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;티스토리 무료 스킨 업데이트 안내.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 무료 스킨 동방생활 20261016 버전(동방생활_20261016)을 배포합니다. 지난 20260829 버전에서 사이드바 광고 세로형(300&amp;times;600) 토글을 넣었는데, 실제로 켜 보니 옵션을 켜도 사이드바에 정사각 광고(300&amp;times;250급)만 나오는 문제가 있었습니다. 원인은 세로형 광고 코드에 반응형 형식 값(data-ad-format=&quot;auto&quot;)이 그대로 남아 있었던 데 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 원인과 수정 내용, 바뀐 기본값, 적용 방법을 정리합니다. 운영 중인 블로그 네 곳(동방생활, 개발은전투다, 자동차평생공부, 우리가모르는한국)에 2026년 10월 16일 같은 수정을 적용했고, 개발은전투다에서는 페이지에 실제로 들어간 광고 코드가 vertical로 바뀐 것을 확인했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;업데이트 요약&lt;/h2&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; font-size: 15px; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 28%;&quot; /&gt;&lt;col style=&quot;width: 72%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2563eb; color: #fff;&quot;&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: center;&quot;&gt;분류&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: center;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;버그 수정&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;세로형 옵션을 켜도 사이드바 광고가 정사각으로만 나오던 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;적용 범위&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;사이드바 광고 1, 사이드바 광고 2, 좌우 플로팅 광고(160&amp;times;600)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;기본값 변경&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;사이드바 광고 1&amp;middot;2의 세로형(600px) 옵션 기본값 OFF에서 ON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;그대로인 것&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;본문 상단&amp;middot;중간&amp;middot;하단 광고, 목차, GA4 중복 방지, 모바일 정사각 고정 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증상, 세로형을 켜도 정사각만 나왔습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC 화면(1025px 이상)에서 오른쪽 사이드바를 따라다니는 광고가 300&amp;times;600 하프 페이지가 아니라 320&amp;times;250 크기로만 채워졌습니다. 스킨 옵션의 &quot;세로형(600px)&quot;은 켜져 있었고, 스킨 스크립트도 세로형 분기로 들어가 높이 600px짜리 광고 칸을 만들고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 페이지에 실제로 그려진 광고 칸을 보면 높이 600px이 사라지고 &lt;b&gt;height: auto !important&lt;/b&gt;가 붙어 있었습니다. 애드센스가 광고를 넣으면서 칸 높이를 자기 판단대로 다시 정한 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인, 형식 값 auto가 높이를 덮어썼습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세로형 분기의 광고 코드는 높이를 600px로 주면서 형식은 data-ad-format=&quot;auto&quot;로 두고 있었습니다. auto는 &quot;크기는 구글이 알아서 고르라&quot;는 뜻이라, 애드센스는 사이드바 폭 320px을 보고 수요가 가장 많은 정사각 크기를 고른 뒤 칸 높이를 그 광고에 맞게 줄입니다. 그래서 스킨이 600px을 열어 줘도 결과는 정사각이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20260829 글에서 &quot;세로형이 나오려면 스킨이 높이를 열어줘야 한다&quot;고 적었는데, 높이만으로는 부족했고 형식 값까지 세로형으로 지정해야 했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수정 내용, 세로형 분기를 vertical로 바꿨습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세로형 분기에 있는 광고 코드의 형식 값만 바꿨습니다. 정사각 분기(옵션 OFF)는 지금처럼 반응형 auto를 그대로 씁니다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// 변경 전 (세로형 분기)
data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;false&quot;

// 변경 후 (세로형 분기)
data-ad-format=&quot;vertical&quot; data-full-width-responsive=&quot;false&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vertical은 세로형 크기 중에서만 고르라는 지정이라, 사이드바 칸에 300&amp;times;600 같은 세로 광고가 들어갑니다. 같은 문제가 있던 사이드바 광고 2와 좌우 플로팅 광고 코드도 함께 바꿨습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세로형 옵션 기본값을 켜짐으로 바꿨습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 버전부터 index.xml에서 사이드바 광고 1&amp;middot;2의 &quot;세로형(600px)&quot; 기본값이 true입니다. 새로 등록하는 블로그는 따로 켜지 않아도 세로형으로 시작합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; font-size: 15px; table-layout: fixed; word-break: keep-all;&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 32%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;col style=&quot;width: 34%;&quot; /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2563eb; color: #fff;&quot;&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: center;&quot;&gt;옵션&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: center;&quot;&gt;20260829&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: center;&quot;&gt;20261016&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;세로형 기본값&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;OFF&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;ON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;세로형 ON일 때 형식&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;auto (정사각으로 바뀜)&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;vertical (세로형 유지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;세로형 OFF일 때 형식&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;auto 정사각&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee; vertical-align: top;&quot;&gt;auto 정사각 (변경 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 직후 광고 칸이 비어 보일 수 있습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꾼 직후에는 사이드바 칸이 비어 있거나 &quot;자세히 알아보기&quot; 안내만 보일 수 있습니다. 애드센스가 그 순간 넣을 세로형 광고를 찾지 못하면 칸을 채우지 않고 넘어가는데(unfill-optimized 상태), 세로형은 정사각보다 수요가 적어서 이런 일이 더 자주 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 시간에서 하루 정도 지켜보시고, 그래도 계속 비거나 수익이 떨어지면 스킨 옵션에서 세로형을 끄면 바로 이전의 정사각 반응형으로 돌아갑니다. 어느 쪽이 나은지는 2주 정도씩 번갈아 켜 보고 애드센스 보고서에서 광고 단위별 RPM과 노출수를 비교하는 방식을 권합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 방법, 기존 사용자와 새로 등록하는 분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 20260829 버전을 쓰고 있다면 스킨 편집에서 skin.html만 교체해도 형식 수정은 적용됩니다. 다만 바뀐 기본값은 스킨 등록 시점에만 읽히므로, 기존 블로그는 옵션에서 세로형을 직접 켜 주셔야 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;관리, 꾸미기, 스킨 보관함, 스킨 등록에서 동방생활_20261016 파일 일체(skin.html, style.css, index.xml, 프리뷰 이미지)를 업로드&lt;/li&gt;
&lt;li&gt;등록된 스킨을 적용&lt;/li&gt;
&lt;li&gt;스킨 옵션에서 광고 슬롯 ID 등 기존 설정값을 다시 입력하고, 사이드바 광고 1&amp;middot;2의 &quot;세로형(600px)&quot;이 켜져 있는지 확인&lt;/li&gt;
&lt;li&gt;PC에서 글 하나를 열고 사이드바 광고가 세로로 길게 나오는지 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 확인 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC에서 F12를 누르고 Elements 탭에서 sidebar-ad-1을 검색하면 사이드바 광고 코드가 보입니다. 안쪽 ins 태그에 data-ad-format=&quot;vertical&quot;이 있으면 새 버전이 적용된 상태입니다. 여전히 auto로 보이면 세로형 옵션이 꺼져 있거나 이전 skin.html이 남아 있는 경우입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드와 이전 버전 변경 이력은 아래에서 확인할 수 있습니다. 사용 중 문제가 있으면 댓글로 남겨 주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/0zwhP/dJMcabswGsp/vfru1x6wsJIrrpu5lzd0A0/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C_20261016.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;동방생활_20261016.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792130910010&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;동방생활 스킨 업데이트, 20260829 버전&quot; data-og-description=&quot;티스토리 무료 스킨 동방생활이 20260829 버전(동방생활_20260829)으로 업데이트되었습니다. 이번 업데이트는 새 기능보다 측정 가능한 성능 개선과 버그 수정에 집중했습니다. 실제 운영 중인 블로&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b09d8c/dJMb83kRVfy/pBKEYHMgFGnN28DYKydIk0/img.png?width=800&amp;amp;height=600&amp;amp;face=537_76_630_178,https://scrap.kakaocdn.net/dn/xaS3m/dJMb8WMOwaS/BHrLJBh71LtFGvJr8mnPX0/img.png?width=800&amp;amp;height=600&amp;amp;face=537_76_630_178,https://scrap.kakaocdn.net/dn/bOYQOs/dJMb88fpCAy/zgQaMdme3dtomgPYZYI9K1/img.png?width=1448&amp;amp;height=1086&amp;amp;face=966_142_1140_332&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b09d8c/dJMb83kRVfy/pBKEYHMgFGnN28DYKydIk0/img.png?width=800&amp;amp;height=600&amp;amp;face=537_76_630_178,https://scrap.kakaocdn.net/dn/xaS3m/dJMb8WMOwaS/BHrLJBh71LtFGvJr8mnPX0/img.png?width=800&amp;amp;height=600&amp;amp;face=537_76_630_178,https://scrap.kakaocdn.net/dn/bOYQOs/dJMb88fpCAy/zgQaMdme3dtomgPYZYI9K1/img.png?width=1448&amp;amp;height=1086&amp;amp;face=966_142_1140_332');&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;동방생활 스킨 업데이트, 20260829 버전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;티스토리 무료 스킨 동방생활이 20260829 버전(동방생활_20260829)으로 업데이트되었습니다. 이번 업데이트는 새 기능보다 측정 가능한 성능 개선과 버그 수정에 집중했습니다. 실제 운영 중인 블로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792130920395&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;동방생활 스킨 업데이트, 20260817 버전&quot; data-og-description=&quot;동방생활 스킨 업데이트, 20260817 버전을 배포합니다. 이번 업데이트는 한 가지에 집중했습니다. PC 넓은 화면에서 본문 양옆에 고정되는 플로팅 광고를 정식으로 구현했고, 좌측과 우측을 각각 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xQoUv/dJMb9dHMEuf/nY8N3dgkfBBITe5nSsgqE0/img.png?width=800&amp;amp;height=597&amp;amp;face=487_137_529_183,https://scrap.kakaocdn.net/dn/c4nB8g/dJMb8ZvZ7Mm/RkQezJ3nsSwiu7V7xDuuqk/img.png?width=800&amp;amp;height=597&amp;amp;face=487_137_529_183,https://scrap.kakaocdn.net/dn/dxsqNj/dJMb9hDpmQu/V8bit8uPXIl13EuQVHmtUK/img.png?width=2207&amp;amp;height=1628&amp;amp;face=1451_234_1602_399&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xQoUv/dJMb9dHMEuf/nY8N3dgkfBBITe5nSsgqE0/img.png?width=800&amp;amp;height=597&amp;amp;face=487_137_529_183,https://scrap.kakaocdn.net/dn/c4nB8g/dJMb8ZvZ7Mm/RkQezJ3nsSwiu7V7xDuuqk/img.png?width=800&amp;amp;height=597&amp;amp;face=487_137_529_183,https://scrap.kakaocdn.net/dn/dxsqNj/dJMb9hDpmQu/V8bit8uPXIl13EuQVHmtUK/img.png?width=2207&amp;amp;height=1628&amp;amp;face=1451_234_1602_399');&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;동방생활 스킨 업데이트, 20260817 버전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;동방생활 스킨 업데이트, 20260817 버전을 배포합니다. 이번 업데이트는 한 가지에 집중했습니다. PC 넓은 화면에서 본문 양옆에 고정되는 플로팅 광고를 정식으로 구현했고, 좌측과 우측을 각각&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792130923205&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;티스토리 스킨 신규 등록 방법 - 무료 스킨 2종 배포 + 원본 안 건드리고 안전하게 적용하기&quot; data-og-description=&quot;&amp;quot;받은 스킨은 대체 어디에 붙여넣는 거지?&amp;quot;, &amp;quot;지금 쓰는 스킨 갈아엎었다가 망하면 어떡하지?&amp;quot;, &amp;quot;index.xml은 어디로 올리는 거야?&amp;quot; 스킨을 처음 바꿔보려는 분들이 꼭 한 번씩 막히는 지점들입니다. &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/tistory-skin-register-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/tistory-skin-register-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i1VcG/dJMb9cB6cMw/ANi4xkbVRkfXA9jOQAB9n1/img.png?width=800&amp;amp;height=597&amp;amp;face=558_72_608_125,https://scrap.kakaocdn.net/dn/lWK98/dJMb8XSuOZA/qEoTlAHmKIvxujiCes1giK/img.png?width=800&amp;amp;height=597&amp;amp;face=558_72_608_125,https://scrap.kakaocdn.net/dn/lVyBA/dJMb8SXWM9K/AWbk9dYy5meZoZH9CBthOK/img.png?width=1200&amp;amp;height=896&amp;amp;face=838_108_913_188&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/tistory-skin-register-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/tistory-skin-register-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i1VcG/dJMb9cB6cMw/ANi4xkbVRkfXA9jOQAB9n1/img.png?width=800&amp;amp;height=597&amp;amp;face=558_72_608_125,https://scrap.kakaocdn.net/dn/lWK98/dJMb8XSuOZA/qEoTlAHmKIvxujiCes1giK/img.png?width=800&amp;amp;height=597&amp;amp;face=558_72_608_125,https://scrap.kakaocdn.net/dn/lVyBA/dJMb8SXWM9K/AWbk9dYy5meZoZH9CBthOK/img.png?width=1200&amp;amp;height=896&amp;amp;face=838_108_913_188');&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;티스토리 스킨 신규 등록 방법 - 무료 스킨 2종 배포 + 원본 안 건드리고 안전하게 적용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;받은 스킨은 대체 어디에 붙여넣는 거지?&quot;, &quot;지금 쓰는 스킨 갈아엎었다가 망하면 어떡하지?&quot;, &quot;index.xml은 어디로 올리는 거야?&quot; 스킨을 처음 바꿔보려는 분들이 꼭 한 번씩 막히는 지점들입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/184</guid>
      <comments>https://devwar.tistory.com/entry/dongbang-skin-update-20261016#entry184comment</comments>
      <pubDate>Fri, 16 Oct 2026 15:12:14 +0900</pubDate>
    </item>
    <item>
      <title>SQL 이름 유래, 원래 SEQUEL이었는데 상표 때문에 바뀌었습니다</title>
      <link>https://devwar.tistory.com/entry/sql-name-origin-sequel</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SQL 이름의 유래와 변화.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JolHS/dJMcaiFbB6o/lD0yx1BuB1KIliuapQ3Ti1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JolHS/dJMcaiFbB6o/lD0yx1BuB1KIliuapQ3Ti1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JolHS/dJMcaiFbB6o/lD0yx1BuB1KIliuapQ3Ti1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJolHS%2FdJMcaiFbB6o%2FlD0yx1BuB1KIliuapQ3Ti1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;SQL 이름 유래, 원래 SEQUEL이었는데 상표 때문에 바뀌었습니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;SQL 이름의 유래와 변화.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 이름 유래를 따라가면 원래 이름이 SQL이 아니었다는 사실부터 만나게 됩니다. 1974년 IBM에서 태어날 때 이름은 SEQUEL이었고, 영국의 한 항공기 회사가 이미 그 이름을 상표로 갖고 있어서 모음을 빼고 SQL이 됐습니다. 지금도 &quot;시퀄&quot;과 &quot;에스큐엘&quot; 두 발음이 같이 쓰이는 건 이 개명의 흔적입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;SQL은 시퀄이에요, 에스큐엘이에요?&quot;&lt;br /&gt;&quot;SQL이 Structured Query Language 약자 맞죠?&quot;&lt;br /&gt;&quot;SQL은 누가 만들었나요?&quot;&lt;br /&gt;&quot;50년 된 언어가 왜 아직도 안 바뀌어요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL은 개발자 대부분이 매일 쓰지만, 이 언어가 왜 영어 문장처럼 생겼는지, 왜 이름이 세 글자인지는 잘 알려져 있지 않습니다. 둘 다 1970년대 IBM 연구소에서 있었던 구체적인 결정에서 나왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 과정을 짧게 따라갑니다. SQL을 배우기 시작한 분, 면접에서 &quot;SQL 발음이 뭐냐&quot;는 질문을 받아본 분, 기술 이름의 뒷이야기를 좋아하는 분께 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1970년, 관계형 모델이라는 출발점&lt;/li&gt;
&lt;li&gt;1974년 IBM, 영어처럼 쓰는 질의어 SEQUEL&lt;/li&gt;
&lt;li&gt;항공기 회사 상표 때문에 모음을 뺀 사연&lt;/li&gt;
&lt;li&gt;SEQUEL이 지우려 했던 것, 수학 기호&lt;/li&gt;
&lt;li&gt;IBM이 아니라 오라클이 먼저 팔았다&lt;/li&gt;
&lt;li&gt;표준이 된 과정, SQL-86에서 SQL:2023까지&lt;/li&gt;
&lt;li&gt;시퀄인가 에스큐엘인가&lt;/li&gt;
&lt;li&gt;50년 넘게 살아남은 이유&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 1970년, 관계형 모델이라는 출발점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 이야기는 1970년 IBM 연구원 에드거 코드(Edgar F. Codd)의 논문에서 시작합니다. 데이터를 행과 열로 된 표(관계)로 다루자는 관계형 모델을 제안한 논문입니다. 그 전까지 데이터베이스는 계층형이나 네트워크형이라, 데이터를 꺼내려면 저장된 구조를 따라 포인터를 쫓아가는 코드를 짜야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 아이디어는 &quot;어디에 어떻게 저장됐는지는 신경 쓰지 말고, 원하는 데이터가 뭔지만 말하면 되게 하자&quot;는 것이었습니다. 지금은 당연하게 들리지만 당시에는 급진적이었고, IBM 내부에서도 바로 받아들여지지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 코드의 논문에는 수학 기호로 된 관계 대수와 관계 해석이 있을 뿐, 사람이 타이핑해서 쓸 만한 언어는 없었습니다. 이론을 실제 언어로 옮기는 일은 다른 두 사람의 몫이었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 1974년 IBM, 영어처럼 쓰는 질의어 SEQUEL&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도널드 체임벌린(Donald Chamberlin)과 레이먼드 보이스(Raymond Boyce)는 1972년 코드의 발표를 듣고 관계형 모델에 빠졌습니다. 두 사람의 목표는 분명했습니다. 수학이나 프로그래밍 훈련을 받지 않은 사람도 데이터베이스에 질문을 던질 수 있는 언어를 만들자는 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 시도는 SQUARE라는 언어였는데, 첨자와 위첨자를 쓰는 수학식 표기라 키보드로 치기 어려웠습니다. 그래서 1973년 산호세 연구소로 옮겨 IBM의 관계형 DB 프로젝트 System R에 합류한 뒤, SQUARE를 영어 문장 구조로 다시 설계합니다. 그 결과가 1974년 발표한 SEQUEL, 풀어 쓰면 Structured English Query Language입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름에 English가 들어간 게 핵심입니다. SELECT, FROM, WHERE처럼 영어 단어를 문장 순서대로 늘어놓으면 질의가 되게 하자는 설계 의도가 이름에 그대로 박혀 있었습니다. SEQUEL이라는 이름은 당시 경쟁하던 버클리의 질의어 QUEL을 의식한 말장난(&quot;속편&quot;)으로도 널리 해석됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  보이스는 결과를 보지 못했습니다&lt;/b&gt;&lt;br /&gt;레이먼드 보이스는 SEQUEL 논문을 낸 1974년에 35세로 세상을 떠났습니다. 자기가 만든 언어가 50년 뒤에도 쓰일 거라는 걸 알지 못한 채였습니다. 정규화 이론의 BCNF(Boyce-Codd Normal Form)에도 그의 이름이 남아 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 항공기 회사 상표 때문에 모음을 뺀 사연&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEQUEL이라는 이름은 오래가지 못했습니다. 영국의 항공&amp;middot;방산 기업 호커 시들리(Hawker Siddeley) 계열사가 이미 SEQUEL을 상표로 등록해 두고 있었기 때문입니다. 컴퓨터 언어와 항공기 회사가 겹칠 일이 있을까 싶지만, 상표는 분야가 달라도 분쟁 소지가 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IBM은 법적 문제를 피하려고 이름에서 모음을 전부 뺐습니다. S-E-Q-U-E-L에서 E, U, E를 빼면 S-Q-L이 남습니다. 새 이름을 지은 게 아니라 있던 이름을 깎아낸 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 재미있는 점이 하나 있습니다. 지금 다들 SQL을 &quot;Structured Query Language&quot;의 약자라고 알고 있지만, 이 풀네임은 개명 뒤에 거꾸로 붙인 것입니다. 원래 약어는 SEQUEL이었고, SQL은 거기서 글자를 뺀 결과물일 뿐이었습니다. 실제로 ANSI/ISO 표준 문서의 공식 명칭은 &quot;Database Language SQL&quot;이고, Structured Query Language라는 표현은 표준 안에 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. SEQUEL이 지우려 했던 것, 수학 기호&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEQUEL이 왜 혁신이었는지는 그 전 방식과 비교하면 보입니다. 코드의 관계 대수로 &quot;급여가 5,000 넘는 직원의 이름&quot;을 표현하면 그리스 문자와 첨자가 들어간 수식이 됩니다. 같은 질문을 1974년 SEQUEL 논문 방식으로 쓰면 이렇습니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SELECT NAME
FROM   EMP
WHERE  SAL &amp;gt; 5000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50년이 지난 지금의 SQL과 거의 같습니다. 영어를 읽을 줄 알면 무슨 뜻인지 짐작할 수 있고, 타자기로 칠 수 있는 문자만 씁니다. 이 두 가지가 SEQUEL의 설계 목표였고, 그대로 달성됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체임벌린은 훗날 이 언어가 원래 목표였던 &quot;훈련 안 받은 일반 사용자&quot;에게는 생각만큼 쉽게 다가가지 못했다고 인정했습니다. 대신 프로그래머들이 받아들였고, 그게 더 큰 결과를 낳았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. IBM이 아니라 오라클이 먼저 팔았다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEQUEL은 IBM 내부 연구 프로젝트의 산물이었고, IBM은 기존 계층형 DB 제품(IMS)이 잘 팔리고 있어서 상용화를 서두르지 않았습니다. 그 사이 외부에서 논문을 읽은 사람이 움직였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;래리 엘리슨(Larry Ellison)이 세운 작은 회사 Relational Software는 IBM 논문을 바탕으로 자체 관계형 DB를 만들어 1979년 6월 오라클 V2를 내놓습니다. 상용으로 팔린 첫 SQL 데이터베이스였습니다. IBM이 자사 제품 SQL/DS를 내놓은 건 1981년, DB2는 1983년입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;연도&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;사건&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1970&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;코드, 관계형 모델 논문 발표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1974&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;체임벌린&amp;middot;보이스, SEQUEL 논문 (System R)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1970년대 중반&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상표 문제로 SQL로 개명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1979&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오라클 V2, 첫 상용 SQL 데이터베이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1983&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;IBM DB2 출시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1986&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;ANSI 표준 SQL-86&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서는 SQL이라는 언어의 성격을 보여줍니다. 한 회사의 제품 언어가 아니라, 논문으로 공개된 설계를 여러 회사가 각자 구현한 언어였습니다. 그래서 일찍부터 &quot;같은 SQL인데 회사마다 조금씩 다른&quot; 방언 문제가 생겼고, 표준이 필요해졌습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 표준이 된 과정, SQL-86에서 SQL:2023까지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1986년 미국 표준 기구 ANSI가 SQL을 표준으로 채택했고, 이듬해 ISO가 국제 표준으로 받아들였습니다. 그 뒤로 꾸준히 개정됐습니다. 1992년판(SQL-92)이 오랫동안 기준이었고, 1999년에 재귀 쿼리, 2003년에 윈도우 함수, 2016년에 JSON 지원이 들어왔습니다. 최신판은 2023년 6월 나온 SQL:2023입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 표준이 곧 현실은 아닙니다. 어떤 DBMS도 표준을 100% 구현하지 않고, 대부분의 기능은 벤더가 먼저 만들고 표준이 나중에 따라갑니다. MySQL, PostgreSQL, 오라클, SQL Server가 날짜 함수 하나도 서로 다르게 쓰는 이유입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 SELECT, FROM, WHERE, JOIN, GROUP BY 같은 뼈대는 1974년 논문에서 거의 그대로 이어졌고, 어느 DBMS에서나 똑같이 통합니다. 표준이 지켜 온 건 이 공통 뼈대입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 시퀄인가 에스큐엘인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발음 논쟁은 개명의 직접적인 유산입니다. 원래 이름이 SEQUEL이었으니 &quot;시퀄&quot;로 읽던 습관이 남았고, 글자가 S-Q-L이 됐으니 &quot;에스큐엘&quot;로 읽는 사람이 생겼습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;발음&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;근거와 쓰는 곳&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;에스큐엘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;ANSI 표준이 명시한 발음. 공동 개발자 체임벌린 본인도 이렇게 발음. MySQL, PostgreSQL 공식 표기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;시퀄&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;원래 이름의 흔적. 마이크로소프트 SQL Server(&quot;시퀄 서버&quot;), 오라클 PL/SQL(&quot;피엘 시퀄&quot;) 진영에서 흔함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답을 하나만 고르라면 표준과 창시자가 같은 편인 &quot;에스큐엘&quot;입니다. 하지만 &quot;시퀄&quot;이 틀렸다고 하기도 어렵습니다. 마이크로소프트와 오라클 생태계에서는 수십 년간 공식에 가깝게 쓰여 왔으니까요. 어느 쪽을 쓰든 상대가 알아듣고, 상대 발음을 고쳐 줄 일은 아니라고 보는 게 무난합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 50년 넘게 살아남은 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1974년에 나온 언어가 2026년에도 백엔드 개발자 필수 기술인 건 드문 일입니다. 같은 시기의 언어 대부분은 역사책에만 남았습니다. SQL이 버틴 이유는 크게 세 가지로 정리됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;이유&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;선언형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;어떻게&quot;가 아니라 &quot;무엇을&quot;만 쓴다. 저장 방식과 하드웨어가 바뀌어도 쿼리는 그대로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;표준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;한 회사 소유가 아니라 어느 DBMS로 옮겨도 뼈대가 통함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;데이터의 수명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;애플리케이션은 몇 년마다 다시 짜도 데이터는 수십 년 남는다. 데이터에 붙은 언어도 같이 남는다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2010년대에 NoSQL이 &quot;SQL 이후&quot;를 표방하며 등장했지만, 결과적으로 MongoDB 같은 NoSQL 제품들도 SQL 비슷한 질의 기능을 다시 넣었고, 빅데이터 쪽에서는 SQL로 분산 데이터를 다루는 도구들이 주류가 됐습니다. 코드와 체임벌린이 1970년대에 잡은 &quot;데이터에 영어 문장으로 질문한다&quot;는 틀이 지금도 가장 많은 사람이 이해하는 방식이기 때문입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  AI 시대에도 SQL이 남는 이유&lt;/b&gt;&lt;br /&gt;자연어로 데이터를 질문하는 도구들이 늘고 있지만, 그 도구들이 내부적으로 생성하는 건 결국 SQL입니다. 영어 문장에 가깝게 설계된 덕분에 AI가 만들기도 쉽고 사람이 검증하기도 쉽습니다. 1974년의 설계 목표가 50년 뒤에 다른 방식으로 맞아떨어진 셈입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL은 Structured Query Language의 약자가 맞나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 그렇게 통용되지만, 원래 약어는 SEQUEL(Structured English Query Language)이었고 SQL은 거기서 모음을 뺀 결과입니다. Structured Query Language는 개명 뒤에 거꾸로 붙은 풀네임이고, 표준 문서의 공식 명칭은 &quot;Database Language SQL&quot;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL을 만든 사람은 누구인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IBM의 도널드 체임벌린과 레이먼드 보이스가 1974년에 설계했습니다. 이론적 토대인 관계형 모델은 1970년 에드거 코드가 제안했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL 표준이 있는데 왜 DBMS마다 문법이 다른가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤더들이 표준보다 먼저 기능을 만들고 표준이 나중에 따라가는 구조이기 때문입니다. 어떤 DBMS도 표준을 전부 구현하지 않고, SELECT&amp;middot;FROM&amp;middot;WHERE 같은 뼈대만 공통입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모음 세 개를 빼서 50년을 간 이름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL은 수학 기호 대신 영어 문장으로 데이터에 질문하게 하려고 만든 언어였고, 그 의도가 SEQUEL이라는 이름에 담겨 있었습니다. 상표 때문에 모음을 뺀 뒤에도 설계는 그대로 남았고, 발음만 둘로 갈라졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1974년 논문의 SELECT 문이 지금 터미널에서 그대로 돌아간다는 사실이 이 언어의 성격을 가장 잘 보여줍니다. 데이터는 코드보다 오래 살고, 데이터에 붙은 언어는 더 오래 삽니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #16181d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791768459736&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;C++는 왜 C+1이 아닐까? 이름에 담긴 1983년의 농담과 탄생 배경&quot; data-og-description=&quot;C++라는 이름은 C 언어의 증가 연산자 ++에서 왔습니다. 1983년 벨 연구소의 릭 마시티가 제안한, 반쯤 농담 같은 이름이었죠. 그런데 왜 하필 ++였는지, 왜 ++C가 아니라 C++인지, 그리고 이 언어가 애&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cpp-name-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cpp-name-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bqSQS5/dJMb9ibeP6P/xnFRMU7LggQcEKQgTrKqO0/img.png?width=800&amp;amp;height=713&amp;amp;face=398_53_481_144,https://scrap.kakaocdn.net/dn/bb7b03/dJMb8PGUonZ/GZLySFtE5Apa7OmHbx76RK/img.png?width=800&amp;amp;height=713&amp;amp;face=398_53_481_144,https://scrap.kakaocdn.net/dn/Fa3s6/dJMb9kUqEEI/6bIfhdqRSdY4vuKVdESVO0/img.png?width=939&amp;amp;height=837&amp;amp;face=473_63_571_170&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cpp-name-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cpp-name-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bqSQS5/dJMb9ibeP6P/xnFRMU7LggQcEKQgTrKqO0/img.png?width=800&amp;amp;height=713&amp;amp;face=398_53_481_144,https://scrap.kakaocdn.net/dn/bb7b03/dJMb8PGUonZ/GZLySFtE5Apa7OmHbx76RK/img.png?width=800&amp;amp;height=713&amp;amp;face=398_53_481_144,https://scrap.kakaocdn.net/dn/Fa3s6/dJMb9kUqEEI/6bIfhdqRSdY4vuKVdESVO0/img.png?width=939&amp;amp;height=837&amp;amp;face=473_63_571_170');&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;C++는 왜 C+1이 아닐까? 이름에 담긴 1983년의 농담과 탄생 배경&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C++라는 이름은 C 언어의 증가 연산자 ++에서 왔습니다. 1983년 벨 연구소의 릭 마시티가 제안한, 반쯤 농담 같은 이름이었죠. 그런데 왜 하필 ++였는지, 왜 ++C가 아니라 C++인지, 그리고 이 언어가 애&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791768455455&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;C언어 이름의 유래 - B 다음이라서 C? 창시자도 확답하지 않은 이유&quot; data-og-description=&quot;C언어 이름의 유래는 흔히 &amp;quot;B 언어 다음이라서 C&amp;quot;라고 알려져 있습니다. 절반은 맞는 얘기입니다. 그런데 C를 만든 데니스 리치 본인은 이 이름이 알파벳 순서에서 온 건지, 조상 언어인 BCPL의 철&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/c-language-name-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/c-language-name-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dr5pOs/dJMb8U9hTmD/90JLYPnzM0cXk28P9VqSY0/img.png?width=800&amp;amp;height=739&amp;amp;face=0_0_800_739,https://scrap.kakaocdn.net/dn/oUMjU/dJMb8U9hTmE/grK89kJhBH494YLYKciSD1/img.png?width=800&amp;amp;height=739&amp;amp;face=0_0_800_739,https://scrap.kakaocdn.net/dn/L7YXS/dJMb8RkqsJa/uk5KXmRksDqrwXiUJ8PyK0/img.png?width=1024&amp;amp;height=946&amp;amp;face=0_0_1024_946&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/c-language-name-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/c-language-name-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dr5pOs/dJMb8U9hTmD/90JLYPnzM0cXk28P9VqSY0/img.png?width=800&amp;amp;height=739&amp;amp;face=0_0_800_739,https://scrap.kakaocdn.net/dn/oUMjU/dJMb8U9hTmE/grK89kJhBH494YLYKciSD1/img.png?width=800&amp;amp;height=739&amp;amp;face=0_0_800_739,https://scrap.kakaocdn.net/dn/L7YXS/dJMb8RkqsJa/uk5KXmRksDqrwXiUJ8PyK0/img.png?width=1024&amp;amp;height=946&amp;amp;face=0_0_1024_946');&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;C언어 이름의 유래 - B 다음이라서 C? 창시자도 확답하지 않은 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C언어 이름의 유래는 흔히 &quot;B 언어 다음이라서 C&quot;라고 알려져 있습니다. 절반은 맞는 얘기입니다. 그런데 C를 만든 데니스 리치 본인은 이 이름이 알파벳 순서에서 온 건지, 조상 언어인 BCPL의 철&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791768449980&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;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&quot; data-og-description=&quot;MySQL과 MariaDB 차이를 찾아보면 &amp;quot;거의 같다&amp;quot;는 답과 &amp;quot;이제 많이 다르다&amp;quot;는 답이 같이 나옵니다. 둘 다 맞습니다. 이 두 데이터베이스는 한 사람이 만든 형제이고, 오라클 인수를 계기로 갈라졌으며,&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LGlsM/dJMb84YmQCQ/qGHhzOOo2tcxadrKkWLUHk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/bBNCma/dJMb82fa0iB/9kEVf2Xss4D3rd7s3Nw8Ck/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/jXck2/dJMb88GtjZy/uLFHLqc9UKm9vK4NvH35K1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LGlsM/dJMb84YmQCQ/qGHhzOOo2tcxadrKkWLUHk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/bBNCma/dJMb82fa0iB/9kEVf2Xss4D3rd7s3Nw8Ck/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/jXck2/dJMb88GtjZy/uLFHLqc9UKm9vK4NvH35K1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL과 MariaDB 차이를 찾아보면 &quot;거의 같다&quot;는 답과 &quot;이제 많이 다르다&quot;는 답이 같이 나옵니다. 둘 다 맞습니다. 이 두 데이터베이스는 한 사람이 만든 형제이고, 오라클 인수를 계기로 갈라졌으며,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>IBM System R</category>
      <category>sequel</category>
      <category>SQL</category>
      <category>SQL 발음</category>
      <category>SQL 이름 유래</category>
      <category>SQL 표준</category>
      <category>관계형 데이터베이스</category>
      <category>데이터베이스 역사</category>
      <category>오라클</category>
      <category>체임벌린</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/183</guid>
      <comments>https://devwar.tistory.com/entry/sql-name-origin-sequel#entry183comment</comments>
      <pubDate>Thu, 15 Oct 2026 19:00:17 +0900</pubDate>
    </item>
    <item>
      <title>API 멱등성이란? 결제 중복 요청 막는 실무 방법, 버튼 비활성화로는 못 막습니다</title>
      <link>https://devwar.tistory.com/entry/api-idempotency-payment-duplicate</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;API 멱등성과 결제 중복 요청 방지.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAEZl/dJMcafob5np/ADQxMzjYZ81mt8WnLmZyg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAEZl/dJMcafob5np/ADQxMzjYZ81mt8WnLmZyg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAEZl/dJMcafob5np/ADQxMzjYZ81mt8WnLmZyg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAEZl%2FdJMcafob5np%2FADQxMzjYZ81mt8WnLmZyg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;API 멱등성이란? 결제 중복 요청 막는 실무 방법, 버튼 비활성화로는 못 막습니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;API 멱등성과 결제 중복 요청 방지.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 멱등성이란 같은 요청을 여러 번 보내도 결과가 한 번 보낸 것과 똑같이 유지되는 성질을 말합니다. 결제 API에서 이게 지켜지지 않으면 손님 카드에서 돈이 두 번 빠지는 사고가 납니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;결제 버튼을 두 번 눌렀는데 두 번 결제됐어요&quot;&lt;br /&gt;&quot;타임아웃 나서 재시도했더니 중복 주문이 생겼습니다&quot;&lt;br /&gt;&quot;Idempotency-Key 헤더가 정확히 뭘 하는 건가요?&quot;&lt;br /&gt;&quot;멱등 키는 서버에서 만들면 안 되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멱등성이라는 단어가 어렵게 들리지만, 실제로 하는 일은 단순합니다. &quot;이 요청은 아까 그 요청이랑 같은 거야&quot;라고 알아보는 꼬리표를 붙이고, 서버가 그 꼬리표를 기억하는 것뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 멱등성이 뭔지부터 시작해서, 결제 중복 요청을 막는 실무 방법을 Node.js(Express) 예시로 설명합니다. 결제 연동을 처음 맡은 분이나, 중복 결제 장애를 한 번 겪어본 분에게 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;API 멱등성이란 무엇인가&lt;/li&gt;
&lt;li&gt;결제 요청이 두 번 들어오는 흔한 상황&lt;/li&gt;
&lt;li&gt;HTTP 메서드별 멱등성 차이&lt;/li&gt;
&lt;li&gt;멱등 키로 POST 결제 요청을 막는 원리&lt;/li&gt;
&lt;li&gt;서버에서 멱등 키를 처리하는 흐름&lt;/li&gt;
&lt;li&gt;멱등 키 저장소 설계&lt;/li&gt;
&lt;li&gt;동시에 두 요청이 들어올 때 처리&lt;/li&gt;
&lt;li&gt;멱등성 적용할 때 흔한 실수&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. API 멱등성이란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 버튼을 떠올리면 쉽습니다. 5층 버튼을 한 번 누르든 열 번 누르든 엘리베이터는 5층에 한 번만 섭니다. 이게 멱등성입니다. 여러 번 눌러도 결과가 달라지지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 자판기 버튼은 멱등하지 않습니다. 콜라 버튼을 두 번 누르면 콜라가 두 개 나오고 돈도 두 번 빠집니다. 결제 API는 기본적으로 자판기 쪽에 가깝습니다. 그래서 일부러 엘리베이터처럼 만들어 줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 건 &quot;요청을 막는다&quot;가 아니라 &quot;결과가 같다&quot;입니다. 두 번째 요청이 와도 에러를 내는 게 아니라, 첫 번째 요청의 결과를 그대로 돌려주는 게 제대로 된 멱등성입니다. 클라이언트 입장에서는 첫 요청이 성공했는지 몰라서 다시 보낸 것이기 때문에, 성공 응답을 받아야 흐름이 끝납니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  멱등성 한 줄 정의&lt;/b&gt;&lt;br /&gt;같은 요청을 1번 보내든 N번 보내든 서버 상태와 응답이 똑같이 유지되는 성질. 결제에서는 &quot;돈이 한 번만 빠지고, 재요청에는 같은 성공 응답을 준다&quot;로 이해하면 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 결제 요청이 두 번 들어오는 흔한 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복 결제는 사용자가 이상한 짓을 해서 생기는 게 아닙니다. 아주 평범한 상황에서 자연스럽게 발생합니다. 대표적인 경우를 정리하면 아래와 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;상황&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;왜 두 번 오는가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;버튼 더블클릭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;응답이 늦으면 사용자가 불안해서 한 번 더 누름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;타임아웃 후 재시도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서버는 처리를 끝냈는데 응답이 도착하기 전에 클라이언트가 포기하고 다시 보냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;네트워크 끊김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;모바일에서 와이파이와 LTE가 바뀌는 순간 요청이 유실된 것처럼 보임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;라이브러리 자동 재시도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;HTTP 클라이언트의 retry 옵션이 켜져 있으면 개발자가 모르는 사이 재전송&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지의 공통점이 있습니다. 클라이언트는 첫 번째 요청이 성공했는지 모른다는 겁니다. 서버는 이미 결제를 끝냈지만, 그 사실을 알려주는 응답이 중간에 사라졌을 뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 프론트에서 버튼을 비활성화하는 것만으로는 부족합니다. 더블클릭은 막을 수 있어도 타임아웃 재시도나 자동 재시도는 막지 못합니다. 결국 서버가 &quot;이 요청 아까 처리했어&quot;라고 알아봐야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. HTTP 메서드별 멱등성 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 명세에는 메서드마다 멱등해야 하는지가 정해져 있습니다. 이걸 알면 왜 하필 결제(POST)에서 문제가 되는지 이해가 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;메서드&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;멱등 여부&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;GET&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;멱등&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;읽기만 하니 몇 번 해도 상태가 안 바뀜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;PUT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;멱등&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;이 값으로 바꿔라&quot;는 두 번 해도 결과가 같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;멱등&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이미 지워진 걸 또 지워도 결과는 &quot;없음&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;POST&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;멱등 아님&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;새로 만들어라&quot;는 두 번 하면 두 개가 생김&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제 생성은 거의 항상 POST입니다. &quot;결제를 새로 만들어라&quot;는 요청이니까요. 그래서 HTTP가 보장해 주는 건 없고, 개발자가 직접 멱등하게 만들어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 PUT이나 DELETE도 명세상 멱등일 뿐, 서버 코드를 이상하게 짜면 얼마든지 깨집니다. 예를 들어 DELETE 핸들러 안에서 &quot;삭제 횟수&quot;를 카운트하면 멱등이 아니게 됩니다. 명세는 약속이지 강제가 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 멱등 키로 POST 결제 요청을 막는 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST를 멱등하게 만드는 가장 널리 쓰이는 방법이 멱등 키(Idempotency Key)입니다. 클라이언트가 요청마다 고유한 값을 하나 만들어서 &lt;code&gt;Idempotency-Key&lt;/code&gt; 헤더에 담아 보내는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름은 이렇습니다. 사용자가 결제 버튼을 누르는 순간 클라이언트가 UUID 같은 랜덤 값을 하나 만듭니다. 그 값을 헤더에 붙여서 서버로 보냅니다. 타임아웃이 나서 다시 보낼 때도 같은 값을 그대로 씁니다. 서버는 그 값을 보고 &quot;아, 이건 아까 그 요청이구나&quot;라고 알아봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 키를 누가 만드느냐입니다. 반드시 클라이언트가 만들어야 합니다. 서버가 키를 만들면, 재시도 요청이 들어왔을 때 서버는 새 키를 또 만들고 새 요청으로 처리합니다. 재시도를 알아볼 방법이 없어집니다. 이 부분은 뒤에서 다시 다루겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  실제 PG사도 같은 방식을 씁니다&lt;/b&gt;&lt;br /&gt;토스페이먼츠는 &lt;code&gt;Idempotency-Key&lt;/code&gt; 헤더를 받으며 최대 300자, 처음 요청한 날부터 15일간 유효합니다. 스트라이프는 최대 255자이고 24시간이 지난 키는 삭제될 수 있습니다. (2026년 10월 각 공식 문서 기준, 정책은 바뀔 수 있습니다)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 서버에서 멱등 키를 처리하는 흐름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 쪽 로직은 단계가 많아 보이지만, 실제로는 &quot;저장소에 키가 있나 확인하고, 없으면 처리하고 저장한다&quot;가 전부입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;서버가 하는 일&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1. 키 확인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;헤더에 멱등 키가 없으면 400 에러로 거부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2. 저장소 조회&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;키가 이미 있으면 저장해 둔 응답을 그대로 반환하고 끝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;3. 결제 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;키가 없으면 실제 결제 로직 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;4. 응답 저장&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;키와 함께 응답 상태 코드&amp;middot;본문을 저장소에 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 Express 미들웨어로 옮기면 아래 정도가 됩니다. 아래 코드는 동작 원리를 보여주는 예시이며 Express 4 기준(2026년 시점)으로 작성했습니다. &lt;code&gt;store&lt;/code&gt;는 뒤에서 설명할 저장소 객체라고 보시면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;async function idempotency(req, res, next) {
  const key = req.get('Idempotency-Key');
  if (!key) {
    return res.status(400).json({ error: 'Idempotency-Key 헤더가 필요합니다' });
  }

  const saved = await store.get(key);
  if (saved) {
    return res.status(saved.status).json(saved.body);
  }

  req.idemKey = key;
  next();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미들웨어가 키를 확인하고 통과시키면, 결제 라우터는 평소처럼 결제를 처리한 뒤 결과를 저장소에 남깁니다.&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;app.post('/payments', idempotency, async (req, res) =&amp;gt; {
  const result = await processPayment(req.body);

  await store.set(req.idemKey, {
    status: 200,
    body: result
  }, { ttl: 60 * 60 * 24 });

  res.json(result);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공 응답만 저장할지, 실패 응답도 저장할지는 정책 선택입니다. 스트라이프는 500 에러까지 포함해 첫 응답을 그대로 저장합니다. 다만 일시적 장애로 실패한 경우에는 같은 키로 재시도했을 때 다시 시도해 주는 게 사용자에게 유리할 수 있어서, 실무에서는 &quot;결제가 실제로 시작된 경우만 저장&quot;하는 쪽을 택하기도 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 멱등 키 저장소 설계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키를 어디에 저장하느냐가 실무에서 고민되는 지점입니다. 보통 DB 테이블과 Redis 중 하나를 고르는데, 각각 장단점이 뚜렷합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;DB 테이블&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Redis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상대적으로 느림&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;매우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;만료 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;배치로 직접 삭제해야 함&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;TTL 옵션으로 자동 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;결제와 같은 트랜잭션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능 (같은 DB면)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;데이터 유실 위험&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;설정에 따라 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제처럼 돈이 걸린 작업이라면 개인적으로는 DB 테이블 쪽을 권합니다. 결제 레코드와 멱등 키를 같은 트랜잭션으로 묶을 수 있어서, &quot;결제는 됐는데 키 저장은 실패&quot;하는 어중간한 상태가 안 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 조회가 빠르고 TTL이 편해서 매력적이지만, 재시작이나 메모리 부족으로 키가 날아가면 그 순간 중복 결제가 열립니다. 트래픽이 아주 많아서 DB 조회가 부담되는 경우에 &quot;Redis로 먼저 거르고 DB로 최종 확인&quot;하는 2단 구성을 쓰기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보관 기간은 재시도가 일어날 수 있는 시간보다 넉넉하게 잡으면 됩니다. 앞서 본 것처럼 PG사들은 24시간에서 15일 사이로 운영합니다. 자체 서비스라면 24시간 정도로 시작해서 필요에 따라 늘리는 게 무난합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 동시에 두 요청이 들어올 때 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5번 섹션의 코드에는 빈틈이 하나 있습니다. 더블클릭으로 두 요청이 거의 동시에 들어오면, 둘 다 &quot;저장소에 키가 없네&quot;라고 판단하고 둘 다 결제를 진행합니다. 조회와 저장 사이의 짧은 틈이 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결은 &quot;조회 후 저장&quot;이 아니라 &quot;먼저 저장 시도&quot;로 순서를 바꾸는 겁니다. 멱등 키 컬럼에 유니크 제약을 걸어 두고, 요청이 오자마자 &quot;처리 중&quot; 상태로 INSERT를 시도합니다. 같은 키로 두 번째 INSERT가 오면 DB가 유니크 에러를 내므로, 그 요청은 자연스럽게 걸러집니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE idempotency_keys (
  idem_key    VARCHAR(255) PRIMARY KEY,
  status      VARCHAR(20)  NOT NULL,  -- processing / done
  response    JSON,
  created_at  DATETIME     NOT NULL
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 요청 처리는 아래 순서로 흘러갑니다. 유니크 제약이 사실상 락 역할을 하기 때문에, 별도의 분산 락 없이도 동시 요청을 막을 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;INSERT 결과&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;서버 동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;성공&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;결제 처리 후 status를 done으로, response에 응답 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;유니크 에러 + status가 done&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;저장된 response를 그대로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;유니크 에러 + status가 processing&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;409 응답으로 &quot;처리 중이니 잠시 후 재시도&quot; 안내&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 가지 더 챙길 게 있습니다. 결제 처리 도중 서버가 죽으면 status가 processing인 채로 남습니다. 이런 키는 일정 시간이 지나면 다시 처리할 수 있게 풀어주는 로직이 필요합니다. 그렇지 않으면 그 사용자는 영원히 409만 받게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 멱등성 적용할 때 흔한 실수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멱등 키를 붙였는데도 중복 결제가 나는 경우가 있습니다. 대부분 아래 실수 중 하나입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;실수&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;왜 문제인가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;서버가 키를 생성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;재시도마다 새 키가 생겨 중복을 알아볼 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;재시도 때 키를 새로 발급&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;클라이언트가 재시도할 때 UUID를 다시 만들면 의미 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;응답을 저장하지 않음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;재요청에 돌려줄 게 없어서 에러만 반환하게 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;같은 키로 다른 내용 전송&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;금액이 다른데 같은 키면 첫 결제 응답이 돌아감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주문 ID를 키로 사용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;같은 주문에 결제 재시도와 취소가 섞이면 구분 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째가 제일 자주 보이는 실수입니다. &quot;키는 서버가 안전하게 만들어야 하지 않나?&quot;라고 생각하기 쉬운데, 멱등 키는 보안용이 아니라 식별용입니다. 클라이언트가 &quot;이 요청과 저 요청은 같은 거야&quot;라고 알려주는 게 목적이라서, 서버가 만들면 그 역할을 할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 번째 실수를 막기 위해 PG사들은 요청 본문도 함께 검사합니다. 스트라이프와 마스터카드 API 모두 같은 키로 다른 내용이 오면 에러를 돌려줍니다. 자체 구현에서도 요청 본문의 해시를 키와 함께 저장해 두고 비교하면 안전합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 실수도 자주 보입니다. 주문 ID는 &quot;무엇에 대한 요청인지&quot;를 나타내고, 멱등 키는 &quot;몇 번째 시도인지&quot;를 나타냅니다. 둘은 역할이 다르므로 따로 두는 게 맞습니다. 다만 &quot;주문당 결제는 무조건 한 번&quot;이라는 정책이 확실하다면 주문 ID에 유니크 제약을 거는 것도 추가 안전장치로 유효합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프론트에서 버튼을 비활성화하면 멱등 키가 필요 없지 않나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더블클릭만 막을 수 있고, 타임아웃 재시도나 네트워크 끊김은 막지 못합니다. 버튼 비활성화는 사용자 경험용이고, 멱등 키는 서버 안전장치입니다. 둘 다 하는 게 맞습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멱등 키는 어떤 값으로 만들어야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UUID v4처럼 충돌 가능성이 거의 없는 랜덤 값이면 됩니다. 토스페이먼츠와 스트라이프 모두 UUID v4를 권장합니다. 이메일이나 전화번호 같은 개인정보를 키로 쓰는 건 피해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PG사가 멱등 키를 지원하면 우리 서버에는 안 만들어도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PG 호출만 멱등해지고, 우리 서버의 주문 생성이나 포인트 차감은 여전히 두 번 실행될 수 있습니다. 우리 서버가 받는 요청에도 별도로 멱등 키를 적용하는 게 안전합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결제 중복을 막는 건 결국 서버의 기억력입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멱등성이라는 말이 어려워 보여도, 하는 일은 &quot;같은 요청인지 알아보고 같은 답을 돌려준다&quot;가 전부입니다. 그 알아보는 꼬리표가 멱등 키이고, 꼬리표는 클라이언트가 만들어야 서버가 재시도를 알아볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소는 돈이 걸린 작업이면 DB 테이블에 유니크 제약으로 시작하는 게 안전하고, 동시 요청은 &quot;조회 후 저장&quot;이 아니라 &quot;먼저 저장 시도&quot;로 막습니다. 이 두 가지만 지켜도 중복 결제 사고의 대부분은 걸러집니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #16181d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791501231512&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;API 뜻, 식당 웨이터 비유로 끝내는 가장 쉬운 설명&quot; data-og-description=&quot;API 뜻을 검색해 보면 '응용 프로그램 프로그래밍 인터페이스'라는 번역만 나오고, 몇 번을 읽어도 머리에 남지 않는 경우가 많습니다. 그런데 이 개념은 레스토랑에서 주문하는 장면 하나만 떠&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; data-og-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSH4Ou/dJMb83SGZIU/WIN0XXIAYwnirk8qpdzjak/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/gAxTo/dJMb81ggrWW/eMBH3RBVzHhAFajPPJla1k/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/sXd0j/dJMb88foGs1/qDZO7gWQt2K8lN3YKkBe40/img.png?width=1024&amp;amp;height=872&amp;amp;face=0_0_1024_872&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSH4Ou/dJMb83SGZIU/WIN0XXIAYwnirk8qpdzjak/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/gAxTo/dJMb81ggrWW/eMBH3RBVzHhAFajPPJla1k/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/sXd0j/dJMb88foGs1/qDZO7gWQt2K8lN3YKkBe40/img.png?width=1024&amp;amp;height=872&amp;amp;face=0_0_1024_872');&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;API 뜻, 식당 웨이터 비유로 끝내는 가장 쉬운 설명&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API 뜻을 검색해 보면 '응용 프로그램 프로그래밍 인터페이스'라는 번역만 나오고, 몇 번을 읽어도 머리에 남지 않는 경우가 많습니다. 그런데 이 개념은 레스토랑에서 주문하는 장면 하나만 떠&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791501227474&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;CQRS, 읽기와 쓰기를 굳이 나누는 이유 &amp;mdash; 후배에게 먼저 외우게 하는 개념&quot; data-og-description=&quot;CQRS(Command Query Responsibility Segregation)는 읽기와 쓰기를 서로 다른 모델로 나눠서 다루는 아키텍처 패턴입니다. 이름은 거창하지만 뿌리는 단순합니다. 상태를 바꾸는 명령(Command)과 값을 돌려주는 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djqAwJ/dJMb85wcXA1/ImtAIJxOQKLmHNuYAytbB0/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/71ADM/dJMb9g5yiGW/11jT0rGFceU8YXCWKGqkpK/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/CiUOs/dJMb9hDotk8/EWT8exsklozKMQcgIFukK0/img.png?width=1016&amp;amp;height=798&amp;amp;face=0_0_1016_798&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djqAwJ/dJMb85wcXA1/ImtAIJxOQKLmHNuYAytbB0/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/71ADM/dJMb9g5yiGW/11jT0rGFceU8YXCWKGqkpK/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/CiUOs/dJMb9hDotk8/EWT8exsklozKMQcgIFukK0/img.png?width=1016&amp;amp;height=798&amp;amp;face=0_0_1016_798');&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;CQRS, 읽기와 쓰기를 굳이 나누는 이유 &amp;mdash; 후배에게 먼저 외우게 하는 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CQRS(Command Query Responsibility Segregation)는 읽기와 쓰기를 서로 다른 모델로 나눠서 다루는 아키텍처 패턴입니다. 이름은 거창하지만 뿌리는 단순합니다. 상태를 바꾸는 명령(Command)과 값을 돌려주는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791501223948&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;웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다&quot; data-og-description=&quot;웹 프론트엔드 성능 최적화와 백엔드 서버 방어에 있어서 스로틀링(Throttling)은 선택이 아닌 필수 기술입니다. 트래픽 폭주로 인한 브라우저 렌더링 지연과 백엔드 서버 마비를 막으려면 이 개념&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3n5G3/dJMb8WMNAMY/Upm68HJNNma5dFtXaXHgN0/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/YQFXe/dJMb8Z3Pu1c/wI9vyeHFA8aOn4nQa2cDTk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/EnKf6/dJMb8RSfMYw/evsHFcr9uzp5cbz3aPHMu0/img.png?width=1200&amp;amp;height=896&amp;amp;face=615_168_712_274&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3n5G3/dJMb8WMNAMY/Upm68HJNNma5dFtXaXHgN0/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/YQFXe/dJMb8Z3Pu1c/wI9vyeHFA8aOn4nQa2cDTk/img.png?width=800&amp;amp;height=597&amp;amp;face=412_115_474_183,https://scrap.kakaocdn.net/dn/EnKf6/dJMb8RSfMYw/evsHFcr9uzp5cbz3aPHMu0/img.png?width=1200&amp;amp;height=896&amp;amp;face=615_168_712_274');&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;웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 프론트엔드 성능 최적화와 백엔드 서버 방어에 있어서 스로틀링(Throttling)은 선택이 아닌 필수 기술입니다. 트래픽 폭주로 인한 브라우저 렌더링 지연과 백엔드 서버 마비를 막으려면 이 개념&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>API멱등성</category>
      <category>Express</category>
      <category>Idempotency-Key</category>
      <category>node.js</category>
      <category>결제API</category>
      <category>결제중복</category>
      <category>멱등키</category>
      <category>백엔드설계</category>
      <category>중복결제방지</category>
      <category>토스페이먼츠</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/179</guid>
      <comments>https://devwar.tistory.com/entry/api-idempotency-payment-duplicate#entry179comment</comments>
      <pubDate>Wed, 14 Oct 2026 10:20:14 +0900</pubDate>
    </item>
    <item>
      <title>한글 깨짐 EUC-KR과 UTF-8 차이, '똠'과 '뷁'이 안 써지던 이유</title>
      <link>https://devwar.tistory.com/entry/euc-kr-utf8-korean-encoding</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글 깨짐과 인코딩 차이 _.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jedbc/dJMcabMU2Yy/8MKW8EYM1w2hB94G1q5150/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jedbc/dJMcabMU2Yy/8MKW8EYM1w2hB94G1q5150/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jedbc/dJMcabMU2Yy/8MKW8EYM1w2hB94G1q5150/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJedbc%2FdJMcabMU2Yy%2F8MKW8EYM1w2hB94G1q5150%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;한글 깨짐 EUC-KR과 UTF-8 차이, '똠'과 '뷁'이 안 써지던 이유&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;한글 깨짐과 인코딩 차이 _.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글 깨짐의 원인을 찾다 보면 EUC-KR과 UTF-8이라는 두 단어를 반드시 만나게 됩니다. 그리고 예전 홈페이지나 게시판에서 '똠'이나 '뷁' 같은 글자를 입력하면 물음표로 바뀌던 것도 결국 같은 이유입니다. 글꼴 문제가 아니라 글자표에 그 글자가 없었기 때문입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;DB에서 꺼낸 한글이 ??? 로 나와요&quot;&lt;br /&gt;&quot;똠방각하는 왜 똠이 안 써졌던 거죠?&quot;&lt;br /&gt;&quot;EUC-KR이랑 CP949는 같은 건가요?&quot;&lt;br /&gt;&quot;MySQL utf8로 했는데 이모지가 깨져요&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩은 한 번 이해하면 평생 써먹는 지식인데, 처음 접하면 용어가 많아서 어렵게 느껴집니다. 이 글은 &quot;컴퓨터는 글자를 번호로 저장한다&quot;는 한 가지 사실에서 출발해 전부 풀어보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 2,350자밖에 없었는지, CP949는 뭘 고쳤는지, UTF-8은 어떻게 다 담았는지, 그리고 지금 PHP와 MySQL에서 한글이 깨지면 어디를 봐야 하는지까지 다룹니다. 레거시 시스템을 물려받은 분이나 인코딩 에러를 처음 만난 분에게 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;한글 깨짐이 생기는 진짜 이유&lt;/li&gt;
&lt;li&gt;완성형과 조합형, 1980년대 한글 코드 싸움&lt;/li&gt;
&lt;li&gt;EUC-KR이 담은 2,350자와 빠진 글자들&lt;/li&gt;
&lt;li&gt;CP949가 EUC-KR에서 고친 것&lt;/li&gt;
&lt;li&gt;UTF-8은 어떻게 한글 11,172자를 다 넣었나&lt;/li&gt;
&lt;li&gt;지금도 한글이 깨지는 지점&lt;/li&gt;
&lt;li&gt;PHP와 MySQL에서 인코딩 맞추는 방법&lt;/li&gt;
&lt;li&gt;MySQL utf8과 utf8mb4의 차이&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 한글 깨짐이 생기는 진짜 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 글자를 저장하지 않습니다. 번호를 저장합니다. 'A'는 65번, '가'는 어떤 번호, 이런 식으로 글자마다 번호를 정해 둔 표가 있고, 그 표를 문자 집합이라고 부릅니다. 그리고 그 번호를 실제 바이트로 어떻게 적을지 정한 규칙이 인코딩입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글이 깨지는 건 아주 단순한 상황입니다. 쓰는 쪽은 A라는 표로 번호를 적었는데, 읽는 쪽은 B라는 표로 번호를 해석한 겁니다. 같은 번호가 다른 글자를 가리키니 엉뚱한 글자가 나오거나, 아예 해당 번호가 없어서 물음표가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한글 깨짐을 고치는 작업은 늘 같습니다. 글자가 지나가는 모든 구간에서 같은 표를 쓰게 만드는 것. 파일, 웹 서버, PHP, DB 연결, DB 테이블, 브라우저까지 하나라도 다르면 그 지점에서 깨집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  용어 두 개만 기억하면 됩니다&lt;/b&gt;&lt;br /&gt;문자 집합: 어떤 글자에 어떤 번호를 줄지 정한 표 (예: KS X 1001, 유니코드)&lt;br /&gt;인코딩: 그 번호를 바이트로 적는 규칙 (예: EUC-KR, UTF-8)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 완성형과 조합형, 1980년대 한글 코드 싸움&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글을 컴퓨터에 넣는 방법은 크게 두 갈래였습니다. 하나는 '가', '각', '간'처럼 완성된 글자 하나하나에 번호를 주는 완성형. 다른 하나는 초성&amp;middot;중성&amp;middot;종성 자모에 번호를 주고 조합해서 글자를 만드는 조합형입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;완성형&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;조합형&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;글자 하나에 번호 하나&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;자모에 번호를 주고 조합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;표현 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;표에 넣은 글자만 가능&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;조합 가능한 한글 전부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;구현이 단순, 국제 표준과 호환&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;한글 원리에 충실, 빠진 글자 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;대표 사용처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정부 표준, 유닉스, 웹&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아래아한글 초기 버전 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1987년 정부가 완성형을 표준(KS C 5601, 지금의 KS X 1001)으로 정하면서 싸움은 사실상 완성형의 승리로 끝났습니다. 당시에는 글자 하나에 2바이트를 쓰는 구조 안에서 한자, 기호까지 다 넣어야 했기 때문에, 한글에 줄 수 있는 자리가 넉넉하지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자주 쓰는 글자만 골라 넣는 결정을 했습니다. 이 결정이 이후 30년 넘게 이어지는 '안 써지는 글자' 문제의 출발점입니다. 1992년 개정에서 조합형이 보조 방식으로 추가되긴 했지만, 실제 쓰임은 완성형이 압도적이었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. EUC-KR이 담은 2,350자와 빠진 글자들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EUC-KR은 KS X 1001 문자 집합을 유닉스 환경에서 쓰기 위한 인코딩입니다. 영문은 1바이트, 한글과 한자는 2바이트로 적습니다. 그런데 KS X 1001에 들어간 한글은 2,350자뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 한글로 만들 수 있는 글자는 초성 19개, 중성 21개, 종성 28개(없음 포함)를 곱해서 11,172자입니다. 그중 2,350자만 표에 넣었으니 나머지 8,822자는 아예 번호가 없습니다. 번호가 없으면 저장할 방법이 없고, 저장이 안 되니 화면에 나올 수도 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'똠', '뷁', '펲', '쓩' 같은 글자가 여기에 해당합니다. 1987년 당시 신문이나 책에서 쓰이는 빈도를 조사해서 골랐기 때문에, 의성어나 이름, 사투리에 나오는 글자는 상당수 빠졌습니다. 똠방각하라는 드라마 제목을 입력하면 '?방각하'가 되던 게 바로 이 때문입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  글꼴 문제가 아닙니다&lt;/b&gt;&lt;br /&gt;글꼴은 &quot;이 번호의 글자를 어떻게 그릴까&quot;를 담당합니다. 번호 자체가 없으면 글꼴이 아무리 좋아도 그릴 대상이 없습니다. '똠'이 안 써진 건 글꼴에 '똠'이 없어서가 아니라, 표에 '똠'의 번호가 없었기 때문입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. CP949가 EUC-KR에서 고친 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 가장 먼저 실용적으로 해결한 건 마이크로소프트였습니다. 한국어 윈도우에서 쓰는 CP949(확장 완성형, 통합 완성형)는 EUC-KR의 2,350자를 그대로 두고, 빠진 8,822자를 비어 있던 바이트 영역에 추가로 채워 넣었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;EUC-KR&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;CP949&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;한글 글자 수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2,350자&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;11,172자 전부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;호환성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;CP949의 부분집합&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;EUC-KR 상위 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주 사용 환경&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;유닉스, 리눅스, 옛 웹&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;한국어 윈도우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;다른 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;KS X 1001, ks_c_5601-1987&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;MS949, Windows-949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2,350자 범위 안에서는 두 인코딩의 바이트가 완전히 같습니다. 그래서 대부분의 글은 EUC-KR이든 CP949든 똑같이 보입니다. 문제는 '똠' 같은 추가 글자가 섞였을 때입니다. CP949로 저장한 파일을 EUC-KR만 아는 프로그램이 읽으면 그 글자만 깨집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자들이 윈도우에서 CP949로 작업하면서 HTML에는 EUC-KR이라고 적는 경우가 너무 많아서, HTML5 표준은 아예 EUC-KR이라고 선언된 문서를 CP949로 해석하도록 정해 버렸습니다. 브라우저 입장에서는 둘이 같은 말입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. UTF-8은 어떻게 한글 11,172자를 다 넣었나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니코드는 전 세계 모든 글자에 번호를 하나씩 주자는 프로젝트입니다. 한글은 U+AC00('가')부터 U+D7A3('힣')까지 11,172개 자리를 통째로 받았습니다. 2,350자를 고를 필요 없이, 조합 가능한 현대 한글이 가나다순으로 전부 들어가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UTF-8은 그 유니코드 번호를 바이트로 적는 규칙 중 하나입니다. 영문은 1바이트, 한글은 3바이트, 이모지는 4바이트처럼 글자에 따라 길이가 달라집니다. 영문이 1바이트라서 기존 ASCII 파일과 그대로 호환되는 게 UTF-8이 웹 표준이 된 가장 큰 이유입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;글자&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;EUC-KR / CP949&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;UTF-8&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1바이트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2바이트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;똠&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;EUC-KR 없음 / CP949 2바이트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;4바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글이 2바이트에서 3바이트로 늘어나 용량이 1.5배가 되는 건 사실입니다. 2000년대 초반에는 이걸 이유로 EUC-KR을 고집하는 경우도 있었습니다. 지금은 텍스트 용량이 문제가 되는 경우가 거의 없고, 이모지&amp;middot;외국어&amp;middot;특수문자를 한 번에 처리할 수 있는 이점이 훨씬 큽니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 지금도 한글이 깨지는 지점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UTF-8이 표준이 된 지 오래됐지만 한글 깨짐은 여전히 생깁니다. 이유는 1번 섹션에서 말한 그대로입니다. 글자가 지나가는 구간 중 어느 하나가 다른 표를 쓰고 있기 때문입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;깨지는 지점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;흔한 원인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;소스 파일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;에디터가 파일을 CP949로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;HTTP 응답 헤더&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Content-Type에 charset이 없거나 다름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;HTML meta&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;meta charset이 euc-kr로 남아 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DB 연결&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;접속 후 문자 집합을 지정하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DB 테이블&amp;middot;컬럼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;테이블은 utf8인데 컬럼만 euckr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;외부 파일 입력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;엑셀에서 내보낸 CSV가 CP949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진단 순서는 위에서 아래로 가면 됩니다. 브라우저 개발자 도구에서 응답 헤더의 charset을 먼저 보고, 그다음 소스 파일 인코딩, DB 연결 순으로 확인하면 대부분 10분 안에 어긋난 지점이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &quot;DB에 넣을 때는 멀쩡했는데 꺼내니 깨진다&quot;면 DB 연결 문자 집합이 범인일 확률이 높습니다. 넣을 때와 꺼낼 때 연결 설정이 달랐던 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. PHP와 MySQL에서 인코딩 맞추는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP와 MySQL 조합에서 한글을 안전하게 다루려면 세 군데를 UTF-8로 못 박아야 합니다. 응답 헤더, HTML 선언, DB 연결입니다. 아래 코드는 PHP 8과 MySQL 8.0 기준(2026년 시점)의 동작 원리 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 PHP가 브라우저에 보내는 응답에 문자 집합을 명시합니다. HTML의 meta 태그도 같이 적어 두면 파일을 직접 열었을 때도 안전합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
header('Content-Type: text/html; charset=UTF-8');
?&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 DB 연결입니다. 접속 직후 &lt;code&gt;set_charset&lt;/code&gt;으로 연결 문자 집합을 지정해야 합니다. 이걸 빼먹으면 서버 기본값을 따라가는데, 그 기본값이 환경마다 달라서 사고가 납니다. 쿼리로 &lt;code&gt;SET NAMES&lt;/code&gt;를 보내는 방법도 있지만, PHP 쪽 이스케이프 함수가 인코딩을 모르게 되므로 &lt;code&gt;set_charset&lt;/code&gt;을 권합니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
$db = new mysqli('localhost', 'user', 'pass', 'mydb');
$db-&amp;gt;set_charset('utf8mb4');

$stmt = $db-&amp;gt;prepare('INSERT INTO posts (title) VALUES (?)');
$stmt-&amp;gt;bind_param('s', $title);
$title = '똠방각하와 뷁';
$stmt-&amp;gt;execute();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레거시 데이터나 엑셀 CSV처럼 CP949로 들어오는 입력은 받자마자 변환합니다. 이때 변환 원본을 EUC-KR이 아니라 CP949로 지정해야 '똠' 같은 추가 글자가 안 깨집니다. 윈도우에서 만든 파일은 거의 항상 CP949입니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
$raw = file_get_contents('legacy.csv');
$utf8 = iconv('CP949', 'UTF-8//IGNORE', $raw);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;//IGNORE&lt;/code&gt;는 변환할 수 없는 바이트를 버리는 옵션입니다. 깨진 바이트 하나 때문에 전체 변환이 실패하는 걸 막아 주지만, 글자가 조용히 사라질 수 있으니 중요한 데이터라면 변환 전후 길이를 비교해 보는 게 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. MySQL utf8과 utf8mb4의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에는 함정이 하나 있습니다. &lt;code&gt;utf8&lt;/code&gt;이라는 이름의 문자 집합이 진짜 UTF-8이 아닙니다. 글자당 최대 3바이트까지만 저장하는 &lt;code&gt;utf8mb3&lt;/code&gt;의 별칭입니다. 한글은 3바이트라 문제없이 들어가지만, 4바이트가 필요한 이모지는 에러가 나거나 잘립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;utf8 (utf8mb3)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;utf8mb4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;글자당 최대&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3바이트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;4바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;한글&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;이모지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불가 (에러 또는 잘림)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;MySQL 8.0 기본값&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아님 (구버전 기본)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기본값&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;한글은 UTF-8로 잘 되는데 이모지만 깨진다&quot;는 증상이 나오면 거의 이 문제입니다. 사용자 이름이나 댓글에 이모지가 들어가는 순간 저장이 실패합니다. 2,350자에 '똠'이 없어서 깨지던 것과 구조가 똑같습니다. 표가 작아서 못 담는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블은 아래 쿼리로 바꿀 수 있습니다. 다만 인덱스가 걸린 VARCHAR 컬럼은 바이트 길이가 늘어나면서 인덱스 길이 제한에 걸릴 수 있으니, 운영 DB에서는 백업 후 테스트 환경에서 먼저 돌려보는 게 안전합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE posts
  CONVERT TO CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 만드는 프로젝트라면 고민할 것 없이 처음부터 &lt;code&gt;utf8mb4&lt;/code&gt;로 시작하면 됩니다. PHP의 &lt;code&gt;set_charset&lt;/code&gt;도 같은 값으로 맞춰야 연결과 테이블이 어긋나지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;EUC-KR로 운영 중인 사이트를 꼭 UTF-8로 바꿔야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 깨지는 게 없다면 급하진 않지만, 바꾸는 쪽을 권합니다. 외부 API, 라이브러리, 이모지, 다국어 대응이 전부 UTF-8을 전제로 하기 때문에 EUC-KR을 유지할수록 변환 코드가 여기저기 쌓입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;EUC-KR과 CP949 중 뭘로 변환해야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본이 윈도우에서 만들어졌다면 CP949로 지정하세요. EUC-KR로 지정하면 2,350자 밖의 글자가 깨집니다. CP949는 EUC-KR의 상위 호환이라 EUC-KR 파일을 CP949로 읽어도 문제없습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지금은 '똠'이나 '뷁'이 다 써지는데 왜 이 역사를 알아야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옛 시스템에서 데이터를 가져올 때, 엑셀 CSV를 처리할 때, 레거시 DB를 마이그레이션할 때 지금도 그대로 마주치는 문제이기 때문입니다. 원인을 알면 증상만 보고도 어디를 고쳐야 할지 바로 보입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한글 깨짐은 결국 표가 안 맞는 문제입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'똠'이 안 써지던 건 1987년에 자주 쓰는 2,350자만 표에 넣기로 한 결정 때문이었고, CP949가 8,822자를 보태서 막았고, UTF-8이 유니코드로 11,172자를 전부 담으면서 끝났습니다. MySQL의 utf8이 이모지를 못 담는 것도 같은 구조의 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한글 깨짐을 만나면 &quot;어떤 글꼴을 깔아야 하지&quot;가 아니라 &quot;어느 구간에서 표가 어긋났지&quot;를 찾으면 됩니다. 응답 헤더, 소스 파일, DB 연결, 테이블 문자 집합 순으로 확인하면 거의 다 잡힙니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #16181d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791503409871&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&quot; data-og-description=&quot;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBQU0Z/dJMb9ibew4u/dFBCjjZTqTtnl3KrSyNIcK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/PIgqK/dJMb9bwpGNl/RxAZMtoQjN8lbP1dcggXL1/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/XXzDw/dJMb8U9hz1g/HbF7rsKH8KUIEeKiLg2DNK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBQU0Z/dJMb9ibew4u/dFBCjjZTqTtnl3KrSyNIcK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/PIgqK/dJMb9bwpGNl/RxAZMtoQjN8lbP1dcggXL1/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/XXzDw/dJMb8U9hz1g/HbF7rsKH8KUIEeKiLg2DNK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275');&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791503404653&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;ASP(Active Server Pages)란 무엇인가 &amp;mdash; 초기 웹을 이끈 서버 스크립트의 등장과 쇠퇴&quot; data-og-description=&quot;ASP(Active Server Pages)는 마이크로소프트가 1996년에 내놓은 서버 사이드 스크립트 기술입니다. 윈도우 서버의 IIS 위에서 동적인 웹 페이지를 만들 수 있게 해준 기술로, 90년대 후반부터 2000년대 초&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/asp-active-server-pages-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/asp-active-server-pages-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jE3ZG/dJMb8U9hz1e/b64VF3KGrtdXMsjYaWzyXk/img.png?width=800&amp;amp;height=646&amp;amp;face=370_62_427_124,https://scrap.kakaocdn.net/dn/GNl90/dJMb9ibew4n/LcFDk2TN8HQshWCSbY1ObK/img.png?width=800&amp;amp;height=646&amp;amp;face=370_62_427_124,https://scrap.kakaocdn.net/dn/Mp8qn/dJMb9bwpGNh/lLspdS2vxQQVr5BKeKLWYK/img.png?width=1024&amp;amp;height=827&amp;amp;face=473_83_543_159&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/asp-active-server-pages-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/asp-active-server-pages-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jE3ZG/dJMb8U9hz1e/b64VF3KGrtdXMsjYaWzyXk/img.png?width=800&amp;amp;height=646&amp;amp;face=370_62_427_124,https://scrap.kakaocdn.net/dn/GNl90/dJMb9ibew4n/LcFDk2TN8HQshWCSbY1ObK/img.png?width=800&amp;amp;height=646&amp;amp;face=370_62_427_124,https://scrap.kakaocdn.net/dn/Mp8qn/dJMb9bwpGNh/lLspdS2vxQQVr5BKeKLWYK/img.png?width=1024&amp;amp;height=827&amp;amp;face=473_83_543_159');&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;ASP(Active Server Pages)란 무엇인가 &amp;mdash; 초기 웹을 이끈 서버 스크립트의 등장과 쇠퇴&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ASP(Active Server Pages)는 마이크로소프트가 1996년에 내놓은 서버 사이드 스크립트 기술입니다. 윈도우 서버의 IIS 위에서 동적인 웹 페이지를 만들 수 있게 해준 기술로, 90년대 후반부터 2000년대 초&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791503400096&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;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&quot; data-og-description=&quot;&amp;quot;MySQL이랑 MariaDB랑 뭐가 다른 거예요? 거의 똑같던데.&amp;quot;&amp;quot;리눅스에 mysql 깔았더니 mariadb가 깔리던데 이거 버그인가요?&amp;quot;&amp;quot;MariaDB가 MySQL 베낀 거예요?&amp;quot;&amp;quot;왜 둘 다 이름 끝이 비슷하죠?&amp;quot; 실무에서 둘 다 써본&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gXOe2/dJMb8WMNA0q/dDIyFlYcxjjm0QMVuEIgik/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/WFAMD/dJMb8U9hz09/umkBFiZG9M43wIudwGWEYk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/jJo2p/dJMb8U9hz1a/7gccTadDAZbHQclacRUEJ1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gXOe2/dJMb8WMNA0q/dDIyFlYcxjjm0QMVuEIgik/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/WFAMD/dJMb8U9hz09/umkBFiZG9M43wIudwGWEYk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/jJo2p/dJMb8U9hz1a/7gccTadDAZbHQclacRUEJ1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;MySQL이랑 MariaDB랑 뭐가 다른 거예요? 거의 똑같던데.&quot;&quot;리눅스에 mysql 깔았더니 mariadb가 깔리던데 이거 버그인가요?&quot;&quot;MariaDB가 MySQL 베낀 거예요?&quot;&quot;왜 둘 다 이름 끝이 비슷하죠?&quot; 실무에서 둘 다 써본&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>cp949</category>
      <category>euc-kr</category>
      <category>mysql</category>
      <category>PHP</category>
      <category>UTF-8</category>
      <category>utf8mb4</category>
      <category>문자인코딩</category>
      <category>완성형</category>
      <category>유니코드</category>
      <category>한글깨짐</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/180</guid>
      <comments>https://devwar.tistory.com/entry/euc-kr-utf8-korean-encoding#entry180comment</comments>
      <pubDate>Mon, 12 Oct 2026 19:00:00 +0900</pubDate>
    </item>
    <item>
      <title>JPA N+1 문제, 쿼리 1번 날렸는데 101번 나가는 이유</title>
      <link>https://devwar.tistory.com/entry/jpa-n-plus-1-problem</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JPA N+1 문제, 101번 쿼리의 비밀.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rOqVI/dJMb99VFWKs/f3oDyxL9xEebDrmBMhHpsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rOqVI/dJMb99VFWKs/f3oDyxL9xEebDrmBMhHpsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rOqVI/dJMb99VFWKs/f3oDyxL9xEebDrmBMhHpsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrOqVI%2FdJMb99VFWKs%2Ff3oDyxL9xEebDrmBMhHpsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;JPA N+1 문제, 쿼리 1번 날렸는데 101번 나가는 이유&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;JPA N+1 문제, 101번 쿼리의 비밀.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA N+1 문제는 게시글 100개를 조회하는 쿼리를 1번 날렸는데 로그에는 쿼리가 101번 찍히는 현상입니다. JPA를 처음 쓰는 개발자가 거의 반드시 한 번은 겪고, 운영 중인 서비스가 갑자기 느려졌을 때 범인으로 지목되는 단골입니다. 이 글은 왜 1번이 101번이 되는지, 그리고 상황별로 어떻게 막는지를 Spring Boot 3.x와 Hibernate 6 기준으로 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;findAll 한 번 했는데 왜 쿼리가 수백 개 나가요?&quot;&lt;br /&gt;&quot;EAGER로 바꾸면 되는 거 아닌가요?&quot;&lt;br /&gt;&quot;fetch join 썼는데 페이징이 안 돼요&quot;&lt;br /&gt;&quot;N+1 생기는지 배포 전에 미리 알 수 있나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N+1은 JPA의 버그가 아닙니다. 지연 로딩이라는 기본 전략이 설계된 대로 동작한 결과입니다. 그래서 &quot;왜 생기는지&quot;를 이해하면 해법도 자연스럽게 따라옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA를 막 시작한 분, 운영 로그에서 같은 쿼리가 수백 줄 반복되는 걸 본 분, fetch join과 @EntityGraph와 BatchSize 중 뭘 써야 할지 헷갈리는 분께 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;쿼리 1번이 101번 되는 장면&lt;/li&gt;
&lt;li&gt;N+1이 생기는 원리, 지연 로딩이 정상 동작한 결과&lt;/li&gt;
&lt;li&gt;EAGER로 바꾸면 해결될까&lt;/li&gt;
&lt;li&gt;해법 1, fetch join&lt;/li&gt;
&lt;li&gt;해법 2, @EntityGraph&lt;/li&gt;
&lt;li&gt;해법 3, BatchSize로 N개를 N/100개로&lt;/li&gt;
&lt;li&gt;세 해법 비교와 선택 기준&lt;/li&gt;
&lt;li&gt;컬렉션 fetch join의 추가 함정&lt;/li&gt;
&lt;li&gt;N+1을 배포 전에 잡는 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 쿼리 1번이 101번 되는 장면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글(Post)과 작성자(Member)가 있는 흔한 구조로 시작하겠습니다. 게시글은 작성자를 다대일로 참조하고, 지연 로딩으로 매핑돼 있습니다. 아래 코드는 동작 원리를 보여주는 예시이며 Spring Boot 3.x, Hibernate 6 기준(2026년 시점)입니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Entity
public class Post {
    @Id @GeneratedValue
    private Long id;
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    private Member author;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 게시글 목록을 가져와서 작성자 이름을 하나씩 꺼내 봅니다. 게시글이 100개라고 가정합니다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;List&amp;lt;Post&amp;gt; posts = postRepository.findAll();   // 쿼리 1번

for (Post post : posts) {
    String name = post.getAuthor().getName();   // 여기서 쿼리가 또 나감
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 켜고 보면 이렇게 찍힙니다. 게시글 조회 1번, 그리고 작성자 조회가 게시글 수만큼 100번. 합쳐서 101번입니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;select p.id, p.title, p.author_id from post p
select m.id, m.name from member m where m.id = ?
select m.id, m.name from member m where m.id = ?
select m.id, m.name from member m where m.id = ?
-- ... 같은 쿼리가 100번 반복&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 N+1입니다. 목록 조회 1번(1) 더하기 각 행의 연관 엔티티 조회 N번(N). 게시글이 1,000개면 1,001번이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. N+1이 생기는 원리, 지연 로딩이 정상 동작한 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;findAll()&lt;/code&gt;이 실행될 때 JPA는 post 테이블만 조회합니다. 작성자는 아직 필요한지 모르니 가져오지 않습니다. 대신 &lt;code&gt;author&lt;/code&gt; 자리에 프록시(가짜 객체)를 끼워 둡니다. 껍데기만 있고 안은 비어 있는 객체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문에서 &lt;code&gt;post.getAuthor().getName()&lt;/code&gt;을 호출하는 순간, 프록시는 &quot;이제 진짜 데이터가 필요하구나&quot;라고 판단해 그 작성자 한 명을 조회하는 쿼리를 날립니다. 이게 지연 로딩(Lazy Loading)입니다. 필요할 때까지 미룬다는 뜻이고, 쓰지 않는 데이터를 불러오지 않으려는 합리적인 전략입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이 판단이 행 단위로 일어난다는 겁니다. JPA는 &quot;반복문이 100번 돌 거니까 작성자 100명을 한 번에 가져오자&quot;라고 미리 알 수 없습니다. 그저 매번 &quot;이 작성자 하나 필요해?&quot;에 &quot;응&quot; 하고 답할 뿐입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  N+1은 버그가 아니라 기본값입니다&lt;/b&gt;&lt;br /&gt;지연 로딩은 &quot;쓸 때 가져온다&quot;는 약속을 정확히 지킨 겁니다. 개발자가 &quot;한꺼번에 쓸 거다&quot;를 알려주지 않았을 뿐입니다. 그래서 해법은 전부 &quot;미리 알려주는 방법&quot;입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. EAGER로 바꾸면 해결될까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 떠오르는 방법이 &lt;code&gt;FetchType.EAGER&lt;/code&gt;로 바꾸는 겁니다. &quot;처음부터 같이 가져와&quot;라는 뜻이니 해결될 것 같지만, 실제로는 대부분 더 나빠집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;조회 방식&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;EAGER일 때 실제 동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;findById (단건)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;조인으로 한 번에 가져옴. 여기만 잘 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;JPQL / findAll (목록)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;목록 먼저 조회 후 각 행마다 즉시 추가 조회. N+1 그대로 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;작성자를 안 쓰는 화면&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;필요 없는데도 매번 조회. 낭비&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPQL은 작성된 쿼리를 그대로 실행한 뒤, EAGER로 지정된 연관 엔티티를 뒤늦게 채웁니다. 그래서 목록 조회에서는 N+1이 그대로 남고, 작성자가 필요 없는 화면에서도 쿼리가 나갑니다. 지연 로딩을 포기하면서 얻는 게 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 모든 연관 관계를 LAZY로 두고, 필요한 조회에서만 아래 해법으로 &quot;같이 가져와&quot;를 지정하는 게 기본입니다. EAGER는 끄는 방향으로 간다고 보시면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 해법 1, fetch join&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPQL에서 &lt;code&gt;join fetch&lt;/code&gt;를 쓰면 &quot;이 조회에서는 작성자도 같이 가져와&quot;라고 명시할 수 있습니다. SQL 조인 한 번으로 게시글과 작성자가 한꺼번에 나옵니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface PostRepository extends JpaRepository&amp;lt;Post, Long&amp;gt; {

    @Query(&quot;select p from Post p join fetch p.author&quot;)
    List&amp;lt;Post&amp;gt; findAllWithAuthor();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 쿼리는 1번만 나갑니다. 반복문에서 &lt;code&gt;getAuthor()&lt;/code&gt;를 호출해도 이미 채워져 있어서 추가 조회가 없습니다. 가장 직관적이고 가장 많이 쓰는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 fetch join은 &quot;이 쿼리 전용&quot;입니다. 작성자가 필요한 조회 메서드마다 따로 만들어야 하고, 같은 엔티티에 대해 조회 조건이 다양해지면 메서드가 늘어납니다. 그리고 컬렉션(일대다)에 쓸 때는 뒤에서 설명할 함정이 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 해법 2, @EntityGraph&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPQL을 직접 쓰기 싫다면 &lt;code&gt;@EntityGraph&lt;/code&gt;로 같은 효과를 낼 수 있습니다. 스프링 데이터 JPA가 제공하는 메서드 위에 &quot;이 속성은 같이 가져와&quot;라고 붙이는 방식입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface PostRepository extends JpaRepository&amp;lt;Post, Long&amp;gt; {

    @EntityGraph(attributePaths = &quot;author&quot;)
    List&amp;lt;Post&amp;gt; findAll();

    @EntityGraph(attributePaths = &quot;author&quot;)
    List&amp;lt;Post&amp;gt; findByTitleContaining(String keyword);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로는 LEFT OUTER JOIN이 나갑니다. fetch join이 기본 INNER JOIN인 것과 다른 점인데, 작성자가 없는 게시글도 결과에 포함된다는 뜻입니다. 대부분은 상관없지만 결과 건수가 달라질 수 있다는 건 알아두면 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 이름 기반 쿼리에 바로 붙일 수 있어서, 조회 조건이 여러 개일 때 fetch join보다 코드가 짧아집니다. 반대로 복잡한 조건이나 정렬이 섞이면 JPQL이 더 읽기 편해서, 둘 중 하나를 고집하기보다 상황 따라 섞어 씁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 해법 3, BatchSize로 N개를 N/100개로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 두 해법은 &quot;조인으로 한 번에&quot;입니다. 세 번째는 접근이 다릅니다. 지연 로딩은 그대로 두되, 프록시가 하나씩 조회하는 대신 &quot;한꺼번에 100개씩 IN 쿼리로 가져와&quot;라고 설정하는 방식입니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;spring:
  jpa:
    properties:
      hibernate:
        default_batch_fetch_size: 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정 하나면 전역으로 적용됩니다. 특정 엔티티나 컬렉션에만 적용하고 싶으면 &lt;code&gt;@BatchSize(size = 100)&lt;/code&gt;를 필드나 클래스에 붙이면 됩니다. 적용 후 로그는 이렇게 바뀝니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;select p.id, p.title, p.author_id from post p
select m.id, m.name from member m where m.id in (?, ?, ?, ... 100개)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 100개면 작성자 조회가 100번에서 1번으로, 1,000개면 10번으로 줄어듭니다. 완전히 1번은 아니지만 N+1이 N/100+1이 되는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법의 진짜 장점은 fetch join으로 못 푸는 상황, 즉 컬렉션 페이징이나 여러 컬렉션을 동시에 가져와야 할 때 유일하게 깔끔하게 동작한다는 점입니다. 그래서 실무에서는 전역 배치 사이즈를 기본으로 깔아 두고, 핵심 조회에만 fetch join을 얹는 조합이 흔합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  배치 사이즈는 얼마가 적당할까&lt;/b&gt;&lt;br /&gt;보통 100~1,000 사이를 씁니다. IN 절에 들어가는 파라미터 수라서 너무 크면 DB 쪽 제한이나 실행 계획 문제가 생길 수 있습니다. 1,000을 넘기지 않는 선에서 시작해 로그를 보며 조정하는 게 안전합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 세 해법 비교와 선택 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋 다 N+1을 막지만 성격이 다릅니다. 한눈에 비교하면 이렇습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;fetch join / @EntityGraph&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;BatchSize&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;쿼리 수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1번&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1 + N/배치크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;적용 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;조회 메서드 단위&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;전역 또는 엔티티 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컬렉션 페이징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불가 (메모리 페이징 위험)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컬렉션 2개 이상&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;제한 있음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;적합한 경우&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;다대일, 단건&amp;middot;소량 조회&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일대다, 페이징 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다대일(게시글 &amp;rarr; 작성자)은 fetch join이나 @EntityGraph, 일대다(게시글 &amp;rarr; 댓글 목록)에 페이징이 붙으면 BatchSize입니다. 그리고 전역 배치 사이즈는 어떤 경우든 깔아 두는 게 손해 볼 일이 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 컬렉션 fetch join의 추가 함정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자(다대일)에 fetch join을 쓰는 건 안전합니다. 문제는 댓글 목록(일대다) 같은 컬렉션에 fetch join을 쓸 때입니다. 두 가지 함정이 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;함정&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;페이징 불가&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;조인 결과가 댓글 수만큼 늘어나 DB에서 LIMIT을 못 씀. Hibernate가 전체를 메모리에 올린 뒤 자르며 경고 로그를 남김&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컬렉션 2개 동시 fetch&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;List 타입 컬렉션 2개를 같이 fetch join하면 MultipleBagFetchException 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째가 특히 위험합니다. 코드는 멀쩡히 돌아가고 결과도 맞게 나오는데, 데이터가 10만 건이면 10만 건을 전부 메모리에 올렸다가 20건만 남기는 겁니다. 로그에 &lt;code&gt;HHH90003004&lt;/code&gt; 경고가 찍히면 이 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 Hibernate 5까지는 컬렉션 fetch join 결과에 부모가 중복돼서 &lt;code&gt;select distinct&lt;/code&gt;를 붙여야 했습니다. Hibernate 6(Spring Boot 3.x)부터는 중복 제거가 자동이라 &lt;code&gt;distinct&lt;/code&gt;가 필요 없습니다. 예전 자료를 보고 습관적으로 붙이는 경우가 많은데, 지금은 빼도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬렉션이 페이징과 함께 필요하면 답은 정해져 있습니다. 다대일만 fetch join으로 가져오고, 컬렉션은 BatchSize로 처리합니다. 이 조합이 Spring Boot + JPA 실무에서 가장 흔한 목록 조회 패턴입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. N+1을 배포 전에 잡는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N+1은 개발 환경에서 잘 안 보입니다. 테스트 데이터가 5건이면 쿼리 6번이라 느리지도 않고, 로그도 몇 줄 안 되니 넘어갑니다. 운영에서 데이터가 5만 건이 되고 나서야 터집니다. 그래서 미리 잡는 장치가 필요합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발 중&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;SQL 로그를 켜고 같은 쿼리가 반복되는지 눈으로 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Hibernate 통계로 쿼리 수를 세서 상한을 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;운영&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;APM이나 슬로우 쿼리 로그에서 요청당 쿼리 수 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트에서 쿼리 수를 세는 건 생각보다 간단합니다. &lt;code&gt;hibernate.generate_statistics: true&lt;/code&gt;를 켜면 &lt;code&gt;SessionFactory&lt;/code&gt;의 통계 객체에서 실행된 쿼리 수를 읽을 수 있습니다. 목록 조회 테스트에 &quot;쿼리는 3번 이하&quot;라는 단언 하나만 넣어 둬도, 누군가 나중에 연관 관계를 하나 추가해서 N+1이 생기면 테스트가 바로 깨집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경에서는 &lt;code&gt;spring.jpa.open-in-view: false&lt;/code&gt;도 같이 꺼 두는 걸 권합니다. 켜져 있으면 컨트롤러나 뷰에서도 지연 로딩이 조용히 동작해서, 서비스 계층 밖에서 생기는 N+1을 놓치기 쉽습니다. 끄면 트랜잭션 밖에서 프록시를 건드리는 순간 예외가 나서 문제를 일찍 드러냅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;N+1은 JPA에만 있는 문제인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 연관 데이터를 지연 로딩하는 ORM이면 전부 같은 구조입니다. 장고(Django) ORM의 &lt;code&gt;select_related&lt;/code&gt;, 라라벨(Laravel)의 &lt;code&gt;with()&lt;/code&gt;도 같은 문제를 같은 방식으로 풉니다. 이름만 다를 뿐 원리는 동일합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;fetch join과 @EntityGraph 중 뭘 써야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 조건이나 정렬이 있으면 JPQL fetch join, 메서드 이름 쿼리로 충분하면 @EntityGraph가 간결합니다. 결과 차이는 INNER JOIN이냐 LEFT OUTER JOIN이냐 정도라 대부분 취향 문제입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;BatchSize만 켜 두면 fetch join은 안 써도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 N+1은 배치만으로 충분히 완화됩니다. 다만 쿼리 1번이 꼭 필요한 핵심 조회나 트래픽이 높은 API는 fetch join으로 확실히 잡는 게 낫습니다. 둘은 경쟁 관계가 아니라 같이 쓰는 도구입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ORM은 쿼리를 안 쓰게 해주는 게 아니라 덜 쓰게 해주는 도구입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N+1은 지연 로딩이 행 단위로 판단하기 때문에 생기고, 해법은 전부 &quot;이 조회에서는 이것도 같이 필요하다&quot;를 미리 알려주는 방법입니다. 다대일은 fetch join이나 @EntityGraph, 일대다에 페이징이 붙으면 BatchSize, 그리고 전역 배치 사이즈는 기본으로 깔아 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 쿼리를 하나하나 손으로 짜고 싶지 않다면 ORM을 쓰는 게 맞다고 봅니다. 반복적인 CRUD에 드는 시간을 줄여주는 효과는 분명하니까요. 다만 ORM이 SQL을 대신 생각해 주는 건 아닙니다. 어떤 쿼리가 나가는지는 결국 개발자가 알아야 하고, N+1은 그걸 모르면 가장 먼저 터지는 지점입니다. 로그 한 번 켜 보는 습관이 이 모든 해법보다 앞에 옵니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #16181d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791600004360&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;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&quot; data-og-description=&quot;MySQL과 MariaDB 차이를 찾아보면 &amp;quot;거의 같다&amp;quot;는 답과 &amp;quot;이제 많이 다르다&amp;quot;는 답이 같이 나옵니다. 둘 다 맞습니다. 이 두 데이터베이스는 한 사람이 만든 형제이고, 오라클 인수를 계기로 갈라졌으며,&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvZZQ4/dJMb8Sp551w/0Bns0HQD8ZdAzdDw6ewPO0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/btWvig/dJMb87guuz4/DDY5gCbGN75blokEdOvRPk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/cpeOv5/dJMb8Yqje8V/e609MqvxDo5f5AAKRpxwl1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/mysql-mariadb-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvZZQ4/dJMb8Sp551w/0Bns0HQD8ZdAzdDw6ewPO0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/btWvig/dJMb87guuz4/DDY5gCbGN75blokEdOvRPk/img.jpg?width=800&amp;amp;height=594&amp;amp;face=497_113_585_210,https://scrap.kakaocdn.net/dn/cpeOv5/dJMb8Yqje8V/e609MqvxDo5f5AAKRpxwl1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=743_175_870_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL과 MariaDB는 원래 한 핏줄이었다 - 오라클 인수와 포크의 가족사&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL과 MariaDB 차이를 찾아보면 &quot;거의 같다&quot;는 답과 &quot;이제 많이 다르다&quot;는 답이 같이 나옵니다. 둘 다 맞습니다. 이 두 데이터베이스는 한 사람이 만든 형제이고, 오라클 인수를 계기로 갈라졌으며,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791600001028&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;자바 스프링 프레임워크(Java Spring Framework)는 백엔드 개발을 시작하는 분들이라면 반드시 마주치게 되는 거대한 산입니다. 한국에서는 특히 전자정부표준프레임워크의 기반 기술로 채택되면서, &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/java-spring-framework&quot; data-og-url=&quot;https://devwar.tistory.com/entry/java-spring-framework&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pWoZT/dJMb8RSfUMG/xLUeJpFg0MUVHTcyEl8wuK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=380_130_432_187,https://scrap.kakaocdn.net/dn/bJDy3M/dJMb8WeXQJY/vBngnkvfOomSqUIF0MxUH1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=380_130_432_187,https://scrap.kakaocdn.net/dn/RJxuK/dJMb87guuz0/hiE0SJ94gLHNPd3yWI2yo0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=552_189_639_283&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/java-spring-framework&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/java-spring-framework&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pWoZT/dJMb8RSfUMG/xLUeJpFg0MUVHTcyEl8wuK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=380_130_432_187,https://scrap.kakaocdn.net/dn/bJDy3M/dJMb8WeXQJY/vBngnkvfOomSqUIF0MxUH1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=380_130_432_187,https://scrap.kakaocdn.net/dn/RJxuK/dJMb87guuz0/hiE0SJ94gLHNPd3yWI2yo0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=552_189_639_283');&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;자바 스프링 프레임워크(Java Spring Framework)는 백엔드 개발을 시작하는 분들이라면 반드시 마주치게 되는 거대한 산입니다. 한국에서는 특히 전자정부표준프레임워크의 기반 기술로 채택되면서,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791599996995&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;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; data-og-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cHEiMe/dJMb86olwIF/adR7E6zyO49mppB9elKF31/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/VIrpJ/dJMb85wc5bw/dn7P0GgFUboL4XybJyWP4k/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/yds9O/dJMb86olwIG/eVEpKSINXwkRsROy7GLoaK/img.png?width=1200&amp;amp;height=896&amp;amp;face=736_178_839_290&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHEiMe/dJMb86olwIF/adR7E6zyO49mppB9elKF31/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/VIrpJ/dJMb85wc5bw/dn7P0GgFUboL4XybJyWP4k/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/yds9O/dJMb86olwIG/eVEpKSINXwkRsROy7GLoaK/img.png?width=1200&amp;amp;height=896&amp;amp;face=736_178_839_290');&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>batchsize</category>
      <category>EntityGraph</category>
      <category>fetch join</category>
      <category>Hibernate</category>
      <category>JPA</category>
      <category>n+1</category>
      <category>n+1 문제</category>
      <category>Spring Boot</category>
      <category>스프링 데이터 JPA</category>
      <category>지연 로딩</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/181</guid>
      <comments>https://devwar.tistory.com/entry/jpa-n-plus-1-problem#entry181comment</comments>
      <pubDate>Sat, 10 Oct 2026 11:39:31 +0900</pubDate>
    </item>
    <item>
      <title>FastAPI 장점, 타입 힌트 한 줄에 숨은 설계가 있습니다</title>
      <link>https://devwar.tistory.com/entry/fastapi-origin-design-philosophy</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FastAPI 타입 힌트의 설계 비밀.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMJif/dJMcaf9hAXi/GOci2MyLFMmm45Vv4mqA41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMJif/dJMcaf9hAXi/GOci2MyLFMmm45Vv4mqA41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMJif/dJMcaf9hAXi/GOci2MyLFMmm45Vv4mqA41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMJif%2FdJMcaf9hAXi%2FGOci2MyLFMmm45Vv4mqA41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;FastAPI 장점, 타입 힌트 한 줄에 숨은 설계가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;FastAPI 타입 힌트의 설계 비밀.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI 탄생 배경을 따라가 보면, 이 프레임워크가 속도 때문에 만들어진 게 아니라는 사실이 먼저 눈에 들어옵니다. 만든 사람은 몇 년 동안 새 프레임워크를 만들지 않으려 버텼고, 기존 도구 조합으로 버틸 수 없게 된 뒤에야 손을 댔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;Flask로 충분한데 FastAPI가 왜 나온 거죠?&quot;&lt;br /&gt;&quot;타입 힌트만 쓰면 검증이 된다는 게 무슨 뜻인가요?&quot;&lt;br /&gt;&quot;이름이 Fast인데 실제로 그렇게 빠른가요?&quot;&lt;br /&gt;&quot;Django REST Framework랑 결국 뭐가 다릅니까?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문들에 답하려면 기능 목록보다 설계 의도를 먼저 봐야 합니다. FastAPI는 없던 기능을 새로 발명한 프레임워크가 아니라, 이미 존재하던 아이디어들을 파이썬 타입 힌트라는 한 지점으로 모은 프레임워크에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 FastAPI의 탄생 과정, 설계 철학, 그리고 그 철학이 실제로 어떤 이득과 부담으로 돌아오는지를 정리합니다. 코드 예시 없이 개념 위주로 진행하니, 파이썬을 조금 아는 정도라면 따라올 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  기준 버전과 검증 시점&lt;/b&gt;&lt;br /&gt;2026년 8월 기준으로 확인한 내용입니다. FastAPI 정식 릴리스는 0.141.x 대이고, Pydantic v2가 기준입니다. 0.124.4 이후 릴리스에서 파이썬 3.8 지원이 끊겨 3.8 환경에서는 0.124.4까지만 설치됩니다. Pydantic v1 연동은 지원 중단 예고 상태이므로, 아래 내용도 버전이 올라가면 달라질 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FastAPI 탄생 이전, 같은 정보를 네 군데에 적었습니다&lt;/li&gt;
&lt;li&gt;새 프레임워크를 만들지 않으려 몇 년을 버틴 이유&lt;/li&gt;
&lt;li&gt;FastAPI 설계 철학의 출발점은 표준 문서였습니다&lt;/li&gt;
&lt;li&gt;타입 힌트 하나를 진실의 출처로 삼는 설계&lt;/li&gt;
&lt;li&gt;Starlette과 Pydantic 위에 세운 프레임워크&lt;/li&gt;
&lt;li&gt;에디터 자동완성을 설계 목표에 넣은 이유&lt;/li&gt;
&lt;li&gt;의존성 주입에서 사전 등록을 걷어낸 선택&lt;/li&gt;
&lt;li&gt;FastAPI가 빠르다는 말에 숨은 오해&lt;/li&gt;
&lt;li&gt;FastAPI와 Flask, Django REST Framework의 갈림길&lt;/li&gt;
&lt;li&gt;FastAPI가 오히려 부담이 되는 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. FastAPI 탄생 이전, 같은 정보를 네 군데에 적었습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2010년대 중반에 파이썬으로 API를 만들려면 조합을 짜야 했습니다. Flask로 라우팅을 잡고, Marshmallow로 검증과 직렬화 스키마를 정의하고, Webargs로 요청 파싱을 붙이고, APISpec으로 문서를 뽑는 식이었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 같은 정보가 여러 군데에 흩어진다는 점이었습니다. 사용자 이름 필드 하나를 두고 검증 스키마에 한 번, 파싱 규칙에 한 번, 문서용 명세에 또 한 번 적어야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 APISpec은 함수 docstring 안에 YAML을 문자열로 써넣는 방식이었습니다. 파이썬 문자열 속의 YAML이니 에디터가 오타를 잡아줄 수 없었고, 파라미터를 고치고 docstring을 깜빡하면 문서가 조용히 낡아갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask-apispec이 이 조합을 묶어주면서 상황은 나아졌습니다. 그래도 근본 구조는 그대로였습니다. 정보의 출처가 하나가 아니라 여러 개라는 점이요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 새 프레임워크를 만들지 않으려 몇 년을 버틴 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI를 만든 사람은 세바스티안 라미레스(온라인에서는 tiangolo)입니다. 머신러닝, 분산 시스템, 비동기 작업, NoSQL이 얽힌 API를 개발팀을 이끌며 만들어 온 사람입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인 설명에 따르면 그는 새 프레임워크를 만드는 걸 몇 년간 피했습니다. 기존 프레임워크와 플러그인 조합으로 필요한 기능을 전부 해결해 보려 했다는 겁니다. Flask + Flask-apispec + Marshmallow + Webargs 조합이 FastAPI 이전 그의 주력 스택이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 만난 대안이 APIStar(0.5 이하 버전)였습니다. 타입 힌트로 파라미터를 선언하고, OpenAPI 표준을 쓰고, 검증과 직렬화와 스키마 생성을 한 번에 처리하는 구조였죠. 원하던 것에 가장 가까웠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 APIStar에는 보안 통합이 없었습니다. 기존 스택을 완전히 대체할 수 없었다는 뜻입니다. 그러다 APIStar를 만든 톰 크리스티가 Starlette 개발로 방향을 옮기면서, APIStar는 서버 프레임워크로서의 수명을 끝냈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 Starlette이라는 더 나은 토대가 생겼습니다. 그게 마지막 계기였습니다. FastAPI 첫 릴리스는 2018년 12월 5일이고, 만든 이는 FastAPI를 APIStar의 정신적 후계자로 부릅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. FastAPI 설계 철학의 출발점은 표준 문서였습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI 개발에서 눈에 띄는 대목은 순서입니다. 코드를 먼저 쓰지 않았습니다. 만든 이는 FastAPI를 코딩하기 전에 몇 달간 OpenAPI, JSON Schema, OAuth2 명세를 읽었습니다. 세 표준이 서로 어디까지 겹치고 어디서 갈리는지 파악하는 작업이었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 첫 번째 원칙이 나옵니다. 자체 스키마를 만들지 않고 공개 표준을 쓴다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 도구 중에는 자기만의 JSON 형식으로 API 전체를 기술하는 것들이 있었습니다. 아이디어는 좋았지만 표준이 아니었기에 다른 도구와 붙이기가 까다로웠습니다. Swagger는 나중에 리눅스 재단으로 이관되며 OpenAPI로 이름이 바뀌었고, 2.0 시절을 Swagger, 3점대 이후를 OpenAPI라 부르는 관행도 이때 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준을 택한 대가는 즉시 돌아옵니다. OpenAPI 문서를 만들 수 있으니 Swagger UI와 ReDoc을 그대로 붙일 수 있고, 같은 명세로 클라이언트 SDK를 생성할 수도 있습니다. FastAPI가 직접 만들지 않은 도구들을 공짜로 얻는 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 타입 힌트 하나를 진실의 출처로 삼는 설계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI의 중심 아이디어는 한 문장으로 줄어듭니다. 같은 정보를 두 번 적지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 파라미터에 파이썬 표준 타입 힌트를 붙이면, FastAPI는 그 선언 하나에서 여러 결과를 파생시킵니다. 이 설계는 파이썬 3.5~3.6에 걸쳐 타입 힌트(함수 주석, 변수 주석)가 들어오기 전에는 불가능했습니다. 언어 기능이 준비되기를 기다린 셈입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;타입 힌트 한 줄에서 나오는 것&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;담당&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;요청 데이터 검증&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Pydantic이 타입과 제약 조건으로 판정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;응답 직렬화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;파이썬 객체를 JSON으로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;JSON Schema 생성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Pydantic이 스키마를 뽑고 FastAPI가 OpenAPI에 넣음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;API 문서 화면&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;OpenAPI 명세를 Swagger UI, ReDoc이 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;에디터 자동완성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;표준 타입이므로 에디터와 타입 체커가 그대로 인식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복이 줄면 문서가 낡을 여지도 줄어듭니다. 코드와 문서가 다른 파일에 있으면 언젠가 어긋나지만, 같은 선언에서 나오면 어긋날 자리가 없습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Starlette과 Pydantic 위에 세운 프레임워크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI는 웹 처리와 데이터 처리를 직접 구현하지 않았습니다. 이미 잘 만들어진 두 라이브러리를 골라 그 위에 얹었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구성 요소&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;맡는 일&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Starlette&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;라우팅, 미들웨어, 웹소켓, 백그라운드 작업 등 웹 기본기(ASGI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Pydantic&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;타입 힌트 기반 검증, 직렬화, JSON Schema 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;FastAPI&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;둘을 잇고 의존성 주입, 보안 유틸, OpenAPI 생성을 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Uvicorn&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프레임워크가 아니라 실행을 담당하는 ASGI 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결합 방식도 느슨하지 않습니다. FastAPI 클래스는 Starlette 클래스를 직접 상속합니다. Starlette으로 할 수 있는 일은 FastAPI에서 그대로 됩니다. ASGI 표준을 쓰니 서버를 Uvicorn에서 다른 것으로 바꿔도 애플리케이션 코드는 그대로 둘 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로운 건 그가 두 라이브러리를 그냥 쓰지 않았다는 점입니다. Pydantic이 JSON Schema를 온전히 따르도록, 제약 조건 선언 방식을 여러 형태로 지원하도록, 에디터 지원이 나아지도록 직접 기여했습니다. Starlette에도 개발 과정에서 기여했습니다. 남의 토대를 고쳐 쓴 셈이죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 에디터 자동완성을 설계 목표에 넣은 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 프레임워크는 런타임 동작을 설계 목표로 잡습니다. FastAPI는 여기에 하나를 더 넣었습니다. 개발자가 코드를 쓰는 순간의 경험입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만든 이는 코딩 전에 자기가 쓰고 싶은 사용 방식을 먼저 설계했고, 그 안을 PyCharm, VS Code, Jedi 계열 에디터에서 실제로 테스트했습니다. 2018년 파이썬 개발자 설문 기준으로 약 80%의 개발자가 쓰는 에디터를 커버하는 조합이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 표준 타입을 고집한 또 하나의 이유입니다. 라이브러리 전용 클래스로 스키마를 정의하면 검증은 되지만 에디터가 도와줄 여지가 줄어듭니다. 표준 타입이면 자동완성, 타입 체크, 리팩터링 지원이 특별한 플러그인 없이 따라옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 시도를 한 NestJS와 비교하면 차이가 보입니다. NestJS도 TypeScript 타입으로 파라미터를 기술하니 에디터 지원이 좋은데, 컴파일 후 타입 정보가 사라져서 검증과 문서화를 타입만으로 처리할 수 없습니다. 그래서 곳곳에 데코레이터를 덧붙이게 됩니다. 파이썬은 런타임에 타입 힌트를 읽을 수 있으니 이 문제를 피했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 의존성 주입에서 사전 등록을 걷어낸 선택&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 주입 자체는 FastAPI가 처음 한 게 아닙니다. NestJS, Molten, APIStar 모두 갖고 있었습니다. 다만 하나같이 주입 대상을 미리 등록해 두는 절차를 요구했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록 절차는 코드 반복을 만듭니다. 같은 대상을 등록부에 한 번, 쓰는 자리에 또 한 번 적어야 하니까요. 반복을 줄이겠다는 원칙과 정면으로 부딪힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI는 함수 시그니처 자체를 선언 자리로 씁니다. 필요한 것을 파라미터로 적으면 그게 곧 등록이고 곧 사용입니다. 하위 의존성이 다시 자기 의존성을 요구하는 중첩도 되고, 요청이 끝난 뒤 정리 작업을 하는 형태도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Molten과의 차이 하나가 특히 실무적입니다. Molten은 타입을 기준으로 의존성을 해결하기 때문에 같은 타입을 제공하는 컴포넌트를 둘 이상 선언할 수 없었습니다. FastAPI는 선언 위치가 기준이라 이 제약이 없습니다. 테스트할 때 특정 의존성만 다른 것으로 갈아끼우는 방식도 여기서 나옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. FastAPI가 빠르다는 말에 숨은 오해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름에 Fast가 붙어 있어서 성능 프레임워크로 소개되는 일이 많습니다. 정작 만든 이가 말하는 Fast에는 실행 속도만이 아니라 개발 속도도 들어 있습니다. 그리고 실행 속도 쪽은 오해가 좀 쌓였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 비동기는 연산을 빠르게 만들지 않습니다. 이미지 변환이나 무거운 계산처럼 CPU를 쓰는 작업은 비동기로 바꿔도 그대로 걸립니다. 이득이 생기는 구간은 외부 API 응답, 데이터베이스 응답, 파일 입출력처럼 기다리는 시간입니다. 기다리는 동안 다른 요청을 처리할 수 있으니 동시 처리량이 올라가는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째로 벤치마크 숫자를 그대로 믿기 어렵습니다. FastAPI 처리량을 두고 초당 수천에서 2만 이상까지 서로 다른 수치가 돌아다닙니다. 하드웨어, 워커 수, 응답 크기, 미들웨어 구성이 다르면 결과가 몇 배씩 갈립니다. 숫자보다 측정 조건을 먼저 봐야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  오히려 느려지는 대표 패턴&lt;/b&gt;&lt;br /&gt;비동기 함수 안에서 동기 방식 데이터베이스 드라이버나 ORM을 호출하면 이벤트 루프가 그 시간 동안 멈춥니다. 같은 프로세스의 다른 요청까지 대기하게 되어, 일반 동기 방식보다 나쁜 결과가 나오기도 합니다. FastAPI에서 일반 함수로 선언한 경로는 별도 스레드풀에서 실행되므로, 동기 라이브러리를 쓸 때는 그쪽이 안전합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 서비스에서 응답 시간을 잡아먹는 건 대개 프레임워크가 아니라 인덱스를 못 타는 쿼리, 반복 호출되는 외부 API, 캐시 부재입니다. 프레임워크 교체로 얻는 이득은 그 다음 자리에 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. FastAPI와 Flask, Django REST Framework의 갈림길&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask와의 차이는 기능 유무보다 기본값의 차이입니다. Flask에서도 검증과 문서화를 할 수 있지만 조합을 직접 짜야 합니다. FastAPI는 그 조합을 프레임워크가 미리 붙여 둔 형태입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Flask 계열 조합&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;FastAPI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;검증&amp;middot;직렬화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;별도 라이브러리로 스키마 정의&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;타입 힌트 선언에서 파생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;API 문서&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;플러그인 추가 후 별도 기술&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;OpenAPI 명세와 문서 화면 기본 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;비동기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동기(WSGI) 기반이 기본&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;ASGI 기반, 동기 함수도 함께 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;의존성 주입&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;직접 구성하거나 확장 사용&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프레임워크 기본 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Django REST Framework는 조금 다른 위치에 있습니다. 자동 API 문서화라는 아이디어를 이른 시기에 보여준 도구이고, FastAPI가 그 방향을 찾아 나선 계기 중 하나였습니다. 만든 사람이 Starlette과 Uvicorn을 만든 톰 크리스티라는 점도 우연이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택 기준은 단순합니다. Django의 관리자 화면, ORM, 인증 체계를 이미 쓰고 있거나 쓰고 싶다면 DRF가 현실적입니다. 별도 서비스로 API만 떼어 만든다면 FastAPI가 맞습니다. 성능 서열이 아니라 생태계 소속의 문제입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. FastAPI가 오히려 부담이 되는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;철학이 뚜렷하면 안 맞는 자리도 뚜렷합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 HTML을 렌더링하는 콘텐츠 사이트 - 템플릿, 관리자, 인증을 기본 제공하는 Django가 손이 덜 갑니다&lt;/li&gt;
&lt;li&gt;타입 힌트를 안 쓰던 팀 - 타입 힌트가 선택이 아니라 전제입니다. 익숙하지 않으면 초반 마찰이 있습니다&lt;/li&gt;
&lt;li&gt;버전 정책에 민감한 조직 - 아직 0.x 번호대를 쓰고 있고, 마이너 버전에서 동작이 바뀔 수 있습니다. 의존성 버전을 고정하고 릴리스 노트를 확인하는 습관이 필요합니다&lt;/li&gt;
&lt;li&gt;비동기를 반쯤만 도입한 코드베이스 - 동기 라이브러리를 비동기 함수 안에서 호출하면 앞서 본 병목이 생깁니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 이야기는 조금 더 붙일 만합니다. 실제로 최근 릴리스에서 파이썬 3.8 지원이 끊겼고, Pydantic v1 연동도 지원 중단이 예고된 상태입니다. 활발하게 정리되는 프로젝트라는 뜻이지만, 오래 방치한 프로젝트를 뒤늦게 올릴 때는 손이 갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 여전히 움직이고 있다는 신호도 여러 곳에 있습니다. 저장소는 fastapi 조직으로 옮겨졌고, 배포 서비스인 FastAPI Cloud가 별도로 운영되며, 2026년 10월 28일 암스테르담에서 FastAPI Conf가 예정돼 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;FastAPI를 쓰려면 async와 await를 꼭 알아야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 일반 함수로 경로를 선언해도 정상 동작하며, 이때는 별도 스레드풀에서 실행됩니다. 동기 방식 데이터베이스 라이브러리를 쓰는 상황이라면 오히려 이 방식이 안전합니다. 비동기는 외부 호출 대기가 많아질 때 도입하면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버전이 아직 0.x인데 실무에 써도 됩니까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;널리 쓰이고 있지만 버전 고정은 해두는 편이 낫습니다. 마이너 버전 업그레이드에서 동작이 바뀔 수 있으니, 의존성 파일에 버전을 명시하고 올릴 때 릴리스 노트를 확인하는 흐름을 만들어 두면 사고를 줄일 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Flask 프로젝트를 FastAPI로 옮겨야 할까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 조합이 잘 돌아가고 문서화 부담도 크지 않다면 서둘 이유는 없습니다. 검증과 문서를 여러 군데에 중복으로 적고 있거나, 외부 호출 대기가 많은 API라면 옮길 근거가 생깁니다. 기존 WSGI 앱을 FastAPI 하위에 붙여 점진적으로 이전하는 방법도 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;같은 정보를 두 번 적지 않는다는 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI를 설명하는 가장 짧은 문장은 속도가 아니라 중복 제거입니다. 검증, 직렬화, 문서, 에디터 지원이 각각의 선언을 요구하던 상황에서, 파이썬 표준 타입 힌트라는 한 지점으로 그것들을 모았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 프레임워크의 성격은 발명보다 정리에 가깝습니다. 자동 문서화 아이디어는 Django REST Framework에서, 마이크로프레임워크 구조는 Flask에서, HTTP 메서드를 그대로 쓰는 직관적인 방식은 Requests에서, 타입 힌트 선언은 Hug와 APIStar에서 왔습니다. 표준을 고른 것도 새 스펙을 쓰지 않기 위한 선택이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구를 고를 때 기능 목록보다 설계 의도를 보면 판단이 쉬워집니다. 중복 선언이 문서와 코드의 불일치를 만들고 있다면 FastAPI의 전제가 자기 문제와 맞는 상황입니다. 그게 아니라면 이름의 Fast만 보고 옮길 이유는 별로 없습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #16181d; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791375189764&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;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; data-og-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FCy2t/dJMb8SXVG6n/OXBHWFbsQS5QXfkjZCWyA0/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/dPf6gf/dJMb9gxITCz/Nbjo2tP58r0bKKLz3XDP20/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/mDJ1D/dJMb85Xg1JS/BtWMUvqVWkUG4TO4LtvidK/img.png?width=1200&amp;amp;height=896&amp;amp;face=736_178_839_290&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/spring-boot-history-philosophy&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FCy2t/dJMb8SXVG6n/OXBHWFbsQS5QXfkjZCWyA0/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/dPf6gf/dJMb9gxITCz/Nbjo2tP58r0bKKLz3XDP20/img.png?width=800&amp;amp;height=597&amp;amp;face=498_122_559_188,https://scrap.kakaocdn.net/dn/mDJ1D/dJMb85Xg1JS/BtWMUvqVWkUG4TO4LtvidK/img.png?width=1200&amp;amp;height=896&amp;amp;face=736_178_839_290');&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791375180447&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLLg2V/dJMb89yBmfQ/0BFaLlEjMsRQfQgL46yKZ1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/jwsTY/dJMb8UanKUC/uajYiWGh23HTTK0iATpGEK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/d0NtzH/dJMb8QeJSc5/ekiMYkks47cG6NTBshZAZ1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLLg2V/dJMb89yBmfQ/0BFaLlEjMsRQfQgL46yKZ1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/jwsTY/dJMb8UanKUC/uajYiWGh23HTTK0iATpGEK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/d0NtzH/dJMb8QeJSc5/ekiMYkks47cG6NTBshZAZ1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229');&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1791375176375&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;라라벨 프레임워크 탄생과 철학을 살펴보면 웹 개발자가 마주했던 반복적인 고통을 어떻게 우아하게 해결하려 했는지 명확하게 알 수 있습니다. 특히 라라벨 6버전부터 정착된 버전 관리 철학&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/laravel-history-fullstack&quot; data-og-url=&quot;https://devwar.tistory.com/entry/laravel-history-fullstack&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qFuNB/dJMb87OkOiB/at65sS7VxiP6WN69C9AoA0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=502_78_568_150,https://scrap.kakaocdn.net/dn/bXEcmX/dJMb84YmmpR/MOKRRBGg6rPuz34LV6iM7K/img.jpg?width=800&amp;amp;height=536&amp;amp;face=502_78_568_150,https://scrap.kakaocdn.net/dn/e3mVh/dJMb9aK2oeH/i6kl4C6qgWxiCs4fcILuMk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=720_105_834_230&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/laravel-history-fullstack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/laravel-history-fullstack&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qFuNB/dJMb87OkOiB/at65sS7VxiP6WN69C9AoA0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=502_78_568_150,https://scrap.kakaocdn.net/dn/bXEcmX/dJMb84YmmpR/MOKRRBGg6rPuz34LV6iM7K/img.jpg?width=800&amp;amp;height=536&amp;amp;face=502_78_568_150,https://scrap.kakaocdn.net/dn/e3mVh/dJMb9aK2oeH/i6kl4C6qgWxiCs4fcILuMk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=720_105_834_230');&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;라라벨 프레임워크 탄생과 철학을 살펴보면 웹 개발자가 마주했던 반복적인 고통을 어떻게 우아하게 해결하려 했는지 명확하게 알 수 있습니다. 특히 라라벨 6버전부터 정착된 버전 관리 철학&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>ASGI</category>
      <category>FastAPI</category>
      <category>FastAPIvsFlask</category>
      <category>FastAPI철학</category>
      <category>FastAPI탄생배경</category>
      <category>OpenAPI</category>
      <category>Pydantic</category>
      <category>Starlette</category>
      <category>파이썬웹프레임워크</category>
      <category>파이썬타입힌트</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/162</guid>
      <comments>https://devwar.tistory.com/entry/fastapi-origin-design-philosophy#entry162comment</comments>
      <pubDate>Wed, 7 Oct 2026 19:00:05 +0900</pubDate>
    </item>
    <item>
      <title>Redis 세션으로 옮겼더니 앱 서버 추가가 단순해졌습니다</title>
      <link>https://devwar.tistory.com/entry/redis-session-vs-file</link>
      <description>&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;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmQolK/dJMcaiym1sZ/eKfKwyJ6vFDKytGeWAzhf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmQolK/dJMcaiym1sZ/eKfKwyJ6vFDKytGeWAzhf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmQolK/dJMcaiym1sZ/eKfKwyJ6vFDKytGeWAzhf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmQolK%2FdJMcaiym1sZ%2FeKfKwyJ6vFDKytGeWAzhf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Redis 세션으로 옮겼더니 앱 서버 추가가 단순해졌습니다&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 두 대면 로드밸런서가 요청을 번갈아 보냅니다. 1번 서버에서 로그인해도 다음 요청이 2번 서버로 가면, 그 디스크에는 세션 파일이 없어서 로그인이 풀립니다. 그래서 모든 서버가 같은 폴더를 공유해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 파일 세션 대신 Redis에 둘 때 키가 어디에 있는지, 노드와 샤드가 어떻게 나뉘는지, Memcached&amp;middot;Valkey&amp;middot;AWS ElastiCache와 무엇이 다른지만 다룹니다. 클러스터 설치 절차 전체는 넣지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일 세션이 마운트를 요구하는 이유&lt;/li&gt;
&lt;li&gt;디스크에 쓰면 느리고 빠지는 지점&lt;/li&gt;
&lt;li&gt;Redis를 다른 서버에 두는 구조&lt;/li&gt;
&lt;li&gt;Redis가 메모리에 두는 키-값인 이유&lt;/li&gt;
&lt;li&gt;저장 위치, 램과 RDB&amp;middot;AOF&lt;/li&gt;
&lt;li&gt;복제 노드와 센티넬&lt;/li&gt;
&lt;li&gt;클러스터와 샤드, 16384 슬롯&lt;/li&gt;
&lt;li&gt;백엔드가 서버 담당에게 요청할 항목&lt;/li&gt;
&lt;li&gt;Memcached와 Redis가 다른 점&lt;/li&gt;
&lt;li&gt;Valkey와 Redis가 갈라진 지점&lt;/li&gt;
&lt;li&gt;AWS ElastiCache에서 Redis와 Valkey&lt;/li&gt;
&lt;li&gt;세션에 Redis를 쓰면 안 되는 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 파일 세션이 마운트를 요구하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 두 대 이상이면 다른 서버에 있는 세션 파일을 읽을 수 없어서, 모든 서버가 같은 폴더를 공유해야 합니다. 앱이 한 대일 때는 다음 요청도 같은 디스크로 가니 이 문제가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유는 NFS처럼 네트워크 너머의 디스크를 내 폴더처럼 붙이는 방식으로 많이 합니다. NFS는 다른 서버의 디렉터리를 네트워크로 연결하는 프로토콜입니다. 앱이 늘 때마다 마운트 경로, 권한, 네트워크 경로가 같이 늘어납니다. 설정이 하나라도 어긋나면 그 서버만 세션을 못 읽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 사용자마다 파일이 생깁니다. 작은 파일이 많으면 목록을 읽는 것만으로도 디스크가 바빠지고, 그 부하를 마운트한 앱 서버가 같이 봅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;파일 세션&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;Redis 세션&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;서버가 늘 때&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;세션 디렉터리 마운트가 추가됩니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;앱은 Redis 주소만 봅니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;저장 위치&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;디스크의 파일입니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;기본은 그 서버의 램입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;장애 때&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;파일 잠금, 쓰기 중단, 끊긴 마운트가 납니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;프로세스가 죽으면 디스크에 남기지 않은 메모리 값은 사라집니다. 그래도 세션은 다시 로그인하면 되니 문제가 적습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 디스크에 쓰면 느리고 빠지는 지점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 세션이 느린 이유는 요청마다 파일을 열고 읽고 덮어쓰고 닫는데, 그 경로가 램이 아니라 디스크라서입니다. 운영체제 캐시에 걸려도 파일을 여는 호출과 잠금은 남습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 요청이 같은 파일을 고치면 잠금이 걸립니다. 한 요청이 쓰는 동안 다른 요청은 기다려야 해서, 새로고침을 연타하거나 탭이 여러 개면 같은 세션에서 줄이 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기가 끝나기 전에 프로세스가 죽으면 파일이 0바이트가 되거나 앞부분만 남습니다. 다음 요청은 그 파일을 세션으로 해석하지 못해서 로그아웃시킵니다. 공유 디스크는 네트워크가 끊기면 쓰기가 중간에 멈춰 같은 증상이 납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마운트가 끊기면 앱은 빈 폴더만 보거나 쓰기가 멈춥니다. 증상은 저장소가 죽은 것과 비슷하지만, 로그에 NFS 타임아웃이 있으면 원인은 디스크 경로입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  유실의 의미&lt;/b&gt;&lt;br /&gt;파일 세션의 유실은 디스크에 있는데 못 읽는 경우입니다. 쓰기가 중간에 끊기거나 마운트가 끊긴 때입니다. Redis 세션의 유실은 메모리가 비워진 경우입니다. 디스크 기록이 꺼져 있으면 프로세스가 죽을 때 값이 같이 없어집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Redis를 다른 서버에 두는 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis를 앱과 다른 서버에 두면, 세션이 앱 디스크 밖에 있어서 앱이 늘어도 마운트를 더하지 않습니다. 앱은 포트로 붙습니다. 기본 포트는 6379입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 세 대여도 키는 그 Redis에 있습니다. 어떤 앱으로 요청이 가도 같은 키를 읽습니다. 앱끼리 디스크를 공유하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 네트워크가 생깁니다. 앱이 있는 망에서 6379가 열려 있어야 접속이 됩니다. 인터넷에 그 포트를 열면 인증 없이도 키가 읽힐 수 있어서, 앱 서버에서만 접근하게 둡니다. 비밀번호, 계정 권한, 암호화 연결은 서버 담당이 호스트를 띄울 때 같이 정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 데이터센터 구역 안에서는 왕복이 한 번입니다. 파일을 잠그고 기다리는 시간보다 짧은 경우가 많습니다. 리전을 건너 붙이면 왕복이 길어져서 그 차이가 줄어듭니다. 세션용 Redis를 앱과 같은 리전에 두는 이유가 여기 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Redis가 메모리에 두는 키-값인 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션을 메모리에 두면 디스크를 열지 않아 읽고 쓰기가 짧습니다. 세션은 잠깐 쓰다 버려도 되는 값이라, 사라져도 다시 로그인하면 됩니다. 결제 원장처럼 남아야 하는 값은 이 이유에 해당하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 키 하나에 문자열을 통째로 넣기보다, 해시의 키&amp;middot;필드&amp;middot;값으로 나누는 경우가 많습니다. 키는 세션 아이디입니다. 필드는 userId, role 같은 항목 이름입니다. 값은 그 항목의 내용입니다. 그래서 권한만 바뀌면 JSON 전체를 다시 쓰지 않아도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TTL은 그 키가 몇 초 뒤에 지워질지 정하는 만료 시간입니다. 로그인 유지 30분이면 1800초를 키에 겁니다. HSET으로 필드를 고쳐도 TTL은 처음 건 시간에서 줄어들 뿐 다시 늘어나지 않습니다. 그래서 요청이 올 때마다 EXPIRE로 남은 시간을 다시 늘립니다. 늘리지 않으면 사용 중에도 키가 지워져 로그아웃됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령은 한 스레드가 순서대로 처리하는 쪽이 기본이었습니다. 그래서 한 키의 증감은 앱에서 잠금을 따로 걸지 않아도 겹치지 않습니다. Redis와 Valkey 모두 네트워크 처리를 스레드로 나누는 옵션이 있을 수 있으니, 그 기본값은 운영 버전 릴리스 노트에서 확인하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령이 한 줄로 처리돼서, 느린 명령은 그 순간 다른 세션 읽기까지 밀립니다. &lt;code&gt;KEYS *&lt;/code&gt; 로 전체를 훑거나 큰 값을 한 번에 넣는 일은 피하고, 키를 찾을 때는 &lt;code&gt;SCAN&lt;/code&gt; 을 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 해시 세션에 필드 두 개를 넣고 30분 TTL을 거는 명령입니다. HSET은 새로 생긴 필드 수를 돌려주고, EXPIRE가 1이면 만료가 걸린 것이며, TTL은 남은 초를 돌려줍니다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;HSET session:abc123 userId 42 role editor
EXPIRE session:abc123 1800
TTL session:abc123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱은 쿠키에 &lt;code&gt;abc123&lt;/code&gt; 같은 아이디만 둡니다. 사용자 번호는 Redis에 둡니다. 쿠키에 권한 전체를 넣으면 Redis에 둘 이유가 줄어듭니다. 권한이 쿠키에 있으면 서버 저장소를 읽지 않아도 요청이 처리되지만, 서명하지 않은 쿠키는 사용자가 값을 바꿀 수 있습니다. 또 권한을 회수해도 이미 발급된 쿠키에는 옛 권한이 남습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 저장 위치, 램과 RDB&amp;middot;AOF&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 읽는 값은 램에 있습니다. 프로세스를 끄거나 호스트가 죽으면, 디스크에 남기지 않은 값은 램과 함께 사라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 기록은 설치 방식마다 기본값이 다릅니다. 직접 설치한 Redis와 Valkey는 기본 설정에서 RDB 스냅샷이 켜져 있고, ElastiCache 같은 관리형은 꺼진 상태로 시작하는 경우가 많습니다. 세션만 쓴다면 어느 쪽인지 확인하고 일부러 정하는 편이 낫습니다. RDB는 어느 시점의 스냅샷 파일입니다. AOF는 명령을 순서대로 적어 둔 로그입니다. 둘 다 켜면 복구에 쓸 자료는 늘지만, 디스크 쓰기가 다시 생깁니다. 파일을 매 요청마다 고치던 비용이 형태로만 바뀌는 셈입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;기록 방식&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;남는 것&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;세션에서&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;램만 사용합니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;재시작 시 다시 로그인합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;RDB&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;마지막 스냅샷입니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;스냅샷 이후에 바뀐 값은 파일에 없습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;AOF&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;명령 로그입니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;빈 구간은 짧지만 디스크에 명령을 남깁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램이 가득 차면 퇴거 정책이 작동합니다. 퇴거 정책은 메모리가 한계에 닿았을 때 어떤 키부터 지울지 정한 규칙입니다. 세션은 만료가 있는 키이므로 &lt;code&gt;volatile-lru&lt;/code&gt; 나 &lt;code&gt;volatile-ttl&lt;/code&gt; 처럼 만료 키부터 지우는 규칙을 많이 봅니다. &lt;code&gt;noeviction&lt;/code&gt; 이면 지우지 않고 쓰기가 실패해서, 새 로그인이 거절됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용량은 대략 동시 로그인 수에 값 크기를 곱한 크기입니다. 여유 없이 채우면 퇴거가 곧 로그아웃입니다. 인스턴스 가격은 리전마다 달라서 여기엔 적지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 복제 노드와 센티넬&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 하나는 그 프로세스의 램이 곧 저장 공간입니다. 기록 설정이 없으면 복사본이 없어서, 노드가 죽으면 그 안의 세션도 끝입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제를 붙이면 같은 데이터를 다른 노드가 따라옵니다. 쓰기를 받는 쪽은 프라이머리이고, 따라오는 쪽은 복제본입니다. 누가 승격할지 정하는 프로세스가 없으면, 프라이머리가 죽어도 역할이 자동으로 바뀌지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;센티넬은 프라이머리가 죽었는지 보고 복제본을 새 프라이머리로 올리는 감시 프로세스입니다. 데이터를 여러 기계로 나누는 기능은 아닙니다. 데이터 한 벌이 살아 있게 하는 장치입니다. 이렇게 죽은 쪽의 역할을 산 쪽으로 넘기는 일을 페일오버라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 읽기가 많습니다. 복제본에서 읽으면 프라이머리 부하는 줍니다. 대신 복제가 늦으면 방금 로그인한 키가 복제본에는 아직 없습니다. 로그인 직후 조회가 실패하면 읽기를 프라이머리로 고정합니다. 방금 쓴 값을 그 노드에서 바로 읽기 위해서입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 주소가 바뀌면 앱도 접속 주소를 바꿔야 할 때가 있습니다. 관리형 서비스는 이 주소 변경을 끝점에서 숨기는 경우가 많습니다. 직접 설치라면 센티넬이 합의에 쓰는 감시 수와 페일오버까지 기다리는 시간은 서버 담당이 정합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 클러스터와 샤드, 16384 슬롯&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터를 쓰는 이유는 램 한 대 또는 쓰기 처리 한 대를 넘기기 위해서입니다. 키 공간을 16384개의 해시 슬롯으로 나눕니다. 해시 슬롯은 키가 어느 조각에 들어갈지 정하는 번호입니다. 번호는 CRC16이라는 체크섬으로 키를 짧은 숫자로 만든 뒤 16384로 나눈 나머지입니다. 이 개수는 Redis 클러스터 명세에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샤드는 슬롯 범위를 맡은 프라이머리와, 그 프라이머리를 따라오는 복제본의 묶음입니다. 예를 들어 앞쪽 슬롯은 샤드 A, 나머지는 샤드 B입니다. 키는 자기 슬롯의 샤드로만 갑니다. 프로세스를 하나 더 띄워도 기존 키는 이동하지 않아서, 용량을 늘리려면 슬롯을 다른 샤드로 옮겨야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샤드 안에서 복제본이 슬롯을 이어 받아서, 클러스터에서는 센티넬을 같이 쓰지 않습니다. 다른 샤드의 데이터까지 한곳으로 모이지는 않습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;방식&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;나누는 것&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;세션에서 보는 점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;단일 노드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;나누지 않습니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;동시 접속이 램 한 대 안에 있으면 이것으로 충분합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;복제와 센티넬&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;같은 데이터 한 벌입니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;한 대가 죽어도 세션을 이어 가려면 복제본이 필요합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;클러스터 샤드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;16384 슬롯을 여러 프라이머리에 나눕니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;램이나 쓰기가 한 대를 넘을 때 슬롯을 나눕니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 명령이 샤드 두 대를 동시에 잠그지 않아서, 슬롯이 다른 키는 한 트랜잭션으로 묶이면 실패할 수 있습니다. 세션 키 하나만 읽고 쓰면 이 경우에 잘 안 걸립니다. 한 사용자의 키 여러 개를 항상 같은 샤드에 두려면 키에 같은 해시 태그 &lt;code&gt;{user42}&lt;/code&gt; 를 넣습니다. 태그가 같으면 슬롯도 같아서 같은 샤드에 들어갑니다. 태그를 넓게 쓰면 다시 한 샤드로 몰립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬롯 주인이 바뀌면 클라이언트는 잠깐 다른 노드로 가라는 응답을 받습니다. 앱 클라이언트가 클러스터 모드를 알아야 합니다. 단일 노드용 클라이언트로 붙이면 일부 키를 다른 샤드에서 찾지 못합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 백엔드가 서버 담당에게 요청할 항목&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 설치, 커널 설정, 백업 위치는 서버 담당 일입니다. 호스트를 띄우는 절차는 요청을 처리하는 코드와 별개입니다. 키 이름, 필드, TTL 초는 백엔드가 정합니다. 어떤 요청이 어떤 값을 읽고 몇 초 뒤에 지울지는 앱 코드에 있습니다. 저장 위치를 앱 디스크 밖으로 빼 달라는 말이 없으면, 파일 세션용 마운트가 해결책으로 돌아올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청서에 적을 내용은 아래 정도면 됩니다. 버전 숫자는 담당이 고른 배포판 기준으로 확정하고, 앱 설정에도 그 버전을 남깁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;예시로 적는 말&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;웹 세션만. 결제 데이터는 퇴거되면 안 되는 값이라 넣지 않음.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;엔진&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;Redis OSS 또는 Valkey. 앱 클라이언트가 붙는 프로토콜과 맞추기 위해서입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;형태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;단일 또는 클러스터. 예상 동시 접속이 램 한 대를 넘는지로 고릅니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;만료와 퇴거&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;키 TTL 사용. 메모리가 가득 차면 만료 키부터 삭제.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;영속화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;재로그인을 허용하면 세션만인 경우 영속화는 꺼도 됩니다. 켜면 RDB인지 AOF인지 적습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 28%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;네트워크&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 72%; text-align: left;&quot;&gt;앱 서버에서만 접근. 공인 IP는 두지 않음.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;받은 뒤에 백엔드가 맞출 것은 호스트와 포트, 인증 방식, 클러스터인지 단일인지입니다. 만료 시간은 Redis 서버가 아니라 앱이 키에 거는 TTL로 정해집니다. 프레임워크의 세션 유지 시간, Redis 키 TTL, 쿠키 만료 시간이 서로 다르면 가장 짧은 쪽이 먼저 로그아웃시킵니다. 쿠키는 30분인데 TTL을 5분으로 걸면 사용자는 5분 뒤에 풀립니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. Memcached와 Redis가 다른 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 램에 두고 앱 서버가 마운트 없이 붙는다는 점은 같습니다. 차이는 값의 종류와, 서버가 죽었을 때 누가 키를 다시 찾는지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Memcached는 문자열과 만료가 중심입니다. 복제와 슬롯 분할을 엔진이 맡지 않는 구성이 많아서, 클라이언트가 키를 서버 목록에 나누는 방식이 많습니다. 서버 한 대가 빠지면 그 구간의 키는 없고, 다음 로그인 때 다시 채웁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 해시와 집합이 있고, 복제와 클러스터가 엔진 안에 있습니다. 세션을 필드로 나눠 고치거나, 같은 저장소에 짧은 잠금을 얹을 수 있습니다. 그 대가로 센티넬, 샤드, 슬롯을 운영 개념에 넣어야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0; table-layout: fixed;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;비교&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;Memcached&lt;/th&gt;
&lt;th style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; background: #2a9d8f; color: white; text-align: center; font-weight: bold;&quot;&gt;Redis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;값&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;문자열 중심입니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;문자열, 해시, 리스트, 집합이 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;디스크 기록&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;기본적으로 없습니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;RDB, AOF를 켤 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;여러 대&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;클라이언트가 키를 나누는 구성이 많습니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;클러스터가 슬롯으로 나눕니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 32%; background: #f9f9f9; font-weight: bold; text-align: left;&quot;&gt;&lt;b&gt;세션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;키 하나에 문자열이면 충분합니다.&lt;/td&gt;
&lt;td style=&quot;word-break: keep-all; vertical-align: top; line-height: 1.55; padding: 10px 8px; border: 1px solid #ddd; width: 34%; text-align: left;&quot;&gt;필드 단위 수정이나 잠금을 같은 곳에 둘 때 해시가 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 Memcached로 세션이 유지되고 있다면, 문자열 키만으로 요구가 끝나는지 보면 됩니다. 필드 수정이나 잠금을 같은 저장소에 둘 계획이면 Redis나 Valkey 쪽 요청이 됩니다. 그 계획이 없으면 엔진만 하나 더 생깁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. Valkey와 Redis가 갈라진 지점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갈라진 이유는 기능 이름보다 라이선스와 프로젝트가 나뉜 시점입니다. 명령은 세션에서 거의 같습니다. &lt;code&gt;HSET&lt;/code&gt;, &lt;code&gt;EXPIRE&lt;/code&gt;, &lt;code&gt;TTL&lt;/code&gt; 은 양쪽에서 같은 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 3월 Redis 쪽은 이후 버전을 기존 BSD만으로 두지 않았습니다. 같은 시기 리눅스 재단과 기여자들이 Redis OSS 7.2를 포크해 Valkey를 만들었고, 라이선스는 BSD 3-Clause입니다. AWS 설명에서는 Redis OSS 7.2를 그 이전 계열의 마지막 완전 오픈소스 버전으로 두고, Redis 8.0부터 AGPLv3가 선택지에 들어갑니다. AGPLv3는 수정분을 공개하는 조건이 있어서 회사마다 채택 기준이 다릅니다. 라이선스 문구는 바뀔 수 있으니 도입 전에 조직의 기준과 운영 버전 릴리스 노트를 보면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에 문자열이나 해시만 쓰면 둘 다 됩니다. 차이가 드러나는 곳은 모듈입니다. Redis 8은 JSON이나 검색 같은 기능을 코어로 가져온 쪽이 있고, Valkey는 그 기능을 별도 모듈로 두는 구간이 있습니다. 세션 키만 쓰면 이 차이는 거의 보이지 않습니다. 검색 모듈을 이미 쓰고 있으면 그 모듈이 Valkey에 있는지만 보면 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  엔진을 적을 때&lt;/b&gt;&lt;br /&gt;요청서에는 Redis OSS인지 Valkey인지를 적습니다. 클라이언트가 기대하는 명령과 모듈이 엔진마다 다를 수 있습니다. 설치된 버전 번호는 앱 설정 옆에 남겨 두고, 업그레이드 때 릴리스 노트와 다시 비교하면 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. AWS ElastiCache에서 Redis와 Valkey&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ElastiCache는 Redis OSS, Valkey, Memcached를 관리형으로 띄우는 서비스입니다. 백업, 패치, 페일오버의 일부를 AWS가 맡아서, 직접 설치할 때 서버 담당이 보던 감시 프로세스를 서비스가 대신하는 구간이 있습니다. 앱은 여전히 끝점으로 붙습니다. 마운트는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성은 노드를 지정하는 방식과 서버리스가 있습니다. 노드 방식은 샤드 수와 인스턴스 크기를 사람이 고릅니다. 대신 비용 상한이 보입니다. 서버리스는 용량 조절을 서비스가 더 많이 맡아서, 트래픽이 낮과 밤으로 출렁여도 노드를 직접 늘리고 줄이지 않습니다. 어느 쪽이 싼지는 리전과 사용량에 따라 달라서, 콘솔 견적 없이 단정하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 10월에 확인한 AWS 문서 기준으로, ElastiCache for Valkey 서버리스 요금은 다른 지원 엔진보다 33% 낮고 노드 방식은 20% 낮다고 되어 있습니다. 기존 Redis OSS 예약 노드 할인을 Valkey에 이어 쓰는 경로도 있습니다. 요금 페이지가 바뀌면 그 페이지가 우선입니다. Redis OSS에서 Valkey로의 엔진 변경은 제자리 업그레이드로 다운타임 없이 가능하다는 안내가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 TLS, 클러스터 모드, 데이터베이스 번호 사용 여부는 스테이징에서 봅니다. Redis 클러스터는 0번 데이터베이스만 쓸 수 있어서, &lt;code&gt;SELECT 1&lt;/code&gt; 처럼 번호로 공간을 나누던 코드는 오류가 납니다. 클러스터는 번호가 아니라 슬롯으로 키를 나누기 때문입니다. Valkey는 9.0부터 클러스터에서도 여러 번호를 쓸 수 있게 바뀌었으니, 이 기능에 기대려면 ElastiCache에서 쓰는 엔진 버전이 지원하는지 먼저 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemoryDB는 같은 회사에서 재시작 뒤에도 값을 남기는 쪽을 더 강조하는 다른 서비스입니다. 세션은 사라져도 다시 로그인하면 되는 값이라, 남을 것을 전제로 한 서비스에 두지 않아도 됩니다. 남아야 하는 원장은 데이터베이스로 나누면 요청서의 용도가 세션으로 고정됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. 세션에 Redis를 쓰면 안 되는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인트 잔액, 결제 상태, 재고는 Redis에 두지 않습니다. 퇴거되거나 프로세스가 죽으면 값이 사라지거나 옛 스냅샷으로 돌아갑니다. 그 값은 데이터베이스 트랜잭션으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 램보다 크면 램 비용이 커집니다. 세션에 이미지 바이너리나 검색 결과 전체를 넣으면 키 하나가 커지고, 그 명령을 처리하는 동안 다른 로그인이 기다립니다. 세션에는 아이디와 짧은 권한만 두고, 큰 데이터는 저장소 주소만 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 로그인을 허용하지 않는 요건이면 램이 비는 전제와 맞지 않습니다. 마운트는 서버가 늘 때마다 장애 지점이 늘어서, 세션을 데이터베이스에 둘 때도 파일 마운트는 피합니다. Redis에 AOF와 복제를 켜도, 그 조합은 캐시보다 작은 데이터베이스에 가깝습니다. 디스크 기록과 페일오버를 서버 담당과 다시 맞춰야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 리전에서 같은 초에 같은 세션을 고치면 한 리전의 Redis로는 부족합니다. 리전 사이 복제는 지연이 있어서, 다른 리전은 방금 쓴 값을 아직 모를 수 있습니다. 세션을 리전 안에만 두고 로그인 토큰을 따로 설계하면 복제 지연을 세션 갱신에 태우지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Redis 세션은 서버를 재부팅하면 다 사라지나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 기록이 꺼져 있으면 값이 램에만 있어서 재부팅하면 사라집니다. 직접 설치한 Redis는 기본으로 RDB 스냅샷이 켜져 있어서 마지막 스냅샷까지는 남고, 그 뒤에 바뀐 값은 없을 수 있습니다. 관리형 서비스는 기본이 꺼진 경우가 많으니 설정을 확인합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;샤드와 노드는 같은 말인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 노드는 프로세스 한 개입니다. 샤드는 슬롯 범위를 맡은 프라이머리와 그 복제본의 묶음입니다. 노드를 추가해도 슬롯을 옮기기 전에는 기존 키가 새 노드로 가지 않습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Valkey로 바꾸면 세션 코드를 새로 짜야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시와 만료만 쓰는 세션은 명령이 같아서 그대로인 경우가 많습니다. 확인할 곳은 클라이언트가 붙는 엔진 이름, TLS, 클러스터 모드입니다. 모듈을 세션 밖에 쓰고 있었다면 그 모듈이 있는지만 보면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션은 디스크 공유가 아니라 만료 있는 키로 둡니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만료 있는 키로 옮기면, 서버를 늘릴 때 세션 폴더를 마운트하지 않아도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔진은 Redis OSS, Valkey, Memcached 중에서 고르면 됩니다. 문자열 키만이면 셋 다 마운트 없이 공유됩니다. 필드와 샤드까지 쓰면 Redis와 Valkey 쪽으로 요청이 모입니다. 요금과 라이선스는 앞에서 인용한 문서를 보고, 도입 달의 공식 문서와 한 번 더 비교하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1790988287957&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;쿠키&amp;middot;세션&amp;middot;JWT&amp;middot;OAuth 차이와 변천사 &amp;mdash; 패스키까지 한눈에&quot; data-og-description=&quot;&amp;quot;로그인하면 그 정보가 대체 어디에 저장되는 거예요?&amp;quot;&amp;quot;JWT 쓰면 세션 안 써도 된다던데, 무슨 뜻이죠?&amp;quot;&amp;quot;OAuth랑 그냥 로그인이랑 같은 거 아닌가요?&amp;quot;&amp;quot;요즘은 비밀번호 없이 로그인한다던데, 그게 패&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/auth-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/auth-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BeLyX/dJMb89yANch/p1AZwG3y55idB4Kk13bac1/img.png?width=800&amp;amp;height=597&amp;amp;face=498_91_564_163,https://scrap.kakaocdn.net/dn/jxlmB/dJMb82e9WZq/S8PksmnsxzK1wYLFMhlsZ1/img.png?width=800&amp;amp;height=597&amp;amp;face=498_91_564_163,https://scrap.kakaocdn.net/dn/QDmr3/dJMb86PoKGU/JqQ9YKAm2obUGu7KRSVtk0/img.png?width=1200&amp;amp;height=896&amp;amp;face=738_121_859_254&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/auth-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/auth-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BeLyX/dJMb89yANch/p1AZwG3y55idB4Kk13bac1/img.png?width=800&amp;amp;height=597&amp;amp;face=498_91_564_163,https://scrap.kakaocdn.net/dn/jxlmB/dJMb82e9WZq/S8PksmnsxzK1wYLFMhlsZ1/img.png?width=800&amp;amp;height=597&amp;amp;face=498_91_564_163,https://scrap.kakaocdn.net/dn/QDmr3/dJMb86PoKGU/JqQ9YKAm2obUGu7KRSVtk0/img.png?width=1200&amp;amp;height=896&amp;amp;face=738_121_859_254');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;쿠키&amp;middot;세션&amp;middot;JWT&amp;middot;OAuth 차이와 변천사 &amp;mdash; 패스키까지 한눈에&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;로그인하면 그 정보가 대체 어디에 저장되는 거예요?&quot;&quot;JWT 쓰면 세션 안 써도 된다던데, 무슨 뜻이죠?&quot;&quot;OAuth랑 그냥 로그인이랑 같은 거 아닌가요?&quot;&quot;요즘은 비밀번호 없이 로그인한다던데, 그게 패&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790988288112&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&quot; data-og-description=&quot;&amp;quot;Redis는 왜 그렇게 빠른가요?&amp;quot;&amp;quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&amp;quot;&amp;quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&amp;quot;&amp;quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠? &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8fI0G/dJMb896qTRX/q2KK7JcJKjW59CkIwejP31/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/uubCz/dJMb9b4eJ7R/Ph7jASKE7kBc7ezWBg0lqK/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/ov71m/dJMb9bwoXzw/pEfwThJL0ccLrxFbiJUXpk/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8fI0G/dJMb896qTRX/q2KK7JcJKjW59CkIwejP31/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/uubCz/dJMb9b4eJ7R/Ph7jASKE7kBc7ezWBg0lqK/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/ov71m/dJMb9bwoXzw/pEfwThJL0ccLrxFbiJUXpk/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359');&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Redis는 왜 그렇게 빠른가요?&quot;&quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&quot;&quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&quot;&quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790988288140&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&quot; data-og-description=&quot;Apache, Nginx, Apache Tomcat의 차이를 한 번에 정리합니다. 셋 다 &amp;quot;서버&amp;quot;라는 이름이 붙지만 Apache와 Nginx는 웹서버, Tomcat은 WAS(서블릿 컨테이너)로 역할이 다릅니다. 이 글은 1995년부터 2026년까지 웹서버&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmDyHC/dJMb8U9gOME/08JQ202KmoUgEWq8IVixUk/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/fkbP9/dJMb8VNTbhi/dgxtkrlwSaR7kduorelKC1/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/dhCeCW/dJMb9lMx8Zf/NXreIXayG11FVnqfiYp6iK/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmDyHC/dJMb8U9gOME/08JQ202KmoUgEWq8IVixUk/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/fkbP9/dJMb8VNTbhi/dgxtkrlwSaR7kduorelKC1/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/dhCeCW/dJMb9lMx8Zf/NXreIXayG11FVnqfiYp6iK/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325');&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Apache, Nginx, Apache Tomcat의 차이를 한 번에 정리합니다. 셋 다 &quot;서버&quot;라는 이름이 붙지만 Apache와 Nginx는 웹서버, Tomcat은 WAS(서블릿 컨테이너)로 역할이 다릅니다. 이 글은 1995년부터 2026년까지 웹서버&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>ElastiCache</category>
      <category>memcached</category>
      <category>redis</category>
      <category>Valkey</category>
      <category>백엔드</category>
      <category>샤딩</category>
      <category>세션</category>
      <category>세션스토어</category>
      <category>클러스터</category>
      <category>파일세션</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/175</guid>
      <comments>https://devwar.tistory.com/entry/redis-session-vs-file#entry175comment</comments>
      <pubDate>Sat, 3 Oct 2026 09:39:58 +0900</pubDate>
    </item>
    <item>
      <title>스타크래프트 AI 플루토 맵핵 논란, 진짜 문제는 맵핵이 아닙니다</title>
      <link>https://devwar.tistory.com/entry/starcraft-ai-pluto-maphack</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스타크래프트 AI 맵핵 논란의 진실.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuR9VK/dJMcaf2Ahiq/oBM4yELU6HUtpiL6CrJCNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuR9VK/dJMcaf2Ahiq/oBM4yELU6HUtpiL6CrJCNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuR9VK/dJMcaf2Ahiq/oBM4yELU6HUtpiL6CrJCNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuR9VK%2FdJMcaf2Ahiq%2FoBM4yELU6HUtpiL6CrJCNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;스타크래프트 AI 플루토 맵핵 논란, 진짜 문제는 맵핵이 아닙니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;스타크래프트 AI 맵핵 논란의 진실.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타크래프트 AI 플루토 맵핵 논란을 보면서 저는 조금 다른 지점이 궁금했습니다. 맵핵을 썼느냐보다, 이 AI가 애초에 게임을 '보는' 방식이 사람과 전혀 다르다는 점이요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;플루토 진짜 맵핵 쓰는 거 맞아?&quot;&lt;br /&gt;&quot;공격 찍자마자 그 유닛만 빼는 게 말이 돼?&quot;&lt;br /&gt;&quot;AI한테 지는 게 실력 차이일까?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경기 영상을 보다 보면 산개 컨트롤에서 묘한 느낌이 듭니다. 눈이 좋아서 피하는 게 아니라, 정답지를 보고 피하는 것처럼 보이거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 설치 방법이 아니라 플루토가 정보를 받는 방식과 공정성 문제를 다룹니다. 스타를 좋아하는 개발자든 아니든 읽기 쉽게 풀어보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스타크래프트 AI 플루토는 어떤 AI인가&lt;/li&gt;
&lt;li&gt;플루토 맵핵 논란, 원본과 개조판은 다르다&lt;/li&gt;
&lt;li&gt;플루토가 맵핵처럼 보인 이유, 맵 전체 자원 정보&lt;/li&gt;
&lt;li&gt;플루토 산개 컨트롤의 정체, 상대 타겟 데이터&lt;/li&gt;
&lt;li&gt;화면을 보는 AI와 데이터를 읽는 AI의 차이&lt;/li&gt;
&lt;li&gt;플루토 APM이 비정상적으로 높아 보이는 이유&lt;/li&gt;
&lt;li&gt;알파스타는 왜 카메라 제약을 걸었을까&lt;/li&gt;
&lt;li&gt;가위바위보 비유로 본 AI 공정성 논란&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스타크래프트 AI 플루토는 어떤 AI인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플루토(Pluto)는 스타크래프트: 브루드워를 플레이하는 AI입니다. 신경망 하나가 자원 운영부터 유닛 컨트롤까지 게임 전체를 맡습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 방식은 자기대전 강화학습입니다. 쉽게 말해 자기 자신과 수없이 붙으면서 이기는 방법을 스스로 찾아가는 방식이에요. 미리 짜둔 빌드 스크립트는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임과는 BWAPI로 연결됩니다. BWAPI는 브루드워 게임 상태를 프로그램이 읽고 명령을 내릴 수 있게 해주는 오픈소스 인터페이스입니다. 이 부분이 뒤에서 말할 논란의 핵심이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 10월 깃허브 README 기준으로 브루드워 1.16.1과 BWAPI 4.4.0 환경에서 1대1로 동작하는 바이너리 베타 상태입니다. 실행 사양은 릴리스마다 달라질 수 있으니 최신 README를 따로 확인하시는 게 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 플루토 맵핵 논란, 원본과 개조판은 다르다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 짚어야 할 게 있습니다. 논란이 된 래더 플루토는 원작자가 배포한 원본이 아니라, 누군가 리마스터용으로 무단 개조한 버전입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커뮤니티에서는 이 개조판을 ^333^ 버전이라고 부릅니다. 원작자 측 설명을 정리하면 차이는 아래와 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;원본 플루토&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;래더 개조판&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;실행 환경&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;브루드워 1.16.1 + BWAPI&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;리마스터에서 돌도록 무단 개조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;상대 정보&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;전장의 안개 기준&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;메모리 정보를 거르지 않고 받음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;래더 사용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자 의도 아님&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자 의사에 반한 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본은 맵핵 없이 학습됐다고 합니다. 그래서 개조판에서 들어오는 정보가 오히려 판단을 흐릴 수 있다는 얘기도 나왔어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 &quot;플루토 개발자가 맵핵을 넣었다&quot;는 말은 정확하지 않습니다. 문제는 AI 자체보다 그걸 가져다 고친 쪽에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 플루토가 맵핵처럼 보인 이유, 맵 전체 자원 정보&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터는 제 해석이 섞여 있습니다. 개조판 내부 코드는 공개되지 않았기 때문에 단정하지 않고 말씀드릴게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람은 정찰로 상대 빌드를 추측합니다. 일꾼 수, 건물 위치, 가스 채취 여부를 보고 &quot;이쯤이면 뭘 올렸겠구나&quot; 하고 짐작하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 개조판처럼 메모리 정보를 거르지 않고 받는다면 얘기가 달라집니다. 제가 보기엔 맵 전체의 미네랄 소모량이 실시간으로 들어오는 셈이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대가 미네랄을 갑자기 크게 쓰면 뭔가 지었다는 뜻입니다. 화면으로 확인하지 않아도 숫자만 보고 대응할 수 있는 거죠.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  맵핵의 정체에 대한 제 해석&lt;/b&gt;&lt;br /&gt;시야를 몰래 밝히는 고전적인 맵핵이라기보다, 원래 화면에 없는 숫자를 직접 받아보는 구조에 가깝다고 봅니다. 정찰 없이 빌드를 맞춰온다는 반응이 나온 것도 이 때문이라고 생각해요.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 플루토 산개 컨트롤의 정체, 상대 타겟 데이터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 더 흥미롭게 본 건 산개 컨트롤입니다. 상대가 공격을 찍으면 정확히 그 유닛만 빠지는 장면이 반복됐거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이라면 상대 유닛의 움직임이나 공격 모션을 보고 반응합니다. 그런데 프로그램은 &quot;이 유닛이 지금 누구를 노리고 있다&quot;는 값을 바로 읽을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 BWAPI에서 이런 정보를 어떻게 다룰 수 있는지 보여주는 동작 원리 예시입니다. 플루토 내부 코드가 아니고 실행 확인도 하지 않았습니다.&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// 동작 원리 예시 (BWAPI 4.4 API 이름 기준, 실행 미확인)
for (auto&amp;amp; enemy : BWAPI::Broodwar-&amp;gt;enemy()-&amp;gt;getUnits()) {
  BWAPI::Unit target = enemy-&amp;gt;getTarget();
  if (!target) continue;

  // 상대 유닛이 노리는 대상이 내 유닛이면
  if (target-&amp;gt;getPlayer() == BWAPI::Broodwar-&amp;gt;self()) {
    // 그 유닛만 골라서 뒤로 뺀다
    target-&amp;gt;move(target-&amp;gt;getPosition() + BWAPI::Position(-64, 0));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;code&gt;getTarget()&lt;/code&gt; 한 줄입니다. 화면을 보고 추측하는 게 아니라, 상대가 클릭한 결과를 데이터로 받는 거예요. 실제 회피에는 방향 계산이 더 필요하지만 원리는 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 정보가 어떤 조건에서 열리는지는 BWAPI 설정과 버전에 따라 다릅니다. 다만 사람과 입력 자체가 다르다는 점은 분명해 보입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 화면을 보는 AI와 데이터를 읽는 AI의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 플루토는 눈으로 보고 화면을 제어하는 방식이 아닙니다. 좌표와 유저가 클릭한 데이터를 기반으로 움직이는 구조예요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;화면을 보는 AI&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;데이터를 읽는 AI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;화면 픽셀&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;좌표, 상태값, 명령 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;상대 공격 인지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;움직임을 보고 추측&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;타겟 값을 즉시 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;정보 한계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;시야와 카메라 범위&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;API가 주는 만큼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람과 비교하려면 왼쪽처럼 같은 화면을 보고 판단해야 합니다. 오른쪽은 같은 게임을 하지만 사실상 다른 입력 장치를 쓰고 있는 셈이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 입장에서 보면 당연한 설계이기도 합니다. 화면 인식은 비싸고 느리지만, API 값은 정확하고 빠르니까요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 플루토 APM이 비정상적으로 높아 보이는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플루토 경기에서 APM이 수천까지 찍히는 장면도 논란이 됐습니다. 그런데 판단 횟수 자체는 생각보다 많지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에 따르면 모델은 6프레임마다 한 번 판단합니다. 브루드워 가장 빠름 속도가 초당 약 24프레임이니, 1초에 4번 정도 결정하는 셈입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 한 번 판단할 때 여러 유닛에 명령을 동시에 넣습니다. 커뮤니티 분석으로는 부대지정 대신 유닛 하나하나에 명령을 넣는 방식이라 APM 숫자가 크게 튄다고 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 APM만으로는 공정성을 따지기 어렵습니다. 진짜 차이는 명령 속도보다 어떤 정보를 보고 명령하느냐에 있다고 생각합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 알파스타는 왜 카메라 제약을 걸었을까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논쟁은 처음이 아닙니다. 2019년 딥마인드의 스타크래프트2 AI 알파스타도 비슷한 비판을 받았어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 시연 버전은 맵 전체를 한 번에 보는 방식이라 &quot;사람과 조건이 다르다&quot;는 지적이 나왔습니다. 이후에는 사람처럼 카메라 화면 안에서만 행동하도록 제약을 걸었고, APM 제한도 함께 뒀습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 방식도 조금 다릅니다. 알파스타는 프로 리플레이를 따라 배운 뒤 자기대전을 했고, 플루토는 자기대전만으로 학습했다고 알려져 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  시대에 따라 달라질 수 있는 부분&lt;/b&gt;&lt;br /&gt;2026년 시점 기준의 이야기입니다. 화면 인식 비용이 더 내려가면 &quot;공정한 AI&quot;의 기준도 지금과 달라질 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 가위바위보 비유로 본 AI 공정성 논란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 지금의 플루토도 분명 AI가 맞다고 봅니다. 신경망 하나로 운영 전체를 배운 건 기술적으로 대단한 일이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 궁극적인 해답은 아니라고 생각합니다. 사람과 겨루는 AI라면 화면을 보고 판단해서 작동하는 쪽이 맞는 방향이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터와 클릭으로 움직이는 AI를 사람과 같은 선에 놓고 실력 논란을 벌이는 게 맞나 싶습니다. 비유하자면 가위바위보를 하는데 상대가 가위를 낼 걸 미리 알고 바위를 내는 느낌이거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그건 이긴 게 아니라 정답을 확인한 겁니다. 그래서 &quot;AI가 프로를 이겼다&quot;는 문장도 조건을 같이 적지 않으면 의미가 흐려진다고 봐요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실하진 않지만, 다음 논쟁은 화면만 보는 AI가 나왔을 때 시작될 것 같습니다. 그때가 진짜 실력 비교가 아닐까 싶어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플루토 원본도 맵핵을 쓰나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원작자 측 설명으로는 아닙니다. 원본은 전장의 안개 기준으로 학습됐고, 논란은 리마스터용 무단 개조판에서 나왔습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리마스터 래더에서 플루토를 써도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원작자가 허락한 사용이 아닙니다. 스타크래프트 AI 커뮤니티에서도 이런 래더 사용을 용인하지 않는다는 입장이 나왔습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;화면만 보고 판단하는 AI는 지금 만들 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시도는 있었지만 쉽지 않습니다. 화면 인식은 연산 비용과 지연이 커서, 데이터를 바로 읽는 방식보다 훨씬 어렵습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;플루토가 보여준 건 실력보다 입력 방식의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플루토 맵핵 논란을 걷어내고 보면 남는 건 결국 입력 방식의 차이입니다. 사람은 화면을 보고, 플루토는 데이터를 읽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저는 이번 논란을 &quot;AI가 사람을 넘었다&quot;보다 &quot;AI와 사람은 아직 같은 게임을 하고 있지 않다&quot;로 읽는 게 맞다고 생각합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1790911230215&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&quot; data-og-description=&quot;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ciVLwd/dJMb8RSeVy9/M2Ksnw7dZkFdtDGA68hT4K/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/cCDNMc/dJMb9cB4t6k/ROd1oq0FlUE5pyH8zZ2Bx1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/bjB3L4/dJMb9kUpwvE/HwPe2nOGuF4jgWvIuP8mI0/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ciVLwd/dJMb8RSeVy9/M2Ksnw7dZkFdtDGA68hT4K/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/cCDNMc/dJMb9cB4t6k/ROd1oq0FlUE5pyH8zZ2Bx1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/bjB3L4/dJMb9kUpwvE/HwPe2nOGuF4jgWvIuP8mI0/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263');&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790911223570&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;AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감&quot; data-og-description=&quot;AI 개발 트렌드가 급격하게 변화하면서 개발자가 직접 소스 코드를 작성하는 방식 대신 정책서와 가이드 문서 기반의 스펙 주도 개발(SDD)이 실무의 핵심으로 자리 잡고 있습니다.&amp;quot;요즘 진짜 코드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TNmb5/dJMb84qvnMi/NNC8ZCnW5Vqtazq0SuK8j0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/dLqD9A/dJMb81gfAC4/Umzy0ZVRUWt9eMC8IH6Mz1/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/AjSpr/dJMb84YlFTB/s8su1XtXXCNh4GS2bM5NSk/img.png?width=1200&amp;amp;height=911&amp;amp;face=0_0_1200_911&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TNmb5/dJMb84qvnMi/NNC8ZCnW5Vqtazq0SuK8j0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/dLqD9A/dJMb81gfAC4/Umzy0ZVRUWt9eMC8IH6Mz1/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/AjSpr/dJMb84YlFTB/s8su1XtXXCNh4GS2bM5NSk/img.png?width=1200&amp;amp;height=911&amp;amp;face=0_0_1200_911');&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;AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 개발 트렌드가 급격하게 변화하면서 개발자가 직접 소스 코드를 작성하는 방식 대신 정책서와 가이드 문서 기반의 스펙 주도 개발(SDD)이 실무의 핵심으로 자리 잡고 있습니다.&quot;요즘 진짜 코드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790911219275&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buBoq8/dJMb9hDnEao/qyMkUYyOdMr8i3ABZBfCT1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/ccnoQS/dJMb8Rkphf4/jHV0EzvUxJimwN5Ig6dmO0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/UdXeC/dJMb8XSs1rw/Ql2yqixFXjeu522cyjSaD0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buBoq8/dJMb9hDnEao/qyMkUYyOdMr8i3ABZBfCT1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/ccnoQS/dJMb8Rkphf4/jHV0EzvUxJimwN5Ig6dmO0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/UdXeC/dJMb8XSs1rw/Ql2yqixFXjeu522cyjSaD0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247');&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI공정성</category>
      <category>BWAPI</category>
      <category>Pluto</category>
      <category>강화학습</category>
      <category>게임AI</category>
      <category>브루드워</category>
      <category>스타크래프트AI</category>
      <category>알파스타</category>
      <category>플루토</category>
      <category>플루토맵핵</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/174</guid>
      <comments>https://devwar.tistory.com/entry/starcraft-ai-pluto-maphack#entry174comment</comments>
      <pubDate>Fri, 2 Oct 2026 12:24:23 +0900</pubDate>
    </item>
    <item>
      <title>제미나이 4 아르곤, 아직 아무나 못 쓰는 이유와 출시일은 언제?</title>
      <link>https://devwar.tistory.com/entry/gemini-4-argon-release-summary</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini 4 출시일과 아르곤 이야기.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V8COs/dJMcabeFlkc/0FqXUrzHUOx0XXQrKKUrM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V8COs/dJMcabeFlkc/0FqXUrzHUOx0XXQrKKUrM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V8COs/dJMcabeFlkc/0FqXUrzHUOx0XXQrKKUrM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV8COs%2FdJMcabeFlkc%2F0FqXUrzHUOx0XXQrKKUrM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;제미나이 4 아르곤, 아직 아무나 못 쓰는 이유와 출시일은 언제?&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;Gemini 4 출시일과 아르곤 이야기.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이 4 아르곤(Gemini 4 Argon)은 구글이 2026년 9월 30일 공개한 새 AI 모델입니다. 구글 AI 중 가장 똑똑한 모델이지만, 아직은 아무나 쓸 수 없어요. 무엇이 좋아졌고 언제 쓸 수 있는지 쉽게 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;제미나이 4 아르곤, 지금 쓸 수 있나요?&quot;&lt;br /&gt;&quot;가격이 2달러라던데 진짜예요?&quot;&lt;br /&gt;&quot;뭐가 좋아졌어요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  핵심만 먼저&lt;/b&gt;&lt;br /&gt;- 구글의 새 최고급 AI 모델입니다.&lt;br /&gt;- 한 번에 쓸 수 있는 답 길이가 약 16배 늘었습니다.&lt;br /&gt;- 코딩, 업무 자동화, 보안 분야에서 높은 점수를 받았습니다.&lt;br /&gt;- 지금은 일부 보안 기관만 쓸 수 있습니다.&lt;br /&gt;- 2달러 가격은 할인가이고, 나중에 두 배가 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 2026년 10월 1일 기준이며, 구글 공식 발표를 바탕으로 썼습니다. 성능 점수는 구글이 직접 발표한 수치예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background: #f5f5f5; padding: 12px 15px; border-left: 4px solid #999;&quot; data-ke-size=&quot;size16&quot;&gt;2026년 10월 14일 &lt;span style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;시점 기준&lt;span&gt; &lt;/span&gt;&lt;/span&gt;일반에 공개된 구글 제미나이 4 아르곤 공개 소식은 아래 글에 자세히 정리해 두었습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1791946974643&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;제미나이 4 아르곤 일반인에게 오늘부터 부분적으로 풀렸습니다&quot; data-og-description=&quot;제미나이 4 아르곤이 일반인에게 오늘부터 풀렸습니다. 한국 시간 10월 14일 새벽부터 제미나이 앱에서 선택할 수 있습니다. 다만 &amp;quot;일반인&amp;quot;의 범위는 확인하고 가셔야 합니다. 이번에 열린 대상은&quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pSRhC/dJMb8TCyurS/y4SYCajoYv2naBKcpA3DAK/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/OLqAn/dJMb8WeYjXW/wKzeIqJHXhpMuhmK9xMh11/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/Sz9UG/dJMb82fbhWc/rZzRTcCPcBdyZvZzNQlDY0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=947_117_1132_318&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pSRhC/dJMb8TCyurS/y4SYCajoYv2naBKcpA3DAK/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/OLqAn/dJMb8WeYjXW/wKzeIqJHXhpMuhmK9xMh11/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/Sz9UG/dJMb82fbhWc/rZzRTcCPcBdyZvZzNQlDY0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=947_117_1132_318');&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;제미나이 4 아르곤 일반인에게 오늘부터 부분적으로 풀렸습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 4 아르곤이 일반인에게 오늘부터 풀렸습니다. 한국 시간 10월 14일 새벽부터 제미나이 앱에서 선택할 수 있습니다. 다만 &quot;일반인&quot;의 범위는 확인하고 가셔야 합니다. 이번에 열린 대상은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;제미나이 4 아르곤이 뭔가요&lt;/li&gt;
&lt;li&gt;제미나이 4 아르곤 출시일, 개인은 언제 쓸 수 있나?&lt;/li&gt;
&lt;li&gt;제미나이 4 아르곤 가격&lt;/li&gt;
&lt;li&gt;답 길이가 16배 늘었다&lt;/li&gt;
&lt;li&gt;제미나이 4 아르곤 성능 점수&lt;/li&gt;
&lt;li&gt;구글이 먼저 써 본 결과&lt;/li&gt;
&lt;li&gt;보안에 특히 강한 이유&lt;/li&gt;
&lt;li&gt;아쉬운 점&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제미나이 4 아르곤이 뭔가요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아르곤은 구글 제미나이의 새 최고급 모델입니다. Gemini 3 이후 약 10개월 만에 나온 새 세대예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 구글은 가볍고 저렴한 모델 위주로 내놨습니다. 아르곤은 오랜만에 나온 본격적인 고성능 모델이라 관심이 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 내세운 강점은 세 가지입니다. 개발 업무, 법률&amp;middot;금융 같은 전문 업무, 그리고 보안이에요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 제미나이 4 아르곤 출시일, 개인은 언제 쓸 수 있나?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직은 쓸 수 없습니다. 구글은 순서를 정해 조금씩 풀고 있어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금은 구글이 고른 보안 기관만 쓸 수 있습니다.&lt;/li&gt;
&lt;li&gt;다음은 개발자용 유료 서비스(API) 사용자와 최고급 요금제인 Google AI Ultra 구독자입니다.&lt;/li&gt;
&lt;li&gt;그다음에 일반 사용자에게 열립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인이 가장 빨리 쓰는 방법은 두 가지입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;방법&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;이런 분께 맞아요&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발자용 유료 서비스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 프로그램에 직접 붙여 쓸 분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Google AI Ultra 구독&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;제미나이 앱에서 채팅으로 쓸 분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자용 유료 서비스는 개인도 쓸 수 있습니다. Google AI Studio에 결제 수단만 등록하면 돼요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ultra는 지금 결제해도 바로 아르곤이 열리지 않습니다. 공개 발표가 난 뒤 가입해도 늦지 않아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 날짜는 구글도 아직 밝히지 않았습니다. 제 개인적인 예상으로는 유료 사용자는 빠르면 몇 주, 길면 2~3개월 안이고, 무료 사용자는 그보다 늦을 것 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  열렸는지 확인하는 법&lt;/b&gt;&lt;br /&gt;Google AI Studio의 모델 목록을 보세요. 지금은 아르곤이 없는데, 목록에 뜨는 날이 쓸 수 있는 날입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 제미나이 4 아르곤 가격&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;아르곤은 2달러&quot;라는 말이 많이 돌았습니다. 맞지만 이건 출시 할인가예요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;입력&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;출력&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;지금 (할인가)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;할인 끝난 뒤&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격은 100만 토큰 기준입니다. 토큰은 AI가 글을 세는 단위예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할인이 끝나면 가격이 두 배가 됩니다. 언제 끝나는지는 아직 발표되지 않았어요. 비용을 계산할 때는 할인 끝난 뒤 가격으로 잡아 두는 게 안전합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 답 길이가 16배 늘었다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 변화는 한 번에 쓸 수 있는 답의 길이입니다. 이전보다 약 16배 늘었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 긴 보고서나 큰 프로그램을 한 번에 끝낼 수 있습니다. 중간에 끊겼다가 다시 이어 쓰는 일이 줄어드는 거죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 제미나이 4 아르곤 성능 점수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 발표한 주요 점수입니다. 무엇을 보는 시험인지 쉽게 적었어요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;무엇을 보는 시험&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;점수&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;긴 개발 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;77.9%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최고 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;업무 자동화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;51.3%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;긴 영상 이해&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;91.7%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최고 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보안 구멍 고치기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;68%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;공동 1위&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 이름은 순서대로 DeepSWE v1.1, AutomationBench, LVBench, CWE-bench v1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융&amp;middot;법률&amp;middot;세무 업무를 종합 평가하는 Vals Index에서도 1위를 했어요. 개발 과제를 스스로 푸는 외부 시험에서는 57%를 기록했는데, 그동안 제미나이가 약했던 분야라 큰 발전으로 평가받습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 구글이 먼저 써 본 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아르곤은 이미 구글 직원 수천 명이 업무에 쓰고 있습니다. 구글이 공개한 사례는 이렇습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터센터 메모리를 스스로 분석해서 300TiB 넘게 아꼈습니다.&lt;/li&gt;
&lt;li&gt;양자 컴퓨터 연구에서 기존 방법보다 40% 나은 답을 몇 분 만에 찾았습니다.&lt;/li&gt;
&lt;li&gt;영상 재생 프로그램 코드 3만 2천 줄을 새로 짜서 2.7배 빠르게 만들었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 큰 코드 변경은 아직 검사 중이라, 바로 실제 서비스에 쓴 건 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 보안에 특히 강한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글은 아르곤을 보안 방어에 강하게 훈련시켰습니다. 프로그램의 보안 구멍을 스스로 찾고 고칠 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 기업 Wiz는 아르곤으로 전 세계 병원이 쓰는 프로그램의 심각한 구멍을 찾아냈습니다. 이전 AI들은 놓쳤던 문제였다고 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 기관에 먼저 푼 이유도 여기 있습니다. 해커보다 방어하는 쪽이 먼저 좋은 도구를 갖게 하려는 거죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 아쉬운 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 점만 있는 건 아닙니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 평가에서 정확도는 이전 제미나이보다 조금 떨어졌습니다.&lt;/li&gt;
&lt;li&gt;구글 안에서도 실제 업무 성능을 의심하는 직원이 있다는 보도가 나왔습니다.&lt;/li&gt;
&lt;li&gt;점수 대부분이 구글 자체 발표라, 다른 곳의 검증은 이제 시작입니다.&lt;/li&gt;
&lt;li&gt;할인이 끝나면 가격이 두 배가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 진짜 실력은 직접 써 볼 수 있게 된 뒤에 알 수 있을 것 같습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제미나이 4 아르곤은 무료로 쓸 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 무료로 쓰는 방법이 없습니다. 유료 사용자에게 먼저 열리고, 무료는 그보다 늦을 것 같아요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제미나이 4 아르곤은 언제 쓸 수 있나요?&lt;/h3&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  결론&lt;/b&gt;&lt;br /&gt;정확한 날짜는 없습니다. 개인이라면 개발자용 유료 서비스나 Ultra 구독이 가장 빠르고, 제 예상으로는 빠르면 몇 주, 길면 2~3개월입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기대는 크지만 아직은 기다릴 때&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이 4 아르곤은 개발, 전문 업무, 보안에서 높은 점수를 받은 구글의 새 최고급 모델입니다. 답 길이를 16배 늘린 것도 큰 변화예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 아직 개인은 쓸 수 없고, 할인이 끝나면 가격도 두 배가 됩니다. 급하게 결제하기보다 공개 소식을 기다리는 게 좋습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1791940348998&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;제미나이 4 아르곤 일반인에게 오늘부터 부분적으로 풀렸습니다&quot; data-og-description=&quot;제미나이 4 아르곤이 일반인에게 오늘부터 풀렸습니다. 한국 시간 10월 14일 새벽부터 제미나이 앱에서 선택할 수 있습니다. 다만 &amp;quot;일반인&amp;quot;의 범위는 확인하고 가셔야 합니다. 이번에 열린 대상은&quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pSRhC/dJMb8TCyurS/y4SYCajoYv2naBKcpA3DAK/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/OLqAn/dJMb8WeYjXW/wKzeIqJHXhpMuhmK9xMh11/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/Sz9UG/dJMb82fbhWc/rZzRTcCPcBdyZvZzNQlDY0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=947_117_1132_318&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/gemini-4-argon-release&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pSRhC/dJMb8TCyurS/y4SYCajoYv2naBKcpA3DAK/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/OLqAn/dJMb8WeYjXW/wKzeIqJHXhpMuhmK9xMh11/img.png?width=800&amp;amp;height=600&amp;amp;face=525_70_621_175,https://scrap.kakaocdn.net/dn/Sz9UG/dJMb82fbhWc/rZzRTcCPcBdyZvZzNQlDY0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=947_117_1132_318');&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;제미나이 4 아르곤 일반인에게 오늘부터 부분적으로 풀렸습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 4 아르곤이 일반인에게 오늘부터 풀렸습니다. 한국 시간 10월 14일 새벽부터 제미나이 앱에서 선택할 수 있습니다. 다만 &quot;일반인&quot;의 범위는 확인하고 가셔야 합니다. 이번에 열린 대상은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790844088605&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&quot; data-og-description=&quot;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Gy5eF/dJMb9dHKNLt/a2Yp527g3VMyTGpXFwwo51/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/dFaJcR/dJMb9kUpqs9/Kr1Jl4mz0aJudQKMAZ4KW1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/ckxrNK/dJMb9jgT8At/iAQTaNwPqTmpGjQlwqGiy1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Gy5eF/dJMb9dHKNLt/a2Yp527g3VMyTGpXFwwo51/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/dFaJcR/dJMb9kUpqs9/Kr1Jl4mz0aJudQKMAZ4KW1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/ckxrNK/dJMb9jgT8At/iAQTaNwPqTmpGjQlwqGiy1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280');&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790844076058&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&quot; data-og-description=&quot;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &amp;quot;가장 똑똑한 일꾼 모델&amp;quot;이라고 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxfLB5/dJMb9kmyQ7V/pCGKlCxpiU6UBx4IZBtvw1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bgtrEZ/dJMb9g5xnMn/ijuaHDsKO3a6JPMouqOn50/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/cwWjJd/dJMb9bwoJ7n/GViBfrFmeTcdRlJKLTPVc1/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxfLB5/dJMb9kmyQ7V/pCGKlCxpiU6UBx4IZBtvw1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bgtrEZ/dJMb9g5xnMn/ijuaHDsKO3a6JPMouqOn50/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/cwWjJd/dJMb9bwoJ7n/GViBfrFmeTcdRlJKLTPVc1/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309');&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &quot;가장 똑똑한 일꾼 모델&quot;이라고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790844043310&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&quot; data-og-description=&quot;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에 &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjlixv/dJMb9kUpqsM/8KWk5m5kHl6JEXSyFyDDF0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/HSvGi/dJMb9kmyQ7m/SVdTKGa1ncrjPcUY9jQgy0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/cdmd9l/dJMb8XkCzFR/oYOdx8VeHRktfKZrkN0ACK/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjlixv/dJMb9kUpqsM/8KWk5m5kHl6JEXSyFyDDF0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/HSvGi/dJMb9kmyQ7m/SVdTKGa1ncrjPcUY9jQgy0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/cdmd9l/dJMb8XkCzFR/oYOdx8VeHRktfKZrkN0ACK/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367');&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI 모델 출시</category>
      <category>AI 보안</category>
      <category>Gemini 4 Argon</category>
      <category>구글 ai</category>
      <category>구글 제미나이</category>
      <category>생성형 AI</category>
      <category>제미나이 4</category>
      <category>제미나이 4 아르곤</category>
      <category>제미나이 가격</category>
      <category>제미나이 출시일</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/173</guid>
      <comments>https://devwar.tistory.com/entry/gemini-4-argon-release-summary#entry173comment</comments>
      <pubDate>Thu, 1 Oct 2026 17:41:36 +0900</pubDate>
    </item>
    <item>
      <title>라라벨이 풀스택 철학과 자동 업그레이드를 고집하는 이유</title>
      <link>https://devwar.tistory.com/entry/laravel-history-fullstack</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CzDXl.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZKMpE/dJMcag7DTDG/6ioIT2cq9iPc1AMMsXIOLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZKMpE/dJMcag7DTDG/6ioIT2cq9iPc1AMMsXIOLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZKMpE/dJMcag7DTDG/6ioIT2cq9iPc1AMMsXIOLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZKMpE%2FdJMcag7DTDG%2F6ioIT2cq9iPc1AMMsXIOLk%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; alt=&quot;라라벨이 풀스택 철학과 자동 업그레이드를 고집하는 이유&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;CzDXl.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 프레임워크 탄생과 철학을 살펴보면 웹 개발자가 마주했던 반복적인 고통을 어떻게 우아하게 해결하려 했는지 명확하게 알 수 있습니다. 특히 라라벨 6버전부터 정착된 버전 관리 철학은 개발자가 프레임워크 유지보수 대신 비즈니스 로직에 몰입할 수 있도록 돕는 전환점이 되었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;PHP로 웹을 만들 때 왜 매번 로그인과 라우팅을 바닥부터 짜야 할까?&quot;&lt;br /&gt;&quot;라라벨은 왜 다른 프레임워크보다 풀스택 도구를 고집할까?&quot;&lt;br /&gt;&quot;프레임워크 버전이 올라갈 때마다 마이그레이션 부담을 줄이는 방법은 없을까?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발을 진행하다 보면 도구가 개발자의 생산성을 돕는 것이 아니라, 도구 자체를 관리하느라 진이 빠지는 상황을 종종 마주합니다. 과거의 PHP 생태계 역시 파편화된 라이브러리와 복잡한 설정 탓에 본질적인 개발에 집중하기 어려웠던 시기가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 라라벨이 탄생하게 된 배경과 개발자 경험을 최우선으로 둔 철학, 그리고 풀스택 프레임워크로서 갖는 가치를 살펴봅니다. 아울러 라라벨 6버전 이후 구축된 버전 업그레이드 생태계가 왜 개발자들에게 큰 만족감을 주는지 정리해 드립니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;과거 PHP 개발 환경과 프레임워크의 태동&lt;/li&gt;
&lt;li&gt;테일러 오트웰의 고민과 라라벨 프레임워크의 탄생&lt;/li&gt;
&lt;li&gt;모든 것을 품은 풀스택 프레임워크의 정의&lt;/li&gt;
&lt;li&gt;루비 온 레일즈&amp;middot;장고와 닮은 라라벨의 생태계&lt;/li&gt;
&lt;li&gt;개발자의 행복을 최우선으로 두는 우아한 문법&lt;/li&gt;
&lt;li&gt;라라벨 6 이전의 파편화와 버전업의 고통&lt;/li&gt;
&lt;li&gt;라라벨 6 시맨틱 버저닝 도입이 바꾼 개발 문화&lt;/li&gt;
&lt;li&gt;&quot;버전업은 도구가 알아서&quot;: Laravel Shift와 자동화 철학&lt;/li&gt;
&lt;li&gt;비즈니스 로직에만 집중하게 만드는 프레임워크의 힘&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 과거 PHP 개발 환경과 프레임워크의 태동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2000년대 후반부터 2010년대 초반까지 PHP는 웹 시장의 절대적인 강자였습니다. 하지만 당시의 개발 환경은 표준화된 규격이 부족하여 개발자마다 작성하는 코드의 격차가 매우 심했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 널리 쓰이던 프레임워크로 코드이그나이터(CodeIgniter)가 있었습니다. 가볍고 빨랐지만 현대적인 객체지향 패턴이나 사용자 인증, 패키지 의존성 관리 같은 기능이 기본적으로 부족했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자들은 프로젝트를 시작할 때마다 인증, 템플릿 엔진, 데이터베이스 매핑 코드를 직접 만들거나 불안정한 외부 라이브러리를 일일이 조합해야 했습니다. 자연스럽게 프레임워크의 현대화에 대한 갈증이 커져가던 시기였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 테일러 오트웰의 고민과 라라벨 프레임워크의 탄생&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨의 창시자인 테일러 오트웰(Taylor Otwell)은 2011년 코드이그나이터를 사용해 웹 애플리케이션을 개발하던 중 깊은 아쉬움을 느꼈습니다. 기본적으로 제공되어야 할 인증(Auth) 기능조차 제대로 마련되어 있지 않았기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 개발자가 애플리케이션을 만들 때 필수적인 요소들을 프레임워크가 품고 있어야 한다고 생각했습니다. 그렇게 2011년 6월, 라라벨 1.0이 오픈소스로 세상에 공개되었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  라라벨의 핵심 지향점&lt;/b&gt;&lt;br /&gt;라라벨은 코드의 장황함을 걷어내고 표현력 있는 문법(Expressive Syntax)을 제공하여 개발자가 작업하는 과정 자체에서 즐거움을 느끼도록 설계되었습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 버전부터 내장 인증 시스템, 직관적인 라우팅, 모듈식 패키지 구조를 적극적으로 도입했습니다. 개발자가 반복적인 보일러플레이트 코드를 작성하는 시간을 대폭 줄여주었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 모든 것을 품은 풀스택 프레임워크의 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨을 설명할 때 빠질 수 없는 키워드가 바로 &lt;b&gt;풀스택 프레임워크(Full-stack Framework)&lt;/b&gt; 혹은 &lt;b&gt;배터리 포함(Batteries-Included)&lt;/b&gt; 철학입니다. 이는 웹 개발에 필요한 도구 일체를 프레임워크가 직접 갖추고 있음을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로 프레임워크가 최소한의 코어만 제공하고 라이브러리 선택을 개발자에게 맡긴다면, 라라벨은 검증된 표준 도구를 기본 탑재하여 제공합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;마이크로 프레임워크&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;라라벨 (풀스택)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;기본 구성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최소 라우팅, HTTP 핸들러&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;인증, ORM, 큐, 캐시, 템플릿 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;라이브러리 선정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자가 직접 조사 및 통합&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;공식 표준 도구 기본 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;초기 세팅 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;초기 설정에 많은 시간 소요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프로젝트 생성 즉시 비즈니스 개발&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 마이그레이션, 백그라운드 큐(Queue) 처리, 실시간 웹소켓, 이메일 발송, 파일 스토리지 추상화까지 하나의 생태계 안에서 일관된 문법으로 제어할 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 루비 온 레일즈&amp;middot;장고와 닮은 라라벨의 생태계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨의 풀스택 철학은 다른 언어의 대표적인 프레임워크들과 궤를 같이합니다. 루비 생태계의 &lt;b&gt;루비 온 레일즈(Ruby on Rails)&lt;/b&gt;, 파이썬의 &lt;b&gt;장고(Django)&lt;/b&gt;가 대표적인 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈가 '설정보다 관례(Convention over Configuration)'와 개발자 행복을 외치며 웹 생태계에 큰 영향을 준 것처럼, 라라벨 역시 레일즈의 우아함에서 깊은 영감을 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장고가 관리자 페이지(Admin)와 강력한 ORM을 내장해 빠른 완성을 돕는 것처럼, 라라벨 역시 Eloquent ORM과 공식 관리자 생태계를 갖추고 있습니다. 자바의 스프링 부트(Spring Boot)나 노드 진영의 네스트(NestJS) 역시 엔터프라이즈 환경을 아우르는 견고한 프레임워크로서 유사한 지향점을 공유합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  언어별 대표 풀스택 프레임워크&lt;/b&gt;&lt;br /&gt;- PHP: Laravel&lt;br /&gt;- Ruby: Ruby on Rails&lt;br /&gt;- Python: Django&lt;br /&gt;- Node.js: NestJS, AdonisJS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 프레임워크들의 공통점은 개발자가 웹 인프라 기초 공사에 쓰는 시간을 아끼고, 서비스의 고유 가치를 만드는 데 집중하도록 돕는다는 점입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1787886739659&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iZigx/dJMb83SBf62/3rjdtC4ZFWav3X0jIuaiOk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/BNlmB/dJMb887qOKa/f48fxm3EHz1VuBtkpKYqTk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/bEvTIg/dJMb85Xbt2b/3EKspd6dwTZHkRPk8yqizK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iZigx/dJMb83SBf62/3rjdtC4ZFWav3X0jIuaiOk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/BNlmB/dJMb887qOKa/f48fxm3EHz1VuBtkpKYqTk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/bEvTIg/dJMb85Xbt2b/3EKspd6dwTZHkRPk8yqizK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229');&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 개발자의 행복을 최우선으로 두는 우아한 문법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 코드의 가장 큰 특징은 읽기 쉽고 직관적이라는 점입니다. 데이터베이스 조회를 수행할 때 복잡한 쿼리 빌더 설정 없이도 자연어에 가까운 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 라라벨의 대표적인 데이터베이스 계층인 Eloquent ORM을 활용한 데이터 조회 예시입니다 (Laravel 11 기준 동작 원리 예시).&lt;/p&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;// 가입 승인된 사용자 중 최근 30일 이내 로그인한 목록 조회
$activeUsers = User::where('is_approved', true)
    -&amp;gt;where('last_login_at', '&amp;gt;=', now()-&amp;gt;subDays(30))
    -&amp;gt;orderByDesc('last_login_at')
    -&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 체이닝과 직관적인 네이밍 덕분에 코드를 처음 보는 사람도 의도를 쉽게 파악할 수 있습니다. 설정 파일을 장황하게 작성하지 않아도 합리적인 기본값이 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 라우팅, 미들웨어, 유효성 검사 등 웹 개발의 핵심 흐름이 모두 일관된 인터페이스로 통일되어 있어 학습 곡선이 완만하고 유지보수가 수월합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 라라벨 6 이전의 파편화와 버전업의 고통&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기부터 라라벨 5.x 시절까지는 버전 표기 방식이 직관적이지 않았습니다. 5.1, 5.2, 5.3처럼 마이너 숫자가 올라갈 때마다 사실상의 메이저 변경(Breaking Changes)이 포함되곤 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 인해 개발자들은 새 버전이 나올 때마다 어디서 코드가 깨질지 몰라 업그레이드를 주저했습니다. 공식 문서의 변경 내역을 한 줄씩 대조하며 수동으로 수정해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 업데이트가 두려움의 대상이 되자 구버전에 머무르는 프로젝트가 늘어났고, 최신 PHP 기능과 보안 패치를 제때 적용하지 못하는 악순환이 발생했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 라라벨 6 시맨틱 버저닝 도입이 바꾼 개발 문화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019년 9월 출시된 &lt;b&gt;라라벨 6.0&lt;/b&gt;은 프레임워크 역사에서 중요한 분기점이 되었습니다. 이전의 모호한 버전 규칙을 버리고 &lt;b&gt;시맨틱 버저닝(Semantic Versioning, SemVer)&lt;/b&gt;을 공식 채택했기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 숫자가 주(Major).부(Minor).수(Patch)로 명확히 나뉘면서, 주 버전이 올라갈 때만 하위 호환성이 깨지는 변경이 포함됨을 엄격히 보장하기 시작했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;라라벨 5.x 시절&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;라라벨 6버전 이후&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;버전 체계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Paradigm.Major.Minor (자체 규칙)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Semantic Versioning (SemVer 표준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;메이저 주기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 6개월 단위 릴리즈 (5.1, 5.2...)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;6&amp;middot;7&amp;middot;8은 6개월 간격, 8 이후 연 1회 메이저 릴리즈 (9, 10, 11...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;업그레이드 예측성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;마이너 업데이트에도 파괴적 변경 존재&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;메이저 버전에서만 변경 사항 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 8을 기점으로 출시 주기를 연 1회 메이저 릴리즈로 안정화하면서 개발팀은 업그레이드 일정을 체계적으로 계획할 수 있게 되었습니다. 불필요한 변경을 줄이고 안정성을 높이는 토대가 마련되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. &quot;버전업은 도구가 알아서&quot;: Laravel Shift와 자동화 철학&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 6 이후 가장 돋보이는 강점은 &lt;b&gt;&quot;버전 관리는 생태계가 알아서 해줄 테니 개발에만 집중하라&quot;&lt;/b&gt;는 태도입니다. 이를 상징하는 대표적인 도구가 바로 &lt;b&gt;Laravel Shift(라라벨 시프트)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Laravel Shift는 저장소의 코드를 분석하여 새 버전에 맞게 자동으로 풀 리퀘스트(Pull Request)를 생성해 주는 자동 업그레이드 서비스입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  버전업 자동화의 강점&lt;/b&gt;&lt;br /&gt;설정 파일 변경, Deprecated 함수 교체, 네임스페이스 수정 등 기계적인 마이그레이션 작업을 도구가 대신 처리하여 수작업 실수를 방지합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크 코어 팀과 생태계가 마이그레이션 자동화를 적극적으로 지원하면서, 과거 며칠씩 걸리던 버전업 작업이 몇 번의 검토와 테스트만으로 끝나게 되었습니다. 프레임워크 유지보수 비용을 획기적으로 낮춘 대표적인 사례입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 비즈니스 로직에만 집중하게 만드는 프레임워크의 힘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발에서 프레임워크의 존재 이유는 개발자의 시간과 노력을 아껴주는 데 있습니다. 기술적인 화려함보다 중요한 것은 비즈니스 요구사항을 얼마나 빠르고 안전하게 구현하느냐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨은 탄생 초기부터 개발자의 편의를 중심에 두었고, 버전이 거듭될수록 그 철학을 더욱 정교하게 다듬어왔습니다. 도구 설정이나 마이그레이션에 쏟는 에너지를 줄여주기 때문에 팀의 개발 생산성이 자연스럽게 높아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검증된 풀스택 도구와 자동화된 버전 관리 생태계는 제품의 빠른 출시와 안정적인 운영을 동시에 달성하게 만드는 든든한 밑바탕이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라라벨의 시맨틱 버저닝은 기존 5.x 버전과 어떻게 다른가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 5.8에서 다음 버전이 나올 때 5.9가 아닌 6.0으로 변경되었습니다. 라라벨 6부터는 표준 SemVer를 따르므로 메이저 번호(6, 7, 8, 9, 10, 11)가 올라갈 때만 하위 호환성이 깨지는 변경이 발생합니다. 패치나 마이너 릴리즈에서는 기능 추가와 버그 수정만 이루어지므로 안심하고 업데이트할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라라벨 같은 풀스택 프레임워크는 가벼운 API 서버 구축에도 적합한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충분히 적합합니다. 라라벨은 불필요한 미들웨어를 제외하고 라우팅과 컨트롤러 중심의 경량 API 구조를 구성할 수 있습니다. 큐나 캐시, DB 마이그레이션 도구를 그대로 활용할 수 있어 순수 마이크로 프레임워크보다 개발 속도와 확장성 면에서 더 유리할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 프레임워크가 나아가야 할 방향&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크는 개발자를 제약하는 규칙이 아니라, 날개를 달아주는 도구여야 합니다. 라라벨이 웹 생태계에서 오랜 시간 사랑받는 이유는 개발자가 겪는 사소한 불편함까지 세심하게 배려하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 설정과 불안한 버전 업그레이드에서 벗어나 풀스택 생태계가 제공하는 편리함을 적극적으로 누려보시기 바랍니다. 도구의 자동화를 신뢰할수록 본질적인 비즈니스 로직과 서비스 완성도에 온전히 집중할 수 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787065581142&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;네이버가 PHP였다고? 한국 IT 대기업들의 충격적인 초기 기술 스택 (네이버&amp;middot;배민&amp;middot;카카오)&quot; data-og-description=&quot;&amp;quot;형, 네이버는 처음부터 Java였죠?&amp;quot;&amp;quot;배민도 Spring으로 시작한 거 아니에요?&amp;quot;&amp;quot;카카오가 Ruby였다고요? 진짜요?&amp;quot;후배 개발자들과 한국 IT 대기업 이야기를 나누다 보면,거의 모두가 같은 오해를 하고 있&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%84%A4%EC%9D%B4%EB%B2%84%EA%B0%80-PHP%EC%98%80%EB%8B%A4%EA%B3%A0-%ED%95%9C%EA%B5%AD-IT-%EB%8C%80%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%98-%EC%B6%A9%EA%B2%A9%EC%A0%81%EC%9D%B8-%EC%B4%88%EA%B8%B0-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EB%84%A4%EC%9D%B4%EB%B2%84%C2%B7%EB%B0%B0%EB%AF%BC%C2%B7%EC%B9%B4%EC%B9%B4%EC%98%A4&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%84%A4%EC%9D%B4%EB%B2%84%EA%B0%80-PHP%EC%98%80%EB%8B%A4%EA%B3%A0-%ED%95%9C%EA%B5%AD-IT-%EB%8C%80%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%98-%EC%B6%A9%EA%B2%A9%EC%A0%81%EC%9D%B8-%EC%B4%88%EA%B8%B0-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EB%84%A4%EC%9D%B4%EB%B2%84%C2%B7%EB%B0%B0%EB%AF%BC%C2%B7%EC%B9%B4%EC%B9%B4%EC%98%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8ECp8/dJMb87gnmjb/sr9rJan5K6jYWcAUGerXkK/img.png?width=800&amp;amp;height=644&amp;amp;face=590_152_653_222,https://scrap.kakaocdn.net/dn/bi9L1D/dJMb9kUjxeq/glBEPVrFlWZJs1ssnZPHt1/img.png?width=800&amp;amp;height=644&amp;amp;face=590_152_653_222,https://scrap.kakaocdn.net/dn/q9hsJ/dJMb85v5TDA/KAzCvXgawQsuCkODUTNiI0/img.png?width=1200&amp;amp;height=967&amp;amp;face=881_228_976_333&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%84%A4%EC%9D%B4%EB%B2%84%EA%B0%80-PHP%EC%98%80%EB%8B%A4%EA%B3%A0-%ED%95%9C%EA%B5%AD-IT-%EB%8C%80%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%98-%EC%B6%A9%EA%B2%A9%EC%A0%81%EC%9D%B8-%EC%B4%88%EA%B8%B0-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EB%84%A4%EC%9D%B4%EB%B2%84%C2%B7%EB%B0%B0%EB%AF%BC%C2%B7%EC%B9%B4%EC%B9%B4%EC%98%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%84%A4%EC%9D%B4%EB%B2%84%EA%B0%80-PHP%EC%98%80%EB%8B%A4%EA%B3%A0-%ED%95%9C%EA%B5%AD-IT-%EB%8C%80%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%98-%EC%B6%A9%EA%B2%A9%EC%A0%81%EC%9D%B8-%EC%B4%88%EA%B8%B0-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EB%84%A4%EC%9D%B4%EB%B2%84%C2%B7%EB%B0%B0%EB%AF%BC%C2%B7%EC%B9%B4%EC%B9%B4%EC%98%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8ECp8/dJMb87gnmjb/sr9rJan5K6jYWcAUGerXkK/img.png?width=800&amp;amp;height=644&amp;amp;face=590_152_653_222,https://scrap.kakaocdn.net/dn/bi9L1D/dJMb9kUjxeq/glBEPVrFlWZJs1ssnZPHt1/img.png?width=800&amp;amp;height=644&amp;amp;face=590_152_653_222,https://scrap.kakaocdn.net/dn/q9hsJ/dJMb85v5TDA/KAzCvXgawQsuCkODUTNiI0/img.png?width=1200&amp;amp;height=967&amp;amp;face=881_228_976_333');&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;네이버가 PHP였다고? 한국 IT 대기업들의 충격적인 초기 기술 스택 (네이버&amp;middot;배민&amp;middot;카카오)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;형, 네이버는 처음부터 Java였죠?&quot;&quot;배민도 Spring으로 시작한 거 아니에요?&quot;&quot;카카오가 Ruby였다고요? 진짜요?&quot;후배 개발자들과 한국 IT 대기업 이야기를 나누다 보면,거의 모두가 같은 오해를 하고 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787065571271&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;PHP는 원래 개인 홈페이지 도구였다 &amp;mdash; 언어가 될 생각이 없던 코드가 웹을 먹은 이야기&quot; data-og-description=&quot;&amp;quot;PHP 아직도 쓰는 데가 있어요?&amp;quot;&amp;quot;워드프레스가 PHP로 돌아간다던데, 그게 그렇게 오래된 언어예요?&amp;quot;&amp;quot;이름이 왜 PHP예요? P가 대체 뭐의 약자죠?&amp;quot;&amp;quot;레거시 PHP 유지보수 들어가라는데... 지금 와서 이걸 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/php-history-personal&quot; data-og-url=&quot;https://devwar.tistory.com/entry/php-history-personal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z0nWu/dJMb82e3KuY/bEVTxpVUamRxMVAeC3lOi1/img.png?width=800&amp;amp;height=640&amp;amp;face=485_178_547_246,https://scrap.kakaocdn.net/dn/mWlLg/dJMb87gnmi6/th3zeqWJky0lmCudDGFFtK/img.png?width=800&amp;amp;height=640&amp;amp;face=485_178_547_246,https://scrap.kakaocdn.net/dn/bXCxkD/dJMb81f9r1E/7H9V1dFWKucvOIbbk54PFK/img.png?width=1021&amp;amp;height=818&amp;amp;face=617_229_690_308&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/php-history-personal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/php-history-personal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z0nWu/dJMb82e3KuY/bEVTxpVUamRxMVAeC3lOi1/img.png?width=800&amp;amp;height=640&amp;amp;face=485_178_547_246,https://scrap.kakaocdn.net/dn/mWlLg/dJMb87gnmi6/th3zeqWJky0lmCudDGFFtK/img.png?width=800&amp;amp;height=640&amp;amp;face=485_178_547_246,https://scrap.kakaocdn.net/dn/bXCxkD/dJMb81f9r1E/7H9V1dFWKucvOIbbk54PFK/img.png?width=1021&amp;amp;height=818&amp;amp;face=617_229_690_308');&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;PHP는 원래 개인 홈페이지 도구였다 &amp;mdash; 언어가 될 생각이 없던 코드가 웹을 먹은 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;PHP 아직도 쓰는 데가 있어요?&quot;&quot;워드프레스가 PHP로 돌아간다던데, 그게 그렇게 오래된 언어예요?&quot;&quot;이름이 왜 PHP예요? P가 대체 뭐의 약자죠?&quot;&quot;레거시 PHP 유지보수 들어가라는데... 지금 와서 이걸&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>Eloquent</category>
      <category>laravel</category>
      <category>LaravelShift</category>
      <category>PHP프레임워크</category>
      <category>라라벨</category>
      <category>라라벨버전업</category>
      <category>시맨틱버저닝</category>
      <category>웹개발</category>
      <category>테일러오트웰</category>
      <category>풀스택프레임워크</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/153</guid>
      <comments>https://devwar.tistory.com/entry/laravel-history-fullstack#entry153comment</comments>
      <pubDate>Wed, 30 Sep 2026 19:00:46 +0900</pubDate>
    </item>
    <item>
      <title>클로드 소넷 5.5 스펙 정리, Sonnet 5와 비교해봤더니 생긴 일</title>
      <link>https://devwar.tistory.com/entry/claude-sonnet-5-5-specs-pricing</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 9월 29일 오후 08_51_55.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgvU7/dJMcajqdsEF/8nK6M2fmPAyMuQxhyQyH6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgvU7/dJMcajqdsEF/8nK6M2fmPAyMuQxhyQyH6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgvU7/dJMcajqdsEF/8nK6M2fmPAyMuQxhyQyH6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgvU7%2FdJMcajqdsEF%2F8nK6M2fmPAyMuQxhyQyH6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;클로드 소넷 5.5 스펙 정리, Sonnet 5와 비교해봤더니 생긴 일&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;ChatGPT Image 2026년 9월 29일 오후 08_51_55.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Sonnet 5.5가 2026년 9월 28일 나왔습니다. 가격은 그대로인데 더 빨라지고, 더 똑똑해졌어요. 소넷 5.5에서 무엇이 좋아졌는지 쉽게 정리해 봤습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;소넷 5.5, 이전 버전이랑 뭐가 달라요?&quot;&lt;br /&gt;&quot;가격이 같은데 왜 더 싸다는 거죠?&quot;&lt;br /&gt;&quot;비싼 Opus 대신 써도 되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  한 줄씩 보는 개선점&lt;/b&gt;&lt;br /&gt;- 답을 쓰는 속도가 30% 이상 빨라졌습니다.&lt;br /&gt;- 가격은 같지만 일을 더 효율적으로 해서 실제 비용이 최대 30% 줄었습니다.&lt;br /&gt;- 코딩 시험 점수가 10.3%에서 70.6%로 크게 올랐습니다.&lt;br /&gt;- 두 배 비싼 Opus 5.5와 점수 차이가 2~3점 정도로 좁혀졌습니다.&lt;br /&gt;- 해킹성 공격 문장에 덜 속게 됐습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 2026년 9월 29일 기준으로, Anthropic 공식 발표를 바탕으로 정리했습니다. 성능 점수는 제조사가 직접 발표한 수치라는 점만 기억해 주세요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Claude Sonnet 5.5는 어떤 모델인가&lt;/li&gt;
&lt;li&gt;소넷 5.5 가격, 그대로인데 더 싸진 이유&lt;/li&gt;
&lt;li&gt;소넷 5.5 속도와 일하는 방식&lt;/li&gt;
&lt;li&gt;소넷 5.5 성능 비교&lt;/li&gt;
&lt;li&gt;소넷 5.5와 Opus 5.5 차이&lt;/li&gt;
&lt;li&gt;소넷 5.5 주요 스펙&lt;/li&gt;
&lt;li&gt;개발자라면 알아둘 변경점&lt;/li&gt;
&lt;li&gt;소넷 5.5 보안은 더 깐깐해졌다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Claude Sonnet 5.5는 어떤 모델인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude는 등급별로 모델이 나뉩니다. 가벼운 Haiku, 중간급 Sonnet, 고급형 Opus 순서예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sonnet 5.5는 이 중 중간급입니다. 빠르고 적당히 똑똑해서 가장 많이 쓰이는 등급이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6일 먼저 나온 Opus 5.5에 이어 5.5 세대의 두 번째 모델입니다. 가장 가벼운 Haiku 5.5도 몇 주 안에 나올 예정이에요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 소넷 5.5 가격, 그대로인데 더 싸진 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격은 이전 버전인 Sonnet 5와 똑같습니다. API 기준 입력 100만 토큰당 2달러, 출력 100만 토큰당 10달러예요. 토큰은 AI가 글을 세는 단위입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Anthropic은 실제 비용이 최대 30% 줄었다고 말합니다. 같은 일을 할 때 글을 덜 쓰고, 단계도 덜 밟기 때문이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택시 요금은 그대로인데 지름길로 가서 요금이 덜 나오는 것과 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  단, 설정에 따라 다릅니다&lt;/b&gt;&lt;br /&gt;AI에게 &quot;최대한 깊게 생각해&quot;라고 설정하면 글을 훨씬 많이 써서 오히려 비용이 늘 수 있어요. 한 외부 평가에서는 가장 깊은 설정일 때 이전 버전보다 약 50% 비싸게 나왔습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 소넷 5.5 속도와 일하는 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답을 쓰는 속도가 이전보다 30% 이상 빨라졌습니다. 지금까지 나온 Sonnet 중 가장 빠르다고 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일하는 방식도 똑똑해졌습니다. 예전에는 파일을 하나씩 열고 하나씩 고쳤다면, 이제는 여러 작업을 한 번에 묶어서 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 외신 테스트에서 이전 버전은 버그를 고치는 데 12~13단계를 거쳤어요. 소넷 5.5는 3단계 만에 끝냈고, 비용도 약 3분의 1이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막히면 같은 방법을 반복하지 않고 다른 길을 찾는 것도 달라진 점입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 소넷 5.5 성능 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 성능은 표준 시험 점수로 비교합니다. 주요 시험 다섯 개만 쉽게 추렸어요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시험&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Sonnet 5 &amp;rarr; 5.5&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Opus 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;스스로 코딩하기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;10.3% &amp;rarr; 70.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;66.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;코딩 도구 과제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;34.1% &amp;rarr; 55.5%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;57.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;실제 업무 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1449 &amp;rarr; 1844점&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1846점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컴퓨터 조작&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;57.0% &amp;rarr; 80.1%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;81.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;고난도 문제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;54.9% &amp;rarr; 64.5%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;67.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 이름은 순서대로 Terminal-Bench 4.0, CursorBench 4.0, GDPval-AA, OSWorld 2.1, Humanity's Last Exam입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 시험에서 이전 버전보다 올랐어요. 특히 스스로 코딩하는 시험은 7배 가까이 뛰었고, 이 항목만큼은 Opus 5.5도 앞섰습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지는 Opus 5.5가 조금 높지만 차이가 2~3점 정도라 거의 비슷합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 소넷 5.5와 Opus 5.5 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수가 비슷하면 비싼 Opus는 왜 쓸까요? 두 모델은 잘하는 일이 다릅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Sonnet 5.5&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Opus 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가격&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Opus의 절반&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2배&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;빠름&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;잘하는 일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;할 일이 분명한 작업, 버그 수정, 문서 작성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;깊은 판단이 필요한 복잡한 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 일상 업무는 소넷 5.5, 어렵고 복잡한 일은 Opus 5.5입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 먼저 소넷으로 해 보고, 결과가 아쉬울 때만 Opus로 바꾸는 방식을 추천합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 소넷 5.5 주요 스펙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 알아둘 스펙만 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;한 번에 읽는 양&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;100만 토큰 (책 여러 권 분량)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;한 번에 쓰는 양&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;12만 8천 토큰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;넣을 수 있는 것&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;글, 이미지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;알고 있는 정보&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 6월까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;쓸 수 있는 곳&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;claude.ai, Claude API, AWS, 구글 클라우드, MS 클라우드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;지원 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최소 2027년 9월까지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API에서 쓸 때 모델 이름은 &lt;code&gt;claude-sonnet-5-5&lt;/code&gt;입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 개발자라면 알아둘 변경점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 버전 코드에서 모델 이름만 바꾸면 문제가 생길 수 있습니다. 대표적인 것만 쉽게 정리했어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI의 생각 기능을 완전히 끄는 설정은 이제 오류가 납니다.&lt;/li&gt;
&lt;li&gt;특정 도구를 억지로 쓰게 하는 설정도 오류가 납니다.&lt;/li&gt;
&lt;li&gt;도구를 쓰는 중간중간 나오던 설명 글이 다른 곳에 담겨 옵니다. 화면에 보여 주던 서비스라면 확인이 필요해요.&lt;/li&gt;
&lt;li&gt;짧은 프롬프트도 저장해서 재사용할 수 있게 돼 비용을 아끼기 쉬워졌습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 버전인 Sonnet 5는 계속 쓸 수 있으니, 급하게 바꾸지 말고 테스트 후 넘어가도 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 소넷 5.5 보안은 더 깐깐해졌다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑똑해진 만큼 보안 장치도 강해졌습니다. 최고급 모델에만 쓰던 보안 장치가 Sonnet에 처음 들어갔어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 점은 방어력입니다. 웹페이지 등에 숨겨진 나쁜 지시에 속는 비율이 이전보다 줄었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 보안 관련 질문은 정상적인 내용이어도 거절될 수 있습니다. Anthropic도 이 부분을 직접 경고했어요. 보안 업무에 쓰는 분이라면 미리 테스트해 보는 게 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소넷 5.5가 Opus 5.5보다 좋은가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로는 Opus 5.5가 조금 더 높습니다. 다만 차이가 작고 가격은 절반이라, 대부분의 일상 업무는 소넷 5.5로 충분합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이전 코드에서 모델 이름만 바꾸면 되나요?&lt;/h3&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  결론&lt;/b&gt;&lt;br /&gt;대부분 되지만 확인은 필요합니다. 생각 기능 끄기, 도구 강제 사용 설정이 있다면 오류가 날 수 있어요.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;같은 가격, 더 나은 성능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소넷 5.5는 가격은 그대로 두고 속도와 성능을 함께 올린 모델입니다. Opus에 가까운 실력을 절반 가격에 쓸 수 있다는 게 가장 큰 장점이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 점수는 제조사 발표 기준이니, 내 작업에 직접 써 보고 판단하는 게 가장 정확합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1790682710004&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&quot; data-og-description=&quot;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에 &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cHsRxQ/dJMb8UamEyQ/s9a5gCJzWlCg91ZgKpwGU0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/RfUUd/dJMb8XSsDnP/BXiZI73pXYFNXUKfGIuHj1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/CitEH/dJMb8RkoS29/7aAlOA8rH6qdrUMkrOTUDk/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHsRxQ/dJMb8UamEyQ/s9a5gCJzWlCg91ZgKpwGU0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/RfUUd/dJMb8XSsDnP/BXiZI73pXYFNXUKfGIuHj1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/CitEH/dJMb8RkoS29/7aAlOA8rH6qdrUMkrOTUDk/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367');&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790682688262&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;클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다&quot; data-og-description=&quot;클로드 오퍼스 5.5(Claude Opus 5.5)가 2026년 9월 22일에 나왔습니다. 이름만 보면 &amp;quot;제일 비싸고 제일 센 모델&amp;quot;처럼 들리는데, 지금 클로드 라인업에서는 둘 다 아닙니다. 이 글은 오퍼스 5.5가 다른 클로&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fWvx1/dJMb9iI2XvJ/tEdlnVLyEyvJPLKaysECrK/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/jn9Mx/dJMb9hDnhBJ/slfVPwvbVId7ed3VMQgdNK/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bep2ap/dJMb9kUo9ir/dEEBDZPZLfZYEXw1vTkP81/img.jpg?width=1712&amp;amp;height=1152&amp;amp;face=1246_144_1377_288&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fWvx1/dJMb9iI2XvJ/tEdlnVLyEyvJPLKaysECrK/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/jn9Mx/dJMb9hDnhBJ/slfVPwvbVId7ed3VMQgdNK/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bep2ap/dJMb9kUo9ir/dEEBDZPZLfZYEXw1vTkP81/img.jpg?width=1712&amp;amp;height=1152&amp;amp;face=1246_144_1377_288');&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;클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 오퍼스 5.5(Claude Opus 5.5)가 2026년 9월 22일에 나왔습니다. 이름만 보면 &quot;제일 비싸고 제일 센 모델&quot;처럼 들리는데, 지금 클로드 라인업에서는 둘 다 아닙니다. 이 글은 오퍼스 5.5가 다른 클로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790682671750&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; data-og-description=&quot;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &amp;quot;코딩과 지식 노동에서 가장 진보한 모델&amp;quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2JmYs/dJMb9efAlE0/CdYfYmPUDaaQ9OkPicIByK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/kbEtr/dJMb9efAlEZ/U6HQF7Cl313Flbkvy8KyJ1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/m5xgH/dJMb9gxHRgr/C8Rt7hWOyGAo4zDKjYXp11/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2JmYs/dJMb9efAlE0/CdYfYmPUDaaQ9OkPicIByK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/kbEtr/dJMb9efAlEZ/U6HQF7Cl313Flbkvy8KyJ1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/m5xgH/dJMb9gxHRgr/C8Rt7hWOyGAo4zDKjYXp11/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224');&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790682667100&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&quot; data-og-description=&quot;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/O4P2E/dJMb8SXUDuU/lLMGU4VcZdCdupriJikkS0/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bg37h6/dJMb8WMMlAo/JKaLdRA7SNw3ZWMbPGtgXk/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/koC36/dJMb8UIbTn2/jNWkfDgK8Opj517KQWKyX0/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/O4P2E/dJMb8SXUDuU/lLMGU4VcZdCdupriJikkS0/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bg37h6/dJMb8WMMlAo/JKaLdRA7SNw3ZWMbPGtgXk/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/koC36/dJMb8UIbTn2/jNWkfDgK8Opj517KQWKyX0/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249');&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI 가격</category>
      <category>ai 성능 비교</category>
      <category>anthropic</category>
      <category>Claude 5.5</category>
      <category>claude api</category>
      <category>Claude Sonnet 5.5</category>
      <category>Opus 5.5</category>
      <category>생성형 AI</category>
      <category>소넷 5.5</category>
      <category>클로드 소넷</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/172</guid>
      <comments>https://devwar.tistory.com/entry/claude-sonnet-5-5-specs-pricing#entry172comment</comments>
      <pubDate>Tue, 29 Sep 2026 20:52:29 +0900</pubDate>
    </item>
    <item>
      <title>그록 4.7 직접 써봤더니, 빠른데 1%가 아쉬운 이유가 있었습니다</title>
      <link>https://devwar.tistory.com/entry/grok-4-7-comparison</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocacd/dJMb99OE15L/WekEEXShFOH4P6syvDNOYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocacd/dJMb99OE15L/WekEEXShFOH4P6syvDNOYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocacd/dJMb99OE15L/WekEEXShFOH4P6syvDNOYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Focacd%2FdJMb99OE15L%2FWekEEXShFOH4P6syvDNOYk%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; alt=&quot;그록 4.7 직접 써봤더니, 빠른데 1%가 아쉬운 이유가 있었습니다&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그록 4.7(Grok 4.7)이 2026년 9월 21일에 나왔습니다. 값은 클로드나 GPT의 절반 정도입니다. 이 글은 그록 4.7이 뭔지, 다른 AI와 비교하면 어디쯤인지, 싸다는 이유만으로 골라도 되는지를 쉽게 정리한 글입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;그록이 뭐예요? X에 있는 그 AI 맞나요?&quot;&lt;br /&gt;&quot;그록 4.7이 클로드보다 싸다는데 성능은요?&quot;&lt;br /&gt;&quot;그록 무료로 쓸 수 있나요?&quot;&lt;br /&gt;&quot;코딩에 그록 써도 되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 그록 4.7을 며칠 써봤습니다. 답이 확실히 빨리 나옵니다. 그런데 결과를 보면 어딘가 1% 아쉬운 느낌이 남았어요. 뭐가 아쉬운지 딱 집어 말하기는 어렵습니다. 그래서 회사가 낸 점수표와 가격표를 같이 놓고 그 느낌의 이유를 찾아봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려운 말은 나올 때마다 한 줄로 풀었습니다. 숫자는 2026년 9월 기준 스페이스XAI 공식 발표에서 가져왔고, 회사가 직접 잰 점수인지 바깥에서 확인된 건지 구분해 뒀습니다. AI 가격과 모델은 몇 달마다 바뀌니 읽는 시점에 다시 확인하는 게 안전합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;그록 4.7 한 줄 정리&lt;/li&gt;
&lt;li&gt;그록은 누가 만드나&lt;/li&gt;
&lt;li&gt;그록 4.6과 4.7 차이&lt;/li&gt;
&lt;li&gt;그록 4.7 가격과 쓸 수 있는 곳&lt;/li&gt;
&lt;li&gt;클로드&amp;middot;GPT와 나란히 놓은 가격 비교&lt;/li&gt;
&lt;li&gt;제일 싼 모델이 제일 좋은 선택이 아닌 이유&lt;/li&gt;
&lt;li&gt;그록 4.7이 잘하는 일&lt;/li&gt;
&lt;li&gt;그록 4.7 쓸 때 주의할 점&lt;/li&gt;
&lt;li&gt;용도별 그록 4.7 선택 기준&lt;/li&gt;
&lt;li&gt;그록 4.7 처음 써볼 때 순서&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;가격표와 점수표를 따로 보면 됩니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 그록 4.7 한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그록 4.7은 스페이스XAI(예전 이름 xAI)가 낸 최신 AI 모델입니다. 회사 설명을 한 줄로 줄이면 이렇습니다. &quot;4.6과 값도 같고 속도도 같은데, 더 잘한다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 시기에 나온 클로드 오퍼스 5.5는 &quot;성능은 그대로, 값을 내렸다&quot;였습니다. 그록 4.7은 반대로 &quot;값은 그대로, 성능을 올렸다&quot;입니다. 방향은 달라도 결국 둘 다 &quot;같은 돈으로 더 많이&quot;를 노립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  그록 4.7 핵심 세 가지&lt;/b&gt;&lt;br /&gt;- 2026년 9월 21일 출시, 개발자용 모델 이름은 &lt;code&gt;grok-4.7&lt;/code&gt;&lt;br /&gt;- 값은 그록 4.6과 똑같음 (입력 $2, 출력 $6 / 100만 토큰)&lt;br /&gt;- 회사가 잰 점수로는 코딩&amp;middot;문서&amp;middot;법률&amp;middot;공학 전 항목에서 4.6보다 올라감&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 그록은 누가 만드나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그록을 만든 회사 이름이 올해 바뀌어서 헷갈리기 쉽습니다. 원래는 일론 머스크가 2023년에 세운 xAI라는 회사였습니다. 이 회사가 2025년에 X(예전 트위터)를 사들였고, 2026년 2월에는 거꾸로 스페이스X가 xAI를 사들였습니다. 그리고 2026년 7월에 회사 이름을 스페이스XAI로 바꿨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 지금 그록은 스페이스X 안의 AI 부서가 만드는 제품입니다. X 앱 안의 그록, grok.com의 그록, 테슬라 차 안의 그록이 전부 같은 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머스크는 4.7이 2.1조 개의 파라미터로 만들어졌다고 밝혔습니다. 파라미터는 모델의 크기를 나타내는 숫자인데, 클수록 배울 수 있는 게 많다고 보면 됩니다. 스페이스X의 위성&amp;middot;제조 데이터를 추가로 학습했다고도 했습니다. 이건 회사 쪽 말이고, 바깥에서 확인된 수치는 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 그록 4.6과 4.7 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 4점대인데 뭐가 달라졌는지 봅니다. 아래 숫자는 스페이스XAI가 직접 잰 점수입니다. 점수는 높을수록 좋습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;그록 4.6&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;그록 4.7&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;값 (입력 / 출력)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2 / $6&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2 / $6 (같음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;코딩&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;40.4%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;46.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;터미널 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;20.3%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;37.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;사무 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,605점&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,695점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;법률 문서&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;15.8%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;19.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널 작업이 거의 두 배로 뛰었습니다. 터미널 작업은 개발자가 명령어를 치는 검은 화면에서 AI가 혼자 여러 단계를 처리하는 일입니다. 4.6이 유독 약했던 부분이라 올라갈 여지가 컸다고 보는 게 맞습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 설명은 이렇습니다. 4.7은 4.6보다 큰 새 모델로 만들었고, 몇 시간씩 걸리는 어려운 문제 위주로 더 오래 훈련했다. 그래서 &quot;어려운 문제에 더 오래 매달리고, 자기 답을 더 자주 검토한다&quot;고 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 그록 4.7 가격과 쓸 수 있는 곳&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값은 API 기준으로 입력 100만 토큰에 2달러, 출력 6달러입니다. API는 개발자가 자기 프로그램에서 AI를 불러 쓰는 방식이고, 쓴 만큼 냅니다. 토큰은 AI가 글을 세는 단위인데, 한글은 글자 1~2개가 토큰 하나 정도입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;쓰는 곳&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;누가 쓰나&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;그록 4.7&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;API&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 자체 서비스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;grok-4.7&lt;/code&gt;로 바로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Grok Build&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 터미널 코딩 도구&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기본 모델로 들어가 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Cursor&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 코드 편집기&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;모든 요금제에서 선택 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;grok.com &amp;middot; X 앱&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일반 사용자&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;요금제별 배정은 grok.com/plans에서 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 버전도 있습니다. 답이 2배 빨리 나오는 대신 값도 2배입니다. 2026년 9월 기준으로 Cursor와 Grok Build에서만 쓸 수 있고, 일반 API에서는 안 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 사용자 요금제는 무료, 라이트(월 $10), 슈퍼그록(월 $30), 헤비(월 $300) 순입니다. 지금까지는 새 모델이 나오면 슈퍼그록 이상에 먼저 열리고, 무료와 라이트는 한 세대 전 모델을 쓰는 게 관례였습니다. 4.7이 어느 요금제까지 열렸는지는 공식 발표문에 없어서 요금제 페이지에서 직접 확인해야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  생각하는 강도를 고를 수 있음&lt;/b&gt;&lt;br /&gt;API에서 low, medium, high, xhigh 네 단계 중 고릅니다. 기본값은 high입니다. 회사가 발표한 점수는 대부분 제일 높은 xhigh로 잰 거라, 기본값으로 쓰면 그 점수보다 낮게 나올 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 클로드&amp;middot;GPT와 나란히 놓은 가격 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 9월 기준 각 회사가 공식으로 올린 값입니다. 100만 토큰당 입력&amp;middot;출력 값이고, 성능은 다음 섹션에서 따로 봅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;입력&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;출력&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;그록 4.7&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;클로드 소넷 5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;GPT-5.6 Sol&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;클로드 오퍼스 5.5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;클로드 페이블 5.1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력은 클로드 소넷 5와 같고, 출력은 그보다 쌉니다. 오퍼스 5.5와 GPT-5.6 Sol의 절반 이하, 페이블 5.1의 5분의 1입니다. 스페이스XAI가 발표문 첫 줄에 &quot;비슷한 모델의 절반 값&quot;이라고 쓴 이유입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이건 단가입니다. 같은 일을 시켜도 모델마다 쓰는 토큰 양이 다릅니다. 실제 내는 돈은 &quot;단가 곱하기 사용량&quot;입니다. 이 부분은 8번에서 다시 봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 제일 싼 모델이 제일 좋은 선택이 아닌 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목에 쓴 얘기를 여기서 회수합니다. 5번 표에서 그록 4.7이 제일 쌌습니다. 그런데 스페이스XAI가 직접 낸 점수표에서도 그록 4.7은 1등이 아닙니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;테스트 (스페이스XAI 발표)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;그록 4.7&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;클로드 페이블 5.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;코딩&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;46.3%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;51.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;터미널 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;37.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;57.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;사무 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,695점&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,735점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;의료 추론&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;56.7%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;62.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;전기공학&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;64.0%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;56.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;법률 문서&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;19.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;6.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사가 고른 테스트에서도 코딩, 터미널, 사무, 의료는 페이블 5.1이 앞섭니다. 전기공학과 법률은 그록이 앞섭니다. 회사는 &quot;값 대비 성능에서 맨 앞&quot;이라고 썼지, &quot;성능 자체가 맨 앞&quot;이라고는 안 썼습니다. 이 차이를 읽어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 느낀 1%의 아쉬움도 아마 여기서 나오는 것 같습니다. 답은 빠르고 대체로 맞는데, 코딩이나 긴 작업에서 마지막 한 끗이 상위 모델보다 살짝 덜 다듬어진 느낌. 확실하진 않지만 점수표의 5~20% 차이가 그 느낌으로 오는 게 아닐까 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 그록 4.7의 자리는 이렇습니다. 값은 소넷급, 성능은 소넷과 오퍼스 사이 어딘가, 몇몇 분야는 상위 모델급. 이 자리가 내 일에 맞으면 싸게 잘 쓰는 거고, 안 맞으면 싼 값에 두 번 시키는 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 그록 4.7이 잘하는 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표문과 점수표에서 그록 4.7이 다른 모델보다 앞선 것만 추렸습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 답 - 직접 써보면 이게 제일 먼저 느껴집니다. 회사도 &quot;같은 급에서 2배 빠르다&quot;고 씁니다.&lt;/li&gt;
&lt;li&gt;법률 문서 - 법률 문서 테스트에서 19.6%로, 같은 표의 페이블 5.1(6.7%)과 GPT-5.6 Sol(2.5%)을 크게 앞섰습니다. 회사 발표 수치입니다.&lt;/li&gt;
&lt;li&gt;전기&amp;middot;기계 계산 - 전기공학 테스트에서 표 안의 모델 중 제일 높습니다. 스페이스X 데이터를 학습했다는 설명과 맞물립니다.&lt;/li&gt;
&lt;li&gt;문서와 발표 자료 - 회사가 &quot;4.6보다 문서와 발표 자료를 더 잘 만든다&quot;고 따로 말했습니다.&lt;/li&gt;
&lt;li&gt;실시간 정보 - 그록 앱은 X의 글과 웹을 바로 검색합니다. 이건 4.7이 새로 얻은 게 아니라 그록의 오래된 강점입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;법률과 전기공학 점수는 눈에 띕니다. 다만 단서가 하나 붙습니다. 이 점수를 낸 곳이 스페이스XAI이고, 비교한 다른 모델의 설정도 스페이스XAI가 정했습니다. 바깥 기관이 같은 조건으로 다시 잰 결과는 2026년 9월 기준 아직 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 그록 4.7 쓸 때 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 얘기만 있는 건 아닙니다. 네 가지만 짚습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;점수는 회사가 잰 것 - 바깥에서 확인되기 전까지는 참고만 하는 게 맞습니다.&lt;/li&gt;
&lt;li&gt;발표 점수는 제일 높은 강도 기준 - 기본값 high로 쓰면 그보다 낮을 수 있고, xhigh로 올리면 토큰을 더 씁니다.&lt;/li&gt;
&lt;li&gt;출시가 여러 번 밀림 - 7월 말부터 최소 다섯 번 연기됐다는 보도가 있습니다. 다음 버전 일정도 그대로 믿기 어렵습니다.&lt;/li&gt;
&lt;li&gt;빠른 버전은 API에 없음 - 2배 속도 모드는 Cursor와 Grok Build에서만 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째가 돈과 바로 이어집니다. 단가가 절반이라도 xhigh로 돌려서 토큰을 두 배 쓰면 내는 돈은 같아집니다. 회사도 &quot;작업 하나당 비용&quot;으로 비교하라고 하는데, 그 비용은 내 작업으로 직접 재봐야 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째는 일정을 믿고 계획을 세우는 분에게 해당합니다. 머스크는 4.8, 4.9, 5를 차례로 예고했습니다. 그런데 4.7 자체가 예고보다 두 달 늦게 나왔습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 용도별 그록 4.7 선택 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 발표, 값, 다른 모델의 자리, 제 사용 느낌을 합쳐 나름대로 정리한 표입니다. 출발점이지 정답은 아닙니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내 상황&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;그록 4.7은&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;싼 값에 빠른 답이 필요할 때&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;먼저 써볼 만함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;법률&amp;middot;전기공학 문서&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상위 모델과 같이 비교해볼 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;실시간 뉴스&amp;middot;X 글 검색&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;앱 기준으로 강점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;긴 코딩, 여러 파일 수정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오퍼스 5.5&amp;middot;페이블 5.1이 점수상 앞섬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;이미 Cursor를 쓰는 개발자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;모델 목록에서 바로 바꿔 시험 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 모델을 쓸지는 발표문이 정해주지 않습니다. 평소 하던 일 하나를 골라 그록 4.7과 지금 쓰는 모델에 같이 시켜보고, 결과와 낸 돈을 나란히 적어보는 게 제일 빠릅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 그록 4.7 처음 써볼 때 순서&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 사용자 - grok.com이나 X 앱에서 모델 고르는 메뉴를 봅니다. 4.7이 안 보이면 요금제 페이지에서 어느 플랜부터 열렸는지 확인합니다.&lt;/li&gt;
&lt;li&gt;Cursor 사용자 - 모델 목록에서 Grok 4.7을 고릅니다. 모든 요금제에서 된다고 회사가 밝혔습니다.&lt;/li&gt;
&lt;li&gt;API 사용자 - 모델 이름을 &lt;code&gt;grok-4.7&lt;/code&gt;로 넣습니다. 강도는 기본값 high로 시작하고, 부족하면 xhigh로 올립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 며칠은 새 일을 맡기지 말고 하던 일을 그대로 시켜보는 게 좋습니다. 그래야 잘된 게 모델 덕인지 알 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  비교 실험은 이렇게&lt;/b&gt;&lt;br /&gt;같은 질문을 그록 4.7과 지금 쓰는 모델에 넣고 결과, 걸린 시간, 낸 돈을 적어두세요. 단가가 절반이니 실제 낸 돈도 절반인지 보는 게 핵심입니다. 저는 사흘 해보고 &quot;빠르지만 1% 아쉽다&quot;는 답이 나왔습니다. 본인 답은 다를 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그록 4.7 무료로 쓸 수 있나요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 9월 기준 공식 발표문은 Cursor, Grok Build, API만 적었고 무료 플랜 얘기는 없습니다. 지금까지 새 모델은 슈퍼그록(월 $30) 이상에 먼저 열렸으니 grok.com/plans에서 확인하는 게 정확합니다. API는 쓴 만큼 내니 소액으로 시험은 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그록 4.7이 클로드 오퍼스 5.5보다 좋은가요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 조건에서 둘을 재본 바깥 자료가 아직 없습니다. 각 회사가 낸 점수표는 재는 방법이 달라서 바로 비교가 안 됩니다. 확실한 건 값이 절반이라는 것, 그리고 스페이스XAI 자체 표에서도 코딩과 터미널 작업은 클로드 상위 모델이 앞선다는 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그록 4.7은 코딩에 써도 되나요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;됩니다. Cursor와 Grok Build에 바로 들어가 있고, 회사 발표에서 코딩이 첫 번째 용도입니다. 다만 긴 터미널 작업 점수는 상위 모델보다 낮으니, 짧은 수정부터 시험해보는 순서가 손해가 적습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가격표와 점수표를 따로 보면 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그록 4.7은 &quot;가장 싼 최신 모델&quot;이지 &quot;가장 좋은 모델&quot;은 아닙니다. 회사도 그렇게 쓰지 않았습니다. 소넷급 값에 그보다 나은 결과를 노리는 모델이고, 법률&amp;middot;공학 같은 몇몇 분야에서는 상위 모델보다 높은 점수를 스스로 발표했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 점수가 내 작업에서도 나오는지는 직접 돌려봐야 압니다. 값에 끌려서 고르지도, 이름에 끌려서 피하지도 말고, 내 작업 하나로 재보고 정하면 됩니다. 이 글의 숫자는 2026년 9월 기준이고, 4.8이 나오면 표는 다시 써야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1790513621222&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&quot; data-og-description=&quot;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에 &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/E1NAH/dJMb9b4dYax/566Ub2FksbZbsK6oIWRGk0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/FjLCJ/dJMb8U9f0ZV/Q24vVIk2PwyKFdw5qerMP0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/bUXhNn/dJMb9dHKfAF/cSlBxhqLFiGlTg2yKJKt90/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-comparison-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/E1NAH/dJMb9b4dYax/566Ub2FksbZbsK6oIWRGk0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/FjLCJ/dJMb8U9f0ZV/Q24vVIk2PwyKFdw5qerMP0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=613_102_688_183,https://scrap.kakaocdn.net/dn/bUXhNn/dJMb9dHKfAF/cSlBxhqLFiGlTg2yKJKt90/img.jpg?width=1600&amp;amp;height=1200&amp;amp;face=1235_205_1385_367');&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;챗GPT 클로드 제미나이 그록 차이, AI 모델 회사별 장단점 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 비교를 2026년 9월 27일 기준으로 다시 정리했습니다. 9월 한 달 사이에 오픈AI, 앤트로픽, 구글, xAI 네 회사가 전부 새 모델을 내놓는 바람에, 9월 초에 정리한 표가 3주 만에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790513603770&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/phUSU/dJMb87gsPUq/Wsii49cEQ4oGBVpX3QQSm1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/yu1s0/dJMb9eUbkWM/lLvLNJq9kpKajdkSL5lxm1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/t5jNR/dJMb87OjpI4/gkoGAyDjt22MZRQ9RO4Nzk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/phUSU/dJMb87gsPUq/Wsii49cEQ4oGBVpX3QQSm1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/yu1s0/dJMb9eUbkWM/lLvLNJq9kpKajdkSL5lxm1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/t5jNR/dJMb87OjpI4/gkoGAyDjt22MZRQ9RO4Nzk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247');&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790513586970&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;오픈AI 커서 모델 공급 중단 머스크 감정싸움이 아니라 계약 조항 때문입니다&quot; data-og-description=&quot;오픈AI 커서 모델 공급 중단 발표가 2026년 8월 28일 밤에 나왔습니다. SpaceX가 커서(Cursor)를 인수한 지 2주 만에 오픈AI가 계약 종료를 통보한 건데, 헤드라인만 보면 머스크와 올트먼의 감정 싸움처&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason&quot; data-og-url=&quot;https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzgXbn/dJMb9bwobvc/ZKaLbQKvyjuvvDnSIv7MFK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=473_121_584_242,https://scrap.kakaocdn.net/dn/QZjkp/dJMb8Sp4pn7/pUSZqdseHVO4xbFJijKL91/img.jpg?width=800&amp;amp;height=536&amp;amp;face=473_121_584_242,https://scrap.kakaocdn.net/dn/nHowo/dJMb8TCwk24/m3kwPxuDl9IWNGqeZtRVdk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=708_195_841_341&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzgXbn/dJMb9bwobvc/ZKaLbQKvyjuvvDnSIv7MFK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=473_121_584_242,https://scrap.kakaocdn.net/dn/QZjkp/dJMb8Sp4pn7/pUSZqdseHVO4xbFJijKL91/img.jpg?width=800&amp;amp;height=536&amp;amp;face=473_121_584_242,https://scrap.kakaocdn.net/dn/nHowo/dJMb8TCwk24/m3kwPxuDl9IWNGqeZtRVdk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=708_195_841_341');&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;오픈AI 커서 모델 공급 중단 머스크 감정싸움이 아니라 계약 조항 때문입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오픈AI 커서 모델 공급 중단 발표가 2026년 8월 28일 밤에 나왔습니다. SpaceX가 커서(Cursor)를 인수한 지 2주 만에 오픈AI가 계약 종료를 통보한 건데, 헤드라인만 보면 머스크와 올트먼의 감정 싸움처&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790513567813&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;클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다&quot; data-og-description=&quot;클로드 오퍼스 5.5(Claude Opus 5.5)가 2026년 9월 22일에 나왔습니다. 이름만 보면 &amp;quot;제일 비싸고 제일 센 모델&amp;quot;처럼 들리는데, 지금 클로드 라인업에서는 둘 다 아닙니다. 이 글은 오퍼스 5.5가 다른 클로&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bs3lf3/dJMb8TCwkx9/7PIKkB79cKubhnEDsHlK0K/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bNsc7C/dJMb8TCwkya/SZbH8mmKpLGi15XkZaZsOk/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bdcFAh/dJMb8XkBZjG/NlVIVwLtNhTxk4WA6MqpgK/img.jpg?width=1712&amp;amp;height=1152&amp;amp;face=1246_144_1377_288&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-opus-5-5-comparison&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bs3lf3/dJMb8TCwkx9/7PIKkB79cKubhnEDsHlK0K/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bNsc7C/dJMb8TCwkya/SZbH8mmKpLGi15XkZaZsOk/img.jpg?width=800&amp;amp;height=538&amp;amp;face=582_70_642_135,https://scrap.kakaocdn.net/dn/bdcFAh/dJMb8XkBZjG/NlVIVwLtNhTxk4WA6MqpgK/img.jpg?width=1712&amp;amp;height=1152&amp;amp;face=1246_144_1377_288');&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;클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 오퍼스 5.5(Claude Opus 5.5)가 2026년 9월 22일에 나왔습니다. 이름만 보면 &quot;제일 비싸고 제일 센 모델&quot;처럼 들리는데, 지금 클로드 라인업에서는 둘 다 아닙니다. 이 글은 오퍼스 5.5가 다른 클로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>ai 모델 비교</category>
      <category>Grok 4.7</category>
      <category>Grok API</category>
      <category>xai 그록</category>
      <category>그록 4.7</category>
      <category>그록 가격</category>
      <category>그록 무료</category>
      <category>그록 사용법</category>
      <category>그록 클로드 비교</category>
      <category>스페이스XAI</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/170</guid>
      <comments>https://devwar.tistory.com/entry/grok-4-7-comparison#entry170comment</comments>
      <pubDate>Sun, 27 Sep 2026 21:59:09 +0900</pubDate>
    </item>
    <item>
      <title>클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다</title>
      <link>https://devwar.tistory.com/entry/claude-opus-5-5-comparison</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;oAYb0.jpg&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KxUDA/dJMcaamuC4O/udIoqLVs2VDDmlkOPCOwCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KxUDA/dJMcaamuC4O/udIoqLVs2VDDmlkOPCOwCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KxUDA/dJMcaamuC4O/udIoqLVs2VDDmlkOPCOwCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKxUDA%2FdJMcaamuC4O%2FudIoqLVs2VDDmlkOPCOwCk%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; alt=&quot;클로드 오퍼스 5.5 쓸 만한가, 짧은 대화만 하면 오히려 손해입니다&quot; loading=&quot;lazy&quot; width=&quot;1712&quot; height=&quot;1152&quot; data-filename=&quot;oAYb0.jpg&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 오퍼스 5.5(Claude Opus 5.5)가 2026년 9월 22일에 나왔습니다. 이름만 보면 &quot;제일 비싸고 제일 센 모델&quot;처럼 들리는데, 지금 클로드 라인업에서는 둘 다 아닙니다. 이 글은 오퍼스 5.5가 다른 클로드 모델과 뭐가 다른지, 내 용도에 굳이 이걸 써야 하는지를 표로 정리한 글입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;클로드 오퍼스, 소넷, 하이쿠 뭐가 다른 거예요?&quot;&lt;br /&gt;&quot;오퍼스 5.5가 페이블보다 좋은 건가요, 아닌가요?&quot;&lt;br /&gt;&quot;무료로도 오퍼스 5.5 쓸 수 있나요?&quot;&lt;br /&gt;&quot;코딩 안 하는데 오퍼스까지 필요할까요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 모델 이름은 매번 바뀌고, 발표문은 벤치마크 숫자로 가득합니다. 저도 새 모델이 나올 때마다 가격표부터 다시 봅니다. 이 글은 벤치마크 점수보다 &quot;돈 내고 쓸 만한가&quot;에 맞춰 썼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 아니어도 읽을 수 있게 용어는 나올 때마다 한 줄로 풀었습니다. 모든 숫자는 2026년 9월 기준 앤트로픽 공식 발표와 문서에서 가져왔습니다. 모델 가격과 라인업은 몇 달 단위로 바뀌니 읽는 시점에 다시 확인하는 게 안전합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클로드 오퍼스 5.5 한 줄 정리&lt;/li&gt;
&lt;li&gt;클로드 모델 이름 읽는 법&lt;/li&gt;
&lt;li&gt;오퍼스 5와 오퍼스 5.5 차이&lt;/li&gt;
&lt;li&gt;클로드 모델별 가격 비교&lt;/li&gt;
&lt;li&gt;오퍼스 5.5가 가장 비싼 모델이 아닌 이유&lt;/li&gt;
&lt;li&gt;클로드 오퍼스 5.5 사용 가능한 곳과 요금제&lt;/li&gt;
&lt;li&gt;오퍼스 5.5가 잘하는 일&lt;/li&gt;
&lt;li&gt;오퍼스 5.5 쓸 때 주의할 점&lt;/li&gt;
&lt;li&gt;용도별 클로드 모델 선택 기준&lt;/li&gt;
&lt;li&gt;오퍼스 5.5 처음 써볼 때 순서&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;이름보다 자리를 보면 됩니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 클로드 오퍼스 5.5 한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오퍼스 5.5는 앤트로픽이 만든 &quot;클로드 5.5&quot; 세대의 첫 번째 모델입니다. 클로드는 서비스 이름이고, 오퍼스 5.5는 그 안에서 고르는 모델 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 발표문은 이렇게 요약합니다. 대부분의 작업에서 상위 모델인 페이블 5.1과 비슷한 결과를 내고, 이전 모델인 오퍼스 5보다 운영 비용이 40% 적게 든다. 즉 &quot;더 세졌다&quot;보다 &quot;같은 일을 더 싸고 빠르게 한다&quot;에 무게가 실린 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표 시점에 앤트로픽은 소넷 5.5와 하이쿠 5.5도 몇 주 안에 낸다고 예고했습니다. 그러니까 오퍼스 5.5는 새 세대의 첫 주자이고, 이 글의 표 일부는 몇 주 뒤에 다시 써야 할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  오퍼스 5.5 핵심 세 가지&lt;/b&gt;&lt;br /&gt;- 2026년 9월 22일 출시, 개발자용 모델 ID는 &lt;code&gt;claude-opus-5-5&lt;/code&gt;&lt;br /&gt;- 성능은 페이블 5.1급, 비용은 오퍼스 5 대비 40% 절감 (앤트로픽 자체 측정)&lt;br /&gt;- 출력 속도는 오퍼스 5보다 30% 이상 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 클로드 모델 이름 읽는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 모델 이름은 &quot;등급 + 세대 번호&quot;입니다. 등급은 크기와 성능, 숫자는 세대입니다. 2026년 9월 기준으로 등급은 다섯 가지입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;등급&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;자리&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;지금 최신 버전&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;하이쿠(Haiku)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가장 작고 빠름, 가장 저렴&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;하이쿠 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;소넷(Sonnet)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;속도와 성능의 중간&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;소넷 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;오퍼스(Opus)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;큰 모델, 긴 작업용&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오퍼스 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;페이블(Fable)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오퍼스 위, 가장 어려운 추론용&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블 5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;미토스(Mythos)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블과 같은 모델, 승인 기관만 사용&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;미토스 5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는 오퍼스가 맨 위였습니다. 지금은 페이블이 그 위에 있습니다. 그래서 &quot;오퍼스 = 최상위&quot;라는 기억은 2026년 기준으로는 한 단계 밀린 정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번호가 붙는 순서도 등급마다 다릅니다. 오퍼스는 5.5인데 소넷은 5, 하이쿠는 4.5입니다. 세대 번호가 같아야 같은 시기에 나온 건 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 오퍼스 5와 오퍼스 5.5 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 오퍼스인데 0.5가 올라간 게 얼마나 큰 차이인지 보겠습니다. 발표문에서 숫자로 밝힌 항목만 표로 뽑았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;오퍼스 5&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;오퍼스 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;입력 가격 (100만 토큰)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;출력 가격 (100만 토큰)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$25&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;캐시 읽기 가격&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$0.50&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;출력 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기준&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;30% 이상 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;실제 작업 비용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기준&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 40% 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;지식 작업 점수 (GDPval-AA)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,708&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1,846&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰은 AI가 글을 세는 단위입니다. 한글은 대략 글자 1~2개가 토큰 하나라고 보면 됩니다. &quot;100만 토큰에 4달러&quot;는 A4 수백 장을 읽히는 데 4달러라는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 읽기는 한 번 읽힌 자료를 다시 쓸 때 매기는 요금입니다. 같은 문서를 놓고 여러 번 질문하거나, 코딩 도구가 프로젝트 파일을 계속 참고할 때 이 요금이 대부분을 차지합니다. 그래서 이 항목이 60% 내린 게 긴 작업에서는 단가 인하보다 더 크게 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격이 20% 내렸는데 실제 비용은 40% 준다고 하는 이유가 있습니다. 5.5가 같은 일을 할 때 토큰을 덜 쓰기 때문입니다. 말을 덜 하고, 시행착오를 덜 한다는 뜻입니다. 초기 테스터 여러 곳이 &quot;같은 작업을 절반 정도의 단계로 끝냈다&quot;고 보고했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 클로드 모델별 가격 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다른 등급과 나란히 놓고 보겠습니다. 2026년 9월 기준 API 가격입니다. API는 개발자가 자기 프로그램에서 모델을 불러 쓰는 방식이고, 쓴 만큼 과금됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;입력 $/100만 토큰&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;출력 $/100만 토큰&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;하이쿠 4.5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$1&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;소넷 5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;오퍼스 5.5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;페이블 5.1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오퍼스 5.5는 소넷 5의 딱 2배, 페이블 5.1의 40%입니다. 페이블 5.1과 성능이 비슷하다는 발표가 맞다면 가격 대비로는 오퍼스 5.5가 유리한 자리에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이건 API 가격입니다. 클로드 앱(claude.ai)을 월 구독으로 쓰는 분은 토큰 단가가 아니라 &quot;5시간당 얼마나 쓸 수 있나&quot;가 중요합니다. 이건 6번에서 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 오퍼스 5.5가 가장 비싼 모델이 아닌 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목에 쓴 얘기를 여기서 회수합니다. &quot;오퍼스&quot;라는 이름 때문에 가장 비싼 모델로 아는 분이 많은데, 4번 표에서 봤듯이 페이블 5.1이 2.5배 더 비쌉니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 페이블이 그만큼 더 좋은가. 앤트로픽 스스로 &quot;벤치마크 점수 차이보다 실제 체감 차이는 더 좁다&quot;고 적었습니다. 공식 문서의 안내도 단순합니다. 대부분의 작업은 오퍼스 5.5로 시작하고, 오퍼스 5.5를 높은 강도로 돌려도 부족할 때만 페이블 5.1로 올리라는 겁니다. 속도가 더 중요하면 소넷 5입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 오퍼스 5.5는 &quot;최상위&quot;가 아니라 &quot;기본값&quot; 자리로 나온 모델입니다. 이름의 무게와 실제 위치가 다릅니다. 이걸 모르면 페이블에 돈을 더 쓰거나, 반대로 오퍼스라는 이름에 겁먹고 소넷에만 머무르게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 클로드 오퍼스 5.5 사용 가능한 곳과 요금제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓸 수 있는 통로는 크게 셋입니다. 표로 구분했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;통로&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;누가 쓰나&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;오퍼스 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;클로드 앱 (claude.ai)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일반 사용자, 월 구독&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Pro 이상에서 선택 가능, 무료 플랜은 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;클로드 코드 (Claude Code)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 터미널&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;/model&lt;/code&gt; 명령으로 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;API &amp;middot; 클라우드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자, 자체 서비스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;AWS, 구글 클라우드, MS 애저에서 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 플랜에서 오퍼스 5.5는 안 됩니다. 앤트로픽 가격 페이지 비교표에서 오퍼스 계열은 Pro 이상에만 들어 있습니다. 무료로 클로드 앱을 쓰고 있다면 소넷 계열이 배정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 발표에서 구독자용 변화도 있었습니다. Pro, Max, Team 요금제의 5시간 사용 한도가 올라갔고, 원하는 때 한 번 쓸 수 있는 &quot;사용 한도 초기화권&quot;이 지급됐습니다. 한도에 걸렸을 때 기다리지 않고 바로 풀 수 있는 쿠폰이라고 보면 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  클로드 코드&amp;middot;API에는 고속 모드가 따로 있음&lt;/b&gt;&lt;br /&gt;최대 2.5배 빠른 대신 입력 $8, 출력 $40으로 기본 가격의 2배입니다. 속도가 곧 돈인 경우가 아니면 기본 모드로 충분합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 오퍼스 5.5가 잘하는 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표문에서 구체적인 사례로 든 것만 추렸습니다. 벤치마크 점수는 뺐습니다. 점수는 앤트로픽도 &quot;실제 차이를 보는 데 덜 믿을 만하다&quot;고 했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오래 걸리는 큰 작업 - 한 테스터가 68만 줄짜리 코드 이전을 하루 안에 끝냈다고 합니다. 사람이 며칠씩 붙어야 하는 반복 작업에 강합니다.&lt;/li&gt;
&lt;li&gt;숫자를 지어내지 않는 조사 - 회사 실적 보고서를 쓰게 하고 모든 숫자를 출처와 대조하는 내부 테스트에서 18번 중 16번 통과했습니다. 페이블 5.1과 오퍼스 5는 한 번도 통과하지 못했습니다.&lt;/li&gt;
&lt;li&gt;읽기 쉬운 글 - 오퍼스 5의 단골 불만이 &quot;말이 길고 따라가기 어렵다&quot;였는데, 5.5는 중요한 내용을 앞에 두고 짧게 씁니다. 여러 테스터가 &quot;내가 쓰는 방식대로 쓴다&quot;고 평했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째가 눈에 띕니다. AI가 그럴듯한 숫자를 지어내는 문제는 여전히 흔한데, 오퍼스 5.5는 못 찾은 숫자를 못 찾았다고 두는 쪽에 가깝다는 뜻입니다. 자료 조사나 보고서 초안에 AI를 쓰는 분이라면 이 차이가 검수 시간으로 바로 돌아옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째는 비개발자에게 제일 체감이 클 겁니다. 보고서 초안, 회의록 정리, 긴 메일 요약 같은 일에서 다시 손볼 양이 줄어든다는 뜻입니다. 한 테스터는 오퍼스 5보다 답이 40% 짧아졌는데 정확도는 그대로였다고 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 쪽에서는 여러 저장소에 걸친 작업, 코드 검토, 성능 개선 같은 &quot;한 번에 여러 파일을 봐야 하는 일&quot;에서 차이가 난다고 합니다. 파일 하나 고치는 작은 일이라면 소넷 5와 큰 차이를 못 느낄 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 오퍼스 5.5 쓸 때 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 얘기만 있는 건 아닙니다. 발표문과 문서에 적힌 제약을 정리합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;주의점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;무슨 뜻인가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;생각 모드를 끌 수 없음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;답하기 전 스스로 생각하는 과정이 항상 켜져 있어 짧은 질문에도 토큰이 조금 더 듦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보안&amp;middot;생물학 안전장치&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;해당 분야 요청은 자동으로 다른 모델(오퍼스 4.8, 오퍼스 5)로 넘어감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;무료 플랜 불가&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;앱에서는 Pro 이상 구독 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;기본 강도가 중간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블&amp;middot;소넷 5는 기본이 &quot;높음&quot;이라 같은 작업이라도 토큰 사용량이 다름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 항목은 개발자에게 특히 중요합니다. 자기 코드의 버그를 찾고 고치는 일상 작업은 되지만, 보안 분석 쪽 요청은 대부분 오퍼스 4.8로 자동 교체됩니다. 이걸 모르고 쓰면 &quot;왜 갑자기 답이 달라지지?&quot; 싶을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 번째도 가격 비교할 때 빠뜨리기 쉬운 부분입니다. 단가가 싸도 기본 강도가 다르면 실제 청구액은 직접 돌려봐야 압니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 용도별 클로드 모델 선택 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앤트로픽 안내와 가격, 발표문의 사례를 합쳐서 제 나름대로 정리한 표입니다. 정답은 아니고 출발점입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내 상황&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;먼저 볼 모델&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;채팅, 요약, 짧은 글&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;소넷 5 (또는 무료 플랜 기본 모델)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보고서&amp;middot;문서 작성, 긴 자료 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오퍼스 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;코드 수정, 여러 파일 걸친 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오퍼스 5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;대량 자동 처리, 비용 최소화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;하이쿠 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;오퍼스 5.5로도 안 풀리는 문제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블 5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 가지. 어떤 모델을 쓸지는 발표문이나 블로그가 정해주는 게 아닙니다. 본인 작업을 하나 골라 두 모델에 같이 시켜보고 결과와 청구액을 비교하는 게 가장 확실합니다. 남의 벤치마크보다 내 작업 하나가 더 정확한 기준입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 오퍼스 5.5 처음 써볼 때 순서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 클로드를 쓰고 있다면 별도 설치는 없습니다. 통로별로 이렇게 하면 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클로드 앱 - 대화창의 모델 선택 메뉴에서 Opus 5.5를 고릅니다. Pro 이상 구독이어야 목록에 보입니다.&lt;/li&gt;
&lt;li&gt;클로드 코드 - 대화 중에 &lt;code&gt;/model&lt;/code&gt;을 입력하고 메뉴에서 Opus 5.5를 선택합니다.&lt;/li&gt;
&lt;li&gt;API - 모델 이름을 &lt;code&gt;claude-opus-5-5&lt;/code&gt;로 바꿉니다. 오퍼스 5에서 옮긴다면 공식 문서에 이전 가이드가 있으니 그것부터 봅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 며칠은 평소 하던 작업을 그대로 시켜보는 게 좋습니다. 새 모델이라고 새 일을 맡기면 잘된 게 모델 덕인지 판단이 안 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  비교 실험은 이렇게&lt;/b&gt;&lt;br /&gt;같은 프롬프트를 소넷 5와 오퍼스 5.5에 각각 넣고 결과 품질, 걸린 시간, 토큰 사용량을 적어두세요. 사흘만 해보면 내 작업에서 2배 가격이 값을 하는지 답이 나옵니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클로드 오퍼스 5.5 무료로 쓸 수 있나요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안 됩니다. 2026년 9월 기준 클로드 앱 무료 플랜에는 오퍼스 계열이 없고 Pro 이상 구독이 필요합니다. API는 쓴 만큼 과금이라 소액으로 시험은 가능합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오퍼스 5.5와 페이블 5.1 중 뭘 써야 하나요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앤트로픽 공식 안내는 오퍼스 5.5로 시작하고, 높은 강도로 돌려도 부족할 때만 페이블로 올리라는 겁니다. 가격이 2.5배 차이 나니 먼저 오퍼스 5.5로 내 작업이 되는지 확인하는 순서가 손해가 적습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소넷 5 쓰던 사람이 오퍼스 5.5로 바꿀 이유가 있나요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 대화 위주면 굳이 없습니다. 긴 문서를 다루거나 여러 단계 작업을 한 번에 맡길 때 차이가 납니다. 그 작업이 한 달에 몇 번 없다면 소넷 5로 두고 필요할 때만 바꾸는 게 낫습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이름보다 자리를 보면 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오퍼스 5.5는 &quot;가장 센 모델&quot;이 아니라 &quot;웬만하면 이걸로 시작하라&quot;는 자리에 나온 모델입니다. 페이블보다 싸고, 오퍼스 5보다 싸고 빠르고, 글은 짧게 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 내 작업에 맞는지는 표가 아니라 직접 돌려본 결과가 답합니다. 발표문 숫자는 참고만 하고, 선택은 본인 작업 기준으로 하면 됩니다. 이 글의 수치는 2026년 9월 기준이고, 소넷 5.5와 하이쿠 5.5가 나오면 표의 절반은 다시 써야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1790507397382&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&quot; data-og-description=&quot;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다. &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZBAS6/dJMb9lls0EN/W0FrxAHiWQSVUlYShb1ON0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/Bncxo/dJMb85XfEe6/b49HabxKEaJ3owmK0ASck0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/ciu0t9/dJMb85XfEe5/QxftqTnqURtvZjtjbAVps1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZBAS6/dJMb9lls0EN/W0FrxAHiWQSVUlYShb1ON0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/Bncxo/dJMb85XfEe6/b49HabxKEaJ3owmK0ASck0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/ciu0t9/dJMb85XfEe5/QxftqTnqURtvZjtjbAVps1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276');&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790507369584&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&quot; data-og-description=&quot;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbAaLZ/dJMb896p587/s6tlkGx3EiWAs7UKwkV9lk/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/dYjH1U/dJMb9dHKfbP/fPgvkZ72mBhIxkeCLJKW0k/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/ibA01/dJMb84YkYOb/A3RUbGoYtCnMcBUIuDWgQ1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbAaLZ/dJMb896p587/s6tlkGx3EiWAs7UKwkV9lk/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/dYjH1U/dJMb9dHKfbP/fPgvkZ72mBhIxkeCLJKW0k/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/ibA01/dJMb84YkYOb/A3RUbGoYtCnMcBUIuDWgQ1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249');&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790507356972&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; data-og-description=&quot;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &amp;quot;코딩과 지식 노동에서 가장 진보한 모델&amp;quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oZcVK/dJMb8PGSwPE/D8lOR9H6OVAd2TIzkTeZSK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/5Ti0k/dJMb8Z3NXi2/swgwPXpLKU9x2V0r7ynug1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/gKtdv/dJMb9fZRh28/kTYnpSLb4qdsi6T06gJyIK/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oZcVK/dJMb8PGSwPE/D8lOR9H6OVAd2TIzkTeZSK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/5Ti0k/dJMb8Z3NXi2/swgwPXpLKU9x2V0r7ynug1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/gKtdv/dJMb9fZRh28/kTYnpSLb4qdsi6T06gJyIK/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224');&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790507353509&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;GPT-6 아스트라 출시 내 챗GPT에 아직 안 뜨는 데 이유가 있습니다&quot; data-og-description=&quot;GPT-6 아스트라(GPT-6 Astra)가 2026년 9월 3일 나왔습니다. 1년 넘게 &amp;quot;GPT-6가 언제 나오냐&amp;quot;는 말이 돌았고, 8월엔 보안 문제로 출시가 미뤄졌다가 결국 나온 겁니다. 오픈AI(OpenAI) 사장은 &amp;quot;AGI 시대에 들어&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/gpt-6-astra-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/gpt-6-astra-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIhW9j/dJMb9efz2K6/6vIukFUxhgKxHn8oRQF7KK/img.png?width=800&amp;amp;height=600&amp;amp;face=512_57_590_143,https://scrap.kakaocdn.net/dn/dqpvDl/dJMb9fr1kkZ/w9NkhgKNUrtl4HGe744ZT0/img.png?width=800&amp;amp;height=600&amp;amp;face=512_57_590_143,https://scrap.kakaocdn.net/dn/YUriW/dJMb9kUoRsM/HbKLzkXov0VV6rHfHZyQl0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=923_99_1079_270&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/gpt-6-astra-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/gpt-6-astra-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIhW9j/dJMb9efz2K6/6vIukFUxhgKxHn8oRQF7KK/img.png?width=800&amp;amp;height=600&amp;amp;face=512_57_590_143,https://scrap.kakaocdn.net/dn/dqpvDl/dJMb9fr1kkZ/w9NkhgKNUrtl4HGe744ZT0/img.png?width=800&amp;amp;height=600&amp;amp;face=512_57_590_143,https://scrap.kakaocdn.net/dn/YUriW/dJMb9kUoRsM/HbKLzkXov0VV6rHfHZyQl0/img.png?width=1448&amp;amp;height=1086&amp;amp;face=923_99_1079_270');&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;GPT-6 아스트라 출시 내 챗GPT에 아직 안 뜨는 데 이유가 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GPT-6 아스트라(GPT-6 Astra)가 2026년 9월 3일 나왔습니다. 1년 넘게 &quot;GPT-6가 언제 나오냐&quot;는 말이 돌았고, 8월엔 보안 문제로 출시가 미뤄졌다가 결국 나온 겁니다. 오픈AI(OpenAI) 사장은 &quot;AGI 시대에 들어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1790507349345&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&quot; data-og-description=&quot;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &amp;quot;가장 똑똑한 일꾼 모델&amp;quot;이라고 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc1c2z/dJMb9g5wO05/OwkKGikEWqYMsGFh1ThMSK/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bQHP8k/dJMb85XfEeA/Ya0kvi8zb4KWsgY87roJy1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bddF7c/dJMb8SXUjTi/xI5IGeVB7kGOxk2S0BCqaK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc1c2z/dJMb9g5wO05/OwkKGikEWqYMsGFh1ThMSK/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bQHP8k/dJMb85XfEeA/Ya0kvi8zb4KWsgY87roJy1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bddF7c/dJMb8SXUjTi/xI5IGeVB7kGOxk2S0BCqaK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309');&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &quot;가장 똑똑한 일꾼 모델&quot;이라고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>ai 모델 선택</category>
      <category>Claude API 가격</category>
      <category>Claude Opus 5.5</category>
      <category>앤트로픽</category>
      <category>클로드 모델 비교</category>
      <category>클로드 소넷 오퍼스 차이</category>
      <category>클로드 오퍼스 5.5</category>
      <category>클로드 요금제</category>
      <category>클로드 코드</category>
      <category>클로드 페이블 5.1</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/169</guid>
      <comments>https://devwar.tistory.com/entry/claude-opus-5-5-comparison#entry169comment</comments>
      <pubDate>Sun, 27 Sep 2026 20:27:20 +0900</pubDate>
    </item>
    <item>
      <title>웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6l9bY/dJMcaa7Aikh/dCqKN0MtUQQ1m6fsX2Ij3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6l9bY/dJMcaa7Aikh/dCqKN0MtUQQ1m6fsX2Ij3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6l9bY/dJMcaa7Aikh/dCqKN0MtUQQ1m6fsX2Ij3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6l9bY%2FdJMcaa7Aikh%2FdCqKN0MtUQQ1m6fsX2Ij3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;웹 API 서버 디도스 방어에 스로틀링 기술이 필수인 숨은 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 프론트엔드 성능 최적화와 백엔드 서버 방어에 있어서 스로틀링(Throttling)은 선택이 아닌 필수 기술입니다. 트래픽 폭주로 인한 브라우저 렌더링 지연과 백엔드 서버 마비를 막으려면 이 개념을 명확히 이해하고 아키텍처 전반에 적용해야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;사용자가 결제 버튼을 연타해서 동일한 주문이 두 번 들어갔어요.&quot;&lt;br /&gt;&quot;디도스 공격도 아닌데 주말에 이벤트만 열면 서버 CPU가 100%를 찍고 뻗어버립니다.&quot;&lt;br /&gt;&quot;화면 스크롤을 조금만 내려도 브라우저가 뚝뚝 끊겨서 쓸 수가 없네요.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2012년 무렵 처음 운영 서버를 띄우고 이벤트를 진행했을 때 겪었던 실제 상황들입니다. 그때는 원인을 몰라 무작정 클라우드 서버 사양(Scale-up)만 올리며 비용을 낭비했습니다. 로그를 뜯어보고 흐름을 분석하면서, 클라이언트가 발생시키는 무의미한 호출을 코드 레벨에서 제어하지 않으면 아무리 좋은 서버를 써도 결국 한계에 부딪힌다는 것을 한참 뒤에야 깨달았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 스로틀링의 기본 개념과 함께, 서버와 클라이언트의 1:N 구조에서 이 기술이 왜 필수적인지 알아봅니다. 또한 직접 코드를 짜는 대신 프레임워크의 지원을 받아 프론트엔드 부하부터 백엔드의 디도스(DDoS) 방어까지 안전하게 구현하는 실무적인 관점을 정리해 보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스로틀링(Throttling)이란 무엇인가?&lt;/li&gt;
&lt;li&gt;스로틀링 vs 디바운싱: 비유와 실무 비교&lt;/li&gt;
&lt;li&gt;서버는 하나, 클라이언트는 수만 개: 방어벽이 필수인 이유&lt;/li&gt;
&lt;li&gt;프론트엔드가 유발하는 무의미한 부하와 렌더링 지연 방어&lt;/li&gt;
&lt;li&gt;백엔드 타격 방어: 악의적인 봇 트래픽과 디도스(DDoS) 차단&lt;/li&gt;
&lt;li&gt;자바스크립트 타이머로 직접 구현할 때 발생하는 위험성&lt;/li&gt;
&lt;li&gt;바퀴를 다시 발명하지 마라: 프레임워크 내장 기능 적극 활용&lt;/li&gt;
&lt;li&gt;클라우드 인프라와 리버스 프록시(Reverse Proxy)에서의 1차 방어&lt;/li&gt;
&lt;li&gt;실무 도입 시 놓치기 쉬운 실행 주기(Interval) 튜닝&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스로틀링(Throttling)이란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스로틀링은 짧은 시간 동안 연속해서 발생하는 수많은 이벤트나 요청을 &lt;b&gt;일정한 시간 간격으로 단 한 번씩만 실행되도록 강제하는 흐름 제어 기술&lt;/b&gt;입니다. 아무리 많은 요청이 몰아쳐도 개발자가 미리 설정해 둔 주기마다 딱 한 번의 로직만 처리되도록 만드는 일종의 밸브 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리적인 세계로 비유하자면 놀이공원 후룸라이드 탑승장과 같습니다. 대기 줄에 수천 명의 사람이 밀려 있어도, 안전요원은 정확히 1분에 한 대씩만 보트를 출발시킵니다. 만약 통제 없이 사람들이 한 번에 쏟아져 들어간다면 큰 사고가 나겠죠. 시스템에서도 마찬가지로 과도한 트래픽 병목을 막고 전체 서비스가 다운되는 것을 막기 위해 이런 통제 장치가 필요합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  스로틀링 요약&lt;/b&gt;&lt;br /&gt;무한히 발생하는 이벤트 스트림을 일정한 간격으로 잘게 쪼개어, 정해진 시간에 단 한 번의 실행만 보장하는 최적화 기법입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 스로틀링 vs 디바운싱: 비유와 실무 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 제어 기법을 논할 때 스로틀링과 항상 짝을 이뤄 등장하는 것이 디바운싱(Debouncing)입니다. 두 개념을 헷갈리는 경우가 많은데, 동작하는 타이밍과 쓰임새가 완전히 다릅니다. 이 차이를 명확히 알아야 엉뚱한 곳에 적용하여 사용자 경험을 해치는 실수를 막을 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;비교 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;스로틀링 (Throttling)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;디바운싱 (Debouncing)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;동작 원리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이벤트가 계속 발생해도 &lt;b&gt;일정 주기마다 1번씩 꾸준히&lt;/b&gt; 실행&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;연속된 이벤트가 &lt;b&gt;완전히 멈춘 후&lt;/b&gt; 일정 시간이 지나면 &lt;b&gt;마지막에 1번만&lt;/b&gt; 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;직관적 비유&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;일정한 간격으로 물이 떨어지는 수도꼭지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;사람이 다 타야 문이 닫히는 엘리베이터&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;프론트엔드 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;무한 스크롤, 화면 리사이즈 최적화&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;검색창 자동완성, 중복 가입 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;백엔드 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;API 트래픽 제한 (Rate Limiting)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;데이터베이스 일괄 쓰기(Batch) 지연&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무한 스크롤에 디바운싱을 쓰면 스크롤을 멈출 때까지 다음 콘텐츠가 뜨지 않아 답답하고, 반대로 검색어 자동완성에 스로틀링을 쓰면 단어를 채 치기도 전에 불완전한 검색어로 API가 낭비됩니다. 도구의 목적에 맞는 선택이 중요합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 서버는 하나, 클라이언트는 수만 개: 방어벽이 필수인 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 공부를 갓 시작했을 때는 내가 띄운 로컬 컴퓨터 창 하나와 서버 하나만 통신하므로 트래픽의 무서움을 체감하기 어렵습니다. 하지만 실제 운영 환경의 아키텍처는 극단적인 1:N 구조를 띕니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를 제공하는 백엔드 서버 인스턴스는 고작 1대에서 많아야 수십 대 수준이지만, 여기에 접속하는 사용자(클라이언트 앱, 브라우저)는 적게는 수천에서 많게는 수백만 대에 이릅니다. 만약 1만 명의 사용자가 악의 없이 그저 스크롤을 내리거나 버튼을 몇 번 연속해서 눌렀을 뿐인데 그게 그대로 API 요청으로 이어진다면 어떻게 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 클라이언트는 1초에 10번의 요청을 보낸 것에 불과하지만, 서버 입장에서는 1초에 10만 번(100,000 TPS)의 요청이 쏟아지는 쓰나미가 됩니다. 아무리 튜닝이 잘 된 데이터베이스라도 커넥션 풀(Connection Pool)은 순식간에 고갈되고, 서버는 메모리 부족으로 뻗어버립니다. 이것이 프론트엔드와 백엔드 양측 모두에 흐름을 통제하는 방어벽을 세워야 하는 가장 큰 이유입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 프론트엔드가 유발하는 무의미한 부하와 렌더링 지연 방어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 비대칭 구조에서 가장 앞단에 위치한 프론트엔드의 역할이 막중합니다. 브라우저에서 마우스 이동이나 화면 크기 조절, 스크롤 이벤트는 사용자가 인지하지 못하는 사이 1초에도 수십, 수백 번씩 발동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트가 터질 때마다 무거운 DOM 조작을 하거나 상태를 업데이트하면 브라우저는 레이아웃을 다시 그리는 리플로우(Reflow) 작업에 짓눌려 화면이 멈춰버립니다. 더 큰 문제는 이 로직 안에 백엔드 API 호출이 포함되어 있을 때입니다. 앞서 언급한 1:N 구조에 의해 백엔드 서버까지 연쇄적인 장애를 겪게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이곳에 200ms 주기의 스로틀링을 걸어두면, 사용자가 스크롤을 맹렬히 내리거나 마우스를 미친 듯이 흔들어도 브라우저는 0.2초에 딱 한 번씩만 연산을 수행합니다. 시각적으로는 이질감이 없으면서도 브라우저 렌더링 연산량과 네트워크 요청을 90% 이상 덜어내는 강력한 1차 방어선이 구축됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 백엔드 타격 방어: 악의적인 봇 트래픽과 디도스(DDoS) 차단&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드에서 아무리 제어를 잘해두더라도, 악의적인 해커나 크롤링 봇은 브라우저를 거치지 않고 백엔드 API 서버를 직접 타격합니다. 특히 다수의 봇넷을 동원해 무차별적인 요청을 쏟아붓는 디도스 공격 상황이라면 백엔드 자체의 방어 로직이 반드시 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 영역에서는 스로틀링을 흔히 &lt;b&gt;처리율 제한(Rate Limiting)&lt;/b&gt;이라고 부릅니다. 특정 IP 주소, API 키, 혹은 사용자 계정을 기준으로 1분에 최대 허용 가능한 요청 수는 100회라는 식의 단단한 규칙을 세우는 것입니다. 짧은 시간 안에 시스템 자원을 갉아먹는 무차별 대입 공격을 막아내는 핵심 원리이기도 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기준을 초과하는 트래픽이 인입되면 서버는 복잡한 비즈니스 로직이나 DB 쿼리를 아예 타지 않고 즉시 429(Too Many Requests) HTTP 상태 코드를 반환하여 돌려보냅니다. 정상적인 사용자들의 요청은 보호하면서 악성 트래픽만 빠르고 가볍게 튕겨내는 생존 전략입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 자바스크립트 타이머로 직접 구현할 때 발생하는 위험성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스로틀링의 원리가 간단해 보인다고 해서 프론트엔드나 백엔드 코드에서 타이머 함수를 이용해 직접 구현하려는 시도는 실무에서 꽤 위험합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영 환경의 요청은 다중 스레드나 비동기 이벤트 루프 위에서 극도로 복잡하게 얽혀서 들어옵니다. 이를 직접 제어하려다 보면 상태 변수가 꼬여 대기열이 영원히 풀리지 않거나, 메모리 누수가 발생하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 동시성 이슈를 완벽하게 제어하지 못하면 트래픽이 튀는 찰나의 순간에 막아야 할 악성 요청들이 타이머의 틈을 타고 그대로 서버 안으로 침투해버리는 등 예상치 못한 치명적인 버그를 양산하게 됩니다. 코딩 테스트가 아니라면 굳이 밑바닥부터 짤 이유가 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 바퀴를 다시 발명하지 마라: 프레임워크 내장 기능 적극 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 실무에서는 절대 스로틀링 로직을 직접 짜지 않습니다. 대신 여러분이 현재 사용 중인 언어나 프레임워크 생태계에서 공식적으로 지원하거나, 이미 수백만 번의 테스트를 거쳐 검증된 기능들을 가져다 쓰는 것을 강력히 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바(Java)의 스프링(Spring) 진영이나 Node.js 같은 백엔드 프레임워크들은 이미 대용량 트래픽을 처리하며 안정성이 입증된 처리율 제한 모듈이나 어노테이션을 생태계 내에 탄탄하게 갖추고 있습니다. 이를 활용하면 단 몇 줄의 설정만으로 IP 기반 차단이나 토큰 버킷 알고리즘을 아주 우아하게 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드의 리액트(React)나 뷰(Vue) 환경에서도 마찬가지입니다. 컴포넌트의 렌더링 생명주기와 상태 관리에 맞춰 안전하게 타이머를 정리해 주는 전용 훅이나, 검증된 범용 유틸리티 라이브러리가 널리 쓰이고 있습니다. 우리가 해야 할 일은 도구를 직접 만드는 것이 아니라, 프로젝트 성격에 맞는 내장 기능을 찾아 임계값만 전략적으로 튜닝하는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 클라우드 인프라와 리버스 프록시(Reverse Proxy)에서의 1차 방어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션(코드) 레벨에서 프레임워크의 도움을 받아 막는 것도 중요하지만, 악성 트래픽이 웹 애플리케이션 서버 자원에 도달하기 전에 인프라 레벨에서 미리 차단하는 것이 서버 리소스 방어에 가장 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 환경이라면 API Gateway나 WAF(웹 방화벽)에서 처리율 제한 규칙을 아주 쉽게 설정할 수 있습니다. Nginx 같은 웹 서버를 앞단에 리버스 프록시로 두고 있다면 내장된 제한 모듈을 통해 초당 허용 요청 수와 버퍼 크기를 지정해 단단한 1차 방어벽을 칠 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  다층 방어(Defense in Depth) 전략&lt;/b&gt;&lt;br /&gt;실무 아키텍처에서는 인프라 앞단에서 무지성 봇 트래픽이나 디도스를 1차로 스로틀링하고, 백엔드 프레임워크 내부에서 유저 계정이나 비즈니스 로직에 맞춘 정교한 2차 스로틀링을 구현하는 다층 방어 방식을 취합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 실무 도입 시 놓치기 쉬운 실행 주기(Interval) 튜닝&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크를 이용해 스로틀링을 무사히 적용했다 하더라도, 실행 주기를 잘못 설정하면 서비스의 품질이 크게 떨어질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 무한 스크롤 이벤트에 1초라는 긴 주기를 걸었다고 가정해 봅시다. 사용자가 화면을 빠르게 내려서 이미 바닥에 닿았는데도, 브라우저는 1초가 지나기 전까지는 스크롤 위치를 계산하지 않습니다. 결국 사용자는 빈 화면을 한참 쳐다보다가 뒤늦게 다음 콘텐츠가 로딩되는 답답함을 겪게 됩니다. 시각적인 피드백이 중요한 프론트엔드 작업은 보통 100ms ~ 250ms 사이가 적당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 백엔드 로그인 API의 무차별 대입 방어용이라면 500ms ~ 1000ms(1초)로 넉넉하게 잡는 것이 낫습니다. 정상적인 사용자가 1초 안에 로그인을 연속해서 두세 번 시도할 일은 없기 때문입니다. 적용하는 도메인의 성격에 맞춰 사용자가 불편함을 느끼지 않는 최소한의 선을 찾는 것이 핵심입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프론트엔드와 백엔드 중 어느 쪽 한 곳에만 적용해도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 1:N 아키텍처 환경에서는 양쪽 모두에 적용해야 합니다. 프론트엔드의 스로틀링은 정상 사용자의 브라우저 렌더링 자원을 아끼고 실수로 인한 버튼 연타를 막는 목적입니다. 반면 백엔드의 스로틀링은 프론트엔드를 거치지 않고 직접 들어오는 악의적인 해커나 디도스로부터 서버를 지키는 최후의 보루입니다. 방어의 성격이 다르기 때문에 이중으로 구축하는 것이 실무의 정석입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자가 많아져서 서버(Scale-out)를 늘려도 스로틀링이 필요한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 여러 대 늘리더라도 단일 서버가 처리할 수 있는 초당 한계치는 존재합니다. 로드밸런서가 트래픽을 분산해주긴 하지만, 디도스나 대형 이벤트 트래픽 폭주 상황에서는 분산된 트래픽조차 각 서버의 물리적 한계치를 훌쩍 넘겨버립니다. 서버 대수를 늘리는 것과 별개로 애플리케이션 자체가 수용할 수 없는 트래픽을 거절하는 흐름 제어 장치는 무조건 있어야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 스로틀링의 개념과 디바운싱과의 차이, 그리고 서버 1대에 클라이언트 수만 대가 붙는 실무 아키텍처에서 이 기술이 왜 생존과 직결되는지 살펴보았습니다. 쏟아지는 트래픽 앞에 무방비로 열려있는 API와 이벤트 리스너는 언제 터질지 모르는 시한폭탄과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 자꾸 버벅거리고 다운된다고 해서 무작정 비싼 클라우드 서버로 사양을 올리기 전에, 우리가 감당해야 할 트래픽의 유입 밸브를 제대로 조절하고 있는지 먼저 점검해 보세요. 직접 구현하려는 유혹을 버리고 프레임워크가 제공하는 탄탄한 기능을 활용한다면, 적은 노력으로도 디도스와 트래픽 폭주로부터 서비스의 생명줄을 든든하게 지켜낼 수 있을 것입니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787232371253&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;방화벽 뜻과 유래, 컴퓨터 보안에 왜 '불(Fire) 막는 벽'이라는 이름이 붙었을까?&quot; data-og-description=&quot;컴퓨터 보안에서 방화벽(Firewall)은 외부의 악의적인 공격으로부터 내부 네트워크를 보호하는 가장 기본적인 보안 시스템입니다.해킹이나 랜섬웨어 등 사이버 위협이 기하급수적으로 증가하는 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eO7uQ/dJMb84qpCq7/kOstOzUq3mrRNHaSJCKjaK/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/bDNeId/dJMb86PiPNf/Jd2FSlHKhBUeBgPjk475s0/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/bic0lh/dJMb8Yqcu7a/Xeiy8e3DbY03hJ04qt5G61/img.png?width=2400&amp;amp;height=1543&amp;amp;face=1290_273_1477_479&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eO7uQ/dJMb84qpCq7/kOstOzUq3mrRNHaSJCKjaK/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/bDNeId/dJMb86PiPNf/Jd2FSlHKhBUeBgPjk475s0/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/bic0lh/dJMb8Yqcu7a/Xeiy8e3DbY03hJ04qt5G61/img.png?width=2400&amp;amp;height=1543&amp;amp;face=1290_273_1477_479');&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;방화벽 뜻과 유래, 컴퓨터 보안에 왜 '불(Fire) 막는 벽'이라는 이름이 붙었을까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터 보안에서 방화벽(Firewall)은 외부의 악의적인 공격으로부터 내부 네트워크를 보호하는 가장 기본적인 보안 시스템입니다.해킹이나 랜섬웨어 등 사이버 위협이 기하급수적으로 증가하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787232365554&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;WAF(웹방화벽) 뜻 쉽게 설명해드림! 우리 회사 협업툴이 해킹당하지 않는 진짜 이유&quot; data-og-description=&quot;최근 기업의 업무 환경이 디지털로 전면 전환되면서 협업툴의 사용 빈도가 폭발적으로 증가하고 있습니다.하지만 이와 동시에 기업의 핵심 데이터를 집요하게 노리는 웹 해킹 공격도 날이 갈수&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btLwtQ/dJMb8Yqcu68/UA6zCewX8xS2NuUNHAnyE1/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/d7XJlk/dJMb9jODKXO/3QScMLws2unA54Q7dkRh1K/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/qdx5R/dJMb9fZMgod/BjlW7h2661V3BdekJTvfzK/img.png?width=1200&amp;amp;height=926&amp;amp;face=0_0_1200_926&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btLwtQ/dJMb8Yqcu68/UA6zCewX8xS2NuUNHAnyE1/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/d7XJlk/dJMb9jODKXO/3QScMLws2unA54Q7dkRh1K/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/qdx5R/dJMb9fZMgod/BjlW7h2661V3BdekJTvfzK/img.png?width=1200&amp;amp;height=926&amp;amp;face=0_0_1200_926');&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;WAF(웹방화벽) 뜻 쉽게 설명해드림! 우리 회사 협업툴이 해킹당하지 않는 진짜 이유&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787232362336&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;SELECT * 때문에 컬럼 권한이 안 먹힐 때 ProxySQL로 우회한 실무 보안 회고&quot; data-og-description=&quot;서비스가 어느 정도 자리를 잡고 나면 한 번쯤은 마주치게 되는 순간이 있다.매출은 늘었는데 코드는 10년 전 그대로고, 보안 점검 한 번 제대로 안 받아본 그 상태. 우리도 그랬다. 이 글은 그 상&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/SELECT-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%BB%AC%EB%9F%BC-%EA%B6%8C%ED%95%9C%EC%9D%B4-%EC%95%88-%EB%A8%B9%ED%9E%90-%EB%95%8C-ProxySQL%EB%A1%9C-%EC%9A%B0%ED%9A%8C%ED%95%9C-%EC%8B%A4%EB%AC%B4-%EB%B3%B4%EC%95%88-%ED%9A%8C%EA%B3%A0&quot; data-og-url=&quot;https://devwar.tistory.com/entry/SELECT-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%BB%AC%EB%9F%BC-%EA%B6%8C%ED%95%9C%EC%9D%B4-%EC%95%88-%EB%A8%B9%ED%9E%90-%EB%95%8C-ProxySQL%EB%A1%9C-%EC%9A%B0%ED%9A%8C%ED%95%9C-%EC%8B%A4%EB%AC%B4-%EB%B3%B4%EC%95%88-%ED%9A%8C%EA%B3%A0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpHOLV/dJMb9jgOpsh/VFK6eagwIKujQtGbXRv2m1/img.png?width=800&amp;amp;height=640&amp;amp;face=526_160_591_231,https://scrap.kakaocdn.net/dn/cJtPGK/dJMb9hDh0pZ/GyOS7bC7JSeBso7GtUN3MK/img.png?width=800&amp;amp;height=640&amp;amp;face=526_160_591_231,https://scrap.kakaocdn.net/dn/J80lx/dJMb9g5rPEN/ixjgCkRMJskkaAxRzIj1BK/img.png?width=1200&amp;amp;height=961&amp;amp;face=795_243_886_342&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/SELECT-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%BB%AC%EB%9F%BC-%EA%B6%8C%ED%95%9C%EC%9D%B4-%EC%95%88-%EB%A8%B9%ED%9E%90-%EB%95%8C-ProxySQL%EB%A1%9C-%EC%9A%B0%ED%9A%8C%ED%95%9C-%EC%8B%A4%EB%AC%B4-%EB%B3%B4%EC%95%88-%ED%9A%8C%EA%B3%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/SELECT-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%BB%AC%EB%9F%BC-%EA%B6%8C%ED%95%9C%EC%9D%B4-%EC%95%88-%EB%A8%B9%ED%9E%90-%EB%95%8C-ProxySQL%EB%A1%9C-%EC%9A%B0%ED%9A%8C%ED%95%9C-%EC%8B%A4%EB%AC%B4-%EB%B3%B4%EC%95%88-%ED%9A%8C%EA%B3%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpHOLV/dJMb9jgOpsh/VFK6eagwIKujQtGbXRv2m1/img.png?width=800&amp;amp;height=640&amp;amp;face=526_160_591_231,https://scrap.kakaocdn.net/dn/cJtPGK/dJMb9hDh0pZ/GyOS7bC7JSeBso7GtUN3MK/img.png?width=800&amp;amp;height=640&amp;amp;face=526_160_591_231,https://scrap.kakaocdn.net/dn/J80lx/dJMb9g5rPEN/ixjgCkRMJskkaAxRzIj1BK/img.png?width=1200&amp;amp;height=961&amp;amp;face=795_243_886_342');&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;SELECT * 때문에 컬럼 권한이 안 먹힐 때 ProxySQL로 우회한 실무 보안 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서비스가 어느 정도 자리를 잡고 나면 한 번쯤은 마주치게 되는 순간이 있다.매출은 늘었는데 코드는 10년 전 그대로고, 보안 점검 한 번 제대로 안 받아본 그 상태. 우리도 그랬다. 이 글은 그 상&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>RateLimit</category>
      <category>Throttling</category>
      <category>디도스방어</category>
      <category>디바운싱</category>
      <category>백엔드방어</category>
      <category>스로틀링</category>
      <category>웹서버최적화</category>
      <category>트래픽제어</category>
      <category>프레임워크활용</category>
      <category>프론트엔드최적화</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/156</guid>
      <comments>https://devwar.tistory.com/entry/throttling-rate-limit-architecture-guide#entry156comment</comments>
      <pubDate>Wed, 23 Sep 2026 19:00:31 +0900</pubDate>
    </item>
    <item>
      <title>깃 커밋 메시지 작성법, 실무에선 5개만 쓰는 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/git-commit-message-rules</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvbgmN/dJMcafuds9d/aqbPh64Ob0YW5F0jHGC9L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvbgmN/dJMcafuds9d/aqbPh64Ob0YW5F0jHGC9L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvbgmN/dJMcafuds9d/aqbPh64Ob0YW5F0jHGC9L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvbgmN%2FdJMcafuds9d%2FaqbPh64Ob0YW5F0jHGC9L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;깃 커밋 메시지 작성법, 실무에선 5개만 쓰는 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;856&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃 커밋 메시지 규칙을 찾아보면 fix, feat 같은 단어가 붙은 커밋 로그를 자주 보게 됩니다. 이건 Conventional Commits라는 커밋 메시지 작성법인데, 규약 문서를 열어보면 생각보다 내용이 많아서 시작 전에 지치기 쉽습니다. 그런데 실무에서 실제로 쓰는 부분만 추리면 5분이면 충분합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;커밋 메시지 앞에 fix는 왜 붙이는 거지?&quot;&lt;br /&gt;&quot;feat, chore, refactor 차이가 뭐야?&quot;&lt;br /&gt;&quot;실제 커밋 메시지는 다들 어떻게 쓰지?&quot;&lt;br /&gt;&quot;body까지 다 써야 하나? 한 줄이면 안 되나?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 처음엔 커밋 메시지를 &quot;수정함&quot;, &quot;버그 고침&quot; 이런 식으로 썼습니다. 혼자 할 땐 문제가 없었는데, 몇 달 뒤 제 코드를 제가 다시 보면서 어떤 커밋이 뭘 고친 건지 로그만 봐서는 전혀 알 수 없었어요. 그때부터 규약을 찾아 쓰기 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Conventional Commits 규약 중 실무에서 실제로 쓰이는 부분만 추린 가이드입니다. 규약 문서 전체를 외울 필요 없이, 오늘 커밋부터 바로 적용할 수 있는 수준으로 정리했습니다. 깃을 이제 막 쓰기 시작한 분부터 팀 커밋 로그를 정리하고 싶은 분까지 참고할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;커밋 메시지에 fix, feat을 붙이는 이유&lt;/li&gt;
&lt;li&gt;Conventional Commits 기본 형식&lt;/li&gt;
&lt;li&gt;실무에서 90%를 차지하는 type 5개&lt;/li&gt;
&lt;li&gt;나머지 type은 언제 쓰나&lt;/li&gt;
&lt;li&gt;제목 한 줄 잘 쓰는 법&lt;/li&gt;
&lt;li&gt;body와 footer는 언제 쓰는가&lt;/li&gt;
&lt;li&gt;scope와 BREAKING CHANGE&lt;/li&gt;
&lt;li&gt;자주 하는 실수 3가지&lt;/li&gt;
&lt;li&gt;자주 쓰는 커밋 예시 5개&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 커밋 메시지에 fix, feat을 붙이는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋 메시지 맨 앞에 붙는 fix, feat 같은 단어를 type이라고 부릅니다. 이 커밋이 어떤 성격의 변경인지 한 단어로 표시하는 꼬리표예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type을 붙이면 &lt;code&gt;git log&lt;/code&gt;를 봤을 때 코드를 열어보지 않아도 흐름이 읽힙니다. 버그 수정만 모아 보고 싶으면 fix로 검색하면 되고, 이번 배포에 새 기능이 몇 개 들어갔는지는 feat 개수만 세면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 규약으로 정리한 것이 Conventional Commits입니다. Angular 팀의 커밋 컨벤션에서 출발해 지금은 사실상 업계 표준처럼 자리 잡았고, 규약 버전은 2026년 현재 v1.0.0입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약을 지키면 부수 효과도 따라옵니다. 커밋 로그에서 체인지로그를 자동 생성하거나, 버전 번호를 자동으로 올리는 도구들이 전부 이 type을 기준으로 동작하기 때문입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Conventional Commits 기본 형식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약 문서에는 여러 구성 요소가 나오지만, 필수는 딱 두 가지입니다. type과 한 줄 요약이에요.&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;fix: 로그인 무한 리다이렉트 수정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 규약을 충족하는 완전한 커밋 메시지입니다. type 뒤에 콜론과 공백을 붙이고, 무엇이 바뀌는지 한 줄로 쓰면 끝입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 커밋의 대부분은 이 한 줄로 끝납니다. body나 footer 같은 나머지 요소는 전부 선택 사항이고, 필요한 경우가 따로 있습니다. 그 기준은 6번 섹션에서 다룹니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  핵심&lt;/b&gt;&lt;br /&gt;형식은 &lt;code&gt;type: 한 줄 요약&lt;/code&gt;이 전부입니다. 나머지 요소는 필요할 때만 추가하는 선택 사항입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실무에서 90%를 차지하는 type 5개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약이 정의하는 type은 10개가 넘지만, 실제 커밋 로그를 열어보면 아래 5개가 대부분을 차지합니다. 이 5개만 익혀도 일상 커밋은 전부 커버됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;type (원래 단어)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;언제 쓰나&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;feat&lt;/b&gt;&lt;br /&gt;(feature, 기능)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;새 기능 추가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;feat: 다크모드 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;fix&lt;/b&gt;&lt;br /&gt;(fix, 수정)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;버그 수정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;fix: 로그인 무한 리다이렉트 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;refactor&lt;/b&gt;&lt;br /&gt;(refactor, 재구성)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동작 그대로, 코드만 정리&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;refactor: 결제 로직 함수 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;docs&lt;/b&gt;&lt;br /&gt;(documentation, 문서)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;문서만 변경&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;docs: README 설치 방법 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;chore&lt;/b&gt;&lt;br /&gt;(chore, 잡일)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;설정&amp;middot;패키지 등 잡무&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;chore: eslint 설정 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헷갈리기 쉬운 건 refactor와 chore의 구분입니다. 코드 파일을 건드렸는데 동작이 그대로면 refactor, 코드가 아닌 설정 파일이나 패키지를 건드렸으면 chore로 기억하면 대체로 맞습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약상 공식 필수 type은 feat와 fix 두 개뿐입니다. 나머지는 팀이 필요에 따라 골라 쓰는 구조라서, 팀마다 목록이 조금씩 다를 수 있어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 나머지 type은 언제 쓰나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5개 외의 type은 프로젝트 성격에 따라 등장 빈도가 갈립니다. 테스트 코드를 열심히 쓰는 팀이면 test가 자주 보이고, CI 파이프라인을 자주 손보는 팀이면 ci가 자주 보이는 식입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;type&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;test&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;테스트 코드 추가&amp;middot;수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;style&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;포맷팅, 세미콜론 등 동작과 무관한 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;perf&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;성능 개선 (performance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;ci&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;CI 설정 변경 (GitHub Actions 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;build&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;빌드 시스템, 외부 의존성 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;revert&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이전 커밋 되돌리기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의할 점 하나. style은 CSS 작업이 아니라 코드 포맷팅을 뜻합니다. CSS를 수정했다면 화면 기능이 바뀐 것이므로 feat나 fix가 맞습니다. 처음 규약을 쓸 때 거의 모두가 한 번씩 틀리는 부분이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type을 몇 개까지 쓸지는 팀 합의의 영역입니다. 개인 프로젝트라면 5개로 시작해서, 필요해질 때 하나씩 추가하는 쪽이 관리하기 편합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 제목 한 줄 잘 쓰는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식을 지켜도 제목 자체가 모호하면 의미가 없습니다. 몇 가지 기준만 잡으면 제목의 질이 확 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 50자 이내로 씁니다. 깃허브를 비롯한 대부분의 도구가 커밋 목록에서 제목을 50자 근처에서 잘라 보여주기 때문입니다. 잘리면 뒷부분은 없는 것과 같아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 마침표를 붙이지 않습니다. 제목은 문장이 아니라 라벨에 가깝기 때문에 마침표 없이 끝내는 것이 관례입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &quot;무엇을 했는지&quot;보다 &quot;이 커밋을 적용하면 무슨 일이 일어나는지&quot; 관점으로 씁니다. &quot;버그 고침&quot;이 아니라 &quot;결제 콜백 중복 호출 방지&quot;처럼요. 나중에 로그를 읽는 사람 입장에서 정보량이 완전히 다릅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;나쁜 제목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;좋은 제목&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;fix: 버그 수정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;fix: 주문 취소 시 재고 미복구 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;feat: 기능 추가함&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;feat: 게시글 임시저장 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;chore: 수정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;chore: node 22로 버전 올림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. body와 footer는 언제 쓰는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약에는 제목 아래에 본문(body)과 꼬리말(footer)을 붙이는 형식도 있습니다. 제목에서 한 줄 비우고 상세 설명을 쓰고, 다시 한 줄 비우고 이슈 번호 같은 참조 정보를 붙이는 구조입니다.&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;fix: 결제 콜백 중복 호출 방지

웹훅이 재시도될 때 주문 상태가 두 번 갱신되는 문제.
멱등성 키로 중복 요청을 걸러내도록 변경.

Closes #142&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이건 매 커밋마다 쓰는 게 아닙니다. 오타 수정이나 자잘한 스타일 정리에 장문의 본문을 다는 건 오히려 이상해요. body가 필요한 경우는 정해져 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;한 줄이면 충분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;body까지 필요&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;오타&amp;middot;문구 수정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;왜 이렇게 고쳤지?&quot; 싶을 복잡한 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;자잘한 스타일 정리&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이슈 트래커와 연결할 때 (Closes #12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;단순 설정 변경&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;팀에 알려야 할 파괴적 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준을 하나로 압축하면 이렇습니다. 제목만 보고 코드 리뷰어나 미래의 내가 맥락을 놓칠 것 같으면 body를 쓰고, 아니면 생략합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. scope와 BREAKING CHANGE&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type 뒤에 괄호로 변경 범위를 표시하는 scope라는 요소도 있습니다. &lt;code&gt;fix(auth): 토큰 만료 처리 수정&lt;/code&gt;처럼 어느 모듈을 건드렸는지 명시하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scope는 선택 사항이고, 프로젝트가 커서 모듈 구분이 의미 있을 때만 쓰면 됩니다. 작은 프로젝트에서 억지로 붙이면 오히려 관리 부담만 늘어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 사용자에게 영향을 주는 파괴적 변경은 type 뒤에 느낌표를 붙여 &lt;code&gt;feat!: API 응답 형식 변경&lt;/code&gt;처럼 표시하거나, footer에 &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;로 시작하는 설명을 답니다. 시맨틱 버저닝(버전을 주.부.수 세 자리로 관리하는 방식)과 연동하면 이 표시가 주 버전을 올리는 신호가 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  버전과의 연결&lt;/b&gt;&lt;br /&gt;fix는 수 버전(1.0.0 &amp;rarr; 1.0.1), feat는 부 버전(1.0.0 &amp;rarr; 1.1.0), 느낌표나 BREAKING CHANGE는 주 버전(1.0.0 &amp;rarr; 2.0.0)을 올리는 신호로 쓰입니다. 자동 배포 도구들이 이 규칙으로 버전을 계산합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 자주 하는 실수 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규약을 도입한 팀들의 커밋 로그를 보면 반복해서 나오는 실수 패턴이 있습니다. 세 가지만 짚어볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 한 커밋에 여러 작업을 섞는 겁니다. 버그도 고치고 리팩토링도 하고 패키지도 올린 커밋에는 어떤 type을 붙여도 거짓말이 됩니다. 커밋 하나에 관심사 하나가 원칙이에요. 작업이 섞였다면 &lt;code&gt;git add -p&lt;/code&gt;로 파일 일부만 스테이징해서 나눠 커밋할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 type만 붙이고 제목을 대충 쓰는 겁니다. &quot;fix: 수정&quot;은 규약 형식은 지켰지만 정보가 없습니다. 형식보다 내용이 먼저입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째는 지키다 마는 겁니다. 로그에 규약 커밋과 자유 커밋이 섞이면 검색도 자동화도 반쪽이 됩니다. 완벽하게 하려다 포기하는 것보다, 다음 섹션의 예시 패턴 몇 개를 손에 익혀서 꾸준히 가는 쪽이 오래갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 자주 쓰는 커밋 예시 5개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 하루에도 몇 번씩 만나는 상황별로, 그대로 가져다 써도 되는 커밋 메시지 패턴 5개를 정리했습니다. 손에 익을 때까지는 이 형태를 참고해서 쓰시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 1. 새 기능을 붙였을 때. 기능 이름과 대상이 드러나게 씁니다.&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;feat: 게시글 목록 무한 스크롤 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 2. 버그를 고쳤을 때. 어떤 상황의 어떤 증상인지가 제목에 들어가야 나중에 검색이 됩니다.&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;fix: 모바일에서 이미지 업로드 실패 수정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 3. 동작은 그대로 두고 코드만 정리했을 때. &quot;정리&quot;라고만 쓰지 말고 어디를 어떻게 정리했는지 적습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;refactor: 중복된 날짜 포맷 함수 유틸로 통합&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 4. 패키지나 설정을 만졌을 때. 버전 변경은 어떤 버전으로 갔는지 남기면 문제 추적에 도움이 됩니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;chore: react 19.1로 업데이트&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;예시 5. 복잡한 수정이라 body까지 쓰는 경우. 제목은 결과, body는 원인과 해결 방식을 담습니다.&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;fix: 검색 결과 중복 노출 수정

페이지네이션 중 새 글이 등록되면 offset이 밀려
같은 글이 두 페이지에 걸쳐 나오는 문제.
커서 기반 조회로 변경.&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;다섯 개를 관통하는 공통점은 하나입니다. 제목만 읽어도 코드를 안 열어보고 무슨 일이 있었는지 알 수 있다는 것. 이게 되면 어떤 type을 붙일지는 자연스럽게 따라옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커밋 메시지는 한글로 써도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;됩니다. type은 영어 소문자로 쓰되, 제목과 본문은 팀이 편한 언어로 쓰면 됩니다. 오픈소스처럼 외부 기여자가 있는 프로젝트만 영어를 권장하고, 사내 프로젝트는 한글이 오히려 정보 전달에 유리한 경우가 많습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미 쌓인 옛날 커밋도 규약에 맞게 고쳐야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고치지 않는 것을 권합니다. 이미 푸시된 커밋의 메시지를 바꾸려면 히스토리를 다시 쓰는 작업이 필요한데, 협업 중인 저장소에서는 다른 사람의 작업을 깨뜨릴 위험이 큽니다. 규약은 오늘 커밋부터 적용하면 충분합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;type을 잘못 붙여서 커밋했는데 어떻게 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 푸시 전이라면 &lt;code&gt;git commit --amend&lt;/code&gt;로 마지막 커밋 메시지를 수정할 수 있습니다. 이미 푸시했다면 그냥 두는 편이 안전합니다. type 하나 틀린 것보다 히스토리를 건드리는 쪽의 위험이 더 큽니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 커밋부터 바꾸면 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇습니다. 형식은 &lt;code&gt;type: 한 줄 요약&lt;/code&gt;, type은 feat&amp;middot;fix&amp;middot;refactor&amp;middot;docs&amp;middot;chore 5개부터, 제목은 50자 이내에 마침표 없이. 이 세 가지만 지켜도 커밋 로그의 가독성이 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;body와 scope 같은 나머지 요소는 필요해질 때 자연스럽게 손이 갑니다. 처음부터 전부 지키려다 포기하는 것보다, 9번의 예시 다섯 개를 손에 익혀 한 줄 규칙부터 습관을 만드는 쪽이 확실히 오래갑니다.&lt;/p&gt;
&lt;h2 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787479962434&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&quot; data-og-description=&quot;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Fc0xH/dJMb83kKxqX/riRSqWLx1K6EmXlkqmZhG1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/cj5QRR/dJMb9aKWhmh/KNqAQ8L9JRafzwWa654VlK/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/bnC9o2/dJMb82e4m1V/BZ4NPkk51ndBt5CVJVDBsK/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Fc0xH/dJMb83kKxqX/riRSqWLx1K6EmXlkqmZhG1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/cj5QRR/dJMb9aKWhmh/KNqAQ8L9JRafzwWa654VlK/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/bnC9o2/dJMb82e4m1V/BZ4NPkk51ndBt5CVJVDBsK/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292');&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787479954034&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&quot; data-og-description=&quot;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pAwOi/dJMb81f94FA/SbsdKy1IJbGCYbWLog6qYK/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/i0paZ/dJMb9aKWhl4/E3BKugMMoL9bVkjIEivo6k/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/rvTsg/dJMb82MUBfw/61zlIcWaC7WVXXYbZx7NT0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pAwOi/dJMb81f94FA/SbsdKy1IJbGCYbWLog6qYK/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/i0paZ/dJMb9aKWhl4/E3BKugMMoL9bVkjIEivo6k/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/rvTsg/dJMb82MUBfw/61zlIcWaC7WVXXYbZx7NT0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286');&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 도구/Git&amp;middot;깃허브</category>
      <category>Conventional Commits</category>
      <category>feat fix 차이</category>
      <category>git commit</category>
      <category>git 사용법</category>
      <category>개발협업</category>
      <category>깃커밋메시지</category>
      <category>커밋메시지규칙</category>
      <category>커밋메시지예시</category>
      <category>커밋컨벤션</category>
      <category>코드리뷰</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/159</guid>
      <comments>https://devwar.tistory.com/entry/git-commit-message-rules#entry159comment</comments>
      <pubDate>Wed, 16 Sep 2026 19:00:40 +0900</pubDate>
    </item>
    <item>
      <title>자바 스프링 프레임워크 복잡하다고요? 탄생 이유를 알면 다릅니다</title>
      <link>https://devwar.tistory.com/entry/java-spring-framework</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GaLxD (1).jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLgnLK/dJMcahFsU3H/8xQxbZo1pta9Js5kAoubx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLgnLK/dJMcahFsU3H/8xQxbZo1pta9Js5kAoubx0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLgnLK/dJMcahFsU3H/8xQxbZo1pta9Js5kAoubx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLgnLK%2FdJMcahFsU3H%2F8xQxbZo1pta9Js5kAoubx0%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; alt=&quot;자바 스프링 프레임워크 복잡하다고요? 탄생 이유를 알면 다릅니다&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;GaLxD (1).jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 스프링 프레임워크(Java Spring Framework)는 백엔드 개발을 시작하는 분들이라면 반드시 마주치게 되는 거대한 산입니다. 한국에서는 특히 전자정부표준프레임워크의 기반 기술로 채택되면서, 사실상 기업용 웹 애플리케이션 개발의 표준으로 자리 잡았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;스프링이 좋다고는 하는데, 대체 왜 쓰는 건가요?&quot;&lt;br /&gt;&quot;스프링 부트랑 기존 스프링은 아예 다른 기술인가요?&quot;&lt;br /&gt;&quot;객체 지향은 알겠는데 의존성 주입(DI)은 너무 추상적이에요.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 접하는 입장에서는 세팅부터 방대한 어노테이션까지 진입 장벽이 꽤 높게 느껴질 수밖에 없습니다. 과거 선배 개발자들이 어떤 고충을 겪었고, 이를 해결하기 위해 스프링이 어떤 철학을 가지고 등장했는지 이해하면 그 복잡해 보이던 구조가 비로소 납득이 가기 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 자바 스프링 프레임워크가 탄생하게 된 역사적 배경과 핵심 철학을 짚어보고, 실무에서 이 프레임워크가 어떻게 작동하는지 기초적인 원리를 명확하게 정리해 보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바 스프링 프레임워크란? 백엔드 생태계의 척추가 된 이유&lt;/li&gt;
&lt;li&gt;탄생의 비화: EJB의 지옥에서 벗어나기 위한 로드 존슨의 반기&lt;/li&gt;
&lt;li&gt;스프링의 핵심 철학: POJO를 향한 집착과 비침투성&lt;/li&gt;
&lt;li&gt;철학을 구현한 무기 1: 제어의 역전(IoC)과 의존성 주입(DI)&lt;/li&gt;
&lt;li&gt;철학을 구현한 무기 2: 관점 지향 프로그래밍(AOP)의 실용성&lt;/li&gt;
&lt;li&gt;스프링(Spring) vs 스프링 부트(Spring Boot) 환경의 변화&lt;/li&gt;
&lt;li&gt;실무에서 마주하는 스프링 프레임워크의 장점과 한계&lt;/li&gt;
&lt;li&gt;알아두면 든든한 스프링 생태계 주요 모듈 요약&lt;/li&gt;
&lt;li&gt;자바 스프링, 2026년 지금 시작해도 늦지 않은 이유&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 자바 스프링 프레임워크란? 백엔드 생태계의 척추가 된 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크는 엔터프라이즈급 자바 애플리케이션 개발을 편하게 만들어주는 오픈소스 경량급 애플리케이션 프레임워크입니다. 여기서 '엔터프라이즈급'이란 대규모 트래픽을 처리하고, 복잡한 비즈니스 로직과 데이터베이스 연동이 필요한 기업용 시스템을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대한민국 IT 시장에서 자바와 스프링의 입지는 절대적입니다. 공공기관 프로젝트의 기준이 되는 전자정부표준프레임워크가 스프링을 바탕으로 만들어졌기 때문입니다. 이로 인해 금융권, 대기업, SI(시스템 통합) 업계는 물론이고, 최근에는 네이버, 카카오, 쿠팡 같은 대규모 서비스 기업들도 메인 백엔드 환경으로 스프링을 채택하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링이 이렇게 사랑받는 가장 큰 이유는 개발자가 인프라나 시스템 환경 설정에 쏟을 에너지를 줄이고, 비즈니스 로직(사용자가 원하는 기능) 구현에만 집중할 수 있도록 든든한 뼈대(Framework)를 제공하기 때문입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 탄생의 비화: EJB의 지옥에서 벗어나기 위한 로드 존슨의 반기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링이 왜 지금의 모습을 갖추게 되었는지 알기 위해서는 2000년대 초반의 자바 개발 환경을 돌아볼 필요가 있습니다. 당시에는 기업용 시스템을 만들기 위해 EJB(Enterprise JavaBeans)라는 기술을 주로 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EJB는 분산 트랜잭션, 보안 등 강력한 기능을 제공했지만 치명적인 단점이 있었습니다. 너무 무겁고, 설정이 지나치게 복잡했으며, 무엇보다 객체 지향 프로그래밍의 장점을 잃어버리게 만들었습니다. 간단한 게시판 하나를 만들려 해도 EJB 스펙에 맞춘 거대한 코드를 작성해야 했고, 테스트조차 전용 서버(WAS) 위에서만 가능했습니다. 개발자들 사이에서는 &quot;EJB 지옥&quot;이라는 말이 돌 정도였습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  로드 존슨(Rod Johnson)의 문제 제기&lt;/b&gt;&lt;br /&gt;2002년, 로드 존슨은 자신의 저서에서 EJB의 복잡성을 신랄하게 비판하며, EJB 없이도 충분히 안정적이고 훌륭한 엔터프라이즈 애플리케이션을 만들 수 있음을 코드로 증명했습니다. 이 코드가 발전하여 2004년 스프링 프레임워크 1.0으로 세상에 나오게 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은 복잡하고 무거운 기존 기술에 반기를 들고, &quot;가장 단순하고 객체지향적인 원래의 자바로 돌아가자&quot;는 목표로 탄생했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 스프링의 핵심 철학: POJO를 향한 집착과 비침투성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링의 모든 설계는 &lt;b&gt;POJO(Plain Old Java Object)&lt;/b&gt;라는 하나의 철학으로 귀결됩니다. 직역하면 '평범한 옛날 자바 객체'입니다. 즉, 특정 프레임워크나 라이브러리의 규약에 종속되지 않고, 순수하게 자바 언어의 객체 지향적 특성만을 가지는 코드를 작성하자는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EJB 시절에는 개발자가 만든 클래스가 무조건 EJB 프레임워크의 특정 클래스를 상속받아야 했습니다. 코드가 프레임워크에 강하게 묶여버리는(Coupling) 현상이 발생한 것입니다. 반면, 스프링은 개발자가 순수한 자바 클래스만 작성하면, 프레임워크가 알아서 엔터프라이즈 기술(트랜잭션, 보안 등)을 외부에서 덧입혀 주는 방식을 택했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 &lt;b&gt;비침투성(Non-invasive)&lt;/b&gt;이라고 부릅니다. 스프링의 코드가 개발자의 비즈니스 로직 안으로 깊숙이 침투하지 않기 때문에, 코드가 깔끔해지고 유지보수와 자동화된 테스트가 훨씬 쉬워졌습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 철학을 구현한 무기 1: 제어의 역전(IoC)과 의존성 주입(DI)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POJO 철학을 실제로 구현하기 위해 스프링이 들고 나온 핵심 무기가 바로 제어의 역전(IoC, Inversion of Control)과 의존성 주입(DI, Dependency Injection)입니다. 용어가 다소 어렵지만, 원리는 단순합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 개발자가 코드 안에서 직접 `new` 키워드를 사용해 필요한 객체를 생성하고 관리했습니다. (개발자가 제어권을 가짐). 하지만 스프링 환경에서는 객체의 생성부터 소멸까지의 관리(제어권)를 스프링 컨테이너(IoC 컨테이너)가 대신합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 주입(DI)은 한 객체가 필요로 하는 다른 객체(의존성)를 내부에서 직접 만들지 않고, 외부(스프링)에서 꽂아 넣어주는 것을 말합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// 순수 자바 코드 예시: 객체를 외부에서 주입받습니다.
public class OrderService {
    private final PaymentGateway paymentGateway;

    // 의존성 주입(DI): OrderService는 어떤 결제 모듈이 들어올지 모릅니다.
    // 스프링이 상황에 맞는 구현체(카카오페이, 네이버페이 등)를 생성해 넣어줍니다.
    public OrderService(PaymentGateway paymentGateway) {
        this.paymentGateway = paymentGateway;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드처럼 설계하면 결제 모듈이 카카오페이에서 토스페이로 바뀌어도 `OrderService`의 코드는 단 한 줄도 수정할 필요가 없습니다. 이것이 객체 지향의 유연성을 극대화하는 스프링의 방식입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 철학을 구현한 무기 2: 관점 지향 프로그래밍(AOP)의 실용성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 로직은 순수하게 유지하되, 엔터프라이즈급 기능을 적용하고 싶을 때 사용하는 두 번째 무기가 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 애플리케이션을 만들든 로그 남기기, 보안 체크, 트랜잭션 처리(DB 연동 시 성공/실패 시 롤백) 같은 기능은 수많은 클래스에 공통으로 필요합니다. 이 코드를 매번 비즈니스 로직에 복사해서 붙여넣으면 코드가 지저분해지고 관리가 안 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  AOP의 동작 원리&lt;/b&gt;&lt;br /&gt;스프링은 공통으로 필요한 기능(예: 트랜잭션)을 따로 빼서 모듈화해 둡니다. 그리고 개발자가 &lt;code&gt;@Transactional&lt;/code&gt; 같은 어노테이션 하나만 붙이면, 실행 시점에 스프링이 알아서 공통 코드를 비즈니스 로직 앞뒤로 감싸서(Proxy) 실행해 줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 개발자는 복잡한 트랜잭션 제어 코드를 신경 쓰지 않고, 진짜 필요한 &quot;데이터 저장 로직&quot; 하나만 작성하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 스프링(Spring) vs 스프링 부트(Spring Boot) 환경의 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크가 훌륭한 도구임은 입증되었지만, 초기 세팅이 너무 어렵다는 불만이 많았습니다. DB 연결, 웹 서버 설정, 라이브러리 의존성 관리 등을 위해 수많은 XML 설정 파일을 만져야 했기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 &quot;설정 지옥&quot;에서 개발자를 구원하기 위해 등장한 것이 바로 &lt;b&gt;스프링 부트(Spring Boot)&lt;/b&gt;입니다. 현재 실무에서는 &quot;스프링으로 개발한다&quot;고 하면 십중팔구 스프링 부트를 의미합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;스프링 (Spring Legacy)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;스프링 부트 (Spring Boot)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;초기 설정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자가 XML 등으로 직접 하나하나 설정 필요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Auto Configuration 기능으로 자동 설정 완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;웹 서버&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Tomcat 등의 WAS를 별도로 설치하고 연동해야 함&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;내장 Tomcat 제공. JAR 파일 하나로 즉시 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;의존성 관리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;버전 충돌을 막기 위해 라이브러리 버전을 일일이 맞춤&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;spring-boot-starter&lt;/code&gt;로 호환되는 버전 세트 자동 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 덕분에 개발자는 프로젝트 생성 사이트(Spring Initializr)에서 클릭 몇 번만 하면 수 분 내에 실행 가능한 웹 서버를 띄울 수 있게 되었습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 실무에서 마주하는 스프링 프레임워크의 장점과 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무리 좋은 프레임워크라도 만능일 수는 없습니다. 대규모 실무 프로젝트에 스프링을 도입할 때 체감하게 되는 명확한 장점과 한계가 존재합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점: 방대한 생태계와 안정성.&lt;/b&gt; 20년 이상 누적된 레퍼런스와 커뮤니티가 있습니다. 실무에서 마주하는 거의 모든 장애 상황이나 연동 이슈에 대한 해결책(스택오버플로 등)이 이미 존재합니다. 기업 입장에서는 유지보수 인력을 구하기도 가장 쉽습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점 1: 무거운 메모리 사용량.&lt;/b&gt; 기동 시점에 수많은 객체(Bean)를 메모리에 올리고 DI 관계를 맺기 때문에, Node.js나 Go 언어에 비해 기본적으로 차지하는 메모리가 큽니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점 2: 느린 부팅 속도.&lt;/b&gt; 최근 유행하는 마이크로서비스 아키텍처(MSA) 환경이나 서버리스(Serverless) 환경에서는 필요할 때 즉시 서버가 떠야(Cold Start) 하는데, 스프링은 초기 기동 속도가 느려 불리한 측면이 있습니다. (최근 Spring Native 기술로 극복해 나가는 중입니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 알아두면 든든한 스프링 생태계 주요 모듈 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은 단일 프로그램이 아니라, 필요한 블록을 조립해서 쓰는 거대한 생태계입니다. 코어 프레임워크를 바탕으로 실무에서 필수적으로 함께 사용하는 주요 모듈들이 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모듈 이름&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;주요 역할 및 특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Spring MVC&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;웹 애플리케이션의 핵심. 클라이언트의 요청을 받아 적절한 컨트롤러로 라우팅하고 응답을 생성합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Spring Data JPA&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;데이터베이스 처리를 돕습니다. 반복적인 CRUD 쿼리 작성 없이 인터페이스 선언만으로 DB 조작이 가능해집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Spring Security&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;막강한 인증(Authentication) 및 인가(Authorization) 기능을 제공하여 애플리케이션의 보안을 책임집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Spring Cloud&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;분산 시스템과 마이크로서비스(MSA) 구축에 필요한 구성 관리, 서비스 탐색, 라우팅 등을 지원합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초심자라면 먼저 Spring Boot와 Spring MVC를 통해 기본 웹 개발을 익히고, DB 연동을 위해 Spring Data JPA를 학습하는 순서를 추천합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 자바 스프링, 2026년 지금 시작해도 늦지 않은 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 지나면서 Node.js, Python(Django/FastAPI), Go 언어 등 훌륭한 대체재들이 많이 등장했습니다. 스타트업 씬에서는 민첩한 개발을 위해 이들을 선택하는 비중도 꽤 높습니다. 그렇다면 2026년 현시점에도 자바 스프링을 공부하는 것이 경쟁력이 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말씀드리면, 대규모 엔터프라이즈 시장과 안정적인 백엔드 시스템 구축에 있어서 자바 스프링의 지위는 여전히 견고합니다. 최신 Spring Boot 3.x 버전부터는 Java 17을 최소 사양으로 강제하며 최신 문법과 기능을 적극 수용하고 있고, Java 21의 가상 스레드(Virtual Threads) 지원을 통해 고질적인 동시성 처리 성능까지 대폭 끌어올렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안정성, 검증된 아키텍처, 그리고 국내 채용 시장의 막대한 수요(TIO)를 고려한다면, 백엔드 개발자로서 자바 스프링은 여전히 가장 확률 높고 강력한 무기입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q. 실무에서는 무조건 스프링 부트만 쓰나요? 기존 스프링을 알아야 할까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 프로젝트는 99% 스프링 부트로 시작합니다. 다만, 공공기관이나 오래전 구축된 금융권 시스템을 유지보수하는 SI 업무를 맡게 된다면, 과거 방식의 Spring Legacy(XML 설정 방식)를 마주할 수도 있습니다. 초기 학습은 무조건 스프링 부트로 시작하되, 나중에 원리를 파악할 때 기존 스프링의 구조를 가볍게 훑어보는 정도면 충분합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q. 스프링을 배우기 전에 꼭 알아야 하는 지식이 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 언어의 기본적인 객체 지향 개념(인터페이스, 다형성)에 대한 이해가 필수입니다. 추가로, 웹이 동작하는 기본 원리(HTTP 요청과 응답)와 데이터베이스(SQL) 기초 지식이 뒷받침되어야 스프링이 제공하는 편리함을 제대로 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 스프링 프레임워크는 단순히 코드를 짜는 도구가 아니라, 수많은 선배 개발자들이 고민해 온 '좋은 설계(객체지향)'에 대한 철학이 담긴 결과물입니다. 처음 설정과 개념들이 다소 낯설고 답답하게 느껴지더라도, 왜 이런 구조(IoC, DI)를 채택했는지 그 이유를 생각하며 접근한다면 훨씬 빠르고 깊이 있게 실력을 키우실 수 있을 것입니다.&lt;/p&gt;
&lt;h2 id=&quot;h-12&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786942087729&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;JVM JRE JDK 차이 핵심 요약: 자바(Java)가 떡상한 이유, 자바 공화국&quot; data-og-description=&quot;수많은 최신 프로그래밍 언어가 쏟아지는 현재, 한때 낡은 언어로 취급받던 자바(Java)가 다시 IT 산업의 중심으로 떠오르며 강력한 입지를 굳히고 있습니다. 클라우드 네이티브 환경의 발전과 스&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/JVM-JRE-JDK-%EC%B0%A8%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD-%EC%9E%90%EB%B0%94Java%EA%B0%80-%EB%96%A1%EC%83%81%ED%95%9C-%EC%9D%B4%EC%9C%A0-%EC%9E%90%EB%B0%94-%EA%B3%B5%ED%99%94%EA%B5%AD&quot; data-og-url=&quot;https://devwar.tistory.com/entry/JVM-JRE-JDK-%EC%B0%A8%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD-%EC%9E%90%EB%B0%94Java%EA%B0%80-%EB%96%A1%EC%83%81%ED%95%9C-%EC%9D%B4%EC%9C%A0-%EC%9E%90%EB%B0%94-%EA%B3%B5%ED%99%94%EA%B5%AD&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/K15NW/dJMb887pkLE/jyUo1mAHKO75qfkXWEBnfk/img.png?width=800&amp;amp;height=617&amp;amp;face=391_242_454_310,https://scrap.kakaocdn.net/dn/E27OB/dJMb84qo7AR/V7PBFD68tB9GtwYdpFDAT1/img.png?width=800&amp;amp;height=617&amp;amp;face=391_242_454_310,https://scrap.kakaocdn.net/dn/brGDFK/dJMb8Uagw31/uxFpEsGE8vLPBrQ0o8GkH1/img.png?width=2109&amp;amp;height=1629&amp;amp;face=1008_635_1205_852&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/JVM-JRE-JDK-%EC%B0%A8%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD-%EC%9E%90%EB%B0%94Java%EA%B0%80-%EB%96%A1%EC%83%81%ED%95%9C-%EC%9D%B4%EC%9C%A0-%EC%9E%90%EB%B0%94-%EA%B3%B5%ED%99%94%EA%B5%AD&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/JVM-JRE-JDK-%EC%B0%A8%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%95%BD-%EC%9E%90%EB%B0%94Java%EA%B0%80-%EB%96%A1%EC%83%81%ED%95%9C-%EC%9D%B4%EC%9C%A0-%EC%9E%90%EB%B0%94-%EA%B3%B5%ED%99%94%EA%B5%AD&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/K15NW/dJMb887pkLE/jyUo1mAHKO75qfkXWEBnfk/img.png?width=800&amp;amp;height=617&amp;amp;face=391_242_454_310,https://scrap.kakaocdn.net/dn/E27OB/dJMb84qo7AR/V7PBFD68tB9GtwYdpFDAT1/img.png?width=800&amp;amp;height=617&amp;amp;face=391_242_454_310,https://scrap.kakaocdn.net/dn/brGDFK/dJMb8Uagw31/uxFpEsGE8vLPBrQ0o8GkH1/img.png?width=2109&amp;amp;height=1629&amp;amp;face=1008_635_1205_852');&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;JVM JRE JDK 차이 핵심 요약: 자바(Java)가 떡상한 이유, 자바 공화국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;수많은 최신 프로그래밍 언어가 쏟아지는 현재, 한때 낡은 언어로 취급받던 자바(Java)가 다시 IT 산업의 중심으로 떠오르며 강력한 입지를 굳히고 있습니다. 클라우드 네이티브 환경의 발전과 스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786942083676&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;웹개발 직군 변천사 - 웹마스터에서 AI 시대까지 (프론트&amp;middot;백엔드&amp;middot;DBA&amp;middot;DevOps)&quot; data-og-description=&quot;&amp;quot;예전엔 웹마스터 한 명이 사이트를 통째로 만들었다던데 진짜예요?&amp;quot; &amp;quot;프론트만 파도 먹고살 수 있나요, 아니면 백엔드까지 해야 하나요?&amp;quot; &amp;quot;풀스택 되라는데 그게 사람이 할 수 있는 범위가 맞나&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dCR20t/dJMb9dHEGdL/9WHi9YnZ57b6tm3QO7RKhK/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/jYrDm/dJMb8WeQuMC/Z8kMIYkhuRWDk5ozWKNr9k/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/w3sKV/dJMb9kmsRTd/FSsg6t8KiSZ2DIjDYeDFl0/img.png?width=1200&amp;amp;height=960&amp;amp;face=879_228_987_346&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dCR20t/dJMb9dHEGdL/9WHi9YnZ57b6tm3QO7RKhK/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/jYrDm/dJMb8WeQuMC/Z8kMIYkhuRWDk5ozWKNr9k/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/w3sKV/dJMb9kmsRTd/FSsg6t8KiSZ2DIjDYeDFl0/img.png?width=1200&amp;amp;height=960&amp;amp;face=879_228_987_346');&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;웹개발 직군 변천사 - 웹마스터에서 AI 시대까지 (프론트&amp;middot;백엔드&amp;middot;DBA&amp;middot;DevOps)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;예전엔 웹마스터 한 명이 사이트를 통째로 만들었다던데 진짜예요?&quot; &quot;프론트만 파도 먹고살 수 있나요, 아니면 백엔드까지 해야 하나요?&quot; &quot;풀스택 되라는데 그게 사람이 할 수 있는 범위가 맞나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786942080923&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;자바(Java)는 왜 커피잔일까? 오크(Oak)에서 자바가 된 이름의 유래&quot; data-og-description=&quot;자바(Java)의 로고는 왜 김이 모락모락 나는 커피잔일까요? 커피와 아무 상관 없어 보이는 이 프로그래밍 언어에 커피잔이 붙은 데는, 원래 '오크(Oak)'라는 나무 이름으로 불렸다가 상표권 문제로 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pj8Cs/dJMb86Pik87/HgWrZFFoIkouQM0cMVzJt1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/TgsOP/dJMb9c9OiTb/ANvvhHlJLf0OpGZCkMARTK/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/ciZA51/dJMb87gm9yj/dcoj4EVrkeoSyXhViAf4r1/img.png?width=939&amp;amp;height=948&amp;amp;face=527_100_592_171&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pj8Cs/dJMb86Pik87/HgWrZFFoIkouQM0cMVzJt1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/TgsOP/dJMb9c9OiTb/ANvvhHlJLf0OpGZCkMARTK/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/ciZA51/dJMb87gm9yj/dcoj4EVrkeoSyXhViAf4r1/img.png?width=939&amp;amp;height=948&amp;amp;face=527_100_592_171');&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;자바(Java)는 왜 커피잔일까? 오크(Oak)에서 자바가 된 이름의 유래&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)의 로고는 왜 김이 모락모락 나는 커피잔일까요? 커피와 아무 상관 없어 보이는 이 프로그래밍 언어에 커피잔이 붙은 데는, 원래 '오크(Oak)'라는 나무 이름으로 불렸다가 상표권 문제로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786942077627&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;SI, SM, 서비스 회사 차이 - 개발자가 일할 회사는 크게 세 종류입니다&quot; data-og-description=&quot;개발자로 일할 회사를 알아보다 보면 SI, SM, 서비스 회사, 유지보수 업체, 금융권 SI 같은 말이 정리 안 된 채로 쏟아집니다. 같은 개발자라도 어느 유형에 들어가느냐에 따라 매일 하는 일, 만지&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5QFcv/dJMb9bwiDD9/JhwZQdWX53kUoGncKbw9xK/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/cCVTQU/dJMb9jODgcw/UTA212EPDLkrNoBndDahi0/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/coSk3L/dJMb9hDhwoT/8bZbUlaVwj28deC7f5JwC0/img.png?width=1200&amp;amp;height=896&amp;amp;face=761_153_867_269&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5QFcv/dJMb9bwiDD9/JhwZQdWX53kUoGncKbw9xK/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/cCVTQU/dJMb9jODgcw/UTA212EPDLkrNoBndDahi0/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/coSk3L/dJMb9hDhwoT/8bZbUlaVwj28deC7f5JwC0/img.png?width=1200&amp;amp;height=896&amp;amp;face=761_153_867_269');&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;SI, SM, 서비스 회사 차이 - 개발자가 일할 회사는 크게 세 종류입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발자로 일할 회사를 알아보다 보면 SI, SM, 서비스 회사, 유지보수 업체, 금융권 SI 같은 말이 정리 안 된 채로 쏟아집니다. 같은 개발자라도 어느 유형에 들어가느냐에 따라 매일 하는 일, 만지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786942074494&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;이클립스가 무겁다고 욕먹은 이유, 애초에 IDE로 만든 게 아니라서입니다&quot; data-og-description=&quot;이클립스(Eclipse)라는 이름이 썬 마이크로시스템즈를 가린다는 뜻이라는 이야기, 개발자 사이에서 꽤 오래 돌았습니다. 그런데 이름을 붙인 IBM 쪽 증언은 다릅니다. 표적은 썬이 아니었고, 애초&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfwvfJ/dJMb81f9fdv/ePpTdJsUhsJdH3OJWkh531/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/bfF121/dJMb82MTLJf/l6y4CyVIHC4Lp4aWiKVu30/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/cwXmLN/dJMb88fhl63/n13Snkvs8cejb1rNHGAFd1/img.png?width=1200&amp;amp;height=896&amp;amp;face=826_146_919_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfwvfJ/dJMb81f9fdv/ePpTdJsUhsJdH3OJWkh531/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/bfF121/dJMb82MTLJf/l6y4CyVIHC4Lp4aWiKVu30/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/cwXmLN/dJMb88fhl63/n13Snkvs8cejb1rNHGAFd1/img.png?width=1200&amp;amp;height=896&amp;amp;face=826_146_919_249');&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;이클립스가 무겁다고 욕먹은 이유, 애초에 IDE로 만든 게 아니라서입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이클립스(Eclipse)라는 이름이 썬 마이크로시스템즈를 가린다는 뜻이라는 이야기, 개발자 사이에서 꽤 오래 돌았습니다. 그런데 이름을 붙인 IBM 쪽 증언은 다릅니다. 표적은 썬이 아니었고, 애초&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>Di</category>
      <category>IOC</category>
      <category>POJO</category>
      <category>springboot</category>
      <category>객체지향</category>
      <category>백엔드개발자</category>
      <category>스프링부트</category>
      <category>스프링프레임워크</category>
      <category>의존성주입</category>
      <category>자바</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/152</guid>
      <comments>https://devwar.tistory.com/entry/java-spring-framework#entry152comment</comments>
      <pubDate>Wed, 9 Sep 2026 10:11:01 +0900</pubDate>
    </item>
    <item>
      <title>GPT-6 아스트라 출시 내 챗GPT에 아직 안 뜨는 데 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/gpt-6-astra-release-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 9월 5일 오전 01_18_58.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cewWAi/dJMcaiknTpX/7jOL9tBg8mRzWcYgobkZ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cewWAi/dJMcaiknTpX/7jOL9tBg8mRzWcYgobkZ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cewWAi/dJMcaiknTpX/7jOL9tBg8mRzWcYgobkZ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcewWAi%2FdJMcaiknTpX%2F7jOL9tBg8mRzWcYgobkZ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GPT-6 아스트라 출시 내 챗GPT에 아직 안 뜨는 데 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;ChatGPT Image 2026년 9월 5일 오전 01_18_58.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-6 아스트라(GPT-6 Astra)가 2026년 9월 3일 나왔습니다. 1년 넘게 &quot;GPT-6가 언제 나오냐&quot;는 말이 돌았고, 8월엔 보안 문제로 출시가 미뤄졌다가 결국 나온 겁니다. 오픈AI(OpenAI) 사장은 &quot;AGI 시대에 들어왔다&quot;고까지 말했는데, 챗GPT를 쓰는 사람 입장에서 실제로 뭐가 달라지는지, 그리고 지금 당장 쓸 수 있는지를 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;GPT-6 나왔다는데 내 챗GPT엔 왜 안 보이죠?&quot;&lt;br /&gt;&quot;무료로도 쓸 수 있나요?&quot;&lt;br /&gt;&quot;AGI라는데 진짜 그 정도인가요?&quot;&lt;br /&gt;&quot;보안 때문에 미뤄졌다는 게 무슨 뜻이에요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 발표 내용과 CNBC, 데이터캠프 등 외신&amp;middot;기술 매체 여러 곳을 교차해서 확인했습니다. 성능 수치는 오픈AI가 직접 측정한 것이고, 외부 검증은 막 시작된 단계입니다. 가격은 &quot;토큰 100만 개당&quot; 달러이고 원화는 9월 초 환율 1달러 약 1,370원 기준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챗GPT 유료 구독자, 무료로 쓰면서 바꿀지 고민하는 분, 그리고 AI 뉴스가 너무 빨라서 뭐가 중요한지 감이 안 오는 분에게 맞는 글입니다. 출시 이틀 뒤인 2026년 9월 5일 기준이고, 순차 배포 중이라 며칠 뒤엔 상황이 또 바뀔 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GPT-6 아스트라, 이름부터 정리&lt;/li&gt;
&lt;li&gt;GPT-5.6과 달라진 점&lt;/li&gt;
&lt;li&gt;성능은 어디서 이기고 어디서 밀리나&lt;/li&gt;
&lt;li&gt;&quot;AGI 시대&quot; 발언과 반론&lt;/li&gt;
&lt;li&gt;출시가 미뤄졌던 이유, 보안 등급 &quot;Critical&quot;&lt;/li&gt;
&lt;li&gt;내 챗GPT엔 언제 뜨나&lt;/li&gt;
&lt;li&gt;가격과 요금제별 차이&lt;/li&gt;
&lt;li&gt;지금 바꿔야 할 사람과 아닌 사람&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;마무리&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. GPT-6 아스트라, 이름부터 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헷갈리는 게 당연합니다. 오픈AI는 8월 1일 &quot;아스트라(Astra)&quot;라는 이름만 먼저 공개했습니다. 수학에서 10년 넘게 안 풀리던 문제 열 개를 풀었다는 연구 발표였고, 그게 GPT-6인지 GPT-5.7인지는 말하지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9월 3일 출시하면서 정식 이름이 &quot;GPT-6 Astra&quot;로 확정됐습니다. 챗GPT 6라는 제품은 없고, 챗GPT 안에서 고르는 모델 이름이 GPT-6 아스트라입니다. 아스트라는 라틴어로 &quot;별&quot;이라는 뜻인데, 이전 모델 이름이 솔(태양)&amp;middot;테라(지구)&amp;middot;루나(달)였던 것과 이어지는 작명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조도 바뀌었습니다. GPT-5.6은 솔&amp;middot;테라&amp;middot;루나 세 등급이었는데, GPT-6는 아스트라 하나에 상위 요금제용 &quot;아스트라 프로&quot;가 붙는 방식입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. GPT-5.6과 달라진 점&lt;/h2&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;GPT-5.6 Sol / 솔&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;GPT-6 Astra / 아스트라&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;출시일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 7월 9일&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 9월 3일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;등급 구성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;솔&amp;middot;테라&amp;middot;루나 3단&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아스트라 + 아스트라 프로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;한 번에 읽는 길이&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 105만 토큰&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 105만 토큰 (동일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;지식 기준 시점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 초&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 4월 30일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보안 위험 등급&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;High (높음)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Critical (심각) &amp;mdash; 오픈AI 최초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발자 가격 (입력/출력)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$4/$20 할인가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10/$50 (2.5배)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉으로 보이는 스펙에서 크게 늘어난 건 없습니다. 읽는 길이도 같고 출력 길이도 같습니다. 달라진 건 &quot;얼마나 오래 혼자 일하느냐&quot;와 &quot;컴퓨터 화면을 얼마나 잘 다루느냐&quot; 같은 성능 쪽, 그리고 보안 등급과 가격입니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 성능은 어디서 이기고 어디서 밀리나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI가 공개한 표에서 이긴 것과 밀린 것을 같이 놓았습니다. 전부 오픈AI 자체 측정이고, 비교 대상은 이틀 전 나온 앤트로픽(Anthropic)의 클로드 페이블 5.1(Claude Fable 5.1)입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시험 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;GPT-6 Astra&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;비교&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컴퓨터 화면 조작 (OSWorld 2.0)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;72.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;GPT-5.6 솔 65.7%. 작업 시간도 절반 가까이 단축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;터미널 코딩 (Terminal-Bench 4.0)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;57.9%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;솔 37.3%, 클로드 페이블 5.1 55.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;고난도 수학 (FrontierMath 4단계)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;97.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;솔 83.0%. 거의 만점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;종합 지식 시험 (Humanity's Last Exam)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;57.2%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;클로드 페이블 5.1이 65.0%로 앞섬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;독립기관 종합 점수 (Artificial Analysis)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;61점&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;GPT-5.6 솔과 동점, 페이블 5.1은 66점&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇습니다. 컴퓨터를 직접 조작하고, 코딩하고, 수학 문제를 푸는 일에서는 확실히 올라갔습니다. 반면 넓은 분야를 두루 아는 시험과 독립기관 종합 점수에서는 이전 모델과 같거나 경쟁사에 밀립니다. &quot;모든 면에서 압도&quot;는 아니고, 특정 방향으로 크게 뻗은 모델입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &quot;AGI 시대&quot; 발언과 반론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 사장 그렉 브록먼(Greg Brockman)은 출시 브리핑을 &quot;AGI 시대에 온 것을 환영한다&quot;는 말로 마쳤습니다. AGI는 사람처럼 여러 분야 일을 두루 해내는 AI를 뜻하는데, 정확한 정의는 정해진 게 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반론도 바로 나왔습니다. 독립기관 종합 점수가 이전 모델과 똑같이 61점이라는 점, 그리고 99.9%를 받았다는 ARC-AGI-3 시험이 오픈AI가 만든 특별한 실행 환경에서 측정됐다는 점이 지적됐습니다. 브록먼 본인도 &quot;그렇게 느끼는 게 무리는 아니다&quot;라는 표현을 썼고, 사실이라고 단정하진 않았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  이 발언을 읽는 법&lt;/b&gt;&lt;br /&gt;&quot;AGI&quot;는 회사가 붙이는 말이고, 측정하는 시험이 따로 없습니다. 판단은 발표 문구가 아니라 내가 시켜본 일에서 결과가 달라졌는지로 하면 됩니다. 외부 평가가 쌓이는 데는 보통 몇 주가 걸립니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 출시가 미뤄졌던 이유, 보안 등급 &quot;Critical&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월 7일 오픈AI는 아스트라가 자사 위험 평가에서 사이버보안 &quot;Critical(심각)&quot; 등급에 도달했을 가능성을 배제할 수 없다고 발표했습니다. 오픈AI 모델 중 처음입니다. 쉽게 말해 아직 알려지지 않은 프로그램 취약점을 스스로 찾고, 그걸 이용하는 공격 코드까지 사람 도움 없이 만들 수 있다는 뜻입니다. 시험 중에 실제로 취약점 두 개를 찾아 개발사에 알렸다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 출시가 미뤄졌고, 나온 뒤에도 두 갈래로 나뉩니다. 일반 사용자가 받는 아스트라는 공격 코드 작성 같은 요청을 거부하도록 만들어졌습니다. 제한을 푼 전체 버전은 데이브레이크(Daybreak) 프로그램에 승인된 보안 기업과 기관만 씁니다. 크라우드스트라이크, 시스코, IBM 같은 곳입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부작용도 있습니다. 위험을 걸러내는 장치가 정상적인 작업까지 멈추는 경우가 있어서, 챗GPT에서는 &quot;이 작업을 검토하세요&quot;라는 확인창이 뜨고 개발자용에서는 작업이 중단됩니다. 오픈AI는 이 오탐이 원하는 수준보다 높다고 인정하고 몇 주 안에 조정하겠다고 했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 내 챗GPT엔 언제 뜨나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출시일에 받은 건 데이브레이크 승인 기관 등 일부 조직뿐입니다. 나머지는 &quot;며칠 안에&quot; 순차 배포라고만 했고 정확한 날짜는 없습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;요금제&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;제공 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;무료 / Go&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;발표 없음. 당분간 GPT-5.6 루나 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Plus (월 $20)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아스트라 기본형. 기존 사용량 한도 안에서 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Pro / Business / Enterprise&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아스트라 프로. Enterprise는 관리자가 켜야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 눈에 띄는 건 Plus가 Pro와 같은 날 받는다는 점입니다. 이전엔 비싼 요금제부터 순서대로 풀었는데, 오픈AI 담당자가 이번엔 의도적으로 동시에 연다고 밝혔습니다. 그리고 아직 안 뜬 유료 사용자에게는 하루마다 사용량 리셋 1회를 보상으로 준다고 했습니다. 기다리는 동안 손해가 없게 하겠다는 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 가격과 요금제별 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챗GPT 구독자는 추가 비용이 없습니다. 기존 요금제 안에서 쓰고, 더 필요하면 사용량을 따로 살 수 있게 할 예정이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자용 가격은 다릅니다. 입력 $10(약 13,700원), 출력 $50(약 68,500원)으로 GPT-5.6 솔 할인가의 2.5배입니다. 클로드 페이블 5.1과 정확히 같은 가격이라, 두 최상위 모델은 이제 가격 아닌 용도로만 갈리게 됐습니다. 속도를 두 배로 올리는 Fast 모드는 요금도 두 배입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 지금 바꿔야 할 사람과 아닌 사람&lt;/h2&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;상황&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;권장&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Plus 이상 구독 중&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;따로 할 일 없음. 모델 선택창에 뜨면 골라 쓰고, 안 뜨면 보상 받으면서 기다림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;무료 사용자, 이것 때문에 구독 고민&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일상 질문&amp;middot;글쓰기 위주면 서두를 이유 적음. 종합 점수는 이전과 같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AI에게 컴퓨터 작업&amp;middot;코딩&amp;middot;자료 분석을 오래 맡김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;바꿀 만함. 이번 향상이 정확히 그 영역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보안 관련 일을 시킴&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;거부&amp;middot;확인창이 잦을 수 있음. 오픈AI가 조정 예고한 몇 주 뒤 다시 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  확인하는 방법&lt;/b&gt;&lt;br /&gt;평소 시키던 일 두세 개를 5.6과 아스트라에 똑같이 넣어보면 됩니다. 발표 표에서 이긴 항목이 내 일과 겹치지 않으면 체감 차이는 작을 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무료로는 언제 쓸 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표에 없습니다. 무료와 Go 요금제는 당분간 GPT-5.6 루나가 기본이고, 아스트라 무료 제공은 별도 공지를 기다려야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GPT-5.6은 없어지나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 없어지진 않습니다. 오픈AI는 새 모델이 나오면 이전 모델을 보통 90일간 유지해왔습니다. 개발자용 5.6 솔 할인가도 11월 21일까지 예정대로 이어집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클로드 페이블 5.1과 뭐가 다른가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격은 같고, 강한 영역이 다릅니다. 아스트라는 컴퓨터 조작&amp;middot;수학&amp;middot;코딩에서, 페이블 5.1은 종합 지식 시험과 독립기관 종합 점수에서 앞섭니다. 둘 다 최상위 모델은 안전장치를 두 단계로 나눠 일반 공개판과 승인 기관용을 따로 두는 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;발표 문구가 아니라 내 작업이 기준입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-6 아스트라는 1년 기다린 이름값을 컴퓨터 조작과 코딩, 수학에서 보여줬고, 그 대신 보안 등급 때문에 거부와 확인창이 늘었고 개발자 가격은 2.5배가 됐습니다. 종합 점수는 그대로입니다. &quot;AGI 시대&quot;라는 말과 &quot;이전과 똑같은 61점&quot;이 같은 날 나온 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 쪽을 믿을지는 회사 발표나 뉴스 제목이 정해주는 게 아닙니다. 내 계정에 뜨면 평소 하던 일을 시켜보고, 달라졌으면 쓰고 아니면 안 쓰면 됩니다. 판단 기준은 처음부터 끝까지 내 일입니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1788538672162&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; data-og-description=&quot;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &amp;quot;코딩과 지식 노동에서 가장 진보한 모델&amp;quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RjSud/dJMb9jOFMDO/TpQCpqyLbStDLX6ZBKgsI1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/bwCDB7/dJMb9efwYaD/fGsv7yoezAoHIMhqCn1Lm0/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/FMjcX/dJMb9kmvjpz/ad0p1h68FbCcdgKMchM5k0/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RjSud/dJMb9jOFMDO/TpQCpqyLbStDLX6ZBKgsI1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/bwCDB7/dJMb9efwYaD/fGsv7yoezAoHIMhqCn1Lm0/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/FMjcX/dJMb9kmvjpz/ad0p1h68FbCcdgKMchM5k0/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224');&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788538660570&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&quot; data-og-description=&quot;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다. &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0Ofdj/dJMb8Sp1hcV/3kMKTlUZIgUkdz4488UCK1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/cwSbaJ/dJMb8WeS1mv/Aao44NUXF8MQUTzFwgK4kk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/bSM5k8/dJMb8WeS1mw/9BRHqX2Q20erbiEvDk2iIK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0Ofdj/dJMb8Sp1hcV/3kMKTlUZIgUkdz4488UCK1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/cwSbaJ/dJMb8WeS1mv/Aao44NUXF8MQUTzFwgK4kk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/bSM5k8/dJMb8WeS1mw/9BRHqX2Q20erbiEvDk2iIK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276');&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788538654156&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&quot; data-og-description=&quot;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &amp;quot;가장 똑똑한 일꾼 모델&amp;quot;이라고 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qEHAp/dJMb86ogKzp/altnHmh1zdKQJchctkgee1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/dnFj1B/dJMb89ywQp1/wDgkAAQ57xiRGyNKX4bbR1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bbX1oa/dJMb9llpW0s/c6bvBHnKBkef1KIQLuLuqK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qEHAp/dJMb86ogKzp/altnHmh1zdKQJchctkgee1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/dnFj1B/dJMb89ywQp1/wDgkAAQ57xiRGyNKX4bbR1/img.png?width=800&amp;amp;height=600&amp;amp;face=508_60_619_181,https://scrap.kakaocdn.net/dn/bbX1oa/dJMb9llpW0s/c6bvBHnKBkef1KIQLuLuqK/img.png?width=1448&amp;amp;height=1086&amp;amp;face=941_124_1110_309');&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;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &quot;가장 똑똑한 일꾼 모델&quot;이라고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>GPT-5.6 비교</category>
      <category>GPT-6 Astra</category>
      <category>GPT-6 가격</category>
      <category>GPT-6 아스트라</category>
      <category>GPT-6 출시</category>
      <category>오픈AI AGI</category>
      <category>오픈AI 새 모델</category>
      <category>챗GPT 6</category>
      <category>챗GPT Plus GPT-6</category>
      <category>클로드 페이블 5.1 비교</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/168</guid>
      <comments>https://devwar.tistory.com/entry/gpt-6-astra-release-guide#entry168comment</comments>
      <pubDate>Sat, 5 Sep 2026 01:20:13 +0900</pubDate>
    </item>
    <item>
      <title>제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.</title>
      <link>https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 9월 3일 오후 02_43_50.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUSZkq/dJMb998JuFm/sxTjBiCts0SQTQwBd5kjF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUSZkq/dJMb998JuFm/sxTjBiCts0SQTQwBd5kjF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUSZkq/dJMb998JuFm/sxTjBiCts0SQTQwBd5kjF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUSZkq%2FdJMb998JuFm%2FsxTjBiCts0SQTQwBd5kjF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;제미나이 3.8 플래시 딱 3주 만에 새로운 모델이 또 나왔습니다.&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;ChatGPT Image 2026년 9월 3일 오후 02_43_50.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이 3.8 플래시(Gemini 3.8 Flash)가 2026년 9월 2일 나왔습니다. 3.7 플래시가 나온 게 8월 13일이니 딱 3주 만입니다. 6주 동안 플래시 모델만 세 번째입니다. 구글은 &quot;가장 똑똑한 일꾼 모델&quot;이라고 소개했는데, 가격은 그대로면서 성능만 올랐다는 말이 사실인지, 그리고 지금 3.7을 쓰는 사람이 바로 바꿔야 하는지를 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;3.7 플래시 쓰고 있는데 3.8로 바꿔야 해요?&quot;&lt;br /&gt;&quot;가격이 같으면 무조건 새 걸 쓰는 게 맞지 않나요?&quot;&lt;br /&gt;&quot;플래시 사이버는 뭔가요, 나도 쓸 수 있나요?&quot;&lt;br /&gt;&quot;3주마다 새 모델이 나오면 언제 갈아타야 하나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 공식 발표문과 모델 카드, 개발자 문서를 기준으로 썼습니다. 성능 수치는 전부 구글이 직접 측정한 것이고, 외부 검증은 아직 없습니다. 가격은 &quot;토큰 100만 개당&quot; 달러이고, 원화는 9월 초 환율 1달러 약 1,370원으로 계산했습니다. 토큰은 AI가 글을 읽고 쓰는 단위인데 한국어 글자 1~2개가 토큰 하나 정도입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이 앱을 구독 중인 분, 일이나 취미로 AI에 코딩을 시키는 분, 그리고 새 모델이 나올 때마다 갈아타야 하나 고민되는 분에게 맞는 글입니다. 출시 하루 뒤인 2026년 9월 3일 기준입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;제미나이 3.8 플래시, 3주 만에 또 나온 이유&lt;/li&gt;
&lt;li&gt;3.7 플래시와 달라진 점&lt;/li&gt;
&lt;li&gt;구글이 내세운 성능 수치&lt;/li&gt;
&lt;li&gt;&quot;더 열심히 일한다&quot;는 말의 진짜 의미&lt;/li&gt;
&lt;li&gt;가격은 같지만 내년엔 두 배&lt;/li&gt;
&lt;li&gt;함께 나온 3.8 플래시 사이버&lt;/li&gt;
&lt;li&gt;3.7 플래시를 계속 써도 되는 경우&lt;/li&gt;
&lt;li&gt;어디서 쓸 수 있나&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;마무리&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제미나이 3.8 플래시, 3주 만에 또 나온 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 모델 카드를 보면 3.8 플래시는 새로 만든 모델이 아닙니다. &quot;3.7 플래시를 기반으로 한다&quot;고 적혀 있고, 학습 데이터나 구조 설명도 3.7 문서를 보라고 되어 있습니다. 즉 바닥부터 다시 만든 게 아니라 3.7을 다듬은 개선판입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 3주라는 짧은 간격이 가능했습니다. 구글은 &quot;모델이 스스로 결과를 평가하고 고치는 반복 학습&quot;과 &quot;보안 분야에서의 집중 훈련&quot;이 이번 향상의 원인이라고 설명합니다. 특히 보안 분야 훈련이 코딩과 추론 전반을 끌어올렸다는 게 구글 주장입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.5 플래시(5월 19일), 3.6 플래시(7월 21일), 3.7 플래시(8월 13일), 3.8 플래시(9월 2일). 넉 달 사이 네 버전입니다. 이 속도 자체가 이번 글의 결론과 연결됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 3.7 플래시와 달라진 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉으로 보이는 스펙은 거의 같습니다. 한 번에 읽는 길이 100만 토큰, 답 쓰는 길이 6만 4천 토큰, 글&amp;middot;사진&amp;middot;소리&amp;middot;영상 입력 모두 그대로입니다. 달라진 건 세 가지입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;3.7 Flash&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;3.8 Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;출시일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 8월 13일&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 9월 2일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;생각 깊이 설정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최소&amp;middot;낮음&amp;middot;중간&amp;middot;높음 4단계&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;낮음&amp;middot;중간&amp;middot;높음 3단계. &quot;최소&quot;는 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;토큰 사용량&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.6보다 효율적&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;어려운 일에서 더 많이 씀 (구글 인정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가격&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$0.75/$3.75 할인가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;지식 기준 시점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 3월&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동일 (일부 분야는 2025년 1월)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;생각 깊이 설정&quot;은 AI가 답하기 전에 얼마나 오래 고민할지 정하는 옵션입니다. 3.7까지 있던 &quot;최소&quot; 단계가 3.8에서 사라졌고, 이걸 쓰면 오류가 납니다. 앱에서 쓰는 분은 상관없지만, 3.7을 프로그램에 연결해서 쓰던 분은 이것 때문에 그대로 바꾸면 멈출 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 구글이 내세운 성능 수치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 발표에서 숫자로 확인되는 항목만 골랐습니다. 차트 이미지로만 공개된 수치는 넣지 않았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시험 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DeepSWE v1.1 (긴 코딩 작업)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;더 크고 비싼 프론티어 모델 대부분보다 높음 (구글 주장, 수치 미공개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;HLE-Verified (여러 분야 추론)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;54.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Vals Finance Agent V2 (금융 분석)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.7 플래시와 다른 프론티어 모델 상회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Harvey 법률 에이전트 벤치마크&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.7 플래시와 다른 프론티어 모델 상회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방향은 분명합니다. 오래 걸리는 코딩, 금융&amp;middot;법률처럼 전문 지식이 필요한 분석에서 좋아졌다는 겁니다. 단순 대화나 짧은 글쓰기 성능 얘기는 발표에 거의 없습니다. 이 모델이 어디를 겨냥했는지 그 자체가 말해줍니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  수치를 볼 때&lt;/b&gt;&lt;br /&gt;위 결과는 전부 구글이 자체 측정한 것입니다. 3.7 플래시도 출시 때 비슷한 방식으로 &quot;3.6 대비 16점 상승&quot;을 발표했고, 이후 외부 평가에서는 격차가 줄어드는 경우가 있었습니다. 독립 기관 점수가 나오기 전까지는 &quot;구글 주장&quot;으로 읽는 게 맞습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &quot;더 열심히 일한다&quot;는 말의 진짜 의미&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 발표문에 눈에 띄는 문장이 있습니다. &quot;이 성능 향상은 3.8 플래시가 더 열심히 일하기 때문이다.&quot; 어려운 문제를 만나면 추론 단계를 더 밟고, 도구를 여러 번 반복해서 부른다는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 문장이 중요합니다. &quot;그 결과 토큰을 더 쓸 수 있다, 특히 높은 단계 설정에서.&quot; 토큰을 더 쓴다는 건 요금이 더 나온다는 뜻입니다. 100만 토큰당 가격은 3.7과 같지만, 같은 일을 시켰을 때 소비하는 토큰이 늘어나면 실제 청구액은 오릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글도 이걸 숨기지 않았습니다. &quot;비용 효율이 최우선이면 생각 깊이를 낮추거나, 3.7 플래시를 계속 쓰라&quot;고 발표문에 직접 적었습니다. 새 모델을 내면서 이전 모델을 계속 쓰라고 안내하는 건 흔한 일이 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 가격은 같지만 내년엔 두 배&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.8 플래시 가격은 입력 $0.75(약 1,030원), 출력 $3.75(약 5,140원)로 3.7 플래시와 같습니다. 단 이건 2026년 12월 31일까지 할인가입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;기간&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;입력 / 출력 (100만 토큰당)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2026년 12월 31일까지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$0.75 / $3.75 (약 1,030원 / 5,140원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2027년 1월 1일부터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$1.50 / $7.50 (약 2,060원 / 10,280원)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4장과 합쳐서 보면 이렇게 됩니다. 지금은 가격이 같아도 토큰을 더 써서 조금 더 나오고, 내년부터는 단가까지 두 배가 됩니다. 올해 안에만 쓸 거면 부담이 작지만, 내년까지 이어지는 일이라면 두 요인이 겹치는 걸 염두에 둬야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 함께 나온 3.8 플래시 사이버&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 날 제미나이 3.8 플래시 사이버(Gemini 3.8 Flash Cyber)라는 모델도 나왔습니다. 같은 모델에 보안 관련 제한을 풀어서, 프로그램 취약점을 찾고 자동으로 고치는 데 특화한 버전입니다. 누구나 쓸 수 있는 건 아니고, 구글의 페어윈드 프로그램(Fairwind Program)에 승인된 정부기관&amp;middot;기반시설 운영자&amp;middot;소프트웨어 관리자만 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 공개한 성과는 이렇습니다. 크롬 보안팀은 이 모델이 훨씬 큰 상용 모델보다 올바른 패치를 2.6배 더 만들었다고 했고, 취약점 수정 외부 시험(CWE-Bench)에서 47.2%로 선두 모델 47.8%에 근접하면서 비용은 훨씬 낮았다고 밝혔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 사용자와 직접 관련은 없지만 한 가지 의미가 있습니다. 앤트로픽이 페이블(일반)과 미토스(승인 기관)로 나눈 것처럼, 구글도 같은 모델을 안전장치 수준으로 둘로 나누기 시작했습니다. 이 방식이 업계 표준이 되어가는 흐름입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 3.7 플래시를 계속 써도 되는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 3.8로 바꾸는 게 이득인 사람과 3.7을 두는 게 나은 사람이 갈립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;상황&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;권장&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AI에게 긴 코딩, 복잡한 분석을 맡김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.8로 바꾸는 게 이득. 토큰 증가분보다 실패 감소 효과가 클 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;짧은 답, 분류, 대량 반복 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.7 유지. 구글도 &quot;효율 우선이면 3.7&quot;이라고 안내&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;&quot;최소&quot; 생각 깊이로 프로그램 연결해 쓰는 중&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.7 유지 또는 설정 변경 후 이동. 그대로 바꾸면 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;제미나이 앱만 쓰는 구독자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;따로 할 일 없음. AI Pro&amp;middot;Ultra 구독이면 이미 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 3.7 플래시를 &quot;완전히 지원한다&quot;고 명시한 것도 참고할 점입니다. 새 모델이 나왔다고 이전 모델이 곧 사라지는 건 아닙니다. 급하게 옮길 이유가 없습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  갈아타기 전 확인법&lt;/b&gt;&lt;br /&gt;평소 시키는 일 한두 개를 3.7과 3.8에 똑같이 넣어보고 결과와 소비 토큰을 비교하는 게 가장 확실합니다. 발표 수치가 아니라 내 작업에서 차이가 나는지가 기준입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 어디서 쓸 수 있나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 사용자는 제미나이 앱, 구글 검색의 AI 모드, 구글 시트에서 쓸 수 있습니다. 단 Google AI Pro 또는 Ultra 구독자만 해당하고, 무료 사용자에게 열리는지는 발표에 언급이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 Gemini API, Google AI Studio, Antigravity, Android Studio, Stitch에서 바로 쓸 수 있고 모델 이름은 gemini-3.8-flash입니다. 기업용은 Gemini Enterprise에 들어갔습니다. 사이버 버전은 페어윈드 프로그램에 신청해서 승인을 받아야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.7 플래시 쓰고 있는데 지금 바꿔야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 코딩이나 전문 분석을 맡기고 있으면 바꿀 만하고, 짧은 답이나 반복 처리가 주 용도면 그대로 두는 게 낫습니다. 구글이 직접 &quot;효율 우선이면 3.7을 계속 쓰라&quot;고 했으니 급할 이유는 없습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가격이 같은데 왜 더 비쌀 수 있다는 건가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단가는 같지만 3.8이 어려운 문제에서 토큰을 더 쓰기 때문입니다. 100만 토큰당 가격이 아니라 &quot;일 하나를 끝내는 데 든 총액&quot;으로 비교해야 합니다. 구글도 이 점을 발표문에 적었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3주마다 나오는 새 모델을 다 따라가야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 넉 달 사이 네 버전이 나왔고, 이 속도를 다 따라가면 매번 설정을 바꾸느라 정작 일을 못 합니다. 지금 모델이 내 일을 잘 처리하고 있으면 그대로 두고, 새 모델은 내 작업으로 직접 시험해보고 확실히 나을 때만 옮기면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새 모델이 나올 때마다 기준은 하나입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.8 플래시는 성능이 올라간 게 맞고, 가격표도 그대로입니다. 하지만 토큰을 더 쓰고, 설정 하나가 사라졌고, 내년엔 단가가 두 배가 됩니다. &quot;가격 같은데 성능 올랐으니 무조건 이득&quot;은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 3주마다 모델을 내놓는 건 구글 사정입니다. 그 속도에 맞춰 움직일지, 내 일에 맞는 모델을 골라 두고 필요할 때만 바꿀지는 쓰는 사람이 정하는 겁니다. 발표 수치보다 내 작업에서 확인한 결과가 기준입니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1788414245166&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&quot; data-og-description=&quot;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다. &quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwulF5/dJMb8WeSN2I/MK8S3MbQ5rRhNA0xtCA090/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/sNvEd/dJMb8U9cFMX/3bAPawcgV7WcGmEI12mVeK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/cfDHee/dJMb8WMIGr2/M2kJN5qaVzonpRJCjKLq0k/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/ai-model-companies-price-krw-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwulF5/dJMb8WeSN2I/MK8S3MbQ5rRhNA0xtCA090/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/sNvEd/dJMb8U9cFMX/3bAPawcgV7WcGmEI12mVeK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=478_95_564_190,https://scrap.kakaocdn.net/dn/cfDHee/dJMb8WMIGr2/M2kJN5qaVzonpRJCjKLq0k/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=693_138_818_276');&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;AI 모델 회사별 장단점 정리, 각 회사 모델마다 추천 사용법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델 회사별 장단점 정리를 2026년 9월 기준으로 했습니다. 오픈AI(OpenAI), 앤트로픽(Anthropic), 구글(Google), xAI 네 회사가 몇 주마다 새 모델을 내놓는 통에 이름만 들어도 헷갈리는 분이 많습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788414217287&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&quot; data-og-description=&quot;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9t4fo/dJMb9iIZsno/MLwPzR56GGuYMKFJ7mZdN0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/bJZVtV/dJMb8YX4SAP/E8JpJmZVEE484W7i8RXz80/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/d7g0iJ/dJMb9fZN3cY/Kks40pqInCkzKQyvP4g1S0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9t4fo/dJMb9iIZsno/MLwPzR56GGuYMKFJ7mZdN0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/bJZVtV/dJMb8YX4SAP/E8JpJmZVEE484W7i8RXz80/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/d7g0iJ/dJMb9fZN3cY/Kks40pqInCkzKQyvP4g1S0/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280');&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788414204114&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; data-og-description=&quot;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &amp;quot;코딩과 지식 노동에서 가장 진보한 모델&amp;quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bH8fYY/dJMb9c9Qzug/fkYLOPYMxP2FSJ29DNHCGK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/tOVJ3/dJMb9llpIDZ/JVyfrmc5XhrvUwSBBwraS1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/sHG2G/dJMb8WeSMuE/vEu8AZHYh62wC4lzmp8B31/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bH8fYY/dJMb9c9Qzug/fkYLOPYMxP2FSJ29DNHCGK/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/tOVJ3/dJMb9llpIDZ/JVyfrmc5XhrvUwSBBwraS1/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/sHG2G/dJMb8WeSMuE/vEu8AZHYh62wC4lzmp8B31/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224');&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI 모델 갈아타기</category>
      <category>Gemini 3.8 Flash</category>
      <category>구글 AI Pro</category>
      <category>구글 AI 모델</category>
      <category>구글 제미나이 신모델</category>
      <category>제미나이 3.7 플래시 비교</category>
      <category>제미나이 3.8 플래시</category>
      <category>제미나이 3.8 플래시 사이버</category>
      <category>제미나이 api</category>
      <category>제미나이 플래시 가격</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/167</guid>
      <comments>https://devwar.tistory.com/entry/gemini-3-8-flash-release-guide#entry167comment</comments>
      <pubDate>Thu, 3 Sep 2026 14:44:19 +0900</pubDate>
    </item>
    <item>
      <title>오픈AI 커서 모델 공급 중단 머스크 감정싸움이 아니라 계약 조항 때문입니다</title>
      <link>https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;LxSWS.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwm3gg/dJMcadpJWcr/KQYKxEnznVi5x467g6yWs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwm3gg/dJMcadpJWcr/KQYKxEnznVi5x467g6yWs0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwm3gg/dJMcadpJWcr/KQYKxEnznVi5x467g6yWs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwm3gg%2FdJMcadpJWcr%2FKQYKxEnznVi5x467g6yWs0%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; alt=&quot;오픈AI 커서 모델 공급 중단 머스크 감정싸움이 아니라 계약 조항 때문입니다&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;LxSWS.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 커서 모델 공급 중단 발표가 2026년 8월 28일 밤에 나왔습니다. SpaceX가 커서(Cursor)를 인수한 지 2주 만에 오픈AI가 계약 종료를 통보한 건데, 헤드라인만 보면 머스크와 올트먼의 감정 싸움처럼 읽히지만 실제로는 계약 조항 하나가 움직인 사건입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;오픈AI가 커서에 모델 안 주는 이유가 정확히 뭔가요?&quot;&lt;br /&gt;&quot;11월 12일 이후 커서에서 GPT 못 쓰는 건가요?&quot;&lt;br /&gt;&quot;머스크랑 싸워서 그런 거 아닌가요?&quot;&lt;br /&gt;&quot;Claude는 계속 되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 공식 발표문, 커서 CEO의 답변, 주요 외신 보도를 교차해서 사실만 정리했습니다. 양측 주장은 출처를 붙여 그대로 옮기고, 해석이 들어간 부분은 그렇다고 표시했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서를 쓰는 개발자, AI 코딩 도구를 팀에 도입한 리드, 그리고 모델 공급 계약 리스크를 처음 접하는 분에게 도움이 될 겁니다. 11월 12일은 오픈AI가 &quot;제안한&quot; 날짜이고 양사가 협의 중이라, 이후 내용이 바뀔 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사건 개요와 타임라인&lt;/li&gt;
&lt;li&gt;오픈AI가 밝힌 이유 두 가지&lt;/li&gt;
&lt;li&gt;지배권 변경 조항이 실제 방아쇠였다&lt;/li&gt;
&lt;li&gt;왜 11월 12일이고, 왜 Astra는 즉시 제외인가&lt;/li&gt;
&lt;li&gt;커서의 반응과 &quot;5%&quot;의 의미&lt;/li&gt;
&lt;li&gt;커서 사용자에게 실제로 달라지는 것&lt;/li&gt;
&lt;li&gt;Anthropic과 Grok, 다른 공급사의 움직임&lt;/li&gt;
&lt;li&gt;Windsurf 선례와 겹쳐 읽히는 지점&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;모델 공급은 중립 인프라가 아니었다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 오픈AI 커서 계약 종료 사건 개요와 타임라인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI는 8월 28일 SpaceX에 커서용 모델 공급 계약을 종료할 의사를 통보했다고 발표했습니다. 제안한 중단일은 2026년 11월 12일이고, 계약이 허용하는 최대 통지 기간을 적용한 날짜라고 밝혔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사건은 갑자기 터진 게 아닙니다. 4월부터 이어진 흐름을 보면 맥락이 잡힙니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;날짜 (2026)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;사건&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;4월 19일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;SpaceX와 커서, 컴퓨트 협력 계약 체결. SpaceX가 인수 옵션 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;6월 16일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;SpaceX가 옵션 행사, 합병 계약 서명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;8월 14일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;인수 완료. 전액 주식 교환, 약 600억 달러 규모(CNBC). 커서가 SpaceX 자회사가 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;8월 26일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Grok Bot이 커서 Pro와 Teams 플랜에 번들로 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;8월 28일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오픈AI, 계약 종료 통보와 11월 12일 중단일 제안 발표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;8월 28일 밤&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;커서 CEO 마이클 트루엘 답변. Anthropic도 같은 밤 커서 지원 확대 발표&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월 14일에서 28일까지 딱 2주입니다. 이 2주가 뒤에서 설명할 계약 조항과 직접 연결됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 오픈AI가 밝힌 이유 두 가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 발표문은 350단어 정도로 짧고, 이유를 상업적 문제가 아니라 신뢰 문제로 못박았습니다. 원문의 핵심 문장을 옮기면 &quot;SpaceX가 우리 기술을 이용약관 범위 안에서 사용할 것이라고 확신할 수 없다&quot;는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확신할 수 없다는 근거로 두 가지 이력을 들었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;근거&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;오픈AI의 설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;트위터(X) 계약 위반&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;머스크가 트위터를 인수한 뒤 오픈AI와의 계약 조건을 위반했다. 현재 X는 SpaceX 소속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;xAI 약관 위반 인정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2026년 초 소송 과정에서 머스크가 선서 하에 xAI가 오픈AI 이용약관을 위반했다고 인정했다. xAI 역시 현재 SpaceX 소속&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 &quot;커서가 문제가 아니라 커서의 새 주인이 문제&quot;라는 논리입니다. 발표문은 커서 팀과 4년 가까운 파트너십에 대해 존중을 표하고, 영향받는 개발자를 위해 최대한 지원하겠다는 말로 끝납니다. The Decoder 인터뷰에서 오픈AI 측 인사는 이 결정을 &quot;결국 신뢰의 문제&quot;라고 요약했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  한쪽 주장이라는 점&lt;/b&gt;&lt;br /&gt;위 두 근거는 오픈AI가 발표문에서 제시한 것입니다. SpaceX나 xAI 측이 이 사건과 관련해 공식 반박문을 낸 건 확인되지 않았고, 머스크 개인이 X에 짧은 반응을 올린 정도입니다. 소송은 여전히 진행 중이라 양측 주장이 모두 확정 사실은 아닙니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 지배권 변경 조항이 실제 방아쇠였다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰 얘기는 명분이고, 실제로 이 사건을 가능하게 한 건 계약서의 한 조항입니다. 오픈AI는 커서와 맺은 맞춤 계약에 지배권 변경(change of control) 시 일정 기간 안에 해지할 수 있는 조항이 있다고 밝혔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지배권 변경 조항은 B2B 계약에서 흔한 장치입니다. 계약 상대방의 소유주가 바뀌면 원래 계약할 때의 전제가 달라지니, 일정 기간 안에 계약을 다시 볼 수 있게 열어두는 겁니다. 오픈AI는 대형 파트너와는 통상 이런 맞춤 계약을 쓴다고 설명했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월 14일 인수 완료로 이 조항의 행사 기간이 열렸고, 오픈AI는 그 기간 안에 해지권을 행사했습니다. 8월 28일이라는 타이밍은 감정이 아니라 계약서가 정한 창문 안에서 나온 겁니다. 다만 조항의 정확한 문구나 행사 기간은 공개되지 않았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 왜 11월 12일이고, 왜 Astra는 즉시 제외인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI는 중단일을 &quot;계약이 허용하는 가장 늦은 날짜&quot;로 잡았다고 강조합니다. 즉시 끊을 수도 있었지만 개발자가 옮길 시간을 최대한 주기 위해 11월 12일까지 미뤘다는 설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 차기 모델 Astra는 예외입니다. 오픈AI는 남은 기간에도 신규 모델은 커서에 공급하지 않겠다고 명시했고, Astra를 직접 거명했습니다. 발표문은 그 이유로 &quot;AI 역량이 발전하면서 차기 모델이 약관에 맞게 쓰이는지 확인할 책임이 커졌다&quot;는 점을 들었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;대상&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;커서 내 공급&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;기존 모델 (GPT-5.6 Sol 등)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;11월 12일(제안일)까지 유지, 이후 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;신규 모델 (Astra 포함)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;즉시 제외, 남은 기간에도 공급 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11월 12일은 아직 확정이 아닙니다. 오픈AI는 양사가 확인한 뒤 공식 날짜를 알리겠다고 했고, 커서 측이 먼저 접근을 끊을 수도 있다고 덧붙였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 커서의 반응과 &quot;5%&quot;의 의미&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서 CEO 마이클 트루엘은 발표 당일 밤 X에 세 문장으로 답했습니다. 요지는 오픈AI 모델이 커서 전체 트래픽의 약 5%를 차지하고, 오픈AI 팀과 해결을 위해 대화 중이며, 커서는 오픈AI의 초기 고객으로서 그 플랫폼을 &quot;중립 인프라&quot;로 신뢰해왔다는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5%라는 숫자는 커서 측만 제시한 것이고 제3자 검증은 없습니다. 하지만 맞다고 가정하면 두 가지를 말해줍니다. 첫째, 커서 입장에서 사업적 타격은 제한적이라는 신호입니다. 둘째, 커서의 무게중심이 이미 자체 라우팅 모델과 Claude, 그리고 인수 후 들어온 Grok으로 옮겨가 있었다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현 차이도 눈여겨볼 부분입니다. 트루엘은 오픈AI가 &quot;커서 사용자의 접근을 차단한다&quot;고 표현했지만, 오픈AI의 안내는 &quot;커서를 통한 도매 공급이 끝난다&quot;에 가깝습니다. 사용자가 직접 관리하는 경로는 남는다는 게 오픈AI 설명인데, 이건 다음 장에서 봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 커서 사용자에게 실제로 달라지는 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중단 이후에도 오픈AI 모델을 커서 안에서 쓰는 방법은 세 가지가 남습니다. 오픈AI가 발표와 함께 안내한 내용입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;경로&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;방식&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #c62828; color: white;&quot;&gt;과금&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;본인 API 키&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;커서 설정에 오픈AI API 키 입력&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;오픈AI API 요금 별도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Codex IDE 확장&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;커서 안에 오픈AI 확장 설치, 별도 에이전트 패널&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;ChatGPT 구독 또는 API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AI 게이트웨이&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Bedrock, Azure, OpenRouter 등 경유&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;해당 제공사 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 세 경로 모두 로컬 Chat과 Agent 세션에만 적용된다는 점입니다. Tab 자동완성, Auto 모델 라우팅, 클라우드&amp;middot;백그라운드 에이전트, Automations, 커서 CLI와 SDK는 커서가 직접 공급하는 모델 풀에서 돌아가는데, 중단 후 이 풀에서 오픈AI 모델이 빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 측면도 짚어야 합니다. ChatGPT 구독에는 API 사용량이 포함되지 않아서, 본인 키 방식은 커서 요금에 오픈AI API 요금을 추가로 내는 구조입니다. 개인 사용자 입장에서 정리하면, 모델 선택창에서 다른 모델을 고르면 일상 작업의 손실은 작고, 대신 커서의 라우팅&amp;middot;백그라운드 기능은 오픈AI 없는 영역이 된다는 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Anthropic과 Grok, 다른 공급사의 움직임&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈AI 발표 두 시간쯤 뒤, Anthropic 공동창업자 톰 브라운은 X에 &quot;커서는 Sonnet 3.5 시절부터 신뢰하는 파트너이며, 커서 내 Claude 모델 지원을 위한 컴퓨트를 계속 늘리겠다&quot;는 글을 올렸습니다. 한 공급사의 계약 리스크가 다른 공급사에겐 확장 기회가 된 장면입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok은 상황이 다릅니다. 커서가 SpaceX 자회사가 된 이상 Grok은 사실상 자사 모델이고, 8월에 Grok 4.6이 커서에 들어왔고 26일부터 Grok Bot이 Pro&amp;middot;Teams에 번들됐습니다. 이번 사건은 오픈AI 공급 모델에만 해당하며 Grok에는 영향이 없습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  흐름으로 읽으면&lt;/b&gt;&lt;br /&gt;8월 14일 SpaceX 인수, 26일 Grok 번들, 28일 오픈AI 이탈, 같은 밤 Anthropic 지원 확대. 2주 안에 커서의 모델 라인업 지형이 통째로 바뀌었습니다. 모델 계층과 제품 계층이 별개 사업이라는 전제가 흔들리고 있다는 해석이 나오는 이유입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. Windsurf 선례와 겹쳐 읽히는 지점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The Decoder는 이 사건을 다루며 2025년 6월 사례를 함께 언급했습니다. 당시 Anthropic이 코딩 도구 Windsurf의 Claude 접근을 차단했는데, 오픈AI가 Windsurf를 인수한다는 보도가 나온 직후였습니다. 구조가 거의 같습니다. 경쟁 랩이 코딩 도구를 인수하면 다른 랩이 모델 공급을 거둬들이는 패턴입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이도 있습니다. Windsurf 건은 인수가 보도 단계일 때 벌어졌고 공식 사유 설명이 제한적이었지만, 이번 건은 인수 완료 후 계약 조항에 근거해 최대 통지 기간을 두고 진행됐습니다. 절차적으로는 이번이 훨씬 정돈된 형태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 사건을 나란히 놓으면 결론은 하나로 모입니다. 프론티어 모델 공급은 돈만 내면 누구나 쓰는 인프라가 아니고, 누가 그 도구를 소유하느냐에 따라 끊길 수 있는 계약 관계라는 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11월 12일 이후 커서에서 GPT를 완전히 못 쓰나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완전히는 아닙니다. 본인 API 키, Codex 확장, 게이트웨이 세 경로로 로컬 Chat과 Agent에서는 계속 쓸 수 있습니다. 다만 Tab 자동완성과 Auto 라우팅, 백그라운드 에이전트 같은 커서 자체 공급 기능에서는 빠집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커서에서 Claude는 계속 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;됩니다. Anthropic은 오히려 커서용 컴퓨트를 늘리겠다고 공개적으로 밝혔습니다. 이번 사건은 오픈AI 모델에만 해당합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;날짜가 바뀔 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;있습니다. 11월 12일은 오픈AI의 제안일이고 양사가 협의 중입니다. 확정 날짜는 양사 확인 후 별도 공지된다고 했고, 커서가 먼저 끊을 가능성도 오픈AI가 언급했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모델 공급은 중립 인프라가 아니었다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사건의 표면은 머스크와 오픈AI의 오랜 갈등이지만, 개발자에게 남는 건 트루엘이 쓴 &quot;중립 인프라&quot;라는 단어입니다. 커서는 오픈AI API를 전기나 수도처럼 여겼고, 그 전제가 소유주 변경 한 번으로 무너졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 도구 위에 워크플로를 쌓든, 그 도구 안의 모델 접근은 서로 경쟁하는 회사들 사이의 계약에 달려 있고 몇 달 통지로 끝날 수 있습니다. 특정 모델에 종속된 프롬프트나 자동화가 있다면, 이번 기회에 다른 모델로 바꿔도 돌아가는지 한 번 점검해볼 만합니다. 개인적으로는 이 사건이 코딩 도구 업계에서 첫 사례도 마지막 사례도 아닐 거라고 봅니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1788336711894&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZzrPf/dJMb8QMu7Fh/08y0FMhOzVeC76hiadvq8k/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bh9c7Y/dJMb887rscI/xFRciGykaS3QsSIrD8doZk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bwjTwq/dJMb8UH73Cb/udlaqO5RJoqdAXNpfOwMJk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZzrPf/dJMb8QMu7Fh/08y0FMhOzVeC76hiadvq8k/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bh9c7Y/dJMb887rscI/xFRciGykaS3QsSIrD8doZk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bwjTwq/dJMb8UH73Cb/udlaqO5RJoqdAXNpfOwMJk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247');&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788336709818&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; data-og-description=&quot;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &amp;quot;코딩과 지식 노동에서 가장 진보한 모델&amp;quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iWyyV/dJMb8SXQQ7B/lqaG5kdMMOwpCoZ02SLmjk/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/omxqU/dJMb9c9Qtrw/42Y8AarORxcYU4cv47kB5k/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/dmAJJY/dJMb87OfPn9/UT7WZqISMKaQWTIaXgcISk/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-fable-5-1-release-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iWyyV/dJMb8SXQQ7B/lqaG5kdMMOwpCoZ02SLmjk/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/omxqU/dJMb9c9Qtrw/42Y8AarORxcYU4cv47kB5k/img.png?width=800&amp;amp;height=618&amp;amp;face=572_93_623_149,https://scrap.kakaocdn.net/dn/dmAJJY/dJMb87OfPn9/UT7WZqISMKaQWTIaXgcISk/img.png?width=1200&amp;amp;height=927&amp;amp;face=862_140_938_224');&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;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>ai 코딩 도구</category>
      <category>Claude 커서</category>
      <category>Cursor OpenAI</category>
      <category>Grok Bot</category>
      <category>SpaceX 커서 인수</category>
      <category>오픈AI 모델 공급 중단</category>
      <category>오픈AI 커서</category>
      <category>일론 머스크 오픈AI</category>
      <category>지배권 변경 조항</category>
      <category>커서 GPT 종료</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/166</guid>
      <comments>https://devwar.tistory.com/entry/openai-cursor-model-cutoff-reason#entry166comment</comments>
      <pubDate>Wed, 2 Sep 2026 17:21:10 +0900</pubDate>
    </item>
    <item>
      <title>클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다</title>
      <link>https://devwar.tistory.com/entry/claude-fable-5-1-release-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xa4Gx/dJMcaikkKpn/YmiEKILU1Nbwe2wWnOF2x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xa4Gx/dJMcaikkKpn/YmiEKILU1Nbwe2wWnOF2x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xa4Gx/dJMcaikkKpn/YmiEKILU1Nbwe2wWnOF2x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxa4Gx%2FdJMcaikkKpn%2FYmiEKILU1Nbwe2wWnOF2x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;클로드 페이블 5.1 페이블 5에서 모델명만 바꾸면 깨지는 게 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;927&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 페이블 5.1(Claude Fable 5.1)이 2026년 9월 1일 출시됐습니다. Anthropic이 &quot;코딩과 지식 노동에서 가장 진보한 모델&quot;이라고 소개한 이번 릴리스는 성능 발표 자체보다 가격 구조, 데이터 보관 조건, 안전장치 변경이 함께 묶여 나왔다는 점에서 개발자 입장에서 따져볼 게 많습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;페이블 5.1이랑 미토스 5.1은 뭐가 다른 건가요?&quot;&lt;br /&gt;&quot;가격이 안 올랐다는데 진짜 싸진 건가요?&quot;&lt;br /&gt;&quot;페이블 5 쓰던 코드 그대로 모델명만 바꾸면 되나요?&quot;&lt;br /&gt;&quot;Opus 5 쓰고 있는데 갈아타야 하나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출시 직후라 커뮤니티에도 헤드라인 위주 정보만 돌고 있어서, 공식 발표문과 개발자 문서, 그리고 외부 벤치마크 기관의 반박까지 한 번에 정리했습니다. 발표 자료에 없는 내용은 넣지 않았고, 확인이 안 되는 부분은 그렇다고 적었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 API로 Claude를 호출하는 개발자, Claude Code나 Cowork를 업무에 쓰는 분, 그리고 모델 선택 기준을 정리해야 하는 팀 리드에게 도움이 될 겁니다. 2026년 9월 2일 시점 정보이며, 가격과 정책은 이후 바뀔 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클로드 페이블 5.1 출시 개요&lt;/li&gt;
&lt;li&gt;페이블 5.1과 미토스 5.1의 차이&lt;/li&gt;
&lt;li&gt;벤치마크로 보는 성능 변화&lt;/li&gt;
&lt;li&gt;가격은 그대로, 캐시 읽기만 75% 인하&lt;/li&gt;
&lt;li&gt;비용 절감 주장에 대한 외부 반박&lt;/li&gt;
&lt;li&gt;effort 설정별 선택 기준&lt;/li&gt;
&lt;li&gt;API 스펙과 호출 예시&lt;/li&gt;
&lt;li&gt;페이블 5에서 넘어갈 때 깨지는 것 3가지&lt;/li&gt;
&lt;li&gt;Covered Model 지정과 데이터 보관 조건&lt;/li&gt;
&lt;li&gt;안전장치 변화: 오탐 감소, 워터마크, 증류 방지&lt;/li&gt;
&lt;li&gt;Opus 5와 비교해 언제 써야 하나&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;마무리&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 클로드 페이블 5.1 출시 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 9월 1일 클로드 페이블 5.1과 클로드 미토스 5.1을 동시에 발표했습니다. API 모델 스트링은 &lt;code&gt;claude-fable-5-1&lt;/code&gt;이고, Claude API 외에 Amazon Bedrock, Google Cloud, Microsoft Foundry, Claude Platform on AWS에서 같은 날 사용 가능해졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포지션은 기존 페이블 5의 직계 후속입니다. Anthropic이 강조하는 방향은 &quot;몇 시간씩 돌아가는 장기 에이전트 작업&quot;입니다. 코드베이스 전체에 걸친 기능 구현, 코드 리뷰, 성능 작업, 여러 애플리케이션을 오가는 무인 실행 같은 시나리오를 대표 사례로 내세웁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude.ai 쪽에서는 Pro, Max, Team, Enterprise 플랜 사용자에게 제공됩니다. 무료 플랜 제공 여부는 발표문에 언급이 없습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  한 줄 요약&lt;/b&gt;&lt;br /&gt;페이블 5.1은 &quot;가격 유지 + 캐시 읽기 인하 + 장기 에이전트 성능 강화 + 규제 대응(워터마크&amp;middot;데이터 보관)&quot;이 한 세트로 묶인 릴리스입니다. 성능만 보고 판단하면 절반만 보는 셈입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 페이블 5.1과 미토스 5.1의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 모델은 같은 모델입니다. 가중치가 다른 게 아니라 안전장치(safeguard) 수준만 다릅니다. 페이블 5.1은 일반 공개, 미토스 5.1은 신뢰 접근 프로그램에 속한 조직만 쓸 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미토스 5.1이 풀어주는 영역은 두 가지입니다. 사이버보안 연구용 Cyber Verification Program(CVP)과 생명과학 연구용 Life Sciences Verification Program(LSVP)입니다. 현재는 미국 조직으로 한정돼 있고, 국제 파트너 확대는 미국 정부와 협의 중이라고만 밝혔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;페이블 5.1&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;미토스 5.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;기반 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;접근&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일반 공개&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;CVP&amp;middot;LSVP 참여 조직(미국 한정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;사이버 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;취약점 발견 가능, 익스플로잇 생성&amp;middot;침투 테스트는 Opus로 전환&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;방어 연구용 안전장치 완화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가격&amp;middot;스펙&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10 / $50&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블 5.1과 동일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 실무에서 중요한 건 &quot;안전장치가 개입하면 어떻게 되는가&quot;입니다. 페이블 5.1에서 사이버 관련 이중용도 요청이 걸리면 Opus 모델로 처리가 넘어갑니다. 벤치마크 각주에도 사이버 태스크는 Opus 4.8이, 생물학 태스크는 Opus 5가 대신 수행했다고 명시돼 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 벤치마크로 보는 성능 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic이 공개한 수치 중 개발자에게 의미 있는 항목만 뽑았습니다. 모든 수치는 Anthropic 자체 측정이고, 페이블 5.1은 프로덕션 안전장치를 켠 상태로 평가됐다는 단서가 붙어 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;벤치마크&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;페이블 5.1&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;페이블 5 / Opus 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Terminal-Bench 4.0 (에이전트 코딩)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;55.8%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;42.0% / 52.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;CursorBench 3.2.0&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;73.4%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;70.5% / 70.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Terminal-Bench-Science 0.1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;52.6%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;24.7% / 29.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AutomationBench (업무 워크플로)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;31.4%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;17.1% / 26.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;OSWorld 2.0 strict (컴퓨터 사용)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;41.7%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;36.1% / 39.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈에 띄는 건 Terminal-Bench-Science가 두 배 이상 뛰었다는 점과, 정작 일반 코딩 벤치마크인 CursorBench는 3점 정도 차이라는 점입니다. 평범한 코딩 작업에서 체감 차이가 클지는 미지수고, 장시간 자율 실행이나 연구성 작업에서 격차가 벌어지는 구조로 읽힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terminal-Bench 4.0에서 미토스 5.1은 60.9%로 페이블 5.1보다 5점 높습니다. 같은 모델인데 차이가 나는 이유는 안전장치가 개입한 태스크 때문이고, Anthropic은 이번 안전장치 개선으로 이 격차가 줄어들 거라고 설명합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 가격은 그대로, 캐시 읽기만 75% 인하&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 100만 토큰당 $10, 출력 100만 토큰당 $50. 페이블 5와 똑같습니다. 바뀐 건 프롬프트 캐시 읽기 가격 하나로, $1.00에서 $0.25로 내려갔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;페이블 5.1 (100만 토큰당)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;캐시 쓰기 (5분 / 1시간)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$12.50 / $20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;캐시 읽기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$0.25 (페이블 5 대비 75% 인하)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Batch API&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;입출력 50% 할인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 이 하나의 변경으로 일반 워크로드는 약 25%, 컨텍스트가 크고 툴 호출이 많은 에이전트 워크로드는 최대 약 45% 비용이 줄어든다고 계산했습니다. 8월 한 달간의 실사용 데이터를 기준으로, 기본 effort에서 측정한 수치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 캐시 읽기 하나가 이렇게 큰 차이를 만들까요. 에이전트 루프에서는 매 턴마다 시스템 프롬프트, 툴 정의, 이전 대화 전체가 다시 입력으로 들어갑니다. 이 반복 입력이 캐시 읽기로 처리되기 때문에, 긴 세션일수록 전체 비용의 대부분이 캐시 읽기에서 나옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 비용 절감 주장에 대한 외부 반박&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 걸음 더 봐야 합니다. 사전 테스트에 참여한 독립 벤치마크 기관 Artificial Analysis는 &quot;45% 절감&quot; 주장에 이의를 제기했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The Decoder 보도에 따르면, 캐시 읽기 인하로 에이전트 태스크당 약 $1.40이 절약되는 건 맞지만, 페이블 5.1을 최대 effort로 돌리면 출력 토큰을 페이블 5보다 약 1.7배 많이 씁니다. 그 결과 태스크당 비용은 오히려 20% 정도 더 나온다는 겁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;주장&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Anthropic: 최대 45% 절감&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기본 effort, 8월 실사용 데이터, 캐시 읽기 비중이 높은 워크로드 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Artificial Analysis: 20% 비싸짐&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최대 effort, 출력 토큰 1.7배 증가, Intelligence Index 태스크당 비용 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 주장은 서로 모순이 아닙니다. 측정 조건이 다릅니다. Anthropic은 기본 effort에서 캐시가 많이 걸리는 워크로드를 봤고, Artificial Analysis는 최대 effort에서 태스크 단위 총비용을 봤습니다. 실무에서 어느 쪽에 가까울지는 본인 워크로드의 effort 설정과 캐시 적중률에 달려 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  확인 방법&lt;/b&gt;&lt;br /&gt;페이블 5 청구 내역에서 캐시 읽기 토큰 비율을 먼저 보세요. 캐시 읽기가 전체 토큰의 절반을 넘는다면 인하 효과가 크고, 출력 토큰 비중이 높은 단발 호출 위주라면 effort를 낮추지 않는 한 비용이 줄지 않을 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. effort 설정별 선택 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이블 5.1은 추론 깊이를 &lt;code&gt;effort&lt;/code&gt; 파라미터로 조절합니다. low, medium, high, xhigh, max 다섯 단계이고, 확장 사고(extended thinking)는 항상 켜진 적응형(adaptive) 모드 하나만 제공됩니다. 즉 사고를 끌 수는 없고, 깊이만 조절합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic 발표에서 실무적으로 유용한 문장은 이겁니다. &quot;Low나 Medium effort에서 페이블 5.1은 페이블 5와 비슷하거나 더 나은 결과를 훨씬 낮은 비용으로 낸다.&quot; 다시 말해 같은 품질을 원하면 effort를 내려서 비용을 줄이고, 더 어려운 문제에는 effort를 올리는 식으로 운용하라는 뜻입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;제품&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;기본 effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude API&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude Code&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude Cowork / claude.ai&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 기본값이 high라는 점은 주의할 부분입니다. 아무 설정 없이 페이블 5에서 모델명만 바꾸면 이전보다 출력 토큰이 늘어날 수 있습니다. 5장의 반박이 바로 이 지점을 짚은 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 대화 도중 effort를 바꾸는 per-message effort 기능이 베타로 들어왔습니다. 프롬프트 캐시를 깨지 않고 턴마다 깊이를 조절할 수 있어서, 탐색 단계는 낮게, 최종 구현 단계는 높게 가는 운용이 가능해졌습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. API 스펙과 호출 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스펙은 페이블 5와 같습니다. 컨텍스트 1M 토큰, 최대 출력 128K 토큰, 입력은 텍스트와 이미지, 출력은 텍스트. 지식 컷오프는 2026년 6월이고, 은퇴(retirement)는 2027년 9월 1일 이전에는 하지 않는다고 명시돼 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 모델 지정과 effort 설정을 함께 넣은 최소 호출 예시입니다. 2026년 9월 시점 Claude API 기준이며, 직접 실행 확인은 하지 않은 동작 원리 예시입니다. effort 파라미터의 정확한 위치와 필드명은 공식 문서의 effort 페이지에서 확인하고 쓰세요.&lt;/p&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;curl https://api.anthropic.com/v1/messages \
  -H &quot;x-api-key: $ANTHROPIC_API_KEY&quot; \
  -H &quot;anthropic-version: 2023-06-01&quot; \
  -H &quot;content-type: application/json&quot; \
  -d '{
    &quot;model&quot;: &quot;claude-fable-5-1&quot;,
    &quot;max_tokens&quot;: 4096,
    &quot;output_config&quot;: { &quot;effort&quot;: &quot;medium&quot; },
    &quot;messages&quot;: [
      { &quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;이 함수의 시간 복잡도를 분석해줘.&quot; }
    ]
  }'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bedrock에서는 모델 ID가 &lt;code&gt;anthropic.claude-fable-5-1&lt;/code&gt;이고, Google Cloud와 Microsoft Foundry는 API와 같은 &lt;code&gt;claude-fable-5-1&lt;/code&gt;을 씁니다. Bedrock은 데이터 보관 모드 설정이 선행돼야 하는데, 이건 9장에서 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 페이블 5에서 넘어갈 때 깨지는 것 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델명만 바꾸면 끝일 거라고 생각하기 쉬운데, 개발자 문서는 하위 호환이 깨지는 변경 세 가지를 명시하고 있습니다. 기존 페이블 5 코드가 있다면 마이그레이션 전에 반드시 확인해야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;변경&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;영향&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;강제 tool use 미지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;특정 툴을 반드시 호출하게 강제하는 옵션을 쓰면 오류 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;thinking 블록 모델 종속&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;페이블 5.1이 만든 thinking 블록을 이전 모델이 읽을 수 없음. 중간에 모델 전환하는 파이프라인 주의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;이전 턴 편집 시 thinking 무효화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;과거 메시지를 수정하면 그 이후 thinking 블록이 무효. 대화 히스토리를 가공하는 코드 점검 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 항목은 단순 기술 변경이 아닙니다. Anthropic은 이걸 증류(distillation) 방지 조치로 설명합니다. 이전 대화 컨텍스트를 편집하면서 Claude의 사고 과정 기록만 보존해 뽑아내는 기법이 공개적으로 알려져 있었고, 이 경로를 막은 겁니다. 신규 API 계정에 먼저 적용되고, 기존 계정은 향후 모델 릴리스부터 순차 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깨지는 것 외에 추가된 것도 있습니다. per-message effort, 턴 단위 시스템 메시지, 툴 호출 사이 진행 상황 업데이트(&lt;code&gt;display: &quot;updates&quot;&lt;/code&gt;), 콘텐츠 출처(provenance) 정보가 베타 또는 신규로 들어왔습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. Covered Model 지정과 데이터 보관 조건&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 페이블 5.1을 Covered Model로 지정했습니다. 어느 플랫폼에서 쓰든 추가 데이터 보관, 안전 검토, 접근 정책이 따라붙는 모델 등급입니다. 기업 사용자라면 성능보다 이 조항이 도입 여부를 결정할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 문서 기준으로 Bedrock에서 페이블 5.1을 쓰려면 &lt;code&gt;aws_review&lt;/code&gt; 데이터 보관 모드를 먼저 설정해야 합니다. 이 모드에서는 프롬프트와 출력이 최대 30일간 AWS 경계 안에 보관되고, Amazon 인력의 안전 검토 대상이 됩니다. 모델 제공사(Anthropic)와의 공유는 필요 없다고 명시돼 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 조건을 피하고 싶은 기업을 위한 답이 Enterprise Frontier Safeguards(EFS)입니다. 데이터를 Anthropic이 아닌 고객이 통제하는 클라우드에 저장하고, 사람 검토도 기본적으로 고객 측이 수행하는 구조입니다. Zero Data Retention과 같은 수준의 프라이버시를 제공한다는 게 Anthropic의 설명입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  시점 주의&lt;/b&gt;&lt;br /&gt;EFS는 올가을부터 단계적으로 출시됩니다. 그 전까지는 EFS 대상 고객만 페이블 5.1을 Zero Data Retention으로 쓸 수 있습니다. 일반 API 사용자의 데이터 보관 조건은 Anthropic 상용 약관과 Covered Models 페이지를 직접 확인해야 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 안전장치 변화: 오탐 감소, 워터마크, 증류 방지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이블 5 사용자들의 불만 중 하나가 정상 요청을 차단하는 오탐(false positive)이었습니다. Anthropic은 이번에 사이버보안 안전장치를 정밀화해서 Claude Code 세션당 개입 횟수가 평균 약 60% 줄었다고 밝혔습니다. 소프트웨어 취약점 발견 작업은 이제 페이블 5.1에서 허용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 여전히 Opus 모델로 넘어가는 영역이 있습니다. 침투 테스트, 익스플로잇 생성, 바이너리 기반 취약점 스캐닝이 그렇습니다. 보안 도구를 만드는 팀이라면 어떤 요청이 어느 모델로 처리되는지 로그를 남겨 확인하는 게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 변화는 텍스트 워터마크입니다. Anthropic이 2026년 7월 EU AI법 실천 강령에 서명하면서, 8월 2일 이후 출시 모델의 출력에 워터마크를 넣게 됐습니다. 페이블 5.1이 첫 적용 모델입니다. 출력 품질에는 영향이 없고, 사용자나 대화 정보는 담지 않으며, 감지 API가 없으면 알아볼 수 없다는 설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감지 API는 현재 프라이빗 프리뷰로 규제기관, 언론, 팩트체커, 연구기관, EU 시민사회 단체 등에 우선 제공됩니다. 일반 개발자가 지금 바로 쓸 수 있는 단계는 아닙니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  워터마크가 개발에 주는 의미&lt;/b&gt;&lt;br /&gt;Claude 출력을 그대로 콘텐츠로 게재하는 서비스라면, 향후 감지 API가 확대될 때 해당 텍스트가 AI 생성물로 식별될 수 있다는 점을 전제로 정책을 세워야 합니다. 현재는 감지 수단이 제한적이지만 방향은 정해졌습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. Opus 5와 비교해 언제 써야 하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로운 건 Anthropic 개발자 문서의 권고입니다. 페이블 5.1 개요 페이지에 &quot;대부분의 워크로드는 Opus 5부터 시작하라&quot;고 적혀 있습니다. 페이블 5.1은 까다로운 추론과 장기 에이전트 작업, 또는 Opus 5를 높은 effort로 돌려도 평가가 부족할 때 쓰라는 겁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;페이블 5.1&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Opus 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가격 (입력/출력)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10 / $50&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$5 / $25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컨텍스트 / 출력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1M / 128K&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1M / 128K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;응답 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;느림&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Terminal-Bench 4.0&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;55.8%&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;52.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;데이터 보관&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Covered Model 조건 적용&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일반 조건&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇습니다. 가격은 두 배, 속도는 더 느리고, 데이터 보관 조건이 붙습니다. 그 대신 장시간 자율 실행과 어려운 추론에서 격차가 납니다. Artificial Analysis 수치로는 최대 effort 기준 페이블 5.1이 태스크당 $3.76, Opus 5가 $2.34인데 점수 차이는 3점이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 &quot;Opus 5로 안 풀리는 문제가 실제로 있는가&quot;를 먼저 확인하는 게 순서라고 봅니다. 그런 문제가 있다면 페이블 5.1을 effort medium부터 시작해 올려보고, 없다면 Opus 5를 유지하는 게 비용 면에서 안전합니다. 확실하진 않지만 출시 초기 외부 평가가 쌓이면 이 판단 기준도 달라질 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;페이블 5는 언제 종료되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표문과 문서에 페이블 5 은퇴 일정은 나와 있지 않습니다. 페이블 5.1의 은퇴 하한이 2027년 9월 1일이라는 것만 명시돼 있고, 페이블 5는 별도 공지를 기다려야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한국에서 미토스 5.1을 쓸 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 미국 조직으로 한정돼 있습니다. Anthropic은 미국 정부와 협의해 국내외 파트너를 확대하겠다고 밝혔지만 일정은 없습니다. 한국 기업이라면 당장은 페이블 5.1이 유일한 선택입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;워터마크 때문에 코드 출력이 달라지나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 출력 품질이나 내용에 실질적 영향이 없다고 설명합니다. 코드 생성 결과가 문법적으로 달라지는 종류의 개입은 아니라는 뜻으로 읽히지만, 구체적 작동 방식은 공개되지 않았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도입 전에 확인할 세 가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이블 5.1은 성능 릴리스라기보다 운영 조건 릴리스에 가깝습니다. 벤치마크 수치만으로 도입을 결정하면 비용과 데이터 보관에서 예상 밖의 상황을 만날 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째, 기존 청구 내역에서 캐시 읽기 비율을 확인해 실제 절감폭을 추정하세요. 두 번째, 페이블 5 코드가 있다면 강제 tool use와 thinking 블록 처리 로직을 점검하세요. 세 번째, 기업 환경이라면 Covered Model 데이터 보관 조건이 내부 정책과 맞는지 먼저 따지세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지가 정리되면 그때 effort medium으로 시작해서 실제 워크로드에 붙여보는 게 순서입니다. 발표 수치는 Anthropic 측정이고, 외부 검증은 지금 막 시작됐다는 점을 기억해두시면 좋겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1788316714553&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&quot; data-og-description=&quot;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxN1zB/dJMb8QMu7Fz/n9uW536V6XEvnjNGL1l1gK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bkJU5N/dJMb8UH73Cp/qUW4GMbvbhblyK6aYXGR30/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/ciRigV/dJMb8UaiJNP/3bVJjYpfvSt8jQZkAXqkv0/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxN1zB/dJMb8QMu7Fz/n9uW536V6XEvnjNGL1l1gK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bkJU5N/dJMb8UH73Cp/qUW4GMbvbhblyK6aYXGR30/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/ciRigV/dJMb8UaiJNP/3bVJjYpfvSt8jQZkAXqkv0/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249');&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788316707628&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&quot; data-og-description=&quot;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjHFtT/dJMb8QMu7Fu/KIskwgGaWK4kHydti88K30/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/cSFexv/dJMb9iIZhET/qiGx5D76CO8pTaiURUdFqK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/QVk9u/dJMb887rscZ/i6e1WWKg7iSXWm48AUhaF1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/google-gemini-model-versions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjHFtT/dJMb8QMu7Fu/KIskwgGaWK4kHydti88K30/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/cSFexv/dJMb9iIZhET/qiGx5D76CO8pTaiURUdFqK/img.jpg?width=800&amp;amp;height=536&amp;amp;face=432_108_510_194,https://scrap.kakaocdn.net/dn/QVk9u/dJMb887rscZ/i6e1WWKg7iSXWm48AUhaF1/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=625_151_743_280');&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;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1788316691733&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZzrPf/dJMb8QMu7Fh/08y0FMhOzVeC76hiadvq8k/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bh9c7Y/dJMb887rscI/xFRciGykaS3QsSIrD8doZk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bwjTwq/dJMb8UH73Cb/udlaqO5RJoqdAXNpfOwMJk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZzrPf/dJMb8QMu7Fh/08y0FMhOzVeC76hiadvq8k/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bh9c7Y/dJMb887rscI/xFRciGykaS3QsSIrD8doZk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/bwjTwq/dJMb8UH73Cb/udlaqO5RJoqdAXNpfOwMJk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247');&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI 모델 가격</category>
      <category>anthropic</category>
      <category>claude api</category>
      <category>claude code</category>
      <category>Claude Fable 5.1</category>
      <category>LLM 마이그레이션</category>
      <category>Opus 5 비교</category>
      <category>클로드 미토스 5.1</category>
      <category>클로드 페이블 5.1</category>
      <category>프롬프트 캐싱</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/165</guid>
      <comments>https://devwar.tistory.com/entry/claude-fable-5-1-release-guide#entry165comment</comments>
      <pubDate>Wed, 2 Sep 2026 11:42:20 +0900</pubDate>
    </item>
    <item>
      <title>동방생활 스킨 업데이트, 20260829 버전</title>
      <link>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84</link>
      <description>&lt;!-- 제목: 티스토리 무료 스킨 동방생활_20260829 업데이트, 모바일 CLS 0.297을 0.021로 잡았습니다 --&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 8월 29일 오후 02_23_00.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/svHaN/dJMcah6PRQB/xPMzckuu6EBQAVRH4v2Qi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/svHaN/dJMcah6PRQB/xPMzckuu6EBQAVRH4v2Qi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/svHaN/dJMcah6PRQB/xPMzckuu6EBQAVRH4v2Qi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsvHaN%2FdJMcah6PRQB%2FxPMzckuu6EBQAVRH4v2Qi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;동방생활 스킨 업데이트, 20260829 버전&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-filename=&quot;ChatGPT Image 2026년 8월 29일 오후 02_23_00.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 슬러그: dongbang-skin-update-20260829 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 무료 스킨 동방생활이 20260829 버전(동방생활_20260829)으로 업데이트되었습니다. 이번 업데이트는 새 기능보다 &lt;b&gt;측정 가능한 성능 개선과 버그 수정&lt;/b&gt;에 집중했습니다. 실제 운영 중인 블로그에 적용하고 PageSpeed Insights(모바일&amp;middot;느린 4G)로 전후를 측정하면서 진행했기 때문에, 아래 수치는 추정이 아니라 실측입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;업데이트 요약&lt;/h2&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; font-size: 15px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2563eb; color: #fff;&quot;&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;분류&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;CLS 원인 제거(광고&amp;middot;목차 자리 예약), jQuery 외부 로드 제거, 모바일 썸네일 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;통계 정확도&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;GA4&amp;middot;애드센스 스크립트 중복 로드 방지 가드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;신규 옵션&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;사이드바 광고 세로형(300&amp;times;600) 토글&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;버그 수정&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;광고 스위치 OFF 시 빈 박스 생성, 관리자 레이어 오류 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실측 성능 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 중인 블로그(개발은전투다)에 순차 적용하며 측정한 결과입니다. 환경은 PageSpeed Insights 모바일, Moto G Power 에뮬레이션, 느린 4G 제한 조건입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; font-size: 15px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2563eb; color: #fff;&quot;&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;지표 (홈 화면)&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;적용 전&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;적용 후&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;성능 점수&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;43&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;&lt;b&gt;60&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;CLS (누적 레이아웃 이동)&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;0.297&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;&lt;b&gt;0.021&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;TBT (총 차단 시간)&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;230ms&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;&lt;b&gt;110ms&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;렌더링 차단 요청&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;1,670ms&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;&lt;b&gt;1,350ms&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLS 0.021은 구글 기준 '좋음'(0.1 이하) 구간입니다. 광고가 붙은 티스토리 블로그에서 모바일 CLS를 그린 존까지 내리는 것이 이번 업데이트의 핵심 목표였습니다. 참고로 성능 점수의 나머지 감점분은 대부분 티스토리 플랫폼 번들과 광고 스크립트 몫이라, 스킨 단에서 줄일 수 있는 항목은 사실상 다 줄인 상태입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLS 개선 &amp;mdash; 광고와 목차가 본문을 밀어내지 않습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLS의 원인은 두 가지였습니다. 첫째, 광고가 지연 로딩(첫 상호작용 또는 3초 후)되는 구조라 광고가 채워지는 순간 본문이 아래로 밀렸습니다. 둘째, 목차(TOC)가 페이지 로드 후 본문 맨 앞에 주입되면서 글 전체를 밀어냈습니다. 이번 버전에서 다음과 같이 자리를 미리 예약합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본문 상단&amp;middot;본문 중간&amp;middot;목록 첫 번째 광고 슬롯에 높이 예약(250px)&lt;/li&gt;
&lt;li&gt;티스토리 수익 관리 광고 래퍼(revenue_unit_item)에도 동일하게 예약 적용&lt;/li&gt;
&lt;li&gt;목차 전용 슬롯을 본문 위에 미리 배치 &amp;mdash; 목차는 슬롯 안에 채워지므로 본문이 밀리지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고가 채워지지 않으면 예약 공간이 빈 채로 남는 트레이드오프가 있지만, 코어 웹 바이탈의 CLS 감점보다는 낫다고 판단했습니다. 원치 않으면 style.css의 예약 규칙 몇 줄만 지우면 이전 동작으로 돌아갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차 동작 &amp;mdash; PC는 펼침, 모바일은 접힘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차는 기존과 동일하게 PC(1025px 이상)에서 펼쳐진 상태로 시작하고, 모바일에서는 접힌 상태로 시작합니다. 모바일은 접힌 목차 높이만큼 슬롯이 정확히 예약되어 이동이 없고, PC 펼침은 높이가 글마다 달라 예약이 불가능하므로 상시 노출이라는 사용성과 맞바꿨습니다. 본문에 h2/h3가 2개 미만이면 슬롯 자체가 접혀서 빈 공간이 남지 않습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GA4 중복 집계 방지 &amp;mdash; 페이지뷰 2배 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 업데이트에서 가장 실질적인 수정일 수 있습니다. 스킨 옵션에 GA4 ID를 넣어둔 상태에서 티스토리 플러그인이나 HTML 편집으로 GA 코드를 또 넣으면, 같은 측정 ID가 두 번 로드되어 &lt;b&gt;페이지뷰와 세션이 2배로 집계&lt;/b&gt;됩니다. 수치가 부풀면 이후 모든 판단이 틀어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 버전부터 스킨은 주입 전에 gtag가 이미 존재하는지 확인하고, 있으면 주입을 건너뜁니다. 이때 개발자 도구 콘솔에 안내 메시지를 남기므로, 어느 쪽이 중복인지 F12로 바로 확인할 수 있습니다. 애드센스 로더(adsbygoogle.js)도 같은 방식의 중복 로드 방지가 들어갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 가지 유의점: 중복 기간의 통계는 이미 부풀려진 값이므로, 추이 비교는 수정 시점 이후 데이터를 새 기준선으로 잡는 것이 맞습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;jQuery 처리 변경 &amp;mdash; 외부 CDN 로드 제거&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 code.jquery.com에서 jQuery를 동기 로드했습니다. 렌더링 차단 요소인 데다 외부 도메인 연결 비용까지 있어서 느린 회선에서 첫 화면을 1초 이상 늦추는 원인이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 스크립트를 단순히 지우면 관리자 레이어가 깨집니다. 티스토리 번들이 noConflict(true)로 전역 jQuery를 회수하는데, 정작 티스토리 common.js는 여전히 $를 사용하기 때문입니다. 그래서 이번 버전은 티스토리가 이미 내려받은 자체 CDN 파일(t1.daumcdn의 jQuery)을 재요청하는 방식을 씁니다. 같은 URL이라 브라우저 캐시에서 즉시 반환되므로 신규 다운로드도, 신규 연결도 없이 전역 $가 복원됩니다. 관리자 레이어(수정&amp;middot;삭제 버튼)도 정상 동작합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모바일 썸네일 최적화 &amp;mdash; LCP와 전송량&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 목록에서 썸네일 표시 폭은 126px인데 500px급 이미지를 받고 있었습니다. 리스트 한 페이지 기준 1MB 이상이 불필요하게 전송되던 셈입니다. 이번 버전은 다음 두 가지를 적용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모바일(640px 미만) 목록 썸네일을 C264x200 규격으로 축소 &amp;mdash; 2배 밀도(레티나)에도 충분한 크기&lt;/li&gt;
&lt;li&gt;썸네일 CDN(img1.daumcdn.net) preconnect &amp;mdash; 썸네일이 스크립트로 주입되는 구조라 브라우저가 늦게 발견하는 문제를 연결 선점으로 보완&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;신규 옵션 &amp;mdash; 사이드바 광고 세로형(300&amp;times;600)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이드바 광고가 항상 정사각(300&amp;times;250급)으로만 나온다는 질문이 있었습니다. 반응형(auto) 유닛은 컨테이너 너비를 기준으로 구글이 높이를 정하는데, 사이드바 폭(320px)에서는 수요가 가장 두꺼운 정사각 크기가 우선 선택되기 때문입니다. 세로형이 나오려면 스킨이 높이를 열어줘야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; font-size: 15px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2563eb; color: #fff;&quot;&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;옵션&lt;/th&gt;
&lt;th style=&quot;padding: 10px 12px; border: 1px solid #d7dce5; text-align: left;&quot;&gt;동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;세로형(600px) OFF (기본)&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;기존과 동일한 반응형 정사각. 채움율이 사실상 100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;세로형(600px) ON&lt;/td&gt;
&lt;td style=&quot;padding: 9px 12px; border: 1px solid #e3e7ee;&quot;&gt;300&amp;times;600급 하프 페이지. 노출 단가가 높은 편이나 채움율은 다소 낮을 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이드바 광고 1&amp;middot;2 각각 따로 설정할 수 있어서, 하단 고정(sticky)으로 지정한 위젯만 세로형으로 켜는 조합도 가능합니다. 어느 쪽 수익이 나은지는 블로그마다 다르므로, 2주씩 번갈아 적용하고 애드센스 보고서에서 해당 광고 단위의 RPM과 노출수를 비교해 보는 방식을 권합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;버그 수정 모음&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애드센스 전체 스위치가 꺼진 상태에서 목록 광고&amp;middot;본문 중간 광고 옵션만 켜져 있으면 빈 박스와 빈 간격이 생기던 문제 수정&lt;/li&gt;
&lt;li&gt;계정 메뉴 동기화 감시자(MutationObserver)가 페이지 로드 후 8초간 모든 DOM 변경마다 실행되던 것을 디바운스 처리&lt;/li&gt;
&lt;li&gt;스킨 이름&amp;middot;버전 표기가 파일마다 다르던 것을 동방생활_YYYYMMDD 체계로 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 방법 &amp;mdash; 이번에는 스킨 신규 등록이 필요합니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 버전은 스킨 옵션(index.xml)에 새 항목이 추가되었기 때문에, &lt;b&gt;스킨 편집에서 skin.html/style.css만 교체하면 새 옵션이 나타나지 않습니다.&lt;/b&gt; 티스토리는 옵션 정의를 스킨 등록 시점에만 읽기 때문입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;관리 &amp;rarr; 꾸미기 &amp;rarr; 스킨 보관함 &amp;rarr; 스킨 등록에서 동방생활_20260829 파일 일체(skin.html, style.css, index.xml, 프리뷰 이미지) 업로드&lt;/li&gt;
&lt;li&gt;등록된 스킨을 적용&lt;/li&gt;
&lt;li&gt;꾸미기 &amp;rarr; 사이드바에서 위젯 배치 확인&lt;/li&gt;
&lt;li&gt;스킨 옵션에서 광고 슬롯 ID 등 기존 설정값 재입력 후, 필요 시 &quot;세로형(600px)&quot; 토글 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용 후 F12 콘솔에서 두 가지를 확인하면 됩니다. GA 중복 안내 메시지가 보이면 외부에 GA 코드가 남아 있다는 뜻이니 한쪽으로 일원화하고, &quot;$ is not a function&quot; 오류가 없으면 jQuery 처리가 정상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드와 이전 버전 변경 이력은 아래 링크에서 확인할 수 있습니다. 사용 중 문제가 있으면 댓글로 남겨주세요. 실측 데이터와 함께 제보해 주시면 다음 버전에 반영하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/baPd8Y/dJMcadb5E2E/B9z1kiWeRfFiWWda0s86s1/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C_20260829.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;동방생활_20260829.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/164</guid>
      <comments>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260829-%EB%B2%84%EC%A0%84#entry164comment</comments>
      <pubDate>Sat, 29 Aug 2026 14:23:44 +0900</pubDate>
    </item>
    <item>
      <title>루비 온 레일즈 역사와 철학, 현대 웹 개발에 남긴 유산</title>
      <link>https://devwar.tistory.com/entry/ruby-on-rails-history</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qKKio.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpwQUZ/dJMcadQzqKE/KZ4coPXmDEMr55Pn4Epluk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpwQUZ/dJMcadQzqKE/KZ4coPXmDEMr55Pn4Epluk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpwQUZ/dJMcadQzqKE/KZ4coPXmDEMr55Pn4Epluk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpwQUZ%2FdJMcadQzqKE%2FKZ4coPXmDEMr55Pn4Epluk%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; alt=&quot;루비 온 레일즈 역사와 철학, 현대 웹 개발에 남긴 유산&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;qKKio.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨지지만, 2000년대 초반만 해도 웹을 하나 띄운다는 것은 지루한 설정과 반복적인 타이핑의 연속이었습니다. 레일즈는 이 척박한 땅에 '개발자의 행복'이라는 독특한 사상을 들고나와 생태계 전체를 뒤집어 놓았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;루비 온 레일즈는 왜 그렇게 유명했던 건가요?&quot;&lt;br /&gt;&quot;요즘 나오는 프레임워크랑 비교하면 어떤 점이 달랐나요?&quot;&lt;br /&gt;&quot;지금 시대에도 레일즈의 철학이 의미가 있을까요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 웹 개발에 막 발을 들였던 2012년 무렵, 한국 스타트업 씬에서 레일즈의 위상은 대단했습니다. 당시 자바(Java) 기반의 무거운 XML 설정과 스파게티처럼 꼬인 PHP 코드에 지쳐있던 저에게, 단 몇 줄의 명령어로 게시판이 뚝딱 만들어지는 레일즈의 구조는 신선한 충격이었죠. 그때는 단순히 '생산성이 좋다'라고만 생각했는데, 트래픽을 다루고 인프라를 고민하는 연차가 되고 나서야 그 이면에 깔린 철학의 무게를 깨닫게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 특정 기술의 튜토리얼을 넘어, 루비 온 레일즈가 어떤 시대적 배경에서 탄생했고 왜 전 세계 개발자들을 열광시켰는지 시기별로 짚어봅니다. 복잡한 용어는 최대한 덜어내고, 현대 웹 개발에 어떤 유산을 남겼는지 13년 차 개발자의 시선에서 쉽게 풀어보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹 개발의 원시 시대: 루비 온 레일즈 이전의 생태계&lt;/li&gt;
&lt;li&gt;루비 언어의 탄생: 기계보다 인간이 먼저다 (1995년)&lt;/li&gt;
&lt;li&gt;베이스캠프와 DHH: 실제 프로덕트에서 추출된 프레임워크 (2004년)&lt;/li&gt;
&lt;li&gt;웹을 뒤흔든 첫 번째 철학: 설정보다 관례 (CoC)&lt;/li&gt;
&lt;li&gt;웹을 뒤흔든 두 번째 철학: 같은 것을 반복하지 마라 (DRY)&lt;/li&gt;
&lt;li&gt;15분 만에 블로그 만들기: 전 세계를 강타한 쇼크 (2005년)&lt;/li&gt;
&lt;li&gt;트위터 스케일링 논란: 레일즈 성장통의 진실 (2010년대)&lt;/li&gt;
&lt;li&gt;현대 프레임워크에 남긴 루비 온 레일즈의 유산&lt;/li&gt;
&lt;li&gt;2026년 현재, 레일즈의 철학은 유효한가&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 웹 개발의 원시 시대: 루비 온 레일즈 이전의 생태계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈가 등장하기 전인 1990년대 후반부터 2000년대 초반까지의 웹 개발은 그야말로 원시 시대에 가까웠습니다. 화면을 그리는 HTML과 데이터베이스(DB)에서 데이터를 가져오는 코드가 한 파일에 무질서하게 뒤섞여 있었죠. 과거 PHP 시절의 코드를 떠올려보면, SQL 쿼리문과 비즈니스 로직, 그리고 HTML 태그가 하나의 파일 안에서 춤을 추고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바(Java) 진영은 조금 달랐지만 상황이 낫다고 보긴 어려웠습니다. 엔터프라이즈급의 견고함을 추구하다 보니, 화면 하나를 띄우기 위해 수많은 XML 설정 파일을 수정하고 매핑해야 했습니다. '설정 지옥'이라는 말이 꼬리표처럼 따라다녔습니다. 개발자들은 비즈니스 로직을 고민하기보다, 환경 설정과 반복적인 보일러플레이트(Boilerplate) 코드를 작성하는 데 대부분의 시간을 쏟아야 했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시대 구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;레일즈 등장 이전 (Pre-Rails)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;레일즈 등장 이후 (Post-Rails)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;코드와 HTML의 혼재, 무거운 설정 파일&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;MVC 패턴의 명확한 분리, 규칙 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DB 접근&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;날것의 SQL 쿼리를 코드에 직접 작성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Active Record (ORM)를 통한 객체 지향적 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;핵심 목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기계(서버)가 이해하기 쉬운 구조&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자의 생산성과 행복&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시기의 웹 개발은 노동 집약적이었습니다. 새로운 테이블을 하나 만들면 그에 맞춰 CRUD(생성, 읽기, 수정, 삭제) 페이지를 일일이 수작업으로 찍어내야 했죠. 이런 피로감이 극에 달했을 때, 전혀 다른 사상을 가진 도구가 등장할 준비를 하고 있었습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 루비 언어의 탄생: 기계보다 인간이 먼저다 (1995년)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈(Rails)라는 프레임워크를 이해하려면, 그 근간이 되는 루비(Ruby) 언어의 철학을 먼저 알아야 합니다. 1995년, 일본의 개발자 마츠모토 유키히로(이하 마츠)는 루비를 세상에 공개했습니다. 당시 주류였던 C나 Java가 '어떻게 하면 컴퓨터가 더 빠르게 처리할까?'를 고민했다면, 마츠의 고민은 완전히 달랐습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  루비 언어의 핵심 설계 철학&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;프로그래밍 언어의 목적은 기계를 다루는 것이 아니라, &lt;br /&gt;개발자라는 인간이 감정을 표현하고 사고하는 것을 돕는 것이다.&lt;br /&gt;루비의 목적은 &lt;b&gt;개발자의 행복(Developer Happiness)&lt;/b&gt;이다.&lt;br /&gt;&lt;br /&gt;- 마츠모토 유키히로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루비는 마치 영어나 자연어를 읽는 것처럼 코드를 작성할 수 있도록 설계되었습니다. 모든 것이 객체로 이루어져 있고, 코드를 읽어 내려가는 흐름이 인간의 사고방식과 매우 닮아있죠. 엄격한 타입 선언이나 중괄호의 압박에서 벗어나, 개발자가 직관적으로 원하는 바를 표현할 수 있게 만든 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 2000년대 초반까지만 해도 루비는 일본 내에서 주로 쓰이거나, 일부 해커들 사이에서만 유행하는 마이너한 스크립트 언어에 불과했습니다. 이 훌륭한 언어가 웹의 주류로 편입되기 위해서는 강력한 '기폭제'가 필요했는데, 그 역할을 한 것이 바로 데이비드 하이네마이어 한슨(DHH)이었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 베이스캠프와 DHH: 실제 프로덕트에서 추출된 프레임워크 (2004년)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2003년, 덴마크의 대학생이었던 데이비드 하이네마이어 한슨(DHH)은 37signals(현 Basecamp)라는 웹 에이전시에서 프로젝트 관리 도구를 개발하고 있었습니다. 그는 개발 언어로 당시에는 생소했던 루비를 선택했습니다. 이유인즉슨, 코드를 짜는 과정 자체가 너무 즐거웠기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DHH는 '베이스캠프(Basecamp)'라는 프로젝트 관리 웹 애플리케이션을 만들면서, 웹 개발에 반복적으로 사용되는 기능들을 모아 하나의 구조로 분리해냈습니다. 즉, &lt;b&gt;레일즈는 처음부터 &quot;세상을 구원할 완벽한 프레임워크를 만들자!&quot;하고 탁상공론으로 설계된 것이 아니라, 돈을 버는 실제 상용 프로덕트를 만들면서 뼈대만 '추출(Extraction)'해 낸 결과물&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 태생적 차이는 엄청난 결과를 낳았습니다. 실제 실무에서 겪는 귀찮음과 반복 작업을 없애는 데 초점이 맞춰져 있었기 때문에, 이론적으로만 완벽한 프레임워크들과 달리 현업 개발자들의 가려운 곳을 정확히 긁어주었습니다. 2004년, 이 뼈대가 오픈소스로 공개되며 '루비 온 레일즈'라는 이름으로 세상에 첫발을 내디뎠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 웹을 뒤흔든 첫 번째 철학: 설정보다 관례 (CoC)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈가 내세운 가장 파격적인 철학 중 하나는 &lt;b&gt;'설정보다 관례(Convention over Configuration, CoC)'&lt;/b&gt;였습니다. 이전 세대의 프레임워크들은 유연성을 명목으로 개발자에게 모든 것을 설정하도록 강요했습니다. DB 테이블 이름은 무엇인지, 어떤 클래스와 매핑되는지 XML에 구구절절 적어줘야 했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈는 &quot;그냥 우리가 정한 규칙(관례)을 따라. 그러면 귀찮은 설정은 프레임워크가 알아서 해줄게&quot;라는 태도를 취했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 테이블 이름을 복수형(users)으로 짓고,&lt;/li&gt;
&lt;li&gt;클래스 이름을 단수형(User)으로 지으면,&lt;/li&gt;
&lt;li&gt;아무런 설정 파일 없이도 둘이 자동으로 연결됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 규칙을 따르기만 하면 개발자는 단 한 줄의 설정 코드도 작성할 필요가 없었습니다. 2012년 당시 저 역시 이 개념을 처음 접했을 때, 그동안 수많은 설정 파일을 오가며 타이핑했던 시간들이 스쳐 지나가면서 적잖은 충격을 받았던 기억이 납니다. &quot;왜 안 되지?&quot; 하며 XML 오타를 찾던 시간이 사라진 것이죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 웹을 뒤흔든 두 번째 철학: 같은 것을 반복하지 마라 (DRY)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 핵심 철학은 &lt;b&gt;DRY(Don't Repeat Yourself)&lt;/b&gt;입니다. 코드나 데이터베이스 스키마 등 정보의 중복을 극단적으로 혐오하는 레일즈의 기조를 보여줍니다. 이 철학이 가장 잘 녹아있는 부분이 바로 레일즈의 ORM인 'Active Record'입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 데이터베이스에서 활성 상태인 사용자를 가져오려면 날것의 SQL 쿼리를 문자열로 짜서 날려야 했습니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php
// 과거의 전통적인 방식 (PHP + SQL 예시)
$query = &quot;SELECT * FROM users WHERE active = 1 AND created_at &amp;gt; '2026-01-01'&quot;;
$result = mysql_query($query);
// 이후 결과를 배열로 패치하고 루프를 돌리는 반복 작업...
?&amp;gt;&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;하지만 레일즈의 Active Record는 이를 인간의 언어와 매우 흡사하게 바꿔놓았습니다. 보안을 위한 이스케이프 처리나 쿼리 매핑도 내부에서 자동으로 처리됩니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# 레일즈의 Active Record 방식
active_users = User.where(active: true).where(&quot;created_at &amp;gt; ?&quot;, '2026-01-01')

# 심지어 이렇게도 직관적으로 확장이 가능합니다.
active_users.order(:created_at).limit(10)
&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;개발자는 SQL 문법의 늪에서 벗어나, 비즈니스 로직 그 자체에 집중할 수 있게 되었습니다. 이는 단지 코드가 짧아진 것을 넘어, 데이터베이스를 객체 지향의 세계로 완벽하게 끌어들인 혁명이었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 15분 만에 블로그 만들기: 전 세계를 강타한 쇼크 (2005년)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈의 인기가 폭발하게 된 결정적인 사건은 2005년에 있었습니다. 창시자 DHH가 화면을 녹화하여 올린 &lt;b&gt;'15분 만에 블로그 만들기(Build a blog in 15 minutes)'&lt;/b&gt;라는 영상이었습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  터미널 명령어 몇 줄의 기적&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;영상 속 DHH는 스캐폴딩(Scaffolding)이라는 기능을 이용해 터미널에서 명령어 몇 줄을 입력합니다. &lt;br /&gt;그러자 글 쓰기, 수정, 삭제, 조회(CRUD)가 모두 가능한 블로그 사이트가 눈앞에서 순식간에 완성되었습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 다른 언어로는 며칠이 걸릴 작업을 단 15분 만에, 그것도 테스트 코드까지 자동으로 생성해 내는 모습은 전 세계 웹 개발자들에게 신선한 충격이었습니다. 이 영상 하나로 루비 온 레일즈는 '웹 2.0 시대' 스타트업들의 표준 무기가 되었습니다. 아이디어를 빠르게 시장에 내놓고 검증해야 하는 애자일(Agile) 환경에서 레일즈만큼 생산성이 뛰어난 도구는 없었기 때문입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 트위터 스케일링 논란: 레일즈 성장통의 진실 (2010년대)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 레일즈의 역사가 늘 찬란했던 것만은 아닙니다. 2000년대 후반에서 2010년대 초반으로 넘어오면서, 레일즈로 구축된 서비스들이 대규모 트래픽을 맞이하기 시작했습니다. 대표적인 사례가 바로 트위터(Twitter, 현 X)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 트위터는 레일즈를 기반으로 빠르게 프로토타입을 만들어 시장을 선점했습니다. 하지만 전 세계적으로 트래픽이 폭증하면서 잦은 접속 장애(유명한 'Fail Whale' 화면)를 겪게 됩니다. 결국 트위터는 핵심 아키텍처를 스칼라(Scala)와 자바 기반으로 마이그레이션했습니다. 이 사건을 계기로 IT 업계에는 &quot;레일즈는 확장에 불리하다(Rails can't scale)&quot;는 꼬리표가 붙게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 트래픽 분석과 트러블슈팅을 업으로 삼는 13년 차 개발자의 관점에서 보면, 이는 프레임워크만의 잘못이라기보다는 &lt;b&gt;'급격하게 성장하는 단일 모놀리식 아키텍처'&lt;/b&gt;가 겪는 필연적인 병목 현상에 가깝습니다. 데이터베이스 N+1 쿼리 최적화 실패, 인덱싱 누락, 단일 DB의 한계 등은 언어를 불문하고 발생합니다. 실제로 깃허브(GitHub), 쇼피파이(Shopify), 에어비앤비(Airbnb) 같은 거대 기업들은 여전히 레일즈를 핵심 백엔드로 사용하며 천문학적인 트래픽을 훌륭하게 감당하고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 현대 프레임워크에 남긴 루비 온 레일즈의 유산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈가 휩쓸고 간 이후, 웹 개발 생태계는 다시는 과거로 돌아갈 수 없게 되었습니다. 레일즈의 철학은 타 언어 진영의 개발자들에게 깊은 영감을 주었고, 수많은 '레일즈 클론' 혹은 영향을 받은 프레임워크들이 쏟아져 나왔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;언어&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;프레임워크&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;영향받은 레일즈의 특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;PHP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Laravel (라라벨)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Eloquent ORM, 직관적인 라우팅 문법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Django (장고)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;관리자 페이지 자동화, 강한 관례(Convention)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Spring Boot&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;XML 설정 최소화(Auto-configuration 도입)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 우리가 편하게 사용하는 라라벨의 직관적인 ORM, 스프링 부트의 '설정 자동화', 심지어 자바스크립트 진영의 여러 MVC 프레임워크들까지 그 뿌리를 거슬러 올라가면 레일즈의 '설정보다 관례(CoC)' 철학에 빚을 지고 있습니다. 레일즈는 특정 도구의 성공을 넘어, 웹 프레임워크가 지향해야 할 표준 인터페이스를 정립한 셈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 2026년 현재, 레일즈의 철학은 유효한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 현재의 웹 개발 트렌드는 마이크로서비스 아키텍처(MSA)와 쿠버네티스(K8s), 분산 서버리스 환경 등 고도로 복잡해져 있습니다. 그렇다면 이제 레일즈의 시대는 완전히 끝난 것일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 오히려 지금 시대에 레일즈의 철학이 다시 조명받을 가치가 있다고 생각합니다. 최근 개발 씬에서는 오버 엔지니어링에 대한 피로감을 호소하는 목소리가 커지고 있습니다. 트래픽이 많지 않은 초기 서비스조차 유행을 좇아 MSA를 도입했다가, 배포 파이프라인 관리와 로그 추적에 허덕이는 경우를 실무에서 수없이 목격했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레일즈 진영(현재 레일즈 8.x 시리즈)은 여전히 '모놀리식(Monolithic)' 아키텍처의 우수성을 굳건히 방어하고 있습니다. 복잡한 프론트엔드 빌드 도구(Node.js 의존성)를 걷어내고, 도커(Docker) 기반의 단순한 배포 도구(Kamal)를 기본으로 채택하는 등 &lt;b&gt;'소수 정예 팀이 가장 빠르고 행복하게 프로덕트를 런칭하는 방법'&lt;/b&gt;에 대한 해답을 묵묵히 발전시켜 나가고 있습니다. 마츠와 DHH가 주창했던 '개발자의 행복'이라는 본질은, 기술이 아무리 발전해도 낡지 않는 가치입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지금 시점에 루비 온 레일즈로 커리어를 시작해도 될까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국 IT 시장의 채용 동향을 냉정하게 보면, 레일즈 포지션이 자바(Spring)나 Node.js에 비해 절대적으로 적은 것은 사실입니다. 하지만 실리콘밸리를 비롯한 해외 리모트 워크나 초기 스타트업 창업(1인 개발)을 목표로 한다면, 레일즈의 압도적인 생산성은 여전히 매력적인 무기가 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;레일즈는 속도가 느리다는 말이 많던데 사실인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루비 언어 자체가 C나 Go 언어처럼 연산 속도가 빠르지는 않습니다. 하지만 대부분의 웹 애플리케이션 병목은 언어의 실행 속도가 아니라, 데이터베이스 설계와 I/O(네트워크, 디스크)에서 발생합니다. N+1 쿼리 최적화, 캐싱(Redis), 인덱싱만 제대로 다뤄도 일반적인 서비스 규모에서는 속도 문제가 발생하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거의 무질서했던 웹 생태계를 우아한 관례로 정리해 낸 루비 온 레일즈. 수많은 기술이 뜨고 지는 요즘, 이 프레임워크가 남긴 '개발자를 중심에 두는 철학'은 여전히 묵직한 울림을 줍니다. 복잡한 인프라와 설정에 지친 날이라면, 코딩의 즐거움을 일깨워주던 레일즈의 발자취를 한 번쯤 되돌아보는 것도 좋겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-12&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786892811115&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&quot; data-og-description=&quot;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8JuXC/dJMb8UH5R2C/qGiTNXYCTS3f2Ydq6sVVxK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/boyPzt/dJMb8VNMtU3/TUeB3I5i02aJyonHFk0nC0/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/LNqXL/dJMb8U9ahw9/VNacpiElDzTVQYnRrKCJIK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8JuXC/dJMb8UH5R2C/qGiTNXYCTS3f2Ydq6sVVxK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/boyPzt/dJMb8VNMtU3/TUeB3I5i02aJyonHFk0nC0/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/LNqXL/dJMb8U9ahw9/VNacpiElDzTVQYnRrKCJIK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275');&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786892783921&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&quot; data-og-description=&quot;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxHGuf/dJMb9c9Of2y/YUbpr0ZNWIzmgh4KkaaIy1/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/lioNL/dJMb9efup6E/jkT1rbFKKMfRv99EbwMRlk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/cBBMbj/dJMb9frVJ1q/Y3sDpalw3F2VcJKkTY5l9K/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxHGuf/dJMb9c9Of2y/YUbpr0ZNWIzmgh4KkaaIy1/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/lioNL/dJMb9efup6E/jkT1rbFKKMfRv99EbwMRlk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/cBBMbj/dJMb9frVJ1q/Y3sDpalw3F2VcJKkTY5l9K/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241');&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>Active_Record</category>
      <category>DHH</category>
      <category>rubyonrails</category>
      <category>레일즈역사</category>
      <category>레일즈철학</category>
      <category>루비온레일즈</category>
      <category>마츠모토유키히로</category>
      <category>백엔드개발</category>
      <category>웹개발트렌드</category>
      <category>웹개발프레임워크</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/147</guid>
      <comments>https://devwar.tistory.com/entry/ruby-on-rails-history#entry147comment</comments>
      <pubDate>Fri, 28 Aug 2026 12:10:40 +0900</pubDate>
    </item>
    <item>
      <title>깃허브 깃랩 차이, 무료로 주는 데엔 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/git-repository-hosting-types</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DrA5H/dJMcadXuYns/2UF0HqKcsNGdqWMUlXkZ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DrA5H/dJMcadXuYns/2UF0HqKcsNGdqWMUlXkZ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DrA5H/dJMcadXuYns/2UF0HqKcsNGdqWMUlXkZ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrA5H%2FdJMcadXuYns%2F2UF0HqKcsNGdqWMUlXkZ7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;깃허브 깃랩 차이, 무료로 주는 데엔 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;860&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃 저장소 종류를 검색하면 깃허브, 깃랩, 비트버킷 같은 이름이 한꺼번에 나옵니다. 다 비슷해 보이는데 어디를 써야 하는지, 애초에 깃이랑 깃허브가 뭐가 다른지부터 헷갈리는 분이 많습니다. 각 서비스가 어떤 회사 것이고, 왜 무료로 저장소를 내주는지까지 알면 선택이 훨씬 쉬워집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;깃이랑 깃허브가 다른 거였어?&quot;&lt;br /&gt;&quot;깃랩은 어떤 회사가 만든 거지?&quot;&lt;br /&gt;&quot;비공개 저장소도 공짜로 쓸 수 있나?&quot;&lt;br /&gt;&quot;이 회사들은 뭘로 돈을 벌길래 무료로 주는 거지?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 처음 깃을 배울 땐 깃허브가 곧 깃인 줄 알았습니다. 한참 뒤에야 깃은 도구고 깃허브는 그 도구로 만든 저장소를 올려두는 서비스라는 걸 구분하게 됐어요. 이 구분만 잡혀도 나머지는 자연스럽게 정리됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Git 저장소 호스팅 서비스 3강인 GitHub, GitLab, Bitbucket을 중심으로 각각 어떤 회사가 왜 운영하는지, 무료 범위는 어디까지인지 정리한 글입니다. 깃을 배우기 시작한 분, 팀에서 어디를 쓸지 고르는 분에게 도움이 됩니다. 가격&amp;middot;정책은 2026년 시점 기준이며, 이후 바뀔 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Git과 GitHub는 다른 것입니다&lt;/li&gt;
&lt;li&gt;원격 저장소 호스팅이 하는 일&lt;/li&gt;
&lt;li&gt;GitHub - 마이크로소프트가 품은 세계 최대&lt;/li&gt;
&lt;li&gt;GitLab - DevOps 올인원과 셀프호스팅&lt;/li&gt;
&lt;li&gt;Bitbucket - Jira 만드는 아틀라시안의 저장소&lt;/li&gt;
&lt;li&gt;그 외 선택지들&lt;/li&gt;
&lt;li&gt;3강 무료 플랜 한눈에 비교&lt;/li&gt;
&lt;li&gt;왜 공짜로 저장소를 내주나&lt;/li&gt;
&lt;li&gt;상황별로 고르는 기준&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Git과 GitHub는 다른 것입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃(Git)은 내 컴퓨터에 설치해서 쓰는 버전 관리 도구입니다. 2005년 리눅스를 만든 리누스 토르발스가 만들었고, 무료 오픈소스라서 누구 소유도 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브(GitHub)는 깃으로 관리하는 저장소를 인터넷에 올려두는 호스팅 서비스입니다. 깃이 워드 프로그램이라면, 깃허브는 문서를 올려두는 클라우드인 셈이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 깃허브 없이도 깃은 쓸 수 있습니다. 반대로 깃허브 대신 깃랩이나 비트버킷에 올려도 깃 명령어는 완전히 똑같이 동작합니다. 저장소 주소만 다를 뿐입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 어느 서비스든 연결 방식은 동일합니다 (둘 중 하나만 실행)
git remote add origin https://github.com/user/repo.git
git remote add origin https://gitlab.com/user/repo.git&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  핵심&lt;/b&gt;&lt;br /&gt;깃 = 도구(무료 오픈소스), 깃허브&amp;middot;깃랩&amp;middot;비트버킷 = 그 도구용 저장 공간을 빌려주는 회사 서비스. 서비스는 갈아타도 깃 사용법은 그대로입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 원격 저장소 호스팅이 하는 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 코드를 올려두는 백업 공간이라면 회사들이 경쟁적으로 무료 제공할 이유가 없습니다. 이 서비스들의 진짜 가치는 협업 기능에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 명이 같은 코드를 고칠 때 변경 사항을 검토하고 합치는 풀 리퀘스트(코드 반영 요청), 할 일과 버그를 기록하는 이슈 트래커, 코드가 올라올 때마다 자동으로 테스트와 배포를 돌리는 CI/CD(지속적 통합&amp;middot;배포) 같은 것들이요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 요즘의 저장소 호스팅은 저장소라기보다 개발 협업 플랫폼에 가깝습니다. 어느 서비스를 고르느냐가 팀의 작업 방식에 꽤 영향을 주는 이유입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. GitHub - 마이크로소프트가 품은 세계 최대&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브는 2008년 스타트업으로 시작해, 2018년 마이크로소프트가 75억 달러에 인수했습니다. 지금은 사용자 1억 명이 넘는 세계 최대 개발 플랫폼이고, 사실상 오픈소스 생태계의 중심지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 플랜이 셋 중 가장 후합니다. 2026년 기준 공개&amp;middot;비공개 저장소 모두 무제한, 협업 인원 제한 없음, CI 도구인 GitHub Actions도 월 2,000분까지 무료입니다. 공개 저장소는 CI도 무제한이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트 인수 후 가장 달라진 건 AI입니다. 코드 자동완성 도구인 Copilot이 깃허브에 깊게 붙으면서, 저장소 서비스를 넘어 AI 개발 도구 플랫폼으로 무게가 옮겨가는 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취업 준비생 입장에서도 의미가 있습니다. 한국을 포함해 대부분의 회사가 지원자의 깃허브 프로필을 포트폴리오로 봅니다. 개인 개발자라면 사실상 기본값이라고 봐도 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. GitLab - DevOps 올인원과 셀프호스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃랩은 2011년 우크라이나 개발자들이 시작한 오픈소스 프로젝트에서 출발했고, 지금은 나스닥에 상장된 독립 회사입니다. 특정 빅테크 소속이 아니라는 점이 깃허브와의 큰 차이예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강점은 두 가지입니다. 첫째, 계획부터 코드 관리, CI/CD, 보안 점검, 배포까지 개발 전 과정을 한 제품 안에 넣은 올인원 구성입니다. 여러 도구를 조합할 필요가 없어서 관리 포인트가 줄어듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 셀프호스팅입니다. 깃랩은 설치형 버전을 제공해서 회사 내부 서버에 직접 올릴 수 있습니다. 코드가 외부로 나가면 안 되는 금융권, 공공기관, 보안이 중요한 기업이 깃랩을 쓰는 이유가 대부분 이것 때문입니다. 한국 기업 사내망에서 깃랩을 만나게 되는 경우가 많은 배경이기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 플랜은 2026년 기준 비공개 저장소 무제한이지만 팀 인원 5명 제한, CI 월 400분, 저장 용량 프로젝트당 10GiB로 깃허브보다 빠듯합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Bitbucket - Jira 만드는 아틀라시안의 저장소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트버킷은 이슈 관리 도구 지라(Jira)와 문서 도구 컨플루언스(Confluence)로 유명한 호주 회사 아틀라시안 소유입니다. 2010년에 인수했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트버킷의 존재 이유는 명확합니다. 이미 지라로 일하는 팀에게 저장소까지 한 식구로 묶어주는 것. 지라 티켓과 커밋&amp;middot;브랜치가 자동으로 연결되는 통합은 셋 중 가장 매끄럽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 말하면 아틀라시안 제품을 안 쓰는 팀에게는 고를 이유가 약합니다. 무료 플랜도 5명 제한에 CI(Pipelines)가 월 50분뿐이라, 2026년 기준 셋 중 가장 박합니다. 오픈소스 커뮤니티 규모도 깃허브&amp;middot;깃랩 대비 작습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 비트버킷은 단독 선택지라기보다 &quot;지라 쓰는 회사의 저장소&quot;라는 포지션에 가깝습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 그 외 선택지들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3강 외에도 상황에 따라 만나게 되는 서비스들이 있습니다. 간단히만 짚어둡니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;서비스&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Gitea / Forgejo&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가볍게 직접 설치하는 오픈소스 깃 서버. 개인 NAS나 소규모 사내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Azure DevOps&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;마이크로소프트의 기업용 개발 플랫폼. 애저 클라우드 쓰는 조직 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Codeberg&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;비영리 재단이 운영하는 오픈소스 프로젝트용 무료 호스팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AWS CodeCommit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;아마존의 깃 호스팅. 2024년 신규 가입을 막았다가 2025년 11월 정식 서비스로 복귀&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재미있는 건 마이크로소프트가 깃허브와 Azure DevOps 둘 다 갖고 있다는 점입니다. 개발자 대상은 깃허브, 애저에 묶인 기업 조직은 Azure DevOps로 역할을 나눈 모양새입니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 3강 무료 플랜 한눈에 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 기준 무료 플랜을 표로 정리하면 이렇습니다. 이 수치는 각사 정책에 따라 언제든 바뀔 수 있으니, 실제 도입 전에는 공식 가격 페이지를 확인하세요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;GitHub&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;GitLab / Bitbucket&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;소유 회사&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;마이크로소프트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;GitLab(독립 상장사) / 아틀라시안&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;비공개 저장소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;무제한&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;둘 다 무제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인원 제한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;둘 다 5명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;무료 CI&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;월 2,000분&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;GitLab 400분 / Bitbucket 50분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;차별 강점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;생태계&amp;middot;Copilot&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;셀프호스팅 / Jira 연동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 왜 공짜로 저장소를 내주나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버비가 만만치 않을 텐데 왜 무료로 줄까요. 세 회사 모두 무료 플랜이 자선이 아니라 영업 깔때기이기 때문입니다. 구조는 회사마다 조금씩 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브의 핵심은 생태계 장악입니다. 전 세계 개발자가 깃허브에서 배우고 활동하게 만들면, 그 개발자들이 취업한 회사가 기업용 유료 플랜과 Copilot 구독을 삽니다. 마이크로소프트 입장에선 개발자를 자사 클라우드(애저)와 AI 제품으로 끌어오는 관문이기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃랩은 오픈코어 모델입니다. 기본 기능은 오픈소스로 풀고, 기업에 필요한 보안&amp;middot;규정 준수&amp;middot;고급 관리 기능을 유료 등급에 넣는 방식이에요. 무료 사용자가 많아질수록 그중에서 유료 전환하는 기업이 나오는 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아틀라시안은 묶음 판매입니다. 비트버킷 자체로 돈을 벌기보다, 지라&amp;middot;컨플루언스 구독 고객을 자사 생태계에 더 단단히 묶어두는 역할에 가깝습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  공통 원리&lt;/b&gt;&lt;br /&gt;개인에게 무료로 줘서 익숙하게 만들고, 그 개인이 속한 조직에 유료로 판다. 무료 플랜의 인원 제한(5명)이나 CI 분량 제한이 정확히 유료 전환을 유도하는 지점에 설계돼 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 상황별로 고르는 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 내용을 선택 기준으로 압축하면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 학습&amp;middot;포트폴리오&amp;middot;오픈소스라면 깃허브입니다. 무료 범위가 가장 넓고, 채용 시장에서 프로필 역할까지 합니다. 고민할 이유가 별로 없어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 외부 클라우드에 둘 수 없는 조직이라면 깃랩 셀프호스팅이 표준에 가깝습니다. 사내망에 직접 설치해 통제할 수 있는 선택지 중 가장 성숙합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 지라 중심으로 일하는 팀이라면 비트버킷이 자연스럽습니다. 반대로 지라를 안 쓴다면 굳이 선택할 이유를 찾기 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 어디를 고르든 크게 실패하지 않는다고 봅니다. 깃 자체는 동일하고, 저장소 이전도 명령 몇 줄이면 되니까요. 다만 이슈&amp;middot;PR 기록 같은 협업 데이터는 옮기기 번거로우니, 팀 도입이라면 처음부터 위 기준으로 정하는 걸 권합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비공개 저장소는 정말 무료인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋 다 무료입니다. 2026년 기준 깃허브&amp;middot;깃랩&amp;middot;비트버킷 모두 무료 플랜에서 비공개 저장소를 무제한 제공합니다. 다만 깃랩과 비트버킷은 협업 인원 5명 제한이 있어서, 팀이 커지면 유료 플랜이 필요해집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;깃허브에서 깃랩으로 갈아타기 어렵나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 자체는 쉽습니다. 깃 저장소는 어디로든 그대로 밀어 넣을 수 있고, 깃랩은 깃허브 저장소를 통째로 가져오는 가져오기 기능도 제공합니다. 번거로운 건 이슈, PR 코멘트, CI 설정 같은 부가 데이터 쪽입니다. CI는 서비스마다 설정 문법이 달라 다시 작성해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회사에서 쓰는 깃랩은 왜 주소가 gitlab.com이 아닌가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셀프호스팅 버전이기 때문입니다. 깃랩은 회사 서버에 설치하는 설치형을 제공해서, 사내 도메인으로 운영하는 경우가 많습니다. 기능은 gitlab.com과 거의 같지만 데이터가 회사 내부에만 있다는 점이 다릅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도구는 하나, 창고는 취향대로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 깃은 공용 도구이고, 깃허브(마이크로소프트)&amp;middot;깃랩(독립 상장사)&amp;middot;비트버킷(아틀라시안)은 각자의 사업 이유로 그 도구용 창고를 빌려주는 회사들입니다. 무료인 이유는 명확합니다. 개인에게 익숙함을 심고 조직에 파는 구조이기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 선택 기준도 단순해집니다. 개인은 깃허브, 폐쇄망 조직은 깃랩, 지라 사용 팀은 비트버킷. 이 구도만 기억해 두면 어느 환경에 가더라도 헤매지 않을 겁니다.&lt;/p&gt;
&lt;h2 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787479962467&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&quot; data-og-description=&quot;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Fc0xH/dJMb83kKxqX/riRSqWLx1K6EmXlkqmZhG1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/cj5QRR/dJMb9aKWhmh/KNqAQ8L9JRafzwWa654VlK/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/bnC9o2/dJMb82e4m1V/BZ4NPkk51ndBt5CVJVDBsK/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Fc0xH/dJMb83kKxqX/riRSqWLx1K6EmXlkqmZhG1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/cj5QRR/dJMb9aKWhmh/KNqAQ8L9JRafzwWa654VlK/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/bnC9o2/dJMb82e4m1V/BZ4NPkk51ndBt5CVJVDBsK/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292');&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787479956092&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&quot; data-og-description=&quot;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pAwOi/dJMb81f94FA/SbsdKy1IJbGCYbWLog6qYK/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/i0paZ/dJMb9aKWhl4/E3BKugMMoL9bVkjIEivo6k/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/rvTsg/dJMb82MUBfw/61zlIcWaC7WVXXYbZx7NT0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pAwOi/dJMb81f94FA/SbsdKy1IJbGCYbWLog6qYK/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/i0paZ/dJMb9aKWhl4/E3BKugMMoL9bVkjIEivo6k/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/rvTsg/dJMb82MUBfw/61zlIcWaC7WVXXYbZx7NT0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286');&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 도구/Git&amp;middot;깃허브</category>
      <category>git 호스팅</category>
      <category>github gitlab 차이</category>
      <category>개발협업</category>
      <category>깃 사용법</category>
      <category>깃랩</category>
      <category>깃저장소</category>
      <category>깃허브</category>
      <category>비트버킷</category>
      <category>셀프호스팅</category>
      <category>형상관리</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/158</guid>
      <comments>https://devwar.tistory.com/entry/git-repository-hosting-types#entry158comment</comments>
      <pubDate>Fri, 28 Aug 2026 10:38:13 +0900</pubDate>
    </item>
    <item>
      <title>2차 도메인 뜻, 서브도메인과 SLD 헷갈리는 이유</title>
      <link>https://devwar.tistory.com/entry/second-level-domain-subdomain</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d09Mx8/dJMcagfbyUO/ktrCfjq4m2rKu2odEmNpqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d09Mx8/dJMcagfbyUO/ktrCfjq4m2rKu2odEmNpqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d09Mx8/dJMcagfbyUO/ktrCfjq4m2rKu2odEmNpqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd09Mx8%2FdJMcagfbyUO%2FktrCfjq4m2rKu2odEmNpqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;2차 도메인 뜻, 서브도메인과 SLD 헷갈리는 이유&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 도메인 뜻을 검색해 보면 답이 하나로 모이지 않습니다. 어떤 글은 naver.com에서 'naver' 부분을 가리키고, 어떤 호스팅 업체는 blog.example.com 같은 서브도메인을 2차 도메인이라 부르며, 티스토리에 개인 도메인을 연결해 주는 서비스까지 같은 이름으로 판매합니다. 같은 단어가 가리키는 대상이 제각각이니 헷갈리는 게 당연합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 도메인 경계를 정확히 아는 일이 프론트엔드 개발에서 은근히 중요합니다. 브라우저 저장소인 로컬스토리지와 쿠키가 바로 이 도메인 단위로 갈리기 때문입니다. 서브도메인 하나 바꿨을 뿐인데 저장해 둔 데이터가 통째로 사라지거나, 로그인 세션이 서브도메인마다 따로 노는 현상이 여기서 나옵니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;2차 도메인이랑 서브도메인이 같은 말인가요?&quot;&lt;br /&gt;&quot;서브도메인 바꿨더니 로그인이 풀렸는데 왜 그런 거죠?&quot;&lt;br /&gt;&quot;로컬스토리지는 도메인마다 따로 저장되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 질문들이 사실은 한 뿌리에서 나옵니다. 용어가 뒤섞여 있고, 그 뒤에 깔린 도메인 경계 개념이 정리되지 않아서입니다. 그래서 이 글에서는 2차 도메인이라는 말이 실제로 무엇을 가리키는지 먼저 풀고, 그 도메인 경계가 로컬스토리지와 쿠키를 어떻게 가르는지까지 이어서 정리하려고 합니다. 도메인 연결을 처음 만지는 분이나, 서브도메인 관련 저장소 문제로 시간을 뺏겨 본 분에게 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2차 도메인 뜻이 사람마다 다른 이유&lt;/li&gt;
&lt;li&gt;도메인 계층 구조: TLD, SLD, 서브도메인 구분&lt;/li&gt;
&lt;li&gt;호스팅 업체가 말하는 2차 도메인의 정체&lt;/li&gt;
&lt;li&gt;origin이 브라우저 저장소를 가르는 기준&lt;/li&gt;
&lt;li&gt;로컬스토리지와 도메인의 관계&lt;/li&gt;
&lt;li&gt;쿠키와 도메인의 관계, 그리고 서브도메인 공유&lt;/li&gt;
&lt;li&gt;쿠키와 로컬스토리지 차이 비교&lt;/li&gt;
&lt;li&gt;서브도메인으로 나눌 때 저장소에서 벌어지는 일&lt;/li&gt;
&lt;li&gt;2026년 현재 서드파티 쿠키 상황&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 2차 도메인 뜻이 사람마다 다른 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 도메인이라는 표현이 헷갈리는 건 쓰는 사람의 실력 문제가 아닙니다. 같은 말이 실제로는 주소의 서로 다른 조각을 가리키고 있어서입니다. 말로 설명하기 전에, 아래 주소에서 어디가 '2차 도메인'인지 색으로 짚어 보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 22px; border: 1px solid #ddd; background: #fafafa; text-align: center;&quot;&gt;
&lt;div style=&quot;font-size: 0.85em; color: #888; margin-bottom: 10px;&quot;&gt;DNS 표준으로 보면 (교과서 기준)&lt;/div&gt;
&lt;div style=&quot;font-size: 1.6em; font-family: monospace; letter-spacing: 1px;&quot;&gt;&lt;span style=&quot;background: #e3f2fd; padding: 3px 7px; border-radius: 4px;&quot;&gt;blog&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: #ffe14d; padding: 3px 7px; border-radius: 4px; font-weight: bold;&quot;&gt;example&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: #e8f5e9; padding: 3px 7px; border-radius: 4px;&quot;&gt;com&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-size: 0.92em; color: #555; margin-top: 12px; line-height: 1.9;&quot;&gt;&lt;span style=&quot;color: #1565c0;&quot;&gt;blog &amp;rarr; 서브도메인 (3차)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8860b; font-weight: bold;&quot;&gt;example &amp;rarr; 여기가 2차 도메인 (SLD)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #2e7d32;&quot;&gt;com &amp;rarr; 최상위 도메인 (TLD, 1차)&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 표준을 그대로 따르면 2차 도메인은 가운데 노란색으로 칠한 example, 즉 우리가 도메인을 살 때 직접 정하는 그 이름입니다. 그런데 국내 호스팅 업체나 서비스형 블로그에서 '2차 도메인'이라고 하면 대개 이 조각을 가리키지 않습니다. 같은 주소를 놓고 이들이 가리키는 곳은 여기입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 22px; border: 1px solid #ddd; background: #fafafa; text-align: center;&quot;&gt;
&lt;div style=&quot;font-size: 0.85em; color: #888; margin-bottom: 10px;&quot;&gt;호스팅 업체가 말할 때는&lt;/div&gt;
&lt;div style=&quot;font-size: 1.6em; font-family: monospace; letter-spacing: 1px;&quot;&gt;&lt;span style=&quot;background: #ffe14d; padding: 3px 7px; border-radius: 4px; font-weight: bold;&quot;&gt;blog&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #999;&quot;&gt;example.com&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-size: 0.92em; color: #555; margin-top: 12px;&quot;&gt;&lt;span style=&quot;color: #b8860b; font-weight: bold;&quot;&gt;맨 앞에 붙이는 이 부분(blog)&lt;/span&gt;을 '2차 도메인'이라고 부릅니다&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 단어인데 한쪽은 가운데 example을, 다른 쪽은 맨 앞 blog을 가리키는 셈입니다. 노란색 위치가 서로 다르다는 게 이 혼란의 정체입니다. 여기에 서비스형 블로그의 용법까지 더하면 '2차 도메인'은 실제로 세 가지를 가리킵니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;부르는 맥락&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;실제로 가리키는 것&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DNS 기술 정의&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;SLD (TLD 바로 왼쪽 한 칸)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;naver.com의 naver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;호스팅 업체 관행&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서브도메인&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;blog.example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;서비스형 블로그&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개인 도메인 연결 서비스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;티스토리에 mysite.com 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지가 서로 다른 층위의 이야기입니다. 첫 번째는 DNS 주소 구조상의 위치를 뜻하고, 두 번째는 하나의 도메인을 용도별로 쪼갠 하위 주소를 뜻하며, 세 번째는 아예 별개 도메인을 서비스에 붙이는 작업을 가리킵니다. 그런데 상업적 호스팅 서비스들이 마케팅 편의상 두 번째와 세 번째를 다 '2차 도메인'으로 묶어 부르면서 혼선이 커졌습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발자들은 실제로 뭐라고 부를까&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 가지 짚고 넘어갈 게 있습니다. 개발자들끼리는 '1차&amp;middot;2차&amp;middot;3차 도메인'이라는 번호식 표현을 거의 쓰지 않습니다. 번호로 세는 방식은 주로 호스팅 안내 문서나 자격증 교재에서 봅니다. 실무 대화나 설정 화면에서 통하는 말은 따로 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;주소 부분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;표준&amp;middot;교재 용어&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;개발자들이 실제 쓰는 말&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;com&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;TLD, 최상위 도메인&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;TLD, 구어로는 '확장자'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;example.com&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;루트 도메인&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;그냥 '도메인', 루트 도메인, apex&amp;middot;네이키드&amp;middot;베어 도메인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;example&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;SLD, 2차 도메인&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;따로 잘 안 부름 ('도메인 이름'으로 뭉뚱그림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;blog.example.com&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서브도메인 (3차)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서브도메인 ('서브도메인 팠다/붙였다')&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재미있는 건 표준 용어인 SLD, 그러니까 example 조각만 딱 떼서 부르는 일이 실무에서 거의 없다는 점입니다. 대개 example.com을 통째로 '도메인'이라 부르고 끝냅니다. 특히 www가 없는 example.com 형태를 강조할 때는 apex 도메인이나 네이키드 도메인이라는 말을 쓰는데, DNS나 CDN 설정 화면에서 apex, root 같은 단어로 자주 만나게 됩니다. 반대로 blog.example.com 같은 하위 주소는 번호를 붙이지 않고 그냥 '서브도메인'이라고 부르면 어디서나 통합니다. 그래서 개인적으로는, 대화 상대가 헷갈릴 것 같으면 '2차 도메인' 대신 서브도메인이나 apex 도메인처럼 오해가 적은 말로 바꿔 쓰는 편이 낫다고 봅니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 도메인 계층 구조: TLD, SLD, 서브도메인 구분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리를 위해 도메인 주소를 오른쪽에서 왼쪽으로 읽는 습관부터 들이면 좋습니다. 인터넷 주소는 오른쪽으로 갈수록 상위 계층입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SLD의 정확한 위치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;naver.com을 보겠습니다. 맨 오른쪽 com이 최상위 도메인, 즉 TLD(Top-Level Domain)입니다. 그 왼쪽 한 칸인 &lt;span style=&quot;background: #ffe14d; padding: 1px 5px; border-radius: 3px; font-weight: bold;&quot;&gt;naver&lt;/span&gt;가 SLD(Second-Level Domain), 우리말로 옮기면 '2차 도메인'입니다. 그러니까 DNS 정의를 그대로 따르면 2차 도메인은 우리가 흔히 도메인을 살 때 직접 정하는 그 이름 부분입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서브도메인은 몇 차 도메인인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;blog.naver.com처럼 앞에 blog이 붙으면, 이 blog은 SLD의 하위, 즉 3차 도메인에 해당합니다. 서브도메인은 도메인 소유자가 필요에 따라 자유롭게 만들어 붙이는 하위 주소입니다. www도 사실은 서브도메인의 한 종류입니다. 예전에는 웹은 www, 메일은 mail, 파일은 ftp 식으로 용도별로 쪼개 쓰던 관행이 있었는데, 지금은 www 없이 쓰는 경우가 더 흔해졌습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #2a9d8f;&quot;&gt;&lt;b&gt;  co.kr은 왜 애매할까&lt;/b&gt;&lt;br /&gt;korea.co.kr에서 점을 기준으로 세면 kr이 TLD, co가 SLD, korea가 3차입니다. 하지만 실무에서는 co.kr을 통째로 하나의 확장자처럼 취급합니다. co.kr, or.kr 같은 조합은 개인이 소유하는 이름이 아니라 등록 체계가 미리 정해 둔 구역이기 때문입니다. 이 구분이 뒤에서 쿠키 이야기와 다시 연결됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ddd.ccc.aaa.co.kr에서 ddd는 뭐라고 부를까&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소가 이렇게 길어지면 번호 세기가 완전히 무너집니다. 예로 든 ddd.ccc.aaa.co.kr을 조각별로 색칠해 보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 22px; border: 1px solid #ddd; background: #fafafa; text-align: center;&quot;&gt;
&lt;div style=&quot;font-size: 1.5em; font-family: monospace; letter-spacing: 1px;&quot;&gt;&lt;span style=&quot;background: #ffe14d; padding: 3px 7px; border-radius: 4px; font-weight: bold;&quot;&gt;ddd&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: #e3f2fd; padding: 3px 7px; border-radius: 4px;&quot;&gt;ccc&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: #e8f5e9; padding: 3px 7px; border-radius: 4px;&quot;&gt;aaa&lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: #eee; padding: 3px 7px; border-radius: 4px; color: #777;&quot;&gt;co.kr&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-size: 0.92em; color: #555; margin-top: 12px; line-height: 1.9;&quot;&gt;&lt;span style=&quot;color: #777;&quot;&gt;co.kr &amp;rarr; 공용 접미사 (실질 TLD)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #2e7d32;&quot;&gt;aaa &amp;rarr; 실제로 등록해서 산 도메인 이름&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1565c0;&quot;&gt;ccc &amp;rarr; 서브도메인&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8860b; font-weight: bold;&quot;&gt;ddd &amp;rarr; 서브도메인 위에 또 붙인 서브도메인&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 실제로 사람이 소유하는 단위는 aaa.co.kr입니다. co.kr은 앞에서 말한 공용 접미사라 개인이 가질 수 없고, aaa가 우리가 돈 주고 등록한 이름입니다. 그 위에 ccc를 붙이고, 다시 그 위에 ddd를 붙인 구조입니다. 그래서 ddd를 부르는 이름은 보는 입장마다 이렇게 갈립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;보는 입장&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;ddd를 부르는 말&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;호스팅 업체&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;aaa.co.kr에 처음 붙인 ccc를 '2차 도메인'이라 부르니, 그 아래 ddd는 '3차 도메인'이라 부르거나 그냥 '서브도메인'으로 뭉뚱그립니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;그냥 '서브도메인'. 깊이를 강조할 땐 중첩 서브도메인이라고 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;DNS 점 세기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;kr이 1차, co가 2차, aaa가 3차, ccc가 4차, ddd는 5차. 그런데 co.kr 때문에 이 셈법 자체가 무의미합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점 세기로 하면 ddd는 5차 도메인이지만, 정작 2차 자리에 오는 co는 아무도 소유하지 않는 조각입니다. 번호가 이렇게 실속 없이 헛도는 게 바로 '몇 차 도메인'이라는 셈법을 실무에서 안 쓰는 이유입니다. 호스팅 화면에서는 ddd 정도의 깊이를 간편 메뉴로 만들기보다 DNS 레코드로 직접 잡는 게 보통이고, 이때는 이름 붙일 것도 없이 그냥 서브도메인 레코드 하나 추가하는 셈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 호스팅 업체가 말하는 2차 도메인의 정체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내 호스팅 업체 안내 문서를 보면 대체로 서브도메인을 2차 도메인이라 부릅니다. 예를 들어 &lt;span style=&quot;background: #ffe14d; padding: 1px 5px; border-radius: 3px; font-weight: bold;&quot;&gt;blog&lt;/span&gt;.mydomain.com을 만들어 다른 호스팅 계정이나 폴더에 연결하는 기능을 '2차 도메인 설정'이라고 소개하는 식입니다. DNS 정의상 이건 3차 도메인이지만, 업체 입장에서는 '기본 도메인에 하나 더 붙이는 것'이라는 의미로 2차라는 말을 쓴 셈입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 한 겹이 더 있습니다. 티스토리나 네이버 블로그처럼 서비스형 플랫폼에 자기 도메인을 연결하는 작업도 '2차 도메인'이라 부르는 경우가 많습니다. 그런데 이건 SLD를 새로 만드는 것도, 서브도메인을 쪼개는 것도 아니고, 단지 이미 가진 도메인 주소를 플랫폼 주소 대신 노출하도록 매핑하는 작업입니다. 이름만 같을 뿐 성격이 다릅니다. 개인적으로는 이 세 번째 용법이 가장 오해를 많이 낳는다고 봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. origin이 브라우저 저장소를 가르는 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 용어에서 저장소 쪽으로 넘어가겠습니다. 브라우저가 데이터를 어디에 격리해서 보관하느냐를 결정하는 핵심 개념이 origin(출처)입니다. origin은 세 가지 요소의 조합으로 정해집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로토콜(scheme) - http인지 https인지&lt;/li&gt;
&lt;li&gt;호스트(host) - 도메인 이름 전체. 서브도메인까지 포함한 정확한 주소&lt;/li&gt;
&lt;li&gt;포트(port) - 80, 443, 3000처럼 접속하는 포트 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 셋 중 하나라도 다르면 브라우저는 다른 origin으로 봅니다. 여기서 두 번째, 호스트가 '서브도메인까지 포함한' 정확한 주소라는 점이 중요합니다. example.com과 blog.example.com은 사람 눈에는 같은 집안 같지만, origin 관점에서는 남남입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #2a9d8f;&quot;&gt;&lt;b&gt;  한 줄 요약&lt;/b&gt;&lt;br /&gt;origin = 프로토콜 + 호스트 + 포트. 이 조합이 로컬스토리지의 격리 경계입니다. 그리고 앞에서 정리한 '서브도메인을 나눈다'는 결정이 곧 이 호스트를 바꾸는 일이기 때문에, 도메인 용어와 저장소가 한 줄로 이어집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 로컬스토리지와 도메인의 관계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬스토리지는 origin 단위로 완전히 격리됩니다. 같은 origin에서 저장한 데이터는 그 origin에서만 읽을 수 있고, origin이 조금이라도 다르면 서로의 저장 공간을 들여다볼 수 없습니다. 프론트엔드에서 흔히 쓰는 클라이언트 전용 저장소가 바로 이 로컬스토리지인데, 도메인과 이렇게까지 밀착되어 있다는 점을 놓치면 예상 밖의 버그를 만나게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적으로 다음 경우들은 전부 서로 다른 저장 공간을 씁니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;example.com과 blog.example.com - 호스트가 다르므로 별개&lt;/li&gt;
&lt;li&gt;http://example.com과 https://example.com - 프로토콜이 다르므로 별개&lt;/li&gt;
&lt;li&gt;example.com과 example.com:3000 - 포트가 다르므로 별개&lt;/li&gt;
&lt;li&gt;www.example.com과 example.com - www 유무로 호스트가 달라 별개&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  서브도메인 개편 전에 확인할 것&lt;/b&gt;&lt;br /&gt;운영 중인 서비스를 app.example.com처럼 서브도메인으로 옮기면, 기존 example.com에 쌓아 둔 로컬스토리지 데이터는 새 주소에서 읽히지 않습니다. 로그인 상태나 사용자 설정을 로컬스토리지에 담아 뒀다면 이전 로직을 따로 준비해야 합니다. 서브도메인 간에는 로컬스토리지를 직접 공유하는 방법 자체가 없습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 쿠키와 도메인의 관계, 그리고 서브도메인 공유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 로컬스토리지와 결이 다릅니다. 쿠키의 스코프는 origin이 아니라 도메인과 경로(Domain, Path 속성)로 정해집니다. 이 차이 덕분에 쿠키는 서브도메인끼리 공유가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키를 심을 때 Domain 속성을 example.com으로 지정하면, 그 쿠키는 example.com은 물론 blog.example.com, shop.example.com 같은 하위 서브도메인 전체에 전달됩니다. 반대로 Domain 속성을 생략하면 쿠키를 심은 정확한 그 호스트에서만 유효합니다. 여러 서브도메인에 걸쳐 로그인 세션을 유지하는 구조가 바로 이 Domain 속성 위에서 돌아갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키가 origin만큼 엄격하지 않은 지점도 있습니다. 포트는 구분하지 않고, 프로토콜 구분도 느슨해서 기본적으로 http와 https가 같은 쿠키를 공유합니다. https에서만 쓰이게 하려면 Secure 속성을 붙여야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  아무 도메인에나 심을 수 있는 건 아닙니다&lt;/b&gt;&lt;br /&gt;Domain을 com이나 co.kr처럼 최상위 구역으로 지정해 쿠키를 심는 건 브라우저가 막습니다. 이런 공용 구역(Public Suffix List에 등록된 접미사)에 쿠키를 걸면 그 확장자를 쓰는 전혀 무관한 사이트들까지 쿠키를 공유하게 되기 때문입니다. 앞에서 co.kr을 통째로 확장자처럼 취급한다고 한 이야기가 여기서 이어집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 쿠키와 로컬스토리지 차이 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 브라우저에 데이터를 남긴다는 점은 같지만, 도메인을 다루는 방식부터 서버 전송 여부까지 성격이 꽤 다릅니다. 표로 비교하면 선택 기준이 분명해집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;쿠키&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;로컬스토리지&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;격리 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;도메인 + 경로 (Domain/Path)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;origin (프로토콜+호스트+포트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;서브도메인 공유&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Domain 지정 시 가능&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불가 (서로 다른 origin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;포트 구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;안 함&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;프로토콜 구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;느슨함 (Secure로 제한)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;엄격 (http/https 별개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;서버 전송&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;요청마다 자동 전송&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;전송 안 됨 (브라우저에 머묾)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;대략적 용량&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 4KB&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;약 5MB (브라우저마다 다름)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;만료&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;설정 가능 (Expires/Max-Age)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;지우기 전까지 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주 용도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;세션, 인증, 서버가 읽어야 할 상태&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;클라이언트 전용 데이터 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 매 요청에서 읽어야 하는 값이라면 쿠키, 브라우저 안에서만 쓰는 값이라면 로컬스토리지가 자연스러운 선택입니다. 쿠키는 요청마다 실려 나가므로 큰 데이터를 넣으면 네트워크에 부담이 되고, 로컬스토리지는 서버로 저절로 가지 않으니 인증 토큰을 넣을 때는 노출 위험을 따로 고려해야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 서브도메인으로 나눌 때 저장소에서 벌어지는 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지의 내용을 실제 상황에 대입해 보면 헷갈리던 증상들이 설명됩니다. 서비스를 여러 서브도메인으로 쪼개는 순간, 저장소는 아래처럼 반응합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬스토리지는 서브도메인마다 완전히 분리됩니다. blog에서 저장한 값을 shop에서 읽을 방법이 없습니다.&lt;/li&gt;
&lt;li&gt;쿠키는 Domain을 상위 도메인으로 잡아 두면 서브도메인 전체에서 공유됩니다. 로그인 세션을 서브도메인 넘나들며 유지하려면 이 설정이 필요합니다.&lt;/li&gt;
&lt;li&gt;Domain을 지정하지 않은 쿠키는 심은 서브도메인에서만 살아 있어서, 다른 서브도메인으로 가면 로그인이 풀린 것처럼 보입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 서두에서 나온 &quot;서브도메인 바꿨더니 로그인이 풀렸다&quot;는 증상은 대개 쿠키 Domain 설정이 상위 도메인으로 잡혀 있지 않아서 생깁니다. &quot;로컬스토리지 데이터가 날아갔다&quot;는 origin이 바뀌었으니 당연한 결과입니다. 버그가 아니라 도메인 경계가 설계대로 작동한 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 2026년 현재 서드파티 쿠키 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키 이야기를 하는 김에 지금(2026년) 시점의 서드파티 쿠키 상황도 짚어 두겠습니다. 지금까지 다룬 쿠키는 사용자가 접속한 사이트가 직접 심는 '퍼스트파티 쿠키'인데, 다른 사이트가 심어 여러 사이트를 넘나들며 추적하는 '서드파티 쿠키'는 별개의 흐름을 타고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글은 크롬에서 서드파티 쿠키를 완전히 없애려던 계획을 2024년 7월 접고 사용자 선택 방식을 내놨다가, 2025년 4월에는 별도 선택 창도 띄우지 않기로 했습니다. 크롬은 여전히 기본값으로 서드파티 쿠키를 차단하지 않습니다. 반면 사파리와 파이어폭스는 이미 몇 년 전부터 기본 차단을 유지하고 있어서, 전체 웹 트래픽의 상당 부분은 이미 서드파티 쿠키가 통하지 않는 환경입니다. 대체 기술로 밀던 프라이버시 샌드박스의 여러 API도 2025년 후반 상당수가 정리됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 서드파티 쿠키는 사라지지도, 예전만큼 믿을 만하지도 않은 어중간한 상태입니다. 다만 이 글에서 다룬 도메인 격리와 퍼스트파티 저장소의 원리 자체는 이런 정책 변화와 무관하게 그대로 유지됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 묻는 질문&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2차 도메인과 서브도메인은 같은 말인가요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 정의로는 다릅니다. 2차 도메인(SLD)은 naver.com의 naver처럼 TLD 바로 왼쪽 한 칸이고, 서브도메인은 그 앞에 붙는 blog.naver.com의 blog 같은 하위 주소입니다. 다만 국내 호스팅 업체들이 서브도메인을 관행적으로 2차 도메인이라 부르는 경우가 많아 실무에서는 문맥으로 구분해야 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;www가 있고 없고에 따라 로컬스토리지가 달라지나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네. www.example.com과 example.com은 호스트가 다르므로 origin이 다르고, 로컬스토리지도 각각 별개로 잡힙니다. 그래서 www 유무를 하나로 통일하는 리다이렉트 설정을 흔히 함께 둡니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;쿠키를 co.kr 같은 곳에 심을 수 있나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심을 수 없습니다. co.kr이나 com처럼 여러 주체가 나눠 쓰는 공용 접미사에는 쿠키를 걸 수 없도록 브라우저가 막습니다. 무관한 사이트끼리 쿠키가 새는 것을 방지하기 위한 장치입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;sessionStorage도 도메인 단위인가요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sessionStorage 역시 origin 단위로 격리되지만, 여기에 더해 탭(브라우징 컨텍스트) 단위로도 나뉩니다. 같은 origin이라도 다른 탭이면 서로의 sessionStorage를 공유하지 않고, 탭을 닫으면 사라집니다. 로컬스토리지보다 한층 더 좁은 범위라고 보면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용어보다 도메인 경계를 먼저 보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 도메인이라는 말은 앞으로도 여기저기서 서로 다른 뜻으로 쓰일 겁니다. 용어를 하나로 통일하는 건 현실적으로 어렵습니다. 그래서 이름을 외우기보다, 지금 이야기하는 대상이 SLD인지 서브도메인인지 아니면 도메인 연결 작업인지를 문맥에서 짚어내는 감각이 더 쓸모 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 감각의 실전 가치는 저장소에서 드러납니다. 로컬스토리지는 origin이 조금만 달라도 남남이 되고, 쿠키는 Domain 설정에 따라 서브도메인을 넘나들거나 갇힙니다. 도메인을 어떻게 나눌지 정하는 순간 저장소 전략도 함께 정해지는 셈입니다. 서브도메인 구조를 손보기 전에 이 경계를 한 번 그려 보면, 나중에 원인 모를 로그인 풀림이나 데이터 유실로 시간을 뺏기는 일을 크게 줄일 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-10&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1784201690698&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;MVVM 패턴이란 무엇인가 - 데이터 바인딩의 탄생부터 단방향 흐름의 시대까지&quot; data-og-description=&quot;MVVM 패턴은 애플리케이션을 Model(모델), View(뷰), ViewModel(뷰모델) 세 부분으로 나누고, 그 사이를 데이터 바인딩으로 잇는 소프트웨어 아키텍처입니다. 화면 상태가 시시각각 바뀌는 요즘 앱에서 U&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/MVVM-%ED%8C%A8%ED%84%B4-%EC%99%9C-%EB%8B%A4%EB%93%A4-%EC%93%B8%EA%B9%8C-%EB%B3%B5%EC%9E%A1%ED%95%9C-UI%EC%99%80-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%B6%84%EB%A6%AC%ED%95%98%EB%8A%94-%EC%99%84%EB%B2%BD%ED%95%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot; data-og-url=&quot;https://devwar.tistory.com/entry/MVVM-%ED%8C%A8%ED%84%B4-%EC%99%9C-%EB%8B%A4%EB%93%A4-%EC%93%B8%EA%B9%8C-%EB%B3%B5%EC%9E%A1%ED%95%9C-UI%EC%99%80-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%B6%84%EB%A6%AC%ED%95%98%EB%8A%94-%EC%99%84%EB%B2%BD%ED%95%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/edCVjb/dJMb87gi3Xd/MrBxmiy7Q4mcTEy0PzYLqk/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/rBXvK/dJMb88GhCYm/ECX2I0oBVV8cqCYEhjt4Yk/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/dDBIIh/dJMb88fdijH/KJMP4NHkJSKpJE6fUien8K/img.png?width=1000&amp;amp;height=831&amp;amp;face=0_0_1000_831&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/MVVM-%ED%8C%A8%ED%84%B4-%EC%99%9C-%EB%8B%A4%EB%93%A4-%EC%93%B8%EA%B9%8C-%EB%B3%B5%EC%9E%A1%ED%95%9C-UI%EC%99%80-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%B6%84%EB%A6%AC%ED%95%98%EB%8A%94-%EC%99%84%EB%B2%BD%ED%95%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/MVVM-%ED%8C%A8%ED%84%B4-%EC%99%9C-%EB%8B%A4%EB%93%A4-%EC%93%B8%EA%B9%8C-%EB%B3%B5%EC%9E%A1%ED%95%9C-UI%EC%99%80-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81%EC%9D%84-%EB%B6%84%EB%A6%AC%ED%95%98%EB%8A%94-%EC%99%84%EB%B2%BD%ED%95%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/edCVjb/dJMb87gi3Xd/MrBxmiy7Q4mcTEy0PzYLqk/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/rBXvK/dJMb88GhCYm/ECX2I0oBVV8cqCYEhjt4Yk/img.png?width=800&amp;amp;height=664&amp;amp;face=0_0_800_664,https://scrap.kakaocdn.net/dn/dDBIIh/dJMb88fdijH/KJMP4NHkJSKpJE6fUien8K/img.png?width=1000&amp;amp;height=831&amp;amp;face=0_0_1000_831');&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;MVVM 패턴이란 무엇인가 - 데이터 바인딩의 탄생부터 단방향 흐름의 시대까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MVVM 패턴은 애플리케이션을 Model(모델), View(뷰), ViewModel(뷰모델) 세 부분으로 나누고, 그 사이를 데이터 바인딩으로 잇는 소프트웨어 아키텍처입니다. 화면 상태가 시시각각 바뀌는 요즘 앱에서 U&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784201684936&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;CQRS, 읽기와 쓰기를 굳이 나누는 이유 &amp;mdash; 후배에게 먼저 외우게 하는 개념&quot; data-og-description=&quot;CQRS(Command Query Responsibility Segregation)는 읽기와 쓰기를 서로 다른 모델로 나눠서 다루는 아키텍처 패턴입니다. 이름은 거창하지만 뿌리는 단순합니다. 상태를 바꾸는 명령(Command)과 값을 돌려주는 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DBEGe/dJMb9lljuRF/fwPioXEDvwxwfpVjEGG941/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/qvrVE/dJMb9b34q7m/gLWGIrqb4SRAqNBcIXKXE0/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/RbrVw/dJMb8RR4vjU/lGwvuDDo1RhmBmTxKqPht0/img.png?width=1016&amp;amp;height=798&amp;amp;face=0_0_1016_798&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cqrs-command-query-separation-why&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DBEGe/dJMb9lljuRF/fwPioXEDvwxwfpVjEGG941/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/qvrVE/dJMb9b34q7m/gLWGIrqb4SRAqNBcIXKXE0/img.png?width=800&amp;amp;height=628&amp;amp;face=0_0_800_628,https://scrap.kakaocdn.net/dn/RbrVw/dJMb8RR4vjU/lGwvuDDo1RhmBmTxKqPht0/img.png?width=1016&amp;amp;height=798&amp;amp;face=0_0_1016_798');&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;CQRS, 읽기와 쓰기를 굳이 나누는 이유 &amp;mdash; 후배에게 먼저 외우게 하는 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CQRS(Command Query Responsibility Segregation)는 읽기와 쓰기를 서로 다른 모델로 나눠서 다루는 아키텍처 패턴입니다. 이름은 거창하지만 뿌리는 단순합니다. 상태를 바꾸는 명령(Command)과 값을 돌려주는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784201675912&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;좋은 코드란 무엇인가 - 13년 차 개발자의 대답이 네 번 바뀐 이야기&quot; data-og-description=&quot;개발을 13년쯤 하다 보니 &amp;quot;좋은 코드란 무엇인가&amp;quot;라는 질문에 대한 제 대답이 계속 바뀌어 왔습니다. 신입 때는 주석을 잘 다는 게 좋은 코드라고 믿었고, 나중엔 가독성을, 그다음엔 지우기 쉬운&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-13%EB%85%84-%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%8C%80%EB%8B%B5%EC%9D%B4-%EB%84%A4-%EB%B2%88-%EB%B0%94%EB%80%90-%EC%9D%B4%EC%95%BC%EA%B8%B0&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-13%EB%85%84-%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%8C%80%EB%8B%B5%EC%9D%B4-%EB%84%A4-%EB%B2%88-%EB%B0%94%EB%80%90-%EC%9D%B4%EC%95%BC%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7GuTt/dJMb81f49M1/XrSTK3utXPNxJjS4VbGQh0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=528_130_593_201,https://scrap.kakaocdn.net/dn/cuEQa9/dJMb85W5UMW/odluRhRhBsObKU4liBGv30/img.jpg?width=800&amp;amp;height=594&amp;amp;face=528_130_593_201,https://scrap.kakaocdn.net/dn/LO5AJ/dJMb8RR4vjR/a3uYUnMKOCEidN9ELTnVr1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=784_197_874_295&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-13%EB%85%84-%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%8C%80%EB%8B%B5%EC%9D%B4-%EB%84%A4-%EB%B2%88-%EB%B0%94%EB%80%90-%EC%9D%B4%EC%95%BC%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-13%EB%85%84-%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%8C%80%EB%8B%B5%EC%9D%B4-%EB%84%A4-%EB%B2%88-%EB%B0%94%EB%80%90-%EC%9D%B4%EC%95%BC%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7GuTt/dJMb81f49M1/XrSTK3utXPNxJjS4VbGQh0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=528_130_593_201,https://scrap.kakaocdn.net/dn/cuEQa9/dJMb85W5UMW/odluRhRhBsObKU4liBGv30/img.jpg?width=800&amp;amp;height=594&amp;amp;face=528_130_593_201,https://scrap.kakaocdn.net/dn/LO5AJ/dJMb8RR4vjR/a3uYUnMKOCEidN9ELTnVr1/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=784_197_874_295');&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;좋은 코드란 무엇인가 - 13년 차 개발자의 대답이 네 번 바뀐 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 13년쯤 하다 보니 &quot;좋은 코드란 무엇인가&quot;라는 질문에 대한 제 대답이 계속 바뀌어 왔습니다. 신입 때는 주석을 잘 다는 게 좋은 코드라고 믿었고, 나중엔 가독성을, 그다음엔 지우기 쉬운&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784201673016&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;SOLID 원칙, 저는 헌법처럼 씁니다 - 완벽하게 지키는 건 애초에 불가능합니다&quot; data-og-description=&quot;&amp;quot;SOLID 다 외웠는데 막상 코드 짤 땐 어떻게 적용하죠?&amp;quot;&amp;quot;이 클래스 책임이 하나인지 두 개인지 솔직히 잘 모르겠어요.&amp;quot;&amp;quot;원칙대로 다 쪼갰더니 파일만 잔뜩 늘어났는데 이게 맞나요?&amp;quot; 개발 좀 하다 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99-%EC%A0%80%EB%8A%94-%ED%97%8C%EB%B2%95%EC%B2%98%EB%9F%BC-%EC%94%81%EB%8B%88%EB%8B%A4-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A7%80%ED%82%A4%EB%8A%94-%EA%B1%B4-%EC%95%A0%EC%B4%88%EC%97%90-%EB%B6%88%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EB%8B%A4&quot; data-og-url=&quot;https://devwar.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99-%EC%A0%80%EB%8A%94-%ED%97%8C%EB%B2%95%EC%B2%98%EB%9F%BC-%EC%94%81%EB%8B%88%EB%8B%A4-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A7%80%ED%82%A4%EB%8A%94-%EA%B1%B4-%EC%95%A0%EC%B4%88%EC%97%90-%EB%B6%88%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EB%8B%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kwATA/dJMb87gi3Xa/IyZINo32OT2AvajMKfe0C1/img.png?width=800&amp;amp;height=639&amp;amp;face=542_131_599_193,https://scrap.kakaocdn.net/dn/c1Iclk/dJMb8WMCe7S/fz0Chrc8UvS1tMiuHKHdJ0/img.png?width=800&amp;amp;height=639&amp;amp;face=542_131_599_193,https://scrap.kakaocdn.net/dn/bdCrHz/dJMb83kFAdu/XWoq9Jw6a8tAgfLdL5KP4k/img.png?width=1200&amp;amp;height=959&amp;amp;face=813_196_899_289&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99-%EC%A0%80%EB%8A%94-%ED%97%8C%EB%B2%95%EC%B2%98%EB%9F%BC-%EC%94%81%EB%8B%88%EB%8B%A4-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A7%80%ED%82%A4%EB%8A%94-%EA%B1%B4-%EC%95%A0%EC%B4%88%EC%97%90-%EB%B6%88%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99-%EC%A0%80%EB%8A%94-%ED%97%8C%EB%B2%95%EC%B2%98%EB%9F%BC-%EC%94%81%EB%8B%88%EB%8B%A4-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A7%80%ED%82%A4%EB%8A%94-%EA%B1%B4-%EC%95%A0%EC%B4%88%EC%97%90-%EB%B6%88%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EB%8B%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kwATA/dJMb87gi3Xa/IyZINo32OT2AvajMKfe0C1/img.png?width=800&amp;amp;height=639&amp;amp;face=542_131_599_193,https://scrap.kakaocdn.net/dn/c1Iclk/dJMb8WMCe7S/fz0Chrc8UvS1tMiuHKHdJ0/img.png?width=800&amp;amp;height=639&amp;amp;face=542_131_599_193,https://scrap.kakaocdn.net/dn/bdCrHz/dJMb83kFAdu/XWoq9Jw6a8tAgfLdL5KP4k/img.png?width=1200&amp;amp;height=959&amp;amp;face=813_196_899_289');&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;SOLID 원칙, 저는 헌법처럼 씁니다 - 완벽하게 지키는 건 애초에 불가능합니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;SOLID 다 외웠는데 막상 코드 짤 땐 어떻게 적용하죠?&quot;&quot;이 클래스 책임이 하나인지 두 개인지 솔직히 잘 모르겠어요.&quot;&quot;원칙대로 다 쪼갰더니 파일만 잔뜩 늘어났는데 이게 맞나요?&quot; 개발 좀 하다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>2차 도메인</category>
      <category>localstorage</category>
      <category>Origin</category>
      <category>SLD</category>
      <category>도메인 계층</category>
      <category>로컬스토리지</category>
      <category>서드파티 쿠키</category>
      <category>서브도메인</category>
      <category>쿠키</category>
      <category>프론트엔드 저장소</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/131</guid>
      <comments>https://devwar.tistory.com/entry/second-level-domain-subdomain#entry131comment</comments>
      <pubDate>Wed, 26 Aug 2026 19:00:00 +0900</pubDate>
    </item>
    <item>
      <title>서버 모니터링 항목 4가지, 이것만 보는 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/server-monitoring-basics</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHE5Cm/dJMcaa0KJCy/y68K1i3KikzUHqRejVbKHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHE5Cm/dJMcaa0KJCy/y68K1i3KikzUHqRejVbKHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHE5Cm/dJMcaa0KJCy/y68K1i3KikzUHqRejVbKHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHE5Cm%2FdJMcaa0KJCy%2Fy68K1i3KikzUHqRejVbKHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;서버 모니터링 항목 4가지, 이것만 보는 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 모니터링 항목을 검색하면 온갖 지표가 쏟아지지만, 실무에서 기본이 되는 건 딱 4가지입니다. 서버가 켜져 있는지, CPU 사용량, 램 사용량, 디스크 용량. 그리고 이건 방화벽이나 WAF 같은 보안 장비와는 완전히 다른 영역입니다. 공격을 막는 게 아니라 서버의 건강 상태를 확인하는 일이에요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;서버 모니터링이랑 방화벽이랑 뭐가 다른 거지?&quot;&lt;br /&gt;&quot;서버 체크는 뭘 봐야 하는 거야?&quot;&lt;br /&gt;&quot;디스크 용량 다 차면 무슨 일이 생기지?&quot;&lt;br /&gt;&quot;CPU 그래프가 갑자기 튀는 건 왜 봐야 해?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 회사를 옮길 때마다 첫 업무로 모니터링부터 구축합니다. 코드를 파악하는 것보다 먼저요. 서버 상태가 안 보이는 채로 운영하는 건 계기판 없는 차를 모는 것과 같아서, 이게 없으면 어떤 작업도 마음 놓고 못 하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 도구 설치법이 아니라 개념 정리입니다. 서버 모니터링이 무엇이고 보안 장비와 어떻게 다른지, 왜 하필 저 4가지를 보는지를 다룹니다. 서버 운영을 시작한 분, 모니터링 없이 서비스를 돌리고 있는 분에게 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버 모니터링이란 - 보안이 아니라 건강검진&lt;/li&gt;
&lt;li&gt;WAF&amp;middot;방화벽과 뭐가 다른가&lt;/li&gt;
&lt;li&gt;체크 항목 1. 서버가 켜져 있는가&lt;/li&gt;
&lt;li&gt;체크 항목 2. CPU 사용량 - 가장 빠른 이상 경보&lt;/li&gt;
&lt;li&gt;체크 항목 3. 램 사용량 - 누수와 비정상 부하 감지&lt;/li&gt;
&lt;li&gt;체크 항목 4. 디스크 용량 - 차면 접속조차 안 됩니다&lt;/li&gt;
&lt;li&gt;왜 하필 이 4가지인가&lt;/li&gt;
&lt;li&gt;이직하면 모니터링부터 만드는 이유&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서버 모니터링이란 - 보안이 아니라 건강검진&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 모니터링은 서버의 상태를 지속적으로 지켜보고, 이상이 생기면 알려주는 체계를 말합니다. 사람으로 치면 혈압&amp;middot;맥박을 재는 건강검진이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 이게 무언가를 막는 장치가 아니라는 점입니다. 모니터링은 관찰하고 알려줄 뿐입니다. 화재를 예로 들면 모니터링은 화재경보기지 스프링클러가 아니에요. 하지만 경보기가 없으면 불이 난 줄도 모른 채 건물이 다 타버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장에서는 이런 상태 체크 체계를 통틀어 APM이라 부르기도 합니다. 엄밀히 APM은 애플리케이션 성능 측정에 가까운 용어지만, 서버 상태 확인까지 묶어서 부르는 경우가 많아요. 이 글에서는 그중 가장 기본인 서버 상태 4가지를 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. WAF&amp;middot;방화벽과 뭐가 다른가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 관리를 시작하면 방화벽, WAF(웹 방화벽), 모니터링이라는 말이 섞여 들어와서 헷갈리기 쉽습니다. 역할이 완전히 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방화벽과 WAF는 보안 장비입니다. 외부에서 들어오는 트래픽을 검사해서 수상한 요청을 차단하는, 문 앞의 경비원이에요. 반면 모니터링은 집 안의 상태를 보는 겁니다. 보일러가 잘 도는지, 수도가 새는지.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;방화벽&amp;middot;WAF&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;서버 모니터링&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;외부 공격 차단&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;내부 상태 관찰&amp;middot;알림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;문 앞 경비원&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;건강검진&amp;middot;화재경보기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;동작&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;막는다&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;알아챈다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 둘은 대체 관계가 아니라 둘 다 필요한 관계입니다. 경비원이 있어도 보일러 고장은 못 잡고, 경보기가 있어도 도둑은 못 막으니까요.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 체크 항목 1. 서버가 켜져 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 원초적이지만 가장 중요한 항목입니다. 서버가 죽어 있으면 나머지 지표는 볼 것도 없으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &quot;지금 켜져 있는가&quot;보다 죽는 순간 바로 아는가입니다. 모니터링이 없으면 서버가 새벽에 죽어도 아침에 고객 항의 전화로 알게 됩니다. 장애 자체보다, 장애를 몇 시간 동안 몰랐다는 게 서비스 신뢰를 깎아먹어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 가동 체크는 주기적으로 서버에 신호를 보내 응답을 확인하고, 응답이 끊기면 몇 분 안에 알림을 쏘는 구조로 만듭니다. 4가지 중 가장 먼저 갖춰야 할 항목입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 체크 항목 2. CPU 사용량 - 가장 빠른 이상 경보&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 사용량은 흔히 성능 지표로만 생각하는데, 실무에서는 이상 징후를 가장 먼저 알려주는 경보 역할이 더 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 20~30%로 잔잔하던 CPU가 갑자기 90%로 치솟아 내려오지 않는다면, 뭔가 평소와 다른 일이 벌어지고 있다는 뜻입니다. 갑작스러운 디도스 공격일 수도 있고, 이벤트로 클라이언트 접속이 폭증하는 중일 수도 있고, 특정 코드가 폭주하는 것일 수도 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인이 무엇이든 공통점은 그래프가 사람보다 먼저 안다는 겁니다. 사용자가 &quot;사이트가 느려요&quot;라고 말하기 한참 전에 CPU 그래프는 이미 치솟아 있습니다. 이 시차가 대응 골든타임이 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  보는 법의 핵심&lt;/b&gt;&lt;br /&gt;순간 수치가 아니라 평소 패턴과의 차이를 봅니다. 90%라도 배치 작업 시간대면 정상이고, 40%라도 새벽 3시에 그렇다면 이상 신호일 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 체크 항목 3. 램 사용량 - 누수와 비정상 부하 감지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램(메모리)은 서버가 지금 하고 있는 일을 올려두는 작업대입니다. 이게 가득 차면 서버는 디스크를 임시 작업대로 끌어다 쓰는데(스왑이라고 부릅니다), 디스크는 램보다 수백 배 느려서 서비스 전체가 급격히 굼떠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램 그래프에서 주로 잡히는 건 두 가지입니다. 하나는 메모리 누수, 즉 프로그램이 쓴 메모리를 반납하지 않아 사용량이 며칠에 걸쳐 계단처럼 우상향하는 패턴입니다. 재시작하면 잠깐 내려갔다가 또 오르죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 하나는 비정상 부하입니다. 해킹 시도로 데이터베이스에서 대량의 데이터를 한꺼번에 뽑아가려 하거나, 클라이언트 쪽에서 비정상적으로 큰 전송이 몰릴 때 램과 CPU가 함께 튑니다. 모니터링이 침입 자체를 막지는 못하지만, 뭔가 대량으로 빠져나가고 있다는 사실을 알아채는 건 이 그래프가 해줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 체크 항목 4. 디스크 용량 - 차면 접속조차 안 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷 중에 성격이 가장 고약한 항목입니다. CPU와 램은 부하가 지나가면 회복되지만, 디스크는 차오르기만 하다가 100%가 되는 순간 서버가 통째로 먹통이 되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크가 가득 차면 서버는 임시 파일 하나 만들 공간이 없어서 로그인 처리조차 못 합니다. 원격 접속 자체가 거부되는 거예요. 원인을 파악하려면 서버에 들어가야 하는데, 들어갈 수가 없는 진퇴양난이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 환경 차이가 극명하게 갈립니다. AWS 같은 클라우드는 콘솔에서 볼륨 용량을 몇 분 만에 늘릴 수 있습니다. 반면 자체 서버(온프레미스)는 물리 디스크를 실제로 사서 꽂아야 해서, 조달부터 작업까지 훨씬 난감해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 서버급 장비는 전원을 끄지 않은 채 디스크를 추가하는 핫스왑을 지원합니다. 서비스를 세우지 않고 증설할 수 있다는 뜻인데, 이건 핫스왑 베이 같은 하드웨어가 갖춰진 장비 기준이고 일반 PC를 서버로 쓰는 경우엔 해당하지 않습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  디스크의 단골 범인&lt;/b&gt;&lt;br /&gt;쌓이기만 하는 로그 파일입니다. 디스크 그래프가 꾸준히 우상향한다면 로그 정리 정책부터 의심하세요. 100%가 되기 전에 알아채는 것, 그게 이 항목을 모니터링하는 이유의 전부입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 왜 하필 이 4가지인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 잴 수 있는 지표는 수십 가지지만, 실제 장애의 원인을 거슬러 올라가면 대부분 이 4가지 중 하나로 수렴합니다. 서버가 죽었거나, 연산이 밀렸거나, 메모리가 바닥났거나, 디스크가 찼거나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4가지의 성격을 정리하면 이렇습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;알려주는 것&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;가동 여부&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;살았는가 죽었는가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최우선, 알림 속도가 생명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;지금 무리하고 있는가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;디도스&amp;middot;급증의 첫 경보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;램&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;작업 공간이 남았는가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;누수&amp;middot;대량 유출 시도 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;디스크&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;저장 공간이 남았는가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;차면 접속 불가, 회복 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 4가지가 잡혀 있으면 장애의 상당수를 사용자보다 먼저 알 수 있고, 나머지 세부 지표는 필요해질 때 얹으면 됩니다. 처음부터 수십 개 지표를 깔아두는 것보다, 이 4개를 확실히 보는 쪽이 실전에서는 훨씬 유효합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 이직하면 모니터링부터 만드는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 새 회사에 가면 코드보다 모니터링을 먼저 확인하고, 없으면 이것부터 구축합니다. 이유는 단순합니다. 상태가 안 보이는 서버는 언제 터질지 모르는 서버이고, 그 위에서 하는 모든 작업이 도박이 되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터링이 없는 환경에서는 배포를 해도 서버에 무리가 갔는지 알 수 없고, 장애가 나도 언제부터였는지 복기가 안 됩니다. 반대로 4가지 그래프만 있어도 &quot;배포 후 램이 계단식으로 오르네&quot; 같은 문제를 사고가 되기 전에 잡을 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 부수 효과도 있습니다. 그래프가 쌓이면 우리 서버의 평소 모습을 알게 됩니다. 평소를 알아야 이상함이 보입니다. 모니터링의 진짜 가치는 화려한 대시보드가 아니라 이 기준선을 갖게 되는 데 있다고 생각합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모니터링만 있으면 방화벽은 없어도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 역할이 다릅니다. 모니터링은 이상을 알아채는 장치고, 방화벽&amp;middot;WAF는 공격을 차단하는 장치입니다. 모니터링은 디도스가 와도 막아주지 못하고, 그래프로 알려줄 뿐입니다. 보안 장비와 모니터링은 둘 다 있어야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디스크는 몇 퍼센트부터 위험한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통상 80%를 경고선으로 잡는 경우가 많습니다. 100%가 되기 전에 조치할 시간을 벌기 위해서인데, 디스크가 크고 증가 속도가 느리면 더 높게 잡아도 됩니다. 중요한 건 숫자 자체보다 그래프의 증가 속도를 함께 보는 겁니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CPU가 100%면 무조건 문제인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 배치 작업이나 빌드처럼 원래 CPU를 다 쓰는 작업 중이라면 정상입니다. 문제는 이유를 모르는 100%, 그리고 내려오지 않는 100%입니다. 그래서 평소 패턴을 알고 있는 게 수치 자체보다 중요합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;계기판 없이 운전하지 않는 것처럼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 서버 모니터링은 공격을 막는 보안이 아니라 상태를 알아채는 체계이고, 볼 것은 가동 여부&amp;middot;CPU&amp;middot;램&amp;middot;디스크 4가지입니다. CPU와 램은 디도스나 비정상 유출 같은 이상 징후의 첫 경보가 되고, 디스크는 차버리면 접속조차 막히니 차기 전에 알아채는 게 전부입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 운영하고 있는데 이 4가지가 안 보이는 상태라면, 새 기능보다 이것부터 갖추는 걸 권합니다. 제가 이직할 때마다 첫 업무로 삼는 데는 그만한 이유가 있었습니다.&lt;/p&gt;
&lt;h3 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  함께 보면 좋은 글&lt;/h3&gt;
&lt;figure id=&quot;og_1787541783193&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;APM(애플리케이션 성능 관리/모니터링) 핵심 정리: 툭하면 터지던 서버를 살려낸 개발 철학의 역&quot; data-og-description=&quot;현대 소프트웨어 개발 환경에서 APM(애플리케이션 성능 관리)은 단순한 선택을 넘어 기업의 생존을 결정짓는 핵심 도구로 자리 잡았습니다.과거에는 서버가 다운되거나 서비스가 지연되면 원인&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/APM%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%B1%EB%8A%A5-%EA%B4%80%EB%A6%AC%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC-%ED%88%AD%ED%95%98%EB%A9%B4-%ED%84%B0%EC%A7%80%EB%8D%98-%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%82%B4%EB%A0%A4%EB%82%B8-%EA%B0%9C%EB%B0%9C-%EC%B2%A0%ED%95%99%EC%9D%98-%EC%97%AD%EC%82%AC&quot; data-og-url=&quot;https://devwar.tistory.com/entry/APM%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%B1%EB%8A%A5-%EA%B4%80%EB%A6%AC%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC-%ED%88%AD%ED%95%98%EB%A9%B4-%ED%84%B0%EC%A7%80%EB%8D%98-%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%82%B4%EB%A0%A4%EB%82%B8-%EA%B0%9C%EB%B0%9C-%EC%B2%A0%ED%95%99%EC%9D%98-%EC%97%AD%EC%82%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VCHKQ/dJMb9kmtJ1s/4C1Ok7I0nD63DthExr94Sk/img.png?width=800&amp;amp;height=588&amp;amp;face=493_132_559_204,https://scrap.kakaocdn.net/dn/JifsN/dJMb8QMtQxv/zjOEf9NC3tkoVaPbbkAXE0/img.png?width=800&amp;amp;height=588&amp;amp;face=493_132_559_204,https://scrap.kakaocdn.net/dn/bqUsd9/dJMb9c9Pctj/JzpX5Es9P2vv6S5pKU9WW0/img.png?width=1000&amp;amp;height=735&amp;amp;face=617_164_702_257&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/APM%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%B1%EB%8A%A5-%EA%B4%80%EB%A6%AC%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC-%ED%88%AD%ED%95%98%EB%A9%B4-%ED%84%B0%EC%A7%80%EB%8D%98-%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%82%B4%EB%A0%A4%EB%82%B8-%EA%B0%9C%EB%B0%9C-%EC%B2%A0%ED%95%99%EC%9D%98-%EC%97%AD%EC%82%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/APM%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%B1%EB%8A%A5-%EA%B4%80%EB%A6%AC%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC-%ED%88%AD%ED%95%98%EB%A9%B4-%ED%84%B0%EC%A7%80%EB%8D%98-%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%82%B4%EB%A0%A4%EB%82%B8-%EA%B0%9C%EB%B0%9C-%EC%B2%A0%ED%95%99%EC%9D%98-%EC%97%AD%EC%82%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VCHKQ/dJMb9kmtJ1s/4C1Ok7I0nD63DthExr94Sk/img.png?width=800&amp;amp;height=588&amp;amp;face=493_132_559_204,https://scrap.kakaocdn.net/dn/JifsN/dJMb8QMtQxv/zjOEf9NC3tkoVaPbbkAXE0/img.png?width=800&amp;amp;height=588&amp;amp;face=493_132_559_204,https://scrap.kakaocdn.net/dn/bqUsd9/dJMb9c9Pctj/JzpX5Es9P2vv6S5pKU9WW0/img.png?width=1000&amp;amp;height=735&amp;amp;face=617_164_702_257');&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;APM(애플리케이션 성능 관리/모니터링) 핵심 정리: 툭하면 터지던 서버를 살려낸 개발 철학의 역&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;현대 소프트웨어 개발 환경에서 APM(애플리케이션 성능 관리)은 단순한 선택을 넘어 기업의 생존을 결정짓는 핵심 도구로 자리 잡았습니다.과거에는 서버가 다운되거나 서비스가 지연되면 원인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787541779539&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;방화벽 뜻과 유래, 컴퓨터 보안에 왜 '불(Fire) 막는 벽'이라는 이름이 붙었을까?&quot; data-og-description=&quot;컴퓨터 보안에서 방화벽(Firewall)은 외부의 악의적인 공격으로부터 내부 네트워크를 보호하는 가장 기본적인 보안 시스템입니다.해킹이나 랜섬웨어 등 사이버 위협이 기하급수적으로 증가하는 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wkjmd/dJMb89yvc6u/OhDX9KkQ0VLTsGRLrS30u1/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/cwzPTr/dJMb9lMsJeZ/kL3yDdsoNL0bThf9DhiEwk/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/0CJCE/dJMb83SAE06/V07N5FgMaU4twHv76b4mHK/img.png?width=2400&amp;amp;height=1543&amp;amp;face=1290_273_1477_479&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB%EA%B3%BC-%EC%9C%A0%EB%9E%98-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B3%B4%EC%95%88%EC%97%90-%EC%99%9C-%EB%B6%88Fire-%EB%A7%89%EB%8A%94-%EB%B2%BD%EC%9D%B4%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EB%B6%99%EC%97%88%EC%9D%84%EA%B9%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wkjmd/dJMb89yvc6u/OhDX9KkQ0VLTsGRLrS30u1/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/cwzPTr/dJMb9lMsJeZ/kL3yDdsoNL0bThf9DhiEwk/img.png?width=800&amp;amp;height=564&amp;amp;face=616_178_646_210,https://scrap.kakaocdn.net/dn/0CJCE/dJMb83SAE06/V07N5FgMaU4twHv76b4mHK/img.png?width=2400&amp;amp;height=1543&amp;amp;face=1290_273_1477_479');&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;방화벽 뜻과 유래, 컴퓨터 보안에 왜 '불(Fire) 막는 벽'이라는 이름이 붙었을까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터 보안에서 방화벽(Firewall)은 외부의 악의적인 공격으로부터 내부 네트워크를 보호하는 가장 기본적인 보안 시스템입니다.해킹이나 랜섬웨어 등 사이버 위협이 기하급수적으로 증가하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787541770981&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;WAF(웹방화벽) 뜻 쉽게 설명해드림! 우리 회사 협업툴이 해킹당하지 않는 진짜 이유&quot; data-og-description=&quot;최근 기업의 업무 환경이 디지털로 전면 전환되면서 협업툴의 사용 빈도가 폭발적으로 증가하고 있습니다.하지만 이와 동시에 기업의 핵심 데이터를 집요하게 노리는 웹 해킹 공격도 날이 갈수&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MYJKo/dJMb8YqcUFO/kb3n1qk8mTDNaXpQiXVNl0/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/dODSCT/dJMb8WeRo84/oKFdv2WUSvyAA99WC72Em0/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/CmzCN/dJMb87OeuYf/ORon8e7wFLlTyi2nKhY1D1/img.png?width=1200&amp;amp;height=926&amp;amp;face=0_0_1200_926&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/WAF%EC%9B%B9%EB%B0%A9%ED%99%94%EB%B2%BD-%EB%9C%BB-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%B4%EB%93%9C%EB%A6%BC-%EC%9A%B0%EB%A6%AC-%ED%9A%8C%EC%82%AC-%ED%98%91%EC%97%85%ED%88%B4%EC%9D%B4-%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%A7%84%EC%A7%9C-%EC%9D%B4%EC%9C%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MYJKo/dJMb8YqcUFO/kb3n1qk8mTDNaXpQiXVNl0/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/dODSCT/dJMb8WeRo84/oKFdv2WUSvyAA99WC72Em0/img.png?width=800&amp;amp;height=617&amp;amp;face=0_0_800_617,https://scrap.kakaocdn.net/dn/CmzCN/dJMb87OeuYf/ORon8e7wFLlTyi2nKhY1D1/img.png?width=1200&amp;amp;height=926&amp;amp;face=0_0_1200_926');&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;WAF(웹방화벽) 뜻 쉽게 설명해드림! 우리 회사 협업툴이 해킹당하지 않는 진짜 이유&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787541766389&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&quot; data-og-description=&quot;&amp;quot;Redis는 왜 그렇게 빠른가요?&amp;quot;&amp;quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&amp;quot;&amp;quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&amp;quot;&amp;quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠? &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfHqjy/dJMb87OeuYb/wnmC1UnQKE2KKbM0f2tmH0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/bB43Ok/dJMb81f99Ma/eZV3xpRFE1P1SgdB9or3oK/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/kcTx9/dJMb84qp1Jr/5jUZtAiK1CjYKfkEKpCch0/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfHqjy/dJMb87OeuYb/wnmC1UnQKE2KKbM0f2tmH0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/bB43Ok/dJMb81f99Ma/eZV3xpRFE1P1SgdB9or3oK/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/kcTx9/dJMb84qp1Jr/5jUZtAiK1CjYKfkEKpCch0/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359');&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Redis는 왜 그렇게 빠른가요?&quot;&quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&quot;&quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&quot;&quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787541761491&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;서버 보안 업데이트가 두렵다면 AWS를 써야 하는 이유&quot; data-og-description=&quot;서버 보안 업데이트, 마지막으로 하신 게 언제인가요? 저는 부끄러운 고백을 하나 하려고 합니다. IDC에 직접 구축한 서버를 13년 동안 단 한 번도 업데이트하지 못했습니다. 잘 돌아가고 있는 걸 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/server-security-update-aws&quot; data-og-url=&quot;https://devwar.tistory.com/entry/server-security-update-aws&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z7Egs/dJMb88GmDgh/ivAko7qtXusKHmoadQPzKK/img.png?width=800&amp;amp;height=597&amp;amp;face=560_93_602_139,https://scrap.kakaocdn.net/dn/cLBjqj/dJMb9aKWmqR/RIN9L412DiatZYsP4jNPBk/img.png?width=800&amp;amp;height=597&amp;amp;face=560_93_602_139,https://scrap.kakaocdn.net/dn/fqrkU/dJMb81f99L0/lc3YihBSadYKSFrKqBVXSK/img.png?width=1200&amp;amp;height=896&amp;amp;face=838_138_911_216&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/server-security-update-aws&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/server-security-update-aws&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z7Egs/dJMb88GmDgh/ivAko7qtXusKHmoadQPzKK/img.png?width=800&amp;amp;height=597&amp;amp;face=560_93_602_139,https://scrap.kakaocdn.net/dn/cLBjqj/dJMb9aKWmqR/RIN9L412DiatZYsP4jNPBk/img.png?width=800&amp;amp;height=597&amp;amp;face=560_93_602_139,https://scrap.kakaocdn.net/dn/fqrkU/dJMb81f99L0/lc3YihBSadYKSFrKqBVXSK/img.png?width=1200&amp;amp;height=896&amp;amp;face=838_138_911_216');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;서버 보안 업데이트가 두렵다면 AWS를 써야 하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서버 보안 업데이트, 마지막으로 하신 게 언제인가요? 저는 부끄러운 고백을 하나 하려고 합니다. IDC에 직접 구축한 서버를 13년 동안 단 한 번도 업데이트하지 못했습니다. 잘 돌아가고 있는 걸&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>apm</category>
      <category>CPU 사용량</category>
      <category>디도스 대응</category>
      <category>디스크 용량</category>
      <category>램 사용량</category>
      <category>서버 관리</category>
      <category>서버 모니터링</category>
      <category>서버 상태 체크</category>
      <category>서버 장애</category>
      <category>인프라 운영</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/161</guid>
      <comments>https://devwar.tistory.com/entry/server-monitoring-basics#entry161comment</comments>
      <pubDate>Mon, 24 Aug 2026 12:24:08 +0900</pubDate>
    </item>
    <item>
      <title>gitignore 작성법, 무조건 써야 하는 이유가 있습니다</title>
      <link>https://devwar.tistory.com/entry/gitignore-usage-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BgpQX/dJMcahr7SZH/porZD0zTRtbWQZm8yWtD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BgpQX/dJMcahr7SZH/porZD0zTRtbWQZm8yWtD7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BgpQX/dJMcahr7SZH/porZD0zTRtbWQZm8yWtD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBgpQX%2FdJMcahr7SZH%2FporZD0zTRtbWQZm8yWtD7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;gitignore 작성법, 무조건 써야 하는 이유가 있습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하면서 버전 관리 시스템을 사용할 때 가장 먼저 신경 써야 할 부분 중 하나는 바로 gitignore 설정입니다. 저 역시 개발 초기에 이 설정을 소홀히 했다가 불필요한 파일들이 원격 저장소에 그대로 올라가 곤란을 겪었던 적이 있습니다. 특히 API 키나 데이터베이스 비밀번호가 담긴 비밀파일이 실수로 커밋되거나, 실행 과정에서 끊임없이 생성되는 방대한 로그 파일들이 추적 대상에 포함되면 심각한 보안 사고와 저장소 용량 및 충돌 문제로 이어지게 됩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;gitignore 이거 꼭 만들어야 하나?&quot;&lt;br /&gt;&quot;.env 파일 깃허브에 올라갔는데 어떡하지?&quot;&lt;br /&gt;&quot;log 파일 때문에 저장소가 너무 무거워졌어&quot;&lt;br /&gt;&quot;gitignore 썼는데 왜 계속 올라가지?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 저는 이번 글을 통해 이러한 비밀파일 유출과 로그 파일 누적 문제를 예방하기 위한 체계적인 파일 제외 관리의 범위를 다루어 보고자 합니다. 단순히 특정 확장자를 막는 수준을 넘어, 로컬 환경 설정 파일부터 런타임에 동적으로 쌓이는 각종 시스템 로그, 그리고 프로젝트 전반의 보안 자격 증명 파일에 이르기까지 어떤 대상을 어디까지 추적에서 배제해야 안전한 개발 환경을 유지할 수 있는지 그 구체적인 기준과 적용 범위를 차례대로 살펴보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;.gitignore가 뭐길래 무조건 알아야 하나&lt;/li&gt;
&lt;li&gt;이유 1. 보안 - 비밀 파일이 인터넷에 박제됩니다&lt;/li&gt;
&lt;li&gt;이유 2. 로그 파일 - 저장소가 쓰레기장이 됩니다&lt;/li&gt;
&lt;li&gt;만드는 법 - 파일 하나면 끝&lt;/li&gt;
&lt;li&gt;문법은 5가지만 알면 됩니다&lt;/li&gt;
&lt;li&gt;복붙해서 쓰는 기본 예시&lt;/li&gt;
&lt;li&gt;자동으로 만들어주는 사이트&lt;/li&gt;
&lt;li&gt;이미 커밋한 파일은 무시되지 않습니다&lt;/li&gt;
&lt;li&gt;커밋 전 습관 하나만 들이면 됩니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. .gitignore가 뭐길래 무조건 알아야 하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.gitignore는 &quot;이 파일들은 깃이 추적하지 마라&quot;라고 적어두는 목록 파일입니다. 프로젝트 폴더 맨 위에 이 이름 그대로 만들어 두면, 깃이 커밋 대상을 고를 때 목록에 적힌 파일을 아예 없는 것처럼 취급합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃은 기본적으로 폴더 안의 모든 파일을 올릴 후보로 봅니다. 문제는 프로젝트 폴더에는 코드만 있는 게 아니라는 점이에요. 비밀번호가 든 설정 파일, 서버가 뱉어낸 로그, 빌드 결과물 같은 것들이 함께 삽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중에서 특히 보안 파일과 로그 파일, 이 둘 때문에 .gitignore는 선택이 아니라 필수가 됩니다. 하나씩 볼게요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 이유 1. 보안 - 비밀 파일이 인터넷에 박제됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 프로젝트에는 데이터베이스 비밀번호, API 키(외부 서비스 인증용 열쇠) 같은 비밀 값을 모아둔 파일이 있습니다. 흔히 &lt;code&gt;.env&lt;/code&gt;라는 이름을 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일이 커밋에 섞여 공개 저장소에 올라가면, 그 순간부터 전 세계 누구나 볼 수 있습니다. 실제로 공개 저장소에 올라온 API 키를 자동으로 긁어가는 봇들이 항상 돌고 있어서, 유출된 클라우드 키로 몇 시간 만에 요금 폭탄을 맞는 사고가 반복적으로 일어납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 무서운 건 깃의 특성입니다. 깃은 모든 기록을 남기는 도구라서, 나중에 파일을 지우고 다시 커밋해도 과거 커밋 기록에는 비밀 값이 그대로 남아 있습니다. 지웠다고 끝난 게 아니라는 뜻이에요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  핵심&lt;/b&gt;&lt;br /&gt;비밀 값이 한 번이라도 커밋되면 &quot;삭제 커밋&quot;으로는 기록에서 사라지지 않습니다. 애초에 올라가지 않게 막는 것, 그게 .gitignore의 역할입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 이유 2. 로그 파일 - 저장소가 쓰레기장이 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 파일은 프로그램이 돌면서 자동으로 쌓이는 기록입니다. 개발 중에도 계속 생기고, 크기가 수백 MB까지 자라는 경우도 흔합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 커밋에 섞이면 세 가지 문제가 생깁니다. 저장소가 무거워져 클론과 푸시가 느려지고, 커밋 내역이 로그 변경으로 도배돼 정작 코드 변경을 찾기 어려워지고, 로그 안에 섞인 접속 IP나 사용자 정보가 함께 노출될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 이유로 막아야 하는 것들이 더 있습니다. 패키지 폴더(Node.js의 node_modules처럼 명령 한 번이면 다시 받아지는 것), 빌드 결과물, 운영체제가 몰래 만드는 파일(macOS의 .DS_Store 등)이 대표적입니다. 전부 &quot;내가 쓴 코드가 아닌 것&quot;이라는 공통점이 있어요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 만드는 법 - 파일 하나면 끝&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만드는 방법은 정말 단순합니다. 프로젝트 최상위 폴더에 &lt;code&gt;.gitignore&lt;/code&gt;라는 이름의 텍스트 파일을 만들면 끝입니다. 확장자 없이 점으로 시작하는 이름 그대로예요.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 프로젝트 폴더에서
touch .gitignore&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;윈도우 탐색기에서는 점으로 시작하는 파일명을 거부할 때가 있는데, 그 경우 에디터(VS Code 등)에서 새 파일로 만들면 문제없이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일 안에 무시할 파일 이름을 한 줄에 하나씩 적으면 됩니다. 시점은 빠를수록 좋습니다. 프로젝트를 시작하고 첫 커밋을 하기 전에 만드는 게 정석이에요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 문법은 5가지만 알면 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.gitignore 문법은 공식 문서를 보면 규칙이 많지만, 실무에서 쓰는 건 사실상 다섯 가지입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;쓰는 법&lt;/th&gt;
&lt;th style=&quot;text-align: center; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;의미&lt;/th&gt;
&lt;th style=&quot;text-align: center; padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;파일명 그대로&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;그 이름의 파일 무시&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;별표 *&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;패턴 일치 전부 무시&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;*.log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;이름 뒤 /&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;폴더 통째로 무시&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;logs/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;느낌표 !&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;무시 목록에서 예외&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;!.env.example&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;샵 #&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;주석 (설명 메모)&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top; padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;# 로그 파일&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;느낌표 예외가 유용한 상황을 하나만 짚으면, &lt;code&gt;.env&lt;/code&gt;는 막되 값이 비어 있는 견본 파일 &lt;code&gt;.env.example&lt;/code&gt;은 팀원 공유용으로 올리고 싶을 때입니다. 두 줄이면 해결됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 복붙해서 쓰는 기본 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 프로젝트든 거의 그대로 쓸 수 있는 공통 뼈대입니다. 보안과 로그, 그리고 앞서 말한 단골 손님들을 전부 막는 구성이에요.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 보안 - 비밀 값 파일
.env
.env.*
!.env.example
*.pem
*.key

# 로그 파일
*.log
logs/

# 패키지&amp;middot;빌드 결과물
node_modules/
dist/
build/

# 운영체제&amp;middot;에디터 파일
.DS_Store
Thumbs.db
.vscode/
.idea/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 프로젝트라면 여기에 &lt;code&gt;__pycache__/&lt;/code&gt;, &lt;code&gt;venv/&lt;/code&gt; 정도를 더하고, 언어별 세부 항목은 다음 섹션의 도구로 채우면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 .gitignore 파일 자체는 커밋해서 올리는 게 맞습니다. 팀원 모두가 같은 무시 규칙을 공유해야 하니까요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 자동으로 만들어주는 사이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어&amp;middot;프레임워크&amp;middot;에디터별로 무시할 파일을 일일이 아는 건 무리입니다. 그래서 조합을 입력하면 .gitignore를 만들어주는 도구가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 것이 gitignore.io입니다(2026년 현재 toptal.com/developers/gitignore 주소로 운영). 검색창에 &quot;Node&quot;, &quot;Python&quot;, &quot;macOS&quot;, &quot;VisualStudioCode&quot;처럼 자기 환경을 넣으면 합쳐진 결과를 바로 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브도 언어별 공식 .gitignore 템플릿 모음을 저장소로 관리하고 있어서, 깃허브에서 새 저장소를 만들 때 템플릿을 선택하면 자동으로 깔아줍니다. 어느 쪽이든 자동 생성 결과를 기본으로 깔고, 프로젝트 고유 항목(자체 로그 폴더 등)만 손으로 추가하는 방식이 편합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 이미 커밋한 파일은 무시되지 않습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.gitignore를 쓰다 가장 많이 막히는 지점입니다. 규칙을 추가했는데도 파일이 계속 커밋 대상에 뜨는 경우인데, 이유는 하나입니다. .gitignore는 아직 추적을 시작하지 않은 파일에만 적용되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 한 번 커밋된 파일은 깃이 계속 추적합니다. 이때는 추적 목록에서 빼주는 명령이 필요합니다. 파일은 컴퓨터에 그대로 두고 깃 추적에서만 제거하는 방식이에요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미 커밋된 파일이 .gitignore에 넣어도 무시되지 않는 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 초기 설정을 하다 보면 실수로 환경 변수 파일인 &lt;code&gt;.env&lt;/code&gt;나 빌드 산출물을 먼저 커밋한 뒤, 뒤늦게 &lt;code&gt;.gitignore&lt;/code&gt;에 추가하는 경우가 종종 있습니다. 저도 예전에 &lt;code&gt;.gitignore&lt;/code&gt;에 분명히 파일명을 적었는데 계속 &lt;code&gt;git status&lt;/code&gt;의 수정 목록에 올라와서 당황했던 경험이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 Git의 추적(Track) 메커니즘에 있습니다. &lt;a href=&quot;https://git-scm.com/docs/gitignore&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Git 공식 gitignore 문서&lt;/a&gt;에 명시된 것처럼, &lt;code&gt;.gitignore&lt;/code&gt;의 목적은 &lt;b&gt;아직 Git이 추적하지 않는 파일(Untracked files)이 실수로 추적 대상에 포함되는 것을 막는 것&lt;/b&gt;입니다. 즉, 이미 한 번이라도 &lt;code&gt;git add&lt;/code&gt;와 커밋을 거쳐 인덱스(Staging Area)에 등록된 파일은 &lt;code&gt;.gitignore&lt;/code&gt; 규칙의 영향을 받지 않고 계속 변경 사항이 추적됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 2026년 10월 20일(KST) 기준으로 로컬 테스트 저장소에서 직접 재현해 본 결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;# 1. .env 파일을 먼저 생성하고 커밋한 상태
$ git add .env &amp;amp;&amp;amp; git commit -m &quot;chore: add env&quot;

# 2. 뒤늦게 .gitignore의 첫 번째 줄에 .env 추가
$ echo &quot;.env&quot; &amp;gt; .gitignore

# 3. 무시 여부 확인 (추적 중이므로 아무 출력도 나오지 않음 - not ignored)
$ git check-ignore -v .env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 이미 버전 관리에 포함된 민감 정보 파일이 무시되지 않은 채 원격에 올라가면 보안 사고로 이어질 수 있습니다. 로컬 저장소와 원격 서비스의 구조적 차이가 궁금하신 분들은 제가 이전에 정리한 &lt;a href=&quot;https://devwar.tistory.com/entry/git-vs-github-hosting-services&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Git과 GitHub의 차이 및 호스팅 서비스 비교&lt;/a&gt; 글을 함께 참고해 보시기 바랍니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 파일은 남기고 깃 추적에서만 제거
## 파일인 경우
git rm --cached .env
## 디렉토리 경우
git rm -r --cached logs/

# 이후 커밋하면 다음부터 무시됨
git commit -m &quot;chore: 추적 제외 파일 정리&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;git rm --cached 명령어로 안전하게 추적만 해제하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 추적 중인 파일을 &lt;code&gt;.gitignore&lt;/code&gt; 규칙에 적용하려면, 작업 디렉터리(내 컴퓨터의 실제 파일)에서는 파일을 그대로 유지하면서 &lt;b&gt;Git의 인덱스(캐시)에서만 제거&lt;/b&gt;해 주어야 합니다. 이때 사용하는 핵심 옵션이 바로 &lt;code&gt;git rm --cached&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 &lt;code&gt;--cached&lt;/code&gt; 옵션 없이 그냥 &lt;code&gt;git rm .env&lt;/code&gt;를 실행하면 내 로컬 디스크에 있는 실제 &lt;code&gt;.env&lt;/code&gt; 파일까지 삭제되므로 주의하셔야 합니다. 저는 실무에서 단일 파일이나 폴더의 추적을 끊을 때 아래 순서대로 진행합니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. 로컬 파일은 남기고 Git 인덱스(추적 목록)에서만 .env 제거
$ git rm --cached .env
rm '.env'

# 2. 폴더 전체의 추적을 해제해야 할 때는 -r 옵션 추가
# $ git rm -r --cached dist/

# 3. 추적 해제 내역을 커밋하여 확정
$ git commit -m &quot;chore: stop tracking .env file&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 인덱스에서 제거하고 커밋까지 마치고 나면, 비로소 &lt;code&gt;.env&lt;/code&gt;는 Untracked 상태가 되는 동시에 &lt;code&gt;.gitignore&lt;/code&gt; 규칙이 즉시 작동하여 &lt;code&gt;git status&lt;/code&gt; 목록에서 깔끔하게 사라집니다. 추적 해제 이력을 남길 때 어떤 커밋 접두사를 써야 할지 고민되신다면 제가 작성해 둔 &lt;a href=&quot;https://devwar.tistory.com/entry/git-commit-message-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Git 커밋 메시지 작성 규칙 정리&lt;/a&gt; 포스팅을 확인해 보셔도 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 앞서 말했듯 과거 커밋 기록에는 파일이 여전히 남아 있습니다. 일반 파일이면 여기까지로 충분하지만, 비밀 값이 들어 있던 파일이라면 기록 제거와 별개로 해당 비밀번호&amp;middot;API 키를 반드시 새로 발급받아 교체해야 합니다. 기록을 지우는 것보다 키를 바꾸는 게 먼저입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 커밋 전 습관 하나만 들이면 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 사고를 막는 습관 하나. 커밋하기 전에 &lt;code&gt;git status&lt;/code&gt;로 올라갈 파일 목록을 한 번 훑는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목록에 .env나 *.log 같은 게 보이면 그 자리에서 .gitignore에 추가하면 됩니다. 5초짜리 확인이 유출 사고와 저장소 청소 작업을 통째로 대체합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;습관이 안 들 것 같으면 &lt;code&gt;git add .&lt;/code&gt; 대신 올릴 파일을 지정해서 add하는 방식도 좋습니다. 통째로 담는 습관이 사고의 절반쯤을 만듭니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;git check-ignore -v로 무시 규칙 정상 적용 검증하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.gitignore&lt;/code&gt; 패턴이 복잡해지거나 전역 설정이 섞여 있을 때는 내가 작성한 규칙이 실제로 잘 먹히고 있는지 눈으로 검증하는 습관이 중요합니다. 이때 제가 가장 자주 활용하는 명령어가 &lt;code&gt;git check-ignore -v &amp;lt;파일경로&amp;gt;&lt;/code&gt;입니다. &lt;code&gt;-v&lt;/code&gt;(--verbose) 옵션을 붙이면 &lt;b&gt;어느 설정 파일의 몇 번째 줄 규칙 때문에 해당 파일이 무시되었는지&lt;/b&gt; 정확히 출력해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 2026년 10월 20일(KST) 실측 환경에서 &lt;code&gt;git rm --cached .env&lt;/code&gt; 및 커밋을 완료한 직후 다시 검증 명령어를 실행한 결과입니다.&lt;/p&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;# 추적 해제 커밋 후 다시 확인
$ git check-ignore -v .env
.gitignore:1:.env	.env

# 작업 트리 상태 확인 (.env가 수정되어도 더 이상 목록에 나타나지 않음)
$ git status -s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 &lt;code&gt;.gitignore:1:.env	.env&lt;/code&gt;는 현재 저장소의 &lt;code&gt;.gitignore&lt;/code&gt; 파일 &lt;code&gt;1&lt;/code&gt;번째 줄에 적힌 &lt;code&gt;.env&lt;/code&gt; 패턴에 의해 &lt;code&gt;.env&lt;/code&gt; 파일이 정상적으로 무시(Ignored)되고 있음을 뜻합니다. 만약 앞서 살펴본 것처럼 파일이 여전히 Git에 의해 추적 중이라면 이 명령어를 실행해도 아무런 결과가 나오지 않으므로, 문제의 원인이 패턴 오타인지 캐시 미삭제인지 단번에 구분할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 단위나 사내 환경에서 이처럼 보안 파일을 철저히 분리하고 저장소를 운영하는 방식이 궁금하시다면 &lt;a href=&quot;https://devwar.tistory.com/entry/git-repository-hosting-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Git 저장소 호스팅 유형과 선택 기준&lt;/a&gt; 글도 함께 읽어보시기를 추천합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.env 파일을 이미 깃허브에 올렸는데 어떻게 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서가 중요합니다. 첫째, 그 안에 있던 비밀번호와 API 키를 전부 새로 발급받아 교체하세요. 이게 가장 급합니다. 둘째, &lt;code&gt;git rm --cached&lt;/code&gt;로 추적에서 제거하고 .gitignore에 추가하세요. 기록까지 완전히 지우려면 별도 도구가 필요하지만, 키를 이미 교체했다면 기록 제거는 부차적인 문제가 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.gitignore 자체도 커밋해야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, 커밋하는 게 표준입니다. 무시 규칙은 팀 전체가 공유해야 의미가 있습니다. 반대로 나만의 개인 규칙(개인 메모 파일 등)은 저장소의 .gitignore 대신 전역 gitignore라는 개인 설정으로 빼는 방법이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;규칙을 추가했는데 적용이 안 됩니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;십중팔구 이미 추적 중인 파일입니다. 8번 섹션의 &lt;code&gt;git rm --cached&lt;/code&gt;를 먼저 실행하세요. 그래도 안 되면 파일명 오타, 경로 위치(하위 폴더 파일은 경로 포함 필요)를 확인해 보세요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일 하나가 사고 하나를 막습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇습니다. 깃은 폴더 안 모든 파일을 올릴 후보로 보고, 그 안에는 반드시 올라가면 안 되는 보안 파일과 올라갈 필요 없는 로그 파일이 섞여 있습니다. 그래서 깃을 쓴다면 .gitignore는 무조건 함께 가야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 배울 건 많지 않습니다. 파일 하나 만들고, 문법 다섯 개 알고, 첫 커밋 전에 깔아두기. 여기에 커밋 전 status 확인 습관까지 더하면, 적어도 유출과 저장소 비대화 두 사고는 원천 차단됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792460529687&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;깃(Git)과 깃허브(GitHub) 차이, 깃 호스팅 4대장 정리 (feat. 죽다 살아난 CodeCommit)&quot; data-og-description=&quot;개발을 처음 시작할 때 저 역시 깃(Git)과 깃허브(GitHub)를 같은 것으로 생각하곤 했습니다. 이름이 비슷하고 실무에서도 늘 함께 언급되다 보니, 많은 입문자분들이 두 도구의 역할을 혼동한 채 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-vs-github-hosting-services&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-vs-github-hosting-services&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5fVc6/dJMb82fb1Ts/14uNPlkRrTesz207KyXjQ0/img.png?width=800&amp;amp;height=597&amp;amp;face=502_132_564_200,https://scrap.kakaocdn.net/dn/qqNzY/dJMb8RSg8U4/8EhVvEBHXjwvivKzcnalI1/img.png?width=800&amp;amp;height=597&amp;amp;face=502_132_564_200,https://scrap.kakaocdn.net/dn/dbbrJQ/dJMb8SXXc1o/a5ggQYS0qt2sA4vot5Zyzk/img.png?width=1200&amp;amp;height=896&amp;amp;face=746_195_858_316&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-vs-github-hosting-services&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-vs-github-hosting-services&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5fVc6/dJMb82fb1Ts/14uNPlkRrTesz207KyXjQ0/img.png?width=800&amp;amp;height=597&amp;amp;face=502_132_564_200,https://scrap.kakaocdn.net/dn/qqNzY/dJMb8RSg8U4/8EhVvEBHXjwvivKzcnalI1/img.png?width=800&amp;amp;height=597&amp;amp;face=502_132_564_200,https://scrap.kakaocdn.net/dn/dbbrJQ/dJMb8SXXc1o/a5ggQYS0qt2sA4vot5Zyzk/img.png?width=1200&amp;amp;height=896&amp;amp;face=746_195_858_316');&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;깃(Git)과 깃허브(GitHub) 차이, 깃 호스팅 4대장 정리 (feat. 죽다 살아난 CodeCommit)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 처음 시작할 때 저 역시 깃(Git)과 깃허브(GitHub)를 같은 것으로 생각하곤 했습니다. 이름이 비슷하고 실무에서도 늘 함께 언급되다 보니, 많은 입문자분들이 두 도구의 역할을 혼동한 채&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792460528068&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;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-repository-hosting-types&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-repository-hosting-types&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/75ZYo/dJMb8XSvfbA/umfeZJFs2zw3UEZAQYqSrK/img.png?width=800&amp;amp;height=573&amp;amp;face=398_92_470_170,https://scrap.kakaocdn.net/dn/bgOJLs/dJMb8YYbgpL/JatAvM97E4ZtLYS7FQySaK/img.png?width=800&amp;amp;height=573&amp;amp;face=398_92_470_170,https://scrap.kakaocdn.net/dn/NgdZO/dJMb8RSg8HI/PHLR0PngEcwyD8q523lvu1/img.png?width=1200&amp;amp;height=860&amp;amp;face=588_133_709_266&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-repository-hosting-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-repository-hosting-types&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/75ZYo/dJMb8XSvfbA/umfeZJFs2zw3UEZAQYqSrK/img.png?width=800&amp;amp;height=573&amp;amp;face=398_92_470_170,https://scrap.kakaocdn.net/dn/bgOJLs/dJMb8YYbgpL/JatAvM97E4ZtLYS7FQySaK/img.png?width=800&amp;amp;height=573&amp;amp;face=398_92_470_170,https://scrap.kakaocdn.net/dn/NgdZO/dJMb8RSg8HI/PHLR0PngEcwyD8q523lvu1/img.png?width=1200&amp;amp;height=860&amp;amp;face=588_133_709_266');&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792460528872&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;깃 커밋 메시지 작성법, 실무에선 5개만 쓰는 이유가 있습니다&quot; data-og-description=&quot;깃 커밋 메시지 규칙을 찾아보면 fix, feat 같은 단어가 붙은 커밋 로그를 자주 보게 됩니다. 이건 Conventional Commits라는 커밋 메시지 작성법인데, 규약 문서를 열어보면 생각보다 내용이 많아서 시&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-commit-message-rules&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-commit-message-rules&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ba3sIu/dJMb8RSg8HQ/cuKSfIE7nKN7PDl4xPpas1/img.png?width=800&amp;amp;height=570&amp;amp;face=547_100_602_160,https://scrap.kakaocdn.net/dn/fDO5w/dJMb8XSvfbO/tBQ2xQhKG1PKHgRUb8nOb1/img.png?width=800&amp;amp;height=570&amp;amp;face=547_100_602_160,https://scrap.kakaocdn.net/dn/h9w4X/dJMb8YYbgpP/AqdP1TPoAllrcMHw6fKCL0/img.png?width=1200&amp;amp;height=856&amp;amp;face=817_146_907_243&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-commit-message-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-commit-message-rules&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ba3sIu/dJMb8RSg8HQ/cuKSfIE7nKN7PDl4xPpas1/img.png?width=800&amp;amp;height=570&amp;amp;face=547_100_602_160,https://scrap.kakaocdn.net/dn/fDO5w/dJMb8XSvfbO/tBQ2xQhKG1PKHgRUb8nOb1/img.png?width=800&amp;amp;height=570&amp;amp;face=547_100_602_160,https://scrap.kakaocdn.net/dn/h9w4X/dJMb8YYbgpP/AqdP1TPoAllrcMHw6fKCL0/img.png?width=1200&amp;amp;height=856&amp;amp;face=817_146_907_243');&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;깃 커밋 메시지 작성법, 실무에선 5개만 쓰는 이유가 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;깃 커밋 메시지 규칙을 찾아보면 fix, feat 같은 단어가 붙은 커밋 로그를 자주 보게 됩니다. 이건 Conventional Commits라는 커밋 메시지 작성법인데, 규약 문서를 열어보면 생각보다 내용이 많아서 시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792460529666&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&quot; data-og-description=&quot;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KeO7k/dJMb9aK3Sko/pGnTd0wnAsR0DP1Vb9nsw0/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/RiwQH/dJMb8PGVpLz/1AcMIvhSkSzCtwlzd4pMn0/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/BvEIy/dJMb8U9iUWO/IKH2khpxKHxHmky7aoMJn0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KeO7k/dJMb9aK3Sko/pGnTd0wnAsR0DP1Vb9nsw0/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/RiwQH/dJMb8PGVpLz/1AcMIvhSkSzCtwlzd4pMn0/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/BvEIy/dJMb8U9iUWO/IKH2khpxKHxHmky7aoMJn0/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286');&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792460530744&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&quot; data-og-description=&quot;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cXjrL0/dJMb8UIesNo/gNHNC4wiraOzjmvTlKFA90/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/cirybV/dJMb89yCTn1/zuWZl3JXfi2oiO6UoB5NEk/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/M63KG/dJMb8PGVpLu/vBoA1akNK5eoctie5VWvh1/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cXjrL0/dJMb8UIesNo/gNHNC4wiraOzjmvTlKFA90/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/cirybV/dJMb89yCTn1/zuWZl3JXfi2oiO6UoB5NEk/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/M63KG/dJMb8PGVpLu/vBoA1akNK5eoctie5VWvh1/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325');&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 도구/Git&amp;middot;깃허브</category>
      <category>API 키 유출</category>
      <category>env 파일</category>
      <category>git rm cached</category>
      <category>git 사용법</category>
      <category>gitignore</category>
      <category>gitignore 작성법</category>
      <category>깃 초보</category>
      <category>깃허브 보안</category>
      <category>로그 파일</category>
      <category>형상관리</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/160</guid>
      <comments>https://devwar.tistory.com/entry/gitignore-usage-guide#entry160comment</comments>
      <pubDate>Sun, 23 Aug 2026 21:37:45 +0900</pubDate>
    </item>
    <item>
      <title>OSI 7계층 쉬운 이해 택배 배송 과정으로 풀어봤더니</title>
      <link>https://devwar.tistory.com/entry/osi-7-layer-easy-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOp3yY/dJMcadptlmW/spNz7OPQlcA5fZCzeiK2m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOp3yY/dJMcadptlmW/spNz7OPQlcA5fZCzeiK2m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOp3yY/dJMcadptlmW/spNz7OPQlcA5fZCzeiK2m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOp3yY%2FdJMcadptlmW%2FspNz7OPQlcA5fZCzeiK2m1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;OSI 7계층 쉬운 이해 택배 배송 과정으로 풀어봤더니&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 통신 구조를 학습할 때 가장 먼저 마주하는 개념은 대개 OSI 7계층입니다. 각 계층의 역할과 명칭을 이론적으로 암기하는 일은 어렵지 않지만, 실제 데이터가 어떤 과정을 거쳐 패킷으로 포장되고 목적지까지 도달하는지 그 흐름을 유기적으로 연결하기란 쉽지 않습니다. 특히 추상적인 참조 모델과 실제 TCP/IP 프로토콜 스택의 동작 방식 사이에 존재하는 간극은, 저를 포함해 네트워크의 실질적인 동작 원리를 파악하려는 이들에게 적지 않은 막막함을 주곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 저는 이번 글에서 단순한 계층별 정의를 나열하는 대신, 데이터가 송신 측에서 캡슐화(Encapsulation)되어 수신 측에서 역캡슐화(Decapsulation)되기까지의 구조적 변화 과정을 중점적으로 다루고자 합니다. 설명의 범위는 애플리케이션 계층의 데이터 생성부터 전송 계층의 세그먼트 분할, 네트워크 계층의 IP 주소 지정, 그리고 데이터 링크 계층의 프레임 구성에 이르는 핵심 전달 흐름으로 한정합니다. 물리 계층의 세부적인 신호 변환 규격이나 복잡한 라우팅 알고리즘은 제외하고, 각 단계에서 헤더 정보가 어떻게 추가되고 해석되는지에 초점을 맞추어 살펴보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic; text-align: left; vertical-align: top;&quot;&gt;&quot;네트워크 연결 오류가 발생했을 때 몇 계층부터 점검해야 할지 감이 안 잡혀요.&quot;&lt;br /&gt;&quot;개발자 면접에서 OSI 7계층 개념과 각 계층별 대표 프로토콜을 물어보면 어떻게 답해야 할까요?&quot;&lt;br /&gt;&quot;IP 주소와 MAC 주소가 왜 둘 다 필요한지 구체적인 차이가 궁금합니다.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OSI 7계층이란? (택배 시스템으로 이해하는 네트워크 약속)&lt;/li&gt;
&lt;li&gt;1계층 물리층(Physical Layer): 전선과 랜선이라는 실제 도로&lt;/li&gt;
&lt;li&gt;2계층 데이터링크층(Data Link Layer): 같은 동네 안에서 물리 주소(MAC) 찾기&lt;/li&gt;
&lt;li&gt;3계층 네트워크층(Network Layer): 전국 주소(IP)로 최적의 경로 찾기&lt;/li&gt;
&lt;li&gt;4계층 전송층(Transport Layer): 택배가 중간에 분실되지 않게 확인하기(TCP/UDP)&lt;/li&gt;
&lt;li&gt;5계층 세션층(Session Layer): 상대방과 대화 연결 상태 유지하기&lt;/li&gt;
&lt;li&gt;6계층 표현층(Presentation Layer): 번역기와 암호화, 데이터 압축&lt;/li&gt;
&lt;li&gt;7계층 응용층(Application Layer): 사용자가 보는 택배 앱 화면&lt;/li&gt;
&lt;li&gt;한눈에 보는 OSI 7계층 핵심 요약 (비유 종합)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. OSI 7계층이란? (택배 시스템으로 이해하는 네트워크 약속)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OSI(Open Systems Interconnection) 7계층은 국제표준화기구(ISO)에서 정의한 네트워크 통신 표준 모델입니다. 서로 다른 제조사에서 만든 컴퓨터와 통신 장비들이 문제없이 데이터를 주고받을 수 있도록 통신 절차를 7개의 독립된 단계로 나누어 표준화했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신 규격을 굳이 7개 계층으로 나누어 놓은 이유는 시스템 모듈화 때문입니다. 각 계층이 자신의 역할만 독립적으로 수행하도록 만들어 두면, 특정 구간에서 장애가 발생했을 때 전체 시스템을 수정할 필요 없이 해당 계층의 장비나 소프트웨어만 점검하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 택배 배송에 비유하면 이해하기 쉽습니다. 물품을 포장하는 사람, 물류센터 경로를 지정하는 시스템, 실제로 도로를 달리는 트럭 운전기사의 역할이 나뉘어 있는 것과 같습니다. 운송 트럭에 펑크가 났다고 해서 상자 안의 내용물이나 받는 사람의 집 주소를 다시 작성할 필요가 없는 이치입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 26.1628%; text-align: center;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 21.6279%; text-align: center;&quot;&gt;OSI 계층&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 52.093%; text-align: center;&quot;&gt;택배 배송 시스템 비유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; width: 26.1628%; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;상위 계층 &lt;br /&gt;(소프트웨어 영역)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 21.6279%; text-align: left; vertical-align: top;&quot;&gt;7계층 (응용)&lt;br /&gt;6계층 (표현)&lt;br /&gt;5계층 (세션)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 52.093%; text-align: left; vertical-align: top;&quot;&gt;택배 주문 앱 실행, 송장 언어 번역 및 완충 포장, 대화 연결 상태 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; width: 26.1628%; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;하위 계층 &lt;br /&gt;(하드웨어 및 전송)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 21.6279%; text-align: left; vertical-align: top;&quot;&gt;4계층 (전송)&lt;br /&gt;3계층 (네트워크)&lt;br /&gt;2계층 (데이터링크)&lt;br /&gt;1계층 (물리)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 52.093%; text-align: left; vertical-align: top;&quot;&gt;배송 확인 및 수령인 서명, 전국 최적 경로 설정, 센터 내 컨베이어 벨트 이동, 아스팔트 도로망&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보강 1&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 실무에서는 OSI 7계층과 TCP/IP 4계층을 함께 이야기할까요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 네트워크 개념을 정리할 때 가장 먼저 짚어드리는 부분은 &lt;b&gt;이론 모델과 실제 구현 프로토콜의 차이&lt;/b&gt;입니다. 원문에서 살펴본 OSI 7계층은 네트워크 통신 과정을 일곱 단계로 세밀하게 나눈 국제 표준 참조 모델(Reference Model)이고, 실제 리눅스 커널과 인터넷 환경에서 동작하는 프로토콜 스택은 이를 실용적으로 묶은 &lt;b&gt;TCP/IP 모델&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;5계층(세션), 6계층(표현), 7계층(응용)&lt;/b&gt;은 현대 운영체제와 애플리케이션 내부에서 하나의 프로그램 흐름으로 통합되어 처리되는 경우가 많습니다. 예를 들어 &lt;b&gt;SSH나 TLS(SSL)가 정확히 몇 계층에 속하는지는 참고하는 교과서나 실무 문서마다 배치 기준이 다릅니다.&lt;/b&gt; 어떤 자료에서는 TLS의 암호화&amp;middot;인코딩 성격을 강조해 6계층(표현 계층)에 대응시키고, 다른 자료에서는 소켓 위에서 세션 보안을 수립한다는 점에서 4계층과 7계층 사이의 별도 계층이나 5&amp;middot;6계층 복합 역할로 설명하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아래 이어지는 실습과 표에서 리눅스 명령어나 프로토콜을 특정 계층에 일대일로 매칭한 것은 &lt;b&gt;장애 지점을 좁혀 가기 위한 교육용 근사치&lt;/b&gt;로 이해해 주시면 가장 정확합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 1계층 물리층(Physical Layer): 전선과 랜선이라는 실제 도로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1계층 물리층은 컴퓨터가 다루는 0과 1 형태의 디지털 데이터를 전기 신호, 광 신호, 또는 무선 전파 형태의 물리적 신호로 변환하여 주고받는 단계입니다. 이 계층에서는 송수신되는 데이터의 의미나 내용에 관해서는 전혀 관여하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배 시스템에 대입하면 아스팔트 도로, 철도선, 케이블 타워 자체에 해당합니다. 도로망이 도중에 끊어지지 않고 이어져 있어야 운송 차량이 다닐 수 있듯, 랜선이나 무선 주파수가 연결되어 있어야 비로소 데이터 전송이 시작됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 장비로는 UTP 랜케이블, 광케이블, 신호를 증폭해 주는 리피터, 기본 허브가 있습니다. 물리층에서 다루는 최소 데이터 단위는 비트(Bit)입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  1계층 물리층 사양 정리&lt;/b&gt;&lt;br /&gt;- 주요 역할: 0과 1의 비트 데이터를 전기 및 광학 신호로 상호 변환하여 전송&lt;br /&gt;- 주요 장비: UTP 케이블, 광케이블, 허브, 리피터&lt;br /&gt;- 데이터 단위: 비트(Bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 2계층 데이터링크층(Data Link Layer): 같은 동네 안에서 물리 주소(MAC) 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2계층 데이터링크층은 물리적으로 인접한 장비 간, 즉 동일한 내부 네트워크(LAN) 환경에서 오류 없이 안전하게 데이터를 전달하는 책임을 집니다. 1계층을 통해 들어온 물리 신호에 에러가 없는지 감지하고 수정하는 기능도 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 계층에서 장비를 서로 구분하기 위해 사용하는 고유 식별자가 바로 &lt;b&gt;MAC 주소(Physical Address)&lt;/b&gt;입니다. MAC 주소는 네트워크 카드(NIC) 제작 시 제조사에서 부여하는 고유한 물리적 번호입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배 과정으로 보자면 물류센터 내부 작업장이 떠올라요. 중앙 터미널 내부에서 분류 작업자가 상자에 부착된 바코드를 스캔하여 바로 옆 트랙이나 특정 컨베이어 라인으로 상자를 분류해 옮기는 작업에 해당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 2계층 장비로는 L2 스위치(Switch)와 브릿지가 있으며, 전송 단위는 &lt;b&gt;프레임(Frame)&lt;/b&gt;이라고 부릅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  MAC 주소와 IP 주소의 구별 포인트&lt;/b&gt;&lt;br /&gt;IP 주소가 이사를 가거나 네트워크 환경이 바뀌면 변경될 수 있는 '집 주소'라면, MAC 주소는 기기가 태어날 때부터 부여받은 '주민등록번호'와 같습니다. 내부 네트워크 통신에서는 반드시 MAC 주소를 사용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 3계층 네트워크층(Network Layer): 전국 주소(IP)로 최적의 경로 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3계층 네트워크층은 서로 다른 네트워크 망을 넘어 목적지 기기까지 데이터를 가장 빠르고 효율적인 경로로 전달하는 라우팅(Routing) 기능을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크층에서 사용되는 가장 대표적인 식별자가 바로 &lt;b&gt;IP 주소(Logical Address)&lt;/b&gt;입니다. IP 주소는 인터넷이라는 거대한 네트워크상에서 내 기기가 현재 어디에 위치해 있는지 알려주는 논리적 주소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배 비유로 보면 서울에서 부산까지 물품을 배송할 때 경부고속도로를 탈지 중부내륙고속도로를 탈지 실시간 도로 정체율을 계산하여 최적 이동 경로를 지정하는 스마트 네비게이션 시스템 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 장비로는 라우터(Router)와 L3 스위치가 있으며, 대표 프로토콜은 IP와 ICMP입니다. 이 계층의 데이터 단위는 &lt;b&gt;패킷(Packet)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;2계층 (데이터링크층)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;3계층 (네트워크층)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;주소 종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;MAC 주소 (물리 주소)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;IP 주소 (논리 주소)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;통신 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;동일 네트워크 내부 (LAN)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;서로 다른 네트워크 간 (WAN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;핵심 장비&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;L2 스위치, 브릿지&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;라우터, L3 스위치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 4계층 전송층(Transport Layer): 택배가 중간에 분실되지 않게 확인하기(TCP/UDP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4계층 전송층은 송신자와 수신자 양 끝단(End-to-End) 간에 신뢰할 수 있는 데이터 전송을 책임집니다. 전송 중 데이터 패킷이 유실되거나 순서가 꼬이지 않도록 제어하는 역할을 담당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 컴퓨터 안에서는 웹 브라우저, 메신저, 게임 등 여러 프로그램이 동시에 네트워크를 사용합니다. 이때 목적지 컴퓨터에 도착한 데이터가 어떤 프로그램으로 들어가야 하는지 식별하기 위해 &lt;b&gt;포트(Port) 번호&lt;/b&gt;를 할당하여 구분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 보내는 방식은 크게 두 종류로 나뉩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;TCP(Transmission Control Protocol)&lt;/b&gt;: 등기 우편처럼 수령인의 서명을 확인하고, 유실이 발생하면 재전송 요청을 보내는 신뢰성 중심 전송 방식입니다.&lt;br /&gt;- &lt;b&gt;UDP(User Datagram Protocol)&lt;/b&gt;: 일반 신문 배포처럼 수령 여부를 확인하지 않고 빠르게 던져주는 속도 중심 전송 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4계층의 데이터 전송 단위는 &lt;b&gt;세그먼트(Segment)&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  4계층 전송층 사양 정리&lt;/b&gt;&lt;br /&gt;- 주요 역할: 양 끝단 간 오류 검출, 흐름 제어, 포트 번호를 통한 응용 프로그램 구별&lt;br /&gt;- 주요 프로토콜: TCP, UDP&lt;br /&gt;- 데이터 단위: 세그먼트(Segment)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보강 2&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리눅스 터미널에서 하위 계층(1~4계층) 연결 상태 직접 확인하기 (2026-10-20 KST 실측)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론으로 배운 하위 계층(물리~전송 계층)이 실제 리눅스 서버에서는 어떤 명령어로 관측되는지, &lt;b&gt;2026년 10월 20일(KST) 기준 테스트 환경에서 제가 직접 실행한 실측 출력&lt;/b&gt;을 통해 단계별로 살펴보겠습니다. 앞서 말씀드렸듯 각 명령어와 계층의 대응은 트러블슈팅을 돕기 위한 교육용 근사치입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# [1&amp;middot;2계층 점검 단서] 네트워크 인터페이스 활성화 여부 및 MAC 주소 확인
$ ip -br link
lo               UNKNOWN        00:00:00:00:00:00 &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;
enp0s4           UP             02:42:ac:1e:00:02 &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;

# [2계층 점검 단서] ARP(이웃 탐색) 캐시 테이블 및 인접 장비 도달 가능 상태 확인
$ ip neigh
172.30.0.1 dev enp0s4 lladdr 02:42:ac:1e:00:01 REACHABLE

# [3계층 점검 단서] IP 라우팅 테이블 및 기본 게이트웨이(Default Gateway) 경로 확인
$ ip route
default via 172.30.0.1 dev enp0s4 
172.30.0.0/24 dev enp0s4 proto kernel scope link src 172.30.0.2 

# [4계층 점검 단서] 현재 수립(ESTAB)된 TCP 소켓 연결 및 포트 상태 확인
$ ss -tn
State      Recv-Q     Send-Q         Local Address:Port          Peer Address:Port     
ESTAB      0          0                 172.30.0.2:48912        93.184.215.14:443      
ESTAB      0          0                 172.30.0.2:22           172.30.0.1:54320       &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 출력 결과가 의미하는 바를 하위 계층부터 순서대로 짚어보면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;ip -br link&lt;/code&gt; (1&amp;middot;2계층 단서):&lt;/b&gt; &lt;code&gt;lo&lt;/code&gt;(루프백)와 &lt;code&gt;enp0s4&lt;/code&gt; 인터페이스가 모두 &lt;code&gt;UP&lt;/code&gt; 및 &lt;code&gt;LOWER_UP&lt;/code&gt; 상태로 표시되며, 이더넷 인터페이스의 하드웨어 주소(MAC 주소)가 정상 인식된 것을 볼 수 있습니다. 만약 여기서 &lt;code&gt;NO-CARRIER&lt;/code&gt;나 &lt;code&gt;DOWN&lt;/code&gt;이 뜬다면 케이블 연결, 가상 스위치 포트 등 1&amp;middot;2계층부터 점검해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;ip neigh&lt;/code&gt; (2계층 단서):&lt;/b&gt; 같은 로컬 네트워크 대역에 있는 게이트웨이(&lt;code&gt;172.30.0.1&lt;/code&gt;)의 MAC 주소를 정상적으로 알아내어 &lt;code&gt;REACHABLE&lt;/code&gt;(도달 가능) 상태임을 보여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;ip route&lt;/code&gt; (3계층 단서):&lt;/b&gt; 외부 네트워크로 나가는 패킷을 어느 이정표(&lt;code&gt;default via 172.30.0.1&lt;/code&gt;)로 보낼지 결정하는 3계층 라우팅 경로가 잡혀 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;ss -tn&lt;/code&gt; (4계층 단서):&lt;/b&gt; 목적지 IP의 특정 포트(&lt;code&gt;:443&lt;/code&gt;, &lt;code&gt;:22&lt;/code&gt;)와 3-Way Handshake를 마치고 &lt;code&gt;ESTAB&lt;/code&gt;(연결 수립) 상태에 들어간 TCP 세션 줄들이 출력됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4계층에서 다루는 서비스별 표준 포트 번호와 TCP/UDP의 구체적인 구분이 필요하시다면 제가 별도로 정리해 둔 &lt;a href=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개발자&amp;middot;서버 관리자 필수 TCP/UDP 포트 번호 모음 즐겨찾기표&lt;/a&gt; 글을 함께 참고해 보시기 바랍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 5계층 세션층(Session Layer): 상대방과 대화 연결 상태 유지하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5계층 세션층은 통신하는 양쪽 응용 프로그램 간의 대화 세션을 생성하고, 유지하며, 작업이 끝나면 안전하게 종료하는 연결 관리 역할을 맡습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 데이터를 주고받다가 네트워크가 갑자기 끊겼을 때, 처음부터 다시 받지 않고 끊긴 지점부터 이어서 받을 수 있도록 체크포인트(동기점)를 설정하는 기능도 세션층이 담당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배 배송 과정에 비유하면, 물건을 내놓기 전 배송 기사님과 전화 통화를 연결하여 &quot;상자를 들고 내려가니 잠시만 기다려주세요&quot;라고 대화 채널을 유지하고 상호 상태를 체크하는 작업으로 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 관련 기술로는 NetBIOS, RPC, SSH 통신 연결 관리 구조가 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 6계층 표현층(Presentation Layer): 번역기와 암호화, 데이터 압축&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6계층 표현층은 응용 계층으로부터 전달받은 데이터를 수신측 컴퓨터가 해석할 수 있는 표준 형식으로 변환하거나, 수신된 데이터를 내부 데이터 형식으로 맞추어 주는 번역기 역할을 담당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 기능은 데이터의 인코딩 및 디코딩, 보안 강화를 위한 암호화 및 복호화, 그리고 네트워크 전송 효율을 높이기 위한 데이터 압축 작업입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배에 비유하자면 깨지기 쉬운 유리제품을 에어캡(뽁뽁이)으로 안전하게 포장하거나, 해외 배송을 위해 통관 서류를 영문 형식으로 번역 작성하는 준비 절차에 해당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 JPEG, PNG 같은 이미지 파일 포맷 변환과 SSL/TLS 보안 암호화 처리가 이 계층에서 수행됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 7계층 응용층(Application Layer): 사용자가 보는 택배 앱 화면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7계층 응용층은 사용자가 직접 눈으로 보고 조작하는 최상위 계층으로, 네트워크 서비스를 이용할 수 있도록 인터페이스를 제공하는 영역입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일상에서 접하는 웹 브라우저, 이메일 클라이언트, 파일 전송 프로그램 등이 모두 이 응용 계층의 프로토콜을 활용하여 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;택배 시스템에 대입하면 소비자가 스마트폰에서 택배 앱을 열고 &quot;배송 접수&quot; 버튼을 누르거나 &quot;실시간 택배 이동 경로&quot;를 확인하는 앱 UI 화면 그 자체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 프로토콜로는 웹 통신에 쓰이는 HTTP/HTTPS, 파일 전송용 FTP, 이메일 발송용 SMTP, 도메인명을 IP로 바꿔주는 DNS 등이 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  개발자가 가장 자주 만나는 7계층&lt;/b&gt;&lt;br /&gt;웹 개발 시 사용하는 REST API 호출, JSON 규격 데이터 송수신, HTTP 헤더 설정 작업 등은 모두 7계층 응용층 범위에 속합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보강 3&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;상위 계층(6&amp;middot;7계층) TLS 인증서 검증과 HTTP 응답 실측 및 계층별 점검 요약&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 1~4계층을 통해 목적지 서버까지 전송 통로가 열렸다면, 이제 보안 연결을 수립하고 실제 웹 데이터를 주고받는 상위 계층을 확인할 차례입니다. 마찬가지로 2026년 10월 20일(KST) 기준 &lt;code&gt;example.com&lt;/code&gt;을 대상으로 실행한 실측 결과입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# [흔히 6계층에 대응시켜 설명하는 TLS 구간] 서버 인증서 체인 및 암호화 협상 확인
$ openssl s_client -connect example.com:443 -servername example.com &amp;lt;/dev/null 2&amp;gt;/dev/null | grep -A 2 &quot;Certificate chain&quot;
Certificate chain
 0 s:C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, CN = example.com
   i:C = US, O = DigiCert Inc, CN = DigiCert Global G2 TLS RSA SHA256 2020 CA1

# [7계층 응용 프로토콜] HTTPS 요청 전송 및 HTTP/2 200 응답 헤더 확인
$ curl -I https://example.com/
HTTP/2 200 
content-type: text/html
etag: &quot;84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134&quot;
cache-control: max-age=86000&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;openssl s_client&lt;/code&gt; (TLS 핸드셰이크 및 인증서 확인):&lt;/b&gt; 흔히 교육 과정에서 6계층(표현 계층)의 암호화&amp;middot;복호화 예시로 대응시켜 설명하는 TLS 구간입니다. 출력된 &lt;code&gt;Certificate chain&lt;/code&gt;에서 주체 이름(&lt;code&gt;CN = example.com&lt;/code&gt;)과 발급 기관이 정상적으로 검증되는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;curl -I https://example.com/&lt;/code&gt; (7계층 HTTP 통신):&lt;/b&gt; 하위 계층의 연결과 TLS 협상이 모두 완료된 뒤, 7계층 응용 프로토콜을 통해 &lt;code&gt;HTTP/2 200&lt;/code&gt; 정상 응답을 받아온 모습입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 위 명령에서 도메인 이름(&lt;code&gt;example.com&lt;/code&gt;)을 서버 IP 주소로 변환하는 과정에는 응용 계층의 DNS 프로토콜이 먼저 개입하며, 응답으로 돌아온 &lt;code&gt;HTTP/2&lt;/code&gt; 역시 전송 효율을 높이기 위해 발전해 온 결과물입니다. 이와 관련하여 도메인 질의 구조를 다룬 &lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DNS 레코드 종류와 역할 총정리&lt;/a&gt; 포스팅과, 웹 프로토콜의 세대별 변화를 비교한 &lt;a href=&quot;https://devwar.tistory.com/entry/http1-http2-http3-difference-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP/1.1 vs HTTP/2 vs HTTP/3 차이점 완벽 정리&lt;/a&gt; 글을 이어서 읽어보시면 7계층의 실제 동작을 훨씬 입체적으로 이해하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 지금까지 살펴본 OSI 7계층 개념과 리눅스 실측 점검 명령어를 한눈에 대조할 수 있도록 표로 정리해 드립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; width: 32%;&quot;&gt;계층 (교육용 근사치) / 핵심 단위 / 주소&lt;/th&gt;
&lt;th style=&quot;text-align: center; width: 34%;&quot;&gt;리눅스 실측 명령어&lt;/th&gt;
&lt;th style=&quot;text-align: center; width: 34%;&quot;&gt;실측 정상 단서 (2026-10-20 KST)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;1&amp;middot;2계층 (물리&amp;middot;데이터링크)&lt;/b&gt;&lt;br /&gt;비트&amp;middot;프레임 / MAC&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;ip -br link&lt;/code&gt;, &lt;code&gt;ip neigh&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;lo&lt;/code&gt;, &lt;code&gt;enp0s4&lt;/code&gt; &lt;code&gt;UP&lt;/code&gt; (MAC 표시) 및 게이트웨이 &lt;code&gt;REACHABLE&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;3계층 (네트워크)&lt;/b&gt;&lt;br /&gt;패킷 / IP 주소&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;ip route&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;default via 172.30.0.1&lt;/code&gt; 기본 라우팅 경로 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4계층 (전송)&lt;/b&gt;&lt;br /&gt;세그먼트 / 포트(Port)&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;ss -tn&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;원격지 포트와 수립된 &lt;code&gt;ESTAB&lt;/code&gt; 상태 행 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;5&amp;middot;6계층 (세션&amp;middot;표현 근사)&lt;/b&gt;&lt;br /&gt;세션 및 TLS 암호화&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;openssl s_client&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;Certificate chain&lt;/code&gt; 내 &lt;code&gt;CN=example.com&lt;/code&gt; 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;7계층 (응용)&lt;/b&gt;&lt;br /&gt;메시지 / HTTP&amp;middot;DNS&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;curl -I https://example.com/&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;HTTP/2 200&lt;/code&gt; 응답 코드 및 헤더 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 한눈에 보는 OSI 7계층 핵심 요약 (비유 종합)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 살펴본 OSI 7계층 전체 구조와 택배 시스템 비유, 계층별 주요 프로토콜을 표로 종합 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; text-align: center; width: 12%;&quot;&gt;계층&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; text-align: center; width: 44%;&quot;&gt;이름&amp;middot;역할 요약&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; text-align: center; width: 44%;&quot;&gt;비유 / 식별자&amp;middot;프로토콜&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;7계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;응용(Application) &amp;mdash; 사용자 앱&amp;middot;API 인터페이스, 택배 접수/조회 앱 UI&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;스마트폰 택배 접수&amp;middot;조회 앱 UI / 메시지(Data) / HTTP&amp;middot;HTTPS&amp;middot;FTP&amp;middot;DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;6계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;표현(Presentation) &amp;mdash; 인코딩&amp;middot;암호화&amp;middot;압축, 영문 서류 작성 및 완충 포장&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;서류 번역&amp;middot;에어캡 완충 포장 / 데이터(Data) / JPEG&amp;middot;PNG&amp;middot;SSL/TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;5계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;세션(Session) &amp;mdash; 연결 유지&amp;middot;동기점, 기사님과의 통화 연결 상태 조율&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;기사와 통화 유지 / 데이터(Data) / NetBIOS&amp;middot;RPC&amp;middot;SSH(세션 측면)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;4계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;전송(Transport) &amp;mdash; 신뢰&amp;middot;포트, 등기 서명 확인 및 분실 재전송 관리&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;등기 확인 / 포트 번호&amp;middot;세그먼트 / TCP&amp;middot;UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;3계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;네트워크(Network) &amp;mdash; 경로&amp;middot;IP, 전국 물류 수송 최적 경로 안내&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;고속도로 경로 / IP 주소&amp;middot;패킷 / IP&amp;middot;ICMP&amp;middot;라우터&amp;middot;L3 스위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;2계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;데이터링크(Data Link) &amp;mdash; MAC&amp;middot;프레임, 센터 내 바코드 분류 및 레일 이동&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;센터 내 분류 / MAC 주소&amp;middot;프레임 / MAC&amp;middot;L2 스위치&amp;middot;브릿지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;1계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;물리(Physical) &amp;mdash; 신호&amp;middot;매체, 아스팔트 도로망 및 고속도로 타워&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; text-align: left; vertical-align: top;&quot;&gt;도로&amp;middot;케이블 / 비트(Bit) / UTP 케이블&amp;middot;광케이블&amp;middot;허브&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. 실무에서는 TCP/IP 4계층을 주로 쓰는데 OSI 7계층을 외워야 하는 이유가 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP 4계층이 인터넷 실제 통신에 맞춰 단순화된 상용 실무 모델이라면, OSI 7계층은 네트워크 흐름 전체를 개념적으로 분석하기 위한 참조 모델입니다. 시스템에 문제(Troubleshooting)가 발생했을 때 물리 랜선 문제인지, 라우팅 문제인지, 앱 프로토콜 문제인지 단계별로 점검하기 위한 사고의 틀을 제공하기 때문에 기본 개념으로 반드시 숙지해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. OSI 7계층 순서를 헷갈리지 않고 기억하는 방법이 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 계층부터 상위 계층 순서(1계층&amp;rarr;7계층)로 앞글자를 따서 연상하는 방법이 가장 효과적입니다. Physical, Data Link, Network, Transport, Session, Presentation, Application의 첫 글자 &quot;P-D-N-T-S-P-A&quot;를 문장으로 만들어 외우면 기억에 오래 남습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네트워크 흐름을 읽는 문제 해결 시각&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OSI 7계층 구조를 이해하고 나면 서버나 클라이언트 통신 오류가 발생했을 때 장애 지점을 추적하는 접근 방식이 명확해집니다. 물리적 선이 빠졌는지(1계층), IP 설정이나 서브넷 마스크 오류인지(3계층), 방화벽 포트가 차단되었는지(4계층), 혹은 요청 페이로드 규격이 맞지 않는지(7계층) 단계적으로 체크리스트를 지워나갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡하게 느껴지던 네트워크 지식도 결국 사람이 물품을 전달하는 택배 배송과 동일한 원리로 움직입니다. 이번 글에서 다룬 계층별 흐름과 비유를 토대로 네트워크 기본기를 차근차근 확립해 보시길 바랍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1792458111229&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&quot; data-og-description=&quot;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &amp;quot;이건 그냥 외워둬&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1fgF0/dJMb8UapjpC/nOCKDyDiTq2AQ0TFo7p1M0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/cLaWih/dJMb8XkETuJ/fWeYwqQ6HkSdNK1M8xDvPk/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/eKdqY/dJMb9iI5pWw/DdOVLEmgqGyvYZ7TeKcwN0/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1fgF0/dJMb8UapjpC/nOCKDyDiTq2AQ0TFo7p1M0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/cLaWih/dJMb8XkETuJ/fWeYwqQ6HkSdNK1M8xDvPk/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/eKdqY/dJMb9iI5pWw/DdOVLEmgqGyvYZ7TeKcwN0/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321');&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &quot;이건 그냥 외워둬&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devwar.tistory.com/entry/dns-record-types&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1792458120385&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&quot; data-og-description=&quot;도메인을 연결하거나 서버 설정을 바꿀 때마다 DNS 레코드 설정 화면 앞에서 멈칫하게 됩니다. 자주 다루는 작업이 아니다 보니 설정할 때마다 각 항목의 역할과 규칙이 낯설고 헷갈리기 때문입&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzRHbi/dJMb81ghMki/BpyJapvgKpOZ46E37lqob1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/cXUQym/dJMb81HmNAi/3B0jBbi9kYpZ3SVjEckts1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/b7XzGq/dJMb85wejSy/8oJEwaW5yhQX7G30nOY2S0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzRHbi/dJMb81ghMki/BpyJapvgKpOZ46E37lqob1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/cXUQym/dJMb81HmNAi/3B0jBbi9kYpZ3SVjEckts1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/b7XzGq/dJMb85wejSy/8oJEwaW5yhQX7G30nOY2S0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316');&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1792458126935&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&quot; data-og-description=&quot;웹 개발이나 인프라 구조를 공부하다 보면 Apache, Nginx, Tomcat을 모두 '서버'라고 부르기 때문에 처음에는 그 차이가 무척 헷갈립니다. 이름이 비슷하게 묶여서 언급되곤 하지만, 사실 이들은 요청&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/doQwal/dJMb9eUd5AJ/3JARTBonRw8xI65zTYq9xK/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/gUd96/dJMb9llvLKq/ujGYAMCkvFCBo4yslfig01/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/bypcu0/dJMb9jgWpbk/bNp6thq8VSQrDut75zhvt0/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/doQwal/dJMb9eUd5AJ/3JARTBonRw8xI65zTYq9xK/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/gUd96/dJMb9llvLKq/ujGYAMCkvFCBo4yslfig01/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/bypcu0/dJMb9jgWpbk/bNp6thq8VSQrDut75zhvt0/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325');&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 개발이나 인프라 구조를 공부하다 보면 Apache, Nginx, Tomcat을 모두 '서버'라고 부르기 때문에 처음에는 그 차이가 무척 헷갈립니다. 이름이 비슷하게 묶여서 언급되곤 하지만, 사실 이들은 요청&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ssl-cert-lifetime&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devwar.tistory.com/entry/ssl-cert-lifetime&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1792458135066&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;SSL 인증서 유효기간 단축 - 1년에서 47일로, 무료 SSL 인증서 대응법&quot; data-og-description=&quot;SSL 인증서 유효기간이 점점 짧아지고 있습니다. 그동안 약 1년(398일)이던 공개 TLS 인증서 최대 수명이 2026년 200일, 2027년 100일, 그리고 2029년에는 47일까지 단계적으로 줄어듭니다. 인증서를 수동&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ssl-cert-lifetime&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ssl-cert-lifetime&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gMTte/dJMb8WMOTrC/P1e39riFmcxWePvk36pT40/img.png?width=800&amp;amp;height=597&amp;amp;face=447_163_540_256,https://scrap.kakaocdn.net/dn/hV3U5/dJMb8QMBCX6/yxk00ckAF6NZOer38x3DTk/img.png?width=800&amp;amp;height=597&amp;amp;face=447_163_540_256,https://scrap.kakaocdn.net/dn/mvC3b/dJMb8VNVhGU/kRlWnxSEJquZOMfzpw4qok/img.png?width=1200&amp;amp;height=896&amp;amp;face=676_256_816_396&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ssl-cert-lifetime&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ssl-cert-lifetime&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gMTte/dJMb8WMOTrC/P1e39riFmcxWePvk36pT40/img.png?width=800&amp;amp;height=597&amp;amp;face=447_163_540_256,https://scrap.kakaocdn.net/dn/hV3U5/dJMb8QMBCX6/yxk00ckAF6NZOer38x3DTk/img.png?width=800&amp;amp;height=597&amp;amp;face=447_163_540_256,https://scrap.kakaocdn.net/dn/mvC3b/dJMb8VNVhGU/kRlWnxSEJquZOMfzpw4qok/img.png?width=1200&amp;amp;height=896&amp;amp;face=676_256_816_396');&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;SSL 인증서 유효기간 단축 - 1년에서 47일로, 무료 SSL 인증서 대응법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SSL 인증서 유효기간이 점점 짧아지고 있습니다. 그동안 약 1년(398일)이던 공개 TLS 인증서 최대 수명이 2026년 200일, 2027년 100일, 그리고 2029년에는 47일까지 단계적으로 줄어듭니다. 인증서를 수동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devwar.tistory.com/entry/data-storage-explained&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1792458143050&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&quot; data-og-description=&quot;&amp;quot;Redis는 왜 그렇게 빠른가요?&amp;quot;&amp;quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&amp;quot;&amp;quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&amp;quot;&amp;quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠? &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKuHmn/dJMb8XSvc6p/c44xZ9FME8qsiBlwhtNMX0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/IjdZP/dJMb9efCOEe/4QRdO4NML82ICsh3uA34O0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/bYudGk/dJMb9dHM1e5/kxKdacr0CDMziSkfFhuHjk/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/data-storage-explained&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKuHmn/dJMb8XSvc6p/c44xZ9FME8qsiBlwhtNMX0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/IjdZP/dJMb9efCOEe/4QRdO4NML82ICsh3uA34O0/img.png?width=800&amp;amp;height=661&amp;amp;face=455_165_530_247,https://scrap.kakaocdn.net/dn/bYudGk/dJMb9dHM1e5/kxKdacr0CDMziSkfFhuHjk/img.png?width=1200&amp;amp;height=992&amp;amp;face=690_262_780_359');&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;데이터는 어디에 저장될까 - CPU&amp;middot;메모리&amp;middot;하드디스크로 이해하는 Redis&amp;middot;MySQL&amp;middot;MongoDB&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Redis는 왜 그렇게 빠른가요?&quot;&quot;메모리 DB라던데, 그럼 서버 껐다 켜면 데이터가 다 날아가는 거 아니에요?&quot;&quot;MySQL이랑 MongoDB는 결국 뭐가 다른 건데요?&quot;&quot;세션을 Redis에 저장한다는 말이 무슨 뜻이죠?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>IP주소MAC주소차이</category>
      <category>OSI7계층</category>
      <category>OSI7계층비유</category>
      <category>OSI7계층요약</category>
      <category>tcpudp차이</category>
      <category>개발자면접</category>
      <category>네트워크개념</category>
      <category>네트워크공부</category>
      <category>네트워크기초</category>
      <category>네트워크입문</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/143</guid>
      <comments>https://devwar.tistory.com/entry/osi-7-layer-easy-guide#entry143comment</comments>
      <pubDate>Sat, 22 Aug 2026 19:00:47 +0900</pubDate>
    </item>
    <item>
      <title>스프링 부트 탄생 배경과 철학 (기존 스프링과 차이점)</title>
      <link>https://devwar.tistory.com/entry/spring-boot-history-philosophy</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3634.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqL24/dJMcaa0JNNU/DQpjrX3GApUIBn0KLVUMLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqL24/dJMcaa0JNNU/DQpjrX3GApUIBn0KLVUMLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqL24/dJMcaa0JNNU/DQpjrX3GApUIBn0KLVUMLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqL24%2FdJMcaa0JNNU%2FDQpjrX3GApUIBn0KLVUMLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;3634.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 탄생 배경과 핵심 철학을 이해하는 것은 자바 생태계의 과거와 현재를 관통하는 중요한 열쇠입니다. 최근 백엔드 입문자분들은 클릭 몇 번으로 서버가 띄워지는 것을 보고 원래 이렇게 쉬운 거라고 생각하실 수도 있지만, 과거의 스프링은 결코 지금처럼 친절하지 않았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;스프링은 설정하다가 진짜 봄(Spring)이 다 간다.&quot;&lt;br /&gt;&quot;톰캣(Tomcat) 연동하다가 하루가 끝났어요. 왜 404 에러가 뜨는지 모르겠습니다.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 처음 실무를 시작했던 2012년 무렵만 해도, 스프링 프로젝트를 하나 세팅하려면 며칠씩 밤을 새우는 일이 허다했습니다. 온갖 XML 파일을 만지고 의존성 버전을 맞추느라 정작 비즈니스 로직은 시작도 못 하곤 했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 글에서는 과거 개발자들을 괴롭혔던 '설정 지옥'에서 어떻게 지금의 편리한 스프링 부트가 탄생하게 되었는지, 그리고 그 이면에 어떤 설계 철학이 숨어 있는지 최대한 쉽게 풀어보겠습니다. 프레임워크의 동작 원리를 겉핥기가 아닌 깊이 있게 이해하고 싶은 분들께 도움이 될 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스프링 프레임워크의 영광과 설정 지옥&lt;/li&gt;
&lt;li&gt;2012년 JIRA 이슈, 모든 것의 시작&lt;/li&gt;
&lt;li&gt;스프링 부트 철학 1: 설정보다 관례&lt;/li&gt;
&lt;li&gt;스프링 부트 철학 2: 주관이 뚜렷한 기본값&lt;/li&gt;
&lt;li&gt;내장 WAS가 가져온 배포 패러다임의 변화&lt;/li&gt;
&lt;li&gt;레거시 스프링과 스프링 부트 결정적 차이 비교&lt;/li&gt;
&lt;li&gt;스프링 부트가 마이크로서비스 시대를 연 이유&lt;/li&gt;
&lt;li&gt;스프링 부트 1.0부터 3.x까지의 진화&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;시대를 바꾼 도구에 대한 단상&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스프링 프레임워크의 영광과 설정 지옥&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 진영에서 기존의 EJB(Enterprise JavaBeans)라는 무겁고 복잡한 기술을 대체하며 등장한 '스프링 프레임워크'는 그야말로 단비 같은 존재였습니다. 객체 지향의 원칙을 잘 지키면서도 유연한 확장이 가능했기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 시간이 흐르면서 스프링 자체도 점점 무거워지기 시작했습니다. 기능이 많아지다 보니, 개발자가 직접 설정해 주어야 할 항목이 기하급수적으로 늘어난 것입니다. 이 시기를 개발자들은 흔히 'XML 지옥(XML Hell)'이라고 불렀습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  당시 개발자들의 필수 의식&lt;/b&gt;&lt;br /&gt;프로젝트를 띄우려면 web.xml, root-context.xml, servlet-context.xml, pom.xml 등 수많은 설정 파일을 열어놓고 태그를 한땀 한땀 입력해야 했습니다. 라이브러리 A의 1.2 버전과 라이브러리 B의 2.0 버전이 서로 충돌하지 않는지 매번 직접 테스트해야 했죠.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 요리사인데, 요리를 시작하기도 전에 프라이팬의 재질과 가스레인지의 불꽃 온도까지 직접 세팅해야 하는 상황이었습니다. 개발 생산성은 바닥을 쳤고, 뭔가 새로운 돌파구가 절실했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 2012년 JIRA 이슈, 모든 것의 시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 탄생 배경을 이야기할 때 빼놓을 수 없는 역사적인 사건이 있습니다. 2012년 10월, 스프링의 이슈 트래커인 JIRA에 'SPR-9888'이라는 번호로 하나의 요구사항이 올라옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크 영스트롬(Mike Youngstrom)이라는 개발자가 &lt;b&gt;&quot;컨테이너 없는 웹 애플리케이션 아키텍처(Containerless web application architecture)를 지원해 달라&quot;&lt;/b&gt;고 요청한 것입니다. 당시 웹 애플리케이션은 톰캣 같은 WAS(웹 애플리케이션 서버)를 따로 설치하고, 거기에 코드를 밀어 넣는 방식이 당연했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그는 &quot;그냥 메인 메서드(main)를 실행하면 웹 서버가 알아서 뜨게 만들어 주면 안 되냐&quot;는 도발적인 제안을 던졌습니다. 이 이슈는 많은 개발자의 공감을 얻었고, 스프링 팀은 이를 발전시켜 2014년 4월, 마침내 '스프링 부트 1.0'을 세상에 내놓게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 스프링 부트 철학 1: 설정보다 관례&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트의 첫 번째 핵심 철학은 &lt;b&gt;'설정보다 관례(Convention over Configuration)'&lt;/b&gt;입니다. 쉽게 말해 &quot;특별한 이유가 없다면, 우리가 정해둔 국룰(표준 설정)을 따르라&quot;는 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 데이터베이스에 연결하려면 어떤 드라이버를 쓸지, 커넥션 풀은 몇 개로 할지 일일이 설정해야 했습니다. 하지만 스프링 부트는 프로젝트에 MySQL 라이브러리가 들어있다면, &quot;아, 이 개발자는 MySQL을 쓰려나 보다&quot;라고 유추하여 데이터베이스 연결 설정을 알아서 구성해 버립니다. 이를 &lt;b&gt;자동 설정(Auto-configuration)&lt;/b&gt;이라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 개발자가 원한다면 언제든지 기본값을 덮어쓰고 커스텀 설정을 할 수 있습니다. 하지만 80% 이상의 일반적인 상황에서는 스프링 부트가 제안하는 '관례'를 따르는 것만으로도 충분히 빠르고 안전하게 개발을 진행할 수 있게 되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 스프링 부트 철학 2: 주관이 뚜렷한 기본값&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 철학은 &lt;b&gt;'주관이 뚜렷한(Opinionated)'&lt;/b&gt; 접근 방식입니다. 저는 종종 후배들에게 이를 '오마카세(셰프 추천 요리)'에 비유하곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 개발자가 하나부터 열까지 모든 라이브러리의 버전을 직접 골랐습니다. 그러다 보니 버전 호환성 문제로 에러가 나는 일이 일상이었죠. 하지만 스프링 부트는 &lt;code&gt;spring-boot-starter-web&lt;/code&gt;이라는 이름의 패키지 하나만 가져오면, 그 안에서 가장 궁합이 잘 맞는 스프링 MVC, JSON 파서(Jackson), 내장 톰캣 등의 버전을 자기들 '주관대로' 묶어서 제공합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  Opinionated의 장점&lt;/b&gt;&lt;br /&gt;개발자는 더 이상 &quot;A 라이브러리 2.1 버전과 B 라이브러리 3.0 버전이 충돌하지 않을까?&quot; 고민할 필요가 없습니다. 스프링 진영의 최고 전문가들이 이미 수많은 테스트를 거쳐 검증된 조합을 제공하기 때문입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 그저 주는 대로 받아 쓰기만 하면 됩니다. 덕분에 설정에 쏟던 에너지를 오롯이 비즈니스 로직(사용자 로그인, 결제 처리 등)을 고민하는 데 사용할 수 있게 되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 내장 WAS가 가져온 배포 패러다임의 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 만든 프로그램을 서버에 배포하려면 꽤 번거로운 과정을 거쳐야 했습니다. 서버 컴퓨터에 자바를 깔고, 톰캣을 설치하고, 폴더 권한을 맞춘 뒤에야 우리가 만든 war 파일을 특정 폴더에 집어넣어야 했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 스프링 부트는 톰캣(Tomcat)이나 언더토우(Undertow) 같은 웹 서버를 아예 프레임워크 내부에 내장시켜 버렸습니다. 이 작은 변화가 가져온 파급력은 실로 엄청났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 서버 컴퓨터에 톰캣을 설치할 필요가 없습니다. 그저 &lt;code&gt;java -jar my-application.jar&lt;/code&gt;라는 명령어 한 줄만 치면, 프로그램이 스스로 웹 서버를 품고 실행됩니다. 배포 과정이 하나의 실행 파일로 극단적으로 단순해진 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 레거시 스프링과 스프링 부트 결정적 차이 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로만 보면 잘 와닿지 않을 수 있으니, 기존 레거시 스프링과 현재의 스프링 부트가 개발 환경을 어떻게 바꾸었는지 표로 한눈에 비교해 보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;비교 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;레거시 스프링 (Spring Legacy)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;스프링 부트 (Spring Boot)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;설정 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;XML 파일 위주 (web.xml 등 다수 필요)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Java 어노테이션 및 application.yml (거의 자동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;의존성 관리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개별 라이브러리 버전을 직접 명시 및 충돌 해결&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;starter 의존성으로 검증된 조합 자동 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;웹 서버 (WAS)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;별도 설치된 외부 Tomcat에 배포 (war)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;내장 Tomcat 포함된 단일 파일 실행 (jar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;시작 코드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;복잡한 설정 파일 로딩 과정 필요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;main 메서드에서 SpringApplication.run() 한 줄&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 보면 그 차이가 더 명확합니다. 과거에는 서버 하나를 띄우기 위해 아래처럼 &lt;code&gt;web.xml&lt;/code&gt;을 복잡하게 작성해야 했습니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- 과거 레거시 스프링의 web.xml 예시 (너무 복잡함) --&amp;gt;
&amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;/WEB-INF/spring/appServlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
&amp;lt;/servlet&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 지금의 스프링 부트는 단 하나의 어노테이션으로 모든 준비를 끝냅니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// 현재 스프링 부트의 실행 코드 (이게 전부입니다)
@SpringBootApplication
public class MyDevwarApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyDevwarApplication.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 스프링 부트가 마이크로서비스 시대를 연 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트가 단순히 '편리한 도구'를 넘어 IT 업계의 표준으로 자리 잡은 이유는 시대의 흐름과 완벽하게 맞아떨어졌기 때문입니다. 바로 &lt;b&gt;도커(Docker)와 마이크로서비스 아키텍처(MSA)&lt;/b&gt;의 등장입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA 환경에서는 거대한 시스템을 여러 개의 작은 서버로 쪼개어 운영합니다. 만약 예전처럼 서버마다 톰캣을 일일이 설치하고 세팅해야 했다면, 서버가 100개로 늘어날 때 관리자들은 아마 과로로 쓰러졌을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 스프링 부트는 내장 WAS를 품은 독립적인 &lt;code&gt;jar&lt;/code&gt; 파일로 실행됩니다. 이는 도커 컨테이너 안에 쏙 들어가기 가장 좋은 형태입니다. 운영체제 환경에 구애받지 않고, 단순히 도커 이미지를 구워서 쿠버네티스(Kubernetes)에 던져주기만 하면 서버 수십 대가 순식간에 복제되고 실행됩니다. 스프링 부트가 클라우드 네이티브(Cloud Native) 시대의 주인공이 된 것은 결코 우연이 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 스프링 부트 1.0부터 3.x까지의 진화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 현재 실무에서는 주로 스프링 부트 3.x를 쓰고 있고, 2025년 11월에는 4.0도 정식 출시됐습니다. 초창기 1.0부터 지금까지 프레임워크도 많은 변화를 겪어왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 1.x와 2.x 시절에는 자바 8 버전이 오랜 기간 현역으로 활약했습니다. 하지만 2022년 말 출시된 &lt;b&gt;스프링 부트 3.0부터는 매우 큰 단절(Breaking Change)&lt;/b&gt;이 있었습니다. 최소 요구 사항이 자바 17로 훌쩍 높아졌고, 기존의 Java EE(javax 패키지)가 Jakarta EE(jakarta 패키지)로 완전히 변경되었기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 변화는 낡은 과거의 짐을 덜어내고 성능과 보안을 끌어올리기 위한 필수적인 선택이었습니다. 혹시라도 과거의 블로그 글을 보고 &lt;code&gt;import javax.persistence.*;&lt;/code&gt;를 복사해서 붙여넣었는데 에러가 난다면, 현재 사용 중인 버전이 3.x 이상이기 때문일 확률이 매우 높습니다. 이럴 땐 &lt;code&gt;jakarta&lt;/code&gt;로 패키지명만 바꿔주면 거짓말처럼 해결됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스프링 부트를 쓰면 기존 스프링 프레임워크는 몰라도 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아닙니다. 스프링 부트는 결국 스프링을 쉽게 쓰게 해주는 '포장지'에 불과합니다.&lt;/b&gt;&lt;br /&gt;초반에 빠르게 개발할 때는 부트의 자동 설정만으로 충분하지만, 트래픽이 몰리고 복잡한 에러(트러블슈팅)가 발생하면 결국 내부의 빈(Bean) 생명주기나 DI(의존성 주입) 같은 스프링의 코어 동작 원리를 알아야만 문제를 해결할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내장 톰캣을 쓰면 성능이 떨어지거나 메모리를 더 먹지 않나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유의미한 성능 차이는 거의 없습니다.&lt;/b&gt;&lt;br /&gt;내장 톰캣이라고 해서 기능이 축소된 가짜 서버가 아닙니다. 외부 톰캣과 완전히 동일한 코드로 동작합니다. 물론 애플리케이션 프로세스와 웹 서버가 한 메모리 공간에서 돌기 때문에 초기 세팅 구조가 다를 뿐, 대규모 트래픽 처리 성능 자체에는 문제가 없으니 안심하고 사용하셔도 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 시대를 바꾼 도구에 대한 단상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13년 전, 까만 콘솔 창에 찍히는 수많은 에러 로그를 보며 며칠 밤을 새우던 시절이 있었습니다. &quot;왜 안 되지?&quot;를 수백 번 외치며 구글을 뒤지던 그때와 비교하면, 지금의 스프링 부트는 마법과도 같은 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기술이 친절해질수록 개발자는 더 깊게 파고들어야 합니다. 프레임워크가 알아서 해준다고 해서 원리를 모른 채 복사 붙여넣기만 한다면, 정해진 길을 벗어나는 순간 아무것도 할 수 없는 개발자가 되기 십상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트가 우리에게 선물한 '절약된 시간'은 퇴근을 빨리 하라는 의미도 있겠지만, 그 시간에 &lt;b&gt;설정 파일 대신 비즈니스의 문제 해결에 더 집중하라&lt;/b&gt;는 프레임워크의 깊은 배려가 아닐까 생각합니다. 편안함에 안주하지 않고, 그 뒤에서 묵묵히 돌아가는 마법의 원리를 탐구하는 개발자가 되시길 응원합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-12&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787886725010&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iZigx/dJMb83SBf62/3rjdtC4ZFWav3X0jIuaiOk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/BNlmB/dJMb887qOKa/f48fxm3EHz1VuBtkpKYqTk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/bEvTIg/dJMb85Xbt2b/3EKspd6dwTZHkRPk8yqizK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ruby-on-rails-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iZigx/dJMb83SBf62/3rjdtC4ZFWav3X0jIuaiOk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/BNlmB/dJMb887qOKa/f48fxm3EHz1VuBtkpKYqTk/img.jpg?width=800&amp;amp;height=536&amp;amp;face=390_96_442_153,https://scrap.kakaocdn.net/dn/bEvTIg/dJMb85Xbt2b/3EKspd6dwTZHkRPk8yqizK/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=567_138_650_229');&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;루비 온 레일즈(Ruby on Rails) 역사와 그 속에 담긴 철학을 이해하는 것은 현대 웹 프레임워크의 뿌리를 찾는 일과 같습니다. 지금(2026년)이야 Next.js나 Spring Boot 같은 강력한 도구들이 당연하게 여겨&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787381133673&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;자바(Java)는 왜 커피잔일까? 오크(Oak)에서 자바가 된 이름의 유래&quot; data-og-description=&quot;자바(Java)의 로고는 왜 김이 모락모락 나는 커피잔일까요? 커피와 아무 상관 없어 보이는 이 프로그래밍 언어에 커피잔이 붙은 데는, 원래 '오크(Oak)'라는 나무 이름으로 불렸다가 상표권 문제로 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RxA28/dJMb9kUj08q/MuDnviKVbr1WlzChkUJ0h1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/bwDSFz/dJMb9iIXSwH/fjfQg1WZAWpFKALqAUAik1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/dF9okv/dJMb9kUj08r/MEPXRvm4kXEQkFXE2c5Rt0/img.png?width=939&amp;amp;height=948&amp;amp;face=527_100_592_171&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94Java%EB%8A%94-%EC%99%9C-%EC%BB%A4%ED%94%BC%EC%9E%94%EC%9D%BC%EA%B9%8C-%EC%98%A4%ED%81%AC-%EB%82%98%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%EB%90%9C-%EC%A0%84%EC%84%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RxA28/dJMb9kUj08q/MuDnviKVbr1WlzChkUJ0h1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/bwDSFz/dJMb9iIXSwH/fjfQg1WZAWpFKALqAUAik1/img.png?width=800&amp;amp;height=807&amp;amp;face=438_81_507_156,https://scrap.kakaocdn.net/dn/dF9okv/dJMb9kUj08r/MEPXRvm4kXEQkFXE2c5Rt0/img.png?width=939&amp;amp;height=948&amp;amp;face=527_100_592_171');&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;자바(Java)는 왜 커피잔일까? 오크(Oak)에서 자바가 된 이름의 유래&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)의 로고는 왜 김이 모락모락 나는 커피잔일까요? 커피와 아무 상관 없어 보이는 이 프로그래밍 언어에 커피잔이 붙은 데는, 원래 '오크(Oak)'라는 나무 이름으로 불렸다가 상표권 문제로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787381091370&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;이클립스가 무겁다고 욕먹은 이유, 애초에 IDE로 만든 게 아니라서입니다&quot; data-og-description=&quot;이클립스(Eclipse)라는 이름이 썬 마이크로시스템즈를 가린다는 뜻이라는 이야기, 개발자 사이에서 꽤 오래 돌았습니다. 그런데 이름을 붙인 IBM 쪽 증언은 다릅니다. 표적은 썬이 아니었고, 애초&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xBY5S/dJMb82MUtYy/l1m8u42ysH27CxVzNkLdg0/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/xvrws/dJMb87gnR24/B8PRponXg9aQFxB3ihsVk1/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/bdT6Eu/dJMb8SXPkQM/Fyi22GyfVtm0Htk6JHn7wk/img.png?width=1200&amp;amp;height=896&amp;amp;face=826_146_919_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%98%81%EC%9B%90%ED%95%9C-%EA%B3%A0%EC%A0%84-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xBY5S/dJMb82MUtYy/l1m8u42ysH27CxVzNkLdg0/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/xvrws/dJMb87gnR24/B8PRponXg9aQFxB3ihsVk1/img.png?width=800&amp;amp;height=597&amp;amp;face=551_97_613_165,https://scrap.kakaocdn.net/dn/bdT6Eu/dJMb8SXPkQM/Fyi22GyfVtm0Htk6JHn7wk/img.png?width=1200&amp;amp;height=896&amp;amp;face=826_146_919_249');&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;이클립스가 무겁다고 욕먹은 이유, 애초에 IDE로 만든 게 아니라서입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이클립스(Eclipse)라는 이름이 썬 마이크로시스템즈를 가린다는 뜻이라는 이야기, 개발자 사이에서 꽤 오래 돌았습니다. 그런데 이름을 붙인 IBM 쪽 증언은 다릅니다. 표적은 썬이 아니었고, 애초&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>msa</category>
      <category>springboot</category>
      <category>개발자경험</category>
      <category>레거시스프링</category>
      <category>백엔드</category>
      <category>설정지옥</category>
      <category>스프링부트</category>
      <category>웹개발</category>
      <category>자바</category>
      <category>프레임워크</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/157</guid>
      <comments>https://devwar.tistory.com/entry/spring-boot-history-philosophy#entry157comment</comments>
      <pubDate>Sat, 22 Aug 2026 09:54:41 +0900</pubDate>
    </item>
    <item>
      <title>git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.</title>
      <link>https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RJYIH/dJMcadCZwzi/pZb36ao4HngslaKHbMeJc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RJYIH/dJMcadCZwzi/pZb36ao4HngslaKHbMeJc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RJYIH/dJMcadCZwzi/pZb36ao4HngslaKHbMeJc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRJYIH%2FdJMcadCZwzi%2FpZb36ao4HngslaKHbMeJc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발생하면 머리가 하얘지기 마련입니다. 두 명령어는 코드를 합친다는 최종 목적은 같지만, 커밋 히스토리를 그려나가는 내부 원리가 완전히 다릅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;기능 개발이 끝났는데 main 브랜치에 merge를 해야 하나요, 아니면 rebase를 해야 하나요?&quot;&lt;br /&gt;&quot;rebase는 방향을 잘못 잡으면 대참사가 난다는데, 현재 어떤 브랜치 상태에서 명령어를 쳐야 하나요?&quot;&lt;br /&gt;&quot;충돌이 났을 때 작업 파일이 다 날아갈까 봐 무서운데 안전하게 취소하는 방법은 없나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 연차가 제법 쌓인 지금도 터미널에 붉은색 글씨로 충돌 마커가 뜨면 잠시 키보드에서 손을 떼고 상황을 파악하게 됩니다. 저 역시 주니어 시절에는 rebase 방향을 반대로 잡아서 팀원들의 공용 브랜치 히스토리를 통째로 망가뜨린 아찔한 경험이 있습니다. 원리를 시각적으로 이해하지 못하고 명령어만 외우면 실전에서 반드시 사고가 납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Git 2.40 이상 최신 버전과 2026년 실무 환경을 기준으로, 두 방식의 근본적인 차이와 3-Way 머지 충돌이 발생하는 필연적인 이유를 살펴봅니다. 특히 가장 헷갈려하시는 Rebase의 '방향 설정(내 커밋을 뒤에 붙이는 올바른 방법)'과 현재 브랜치 위치 확인법, 그리고 꼬인 상태를 즉시 복구하는 abort 명령어까지 상세히 정리해 드립니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;깃 브랜치 합치기 전 꼭 알아야 할 기본: Merge와 Rebase 차이점&lt;/li&gt;
&lt;li&gt;과거의 모든 분기 이력을 있는 그대로 보존하는 Git Merge 원리&lt;/li&gt;
&lt;li&gt;커밋 시작점을 옮겨서 한 줄로 깔끔하게 만드는 Git Rebase 원리&lt;/li&gt;
&lt;li&gt;Rebase 최대 함정: 내 커밋을 무조건 '뒤에' 붙여야 하는 이유&lt;/li&gt;
&lt;li&gt;실전 예시: Rebase로 내 커밋을 최신 코드 뒤에 안전하게 이어붙이는 법&lt;/li&gt;
&lt;li&gt;실무 핵심 팁: 원격에 올라간 브랜치는 Merge, 로컬 작업은 Rebase&lt;/li&gt;
&lt;li&gt;코드로 보는 3-Way Merge의 자동 병합과 충돌 예시&lt;/li&gt;
&lt;li&gt;Git 머지 충돌이 버그가 아니라 지극히 당연하고 안전한 이유&lt;/li&gt;
&lt;li&gt;Rebase 충돌이 체감상 유독 까다롭고 자주 터지는 구조적 배경&lt;/li&gt;
&lt;li&gt;작업이 꼬였을 때 직전 상태로 완벽히 되돌리는 Abort 명령어&lt;/li&gt;
&lt;li&gt;클릭 한 번으로 충돌과 되돌리기를 해결하는 최신 IDE 도구의 편리함&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 깃 브랜치 합치기 전 꼭 알아야 할 기본: Merge와 Rebase 차이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git에서 한 브랜치의 수정 사항을 다른 브랜치로 가져오는 방식은 크게 &lt;code&gt;merge&lt;/code&gt;와 &lt;code&gt;rebase&lt;/code&gt; 두 가지입니다. 최종적인 코드 결과물 자체는 동일하게 만들 수 있습니다. 하지만 발자국처럼 남겨지는 커밋 히스토리(그래프)를 그리는 방식에서 결정적인 차이가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 말해 Merge는 두 브랜치가 나뉘어 작업된 과거의 흔적을 있는 그대로 놔두고 하나로 묶어주는 방식입니다. 반면 Rebase는 브랜치가 뻗어 나온 기준점(Base)을 통째로 옮겨서, 마치 처음부터 한 줄로 차례대로 작업한 것처럼 과거를 새롭게 고쳐 쓰는 방식입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Git Merge&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Git Rebase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;히스토리 구조&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;분기와 병합 이력이 남는 다선형 구조&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;갈래 없이 깔끔하게 이어지는 단일 선형 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;커밋 해시(ID) 유지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;기존에 작업한 커밋 ID가 100% 보존됨&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;새 베이스 위에 새 커밋으로 생성 (해시 변경됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;병합 커밋 유무&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;두 갈래를 묶는 병합(Merge) 커밋 자동 생성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;별도 머지 커밋 없이 뒤에 일렬로 나란히 부착&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 방식 중 어느 한쪽이 무조건 정답인 것은 아닙니다. 현재 프로젝트의 성격, 소속된 팀의 브랜치 운영 정책에 따라 적절한 도구를 선택하는 눈을 기르는 것이 중요합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 과거의 모든 분기 이력을 있는 그대로 보존하는 Git Merge 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Merge는 가장 정직하고 안전하게 브랜치를 합치는 표준 방식입니다. 두 브랜치가 분기되어 각자 작업된 흐름을 보존하면서, 양쪽의 최종 변경 사항을 하나로 통합한 새로운 '병합 커밋(Merge Commit)'을 생성해 냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;code&gt;main&lt;/code&gt; 브랜치에서 &lt;code&gt;feature/login&lt;/code&gt; 브랜치를 따서 작업하는 도중, 동료가 &lt;code&gt;main&lt;/code&gt;에 급한 버그 수정 커밋을 추가했다고 가정해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 기능 브랜치의 작업 내용을 main 브랜치로 가져와 병합
git checkout main
git merge feature/login&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;위 명령어를 실행하면 Git은 두 브랜치의 흐름을 이어주는 새로운 커밋 &lt;code&gt;M&lt;/code&gt;을 만듭니다. 이를 텍스트 그래프로 나타내면 아래와 같은 다이아몬드 형태가 됩니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;[Merge 실행 전]
main    : A --- B --- C (동료의 작업)
                 \
feature :         D --- E (나의 작업)

[Merge 실행 후 (main에서 merge 수행)]
main    : A --- B --- C ------- M (Merge Commit)
                 \             /
feature :         D --- E ----+&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;Merge의 가장 큰 장점은 실제 작업이 진행된 시간 흐름과 브랜치가 분기된 맥락이 투명하게 기록된다는 점입니다. 단점은 팀원 여러 명이 수시로 머지를 반복할 경우, 커밋 그래프가 복잡한 지하철 노선도처럼 얽혀서 전체 이력을 한눈에 파악하기 어려워진다는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 커밋 시작점을 옮겨서 한 줄로 깔끔하게 만드는 Git Rebase 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rebase는 말 그대로 브랜치가 파생된 기반(Base)을 최신 지점으로 다시(Re) 설정하는 명령어입니다. 내가 옛날 커밋에서 갈라져 나와서 코드를 짰더라도, 그 작업물들을 임시로 떼어내어 최신 커밋의 맨 뒷자리로 옮겨 붙여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 동작은 꽤 정교합니다. Git은 내 브랜치에 있던 기존 커밋들(D, E)을 임시 공간에 따로 저장해 둡니다. 그 후 내 브랜치의 시작점을 &lt;code&gt;main&lt;/code&gt;의 최신 커밋(C)으로 강제 이동시키고, 임시 저장해 두었던 내 커밋들을 하나씩 차례대로 다시 실행(Replay)합니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 기능 브랜치에서 기준을 최신 main으로 변경하기
git checkout feature/login
git rebase main&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;Rebase가 끝나면 기존 커밋 D, E는 역사 속으로 사라지고, 코드 내용은 같지만 완전히 새로운 해시값을 가진 커밋 D', E'가 생성되어 최신 &lt;code&gt;main&lt;/code&gt; 뒤에 일렬로 배치됩니다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;[Rebase 실행 전]
main    : A --- B --- C
                 \
feature :         D --- E

[Rebase 실행 후 (feature에서 rebase 수행)]
main    : A --- B --- C
                       \
feature :               D' --- E' (새 커밋으로 재생성됨)&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;이 방식을 사용하면 옆으로 튀어나온 분기선이 생기지 않습니다. 전체 커밋 로그가 하나의 직선 형태로 깔끔하게 유지되므로, PR(Pull Request)을 리뷰하는 동료가 코드 변화를 파악하기가 매우 수월해집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Rebase 최대 함정: 내 커밋을 무조건 '뒤에' 붙여야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rebase를 할 때 초보 개발자들이 가장 많이 겪는 혼란이자 치명적인 실수가 바로 '명령어의 방향(타깃 설정)'입니다. 흔히 &quot;내 커밋을 앞에 넣어야 하나요, 뒤에 넣어야 하나요?&quot;라고 묻곤 하시는데, 정답은 &lt;b&gt;&quot;무조건 공용 브랜치의 최신 커밋 뒤에 내 커밋을 이어 붙여야 한다&quot;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 방향을 잘못 잡아 공용 브랜치(main)에 서 있는 상태에서 개인 브랜치를 타깃으로 Rebase를 돌리면 대참사가 일어납니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 15.5814%;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 35.814%;&quot;&gt;명령어 방향 (현재 위치)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; width: 48.6047%;&quot;&gt;발생하는 결과 (팩트 체크)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; width: 15.5814%;&quot;&gt;&lt;b&gt;올바른 방식&lt;br /&gt;(뒤에 붙이기)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 35.814%;&quot;&gt;현재 브랜치: &lt;code&gt;feature&lt;/code&gt;&lt;br /&gt;명령어: &lt;code&gt;git rebase main&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 48.6047%;&quot;&gt;&lt;code&gt;main&lt;/code&gt;의 최신 코드를 밑바탕(앞)에 깔고, 내 작업물(feature)을 그 &lt;b&gt;뒤(최상단)에 안전하게 이어 붙입니다.&lt;/b&gt; 내 로컬 커밋의 해시만 바뀝니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; width: 15.5814%;&quot;&gt;&lt;b&gt;위험한 방식&lt;br /&gt;(앞에 깔기)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 35.814%;&quot;&gt;현재 브랜치: &lt;code&gt;main&lt;/code&gt;&lt;br /&gt;명령어: &lt;code&gt;git rebase feature&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; width: 48.6047%;&quot;&gt;내 작업물(feature)을 밑바탕(앞)에 깔고, 팀원들의 &lt;code&gt;main&lt;/code&gt; 커밋을 내 뒤로 밀어버립니다. &lt;b&gt;main의 공용 커밋 해시가 전부 바뀌어 동료들의 로컬이 붕괴됩니다.&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 기억하세요. Rebase는 &quot;현재 내가 발을 딛고 서 있는 브랜치(HEAD)의 커밋들을 뽑아다가, 명령어 뒤에 적어준 타깃 브랜치의 맨 끝으로 이사 가는 작업&quot;입니다. 따라서 옮길 대상인 내 개인 브랜치로 먼저 이동(checkout)하는 것이 모든 작업의 시작입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실전 예시: Rebase로 내 커밋을 최신 코드 뒤에 안전하게 이어붙이는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명한 개념을 바탕으로, 실무에서 정확히 어떤 상태에서 어떤 순서로 명령어를 쳐야 하는지 구체적인 시나리오로 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[현재 상황 시나리오]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나는 현재 &lt;code&gt;feature/cart&lt;/code&gt; 브랜치에서 장바구니 기능을 3일째 개발 중입니다.&lt;/li&gt;
&lt;li&gt;방금 단톡방에서 동료가 &quot;메인(main) 브랜치에 결제 모듈 핫픽스를 올렸으니 다들 최신화받고 작업하세요&quot;라고 공지했습니다.&lt;/li&gt;
&lt;li&gt;나는 내 장바구니 코드(feature/cart) 아래에 최신 메인 코드를 깔아두고 싶습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 터미널을 열고 아래의 순서대로 입력합니다. 내가 지금 어느 브랜치에 있는지 &lt;code&gt;git status&lt;/code&gt;로 확인하는 습관이 생명입니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. 혹시 모르니 현재 내가 어느 브랜치에 있는지 확인합니다. (매우 중요)
git status
# 출력 결과: On branch feature/cart (정상)

# 2. 동료가 업데이트한 원격 저장소의 최신 내역을 내 컴퓨터로 받아옵니다. (병합은 안 일어남)
git fetch origin

# 3. 받아온 원격 main 브랜치를 밑바탕 삼아, 내 장바구니 작업을 그 뒤에 이어 붙입니다.
git rebase origin/main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 거치면 내 로컬의 &lt;code&gt;feature/cart&lt;/code&gt; 브랜치는 동료의 핫픽스 코드를 온전히 품은 채, 그 위에 내가 짠 코드들이 예쁘게 일렬로 정렬됩니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 4. 충돌이 났다면 파일을 수정하고 아래 명령어로 계속 진행합니다.
git add .
git rebase --continue

# 5. 모든 정리가 끝났다면 원격 저장소에 푸시하여 PR(Pull Request)을 올립니다.
# (rebase를 했기 때문에 로컬과 원격 해시가 달라 -f 강제 푸시가 필요할 수 있습니다)
git push -f origin feature/cart&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;이렇게 작업하면 원격에 올라간 내 PR에는 동료의 코드가 충돌 없이 반영되어 있고, 내가 순수하게 작업한 커밋들만 최상단에 노출되므로 리뷰어가 코드를 읽기 가장 편안한 상태가 완성됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 실무 핵심 팁: 원격에 올라간 브랜치는 Merge, 로컬 작업은 Rebase&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 Merge를 쓰고 언제 Rebase를 써야 할지 여전히 헷갈린다면, 실무에서 통용되는 아주 명확한 기준 하나만 기억하시면 됩니다. 브랜치가 이미 외부에 공유되었는지가 유일한 판단 기준입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  실무 브랜치 병합의 절대 원칙&lt;/b&gt;&lt;br /&gt;1. &lt;b&gt;원격(Remote)에 이미 푸시된 공용 브랜치&lt;/b&gt;: 무조건 &lt;code&gt;git merge&lt;/code&gt;를 사용해 안전하게 합칩니다. 커밋 해시가 유지되어 동료들에게 피해를 주지 않습니다.&lt;br /&gt;2. &lt;b&gt;아직 푸시하지 않은 내 로컬(Local) 개인 브랜치&lt;/b&gt;: &lt;code&gt;git rebase&lt;/code&gt;를 사용해 자잘한 커밋을 뭉치거나 기준점을 마음대로 다듬어도 완벽히 안전합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 다른 팀원이 풀(Pull)을 받아서 작업 중인 원격 브랜치에 대고 Rebase를 한 뒤 강제 푸시를 해버리면, 팀원들의 로컬 트리가 엉망으로 꼬이게 됩니다. 반면 나 혼자 노트북에서 만지작거리고 있는 브랜치라면 아무리 Rebase로 과거를 조작해도 외부에 영향을 주지 않으므로 자유롭게 히스토리를 다듬으면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 코드로 보는 3-Way Merge의 자동 병합과 충돌 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git이 브랜치를 병합할 때 코드를 어떻게 바라보는지 알면 충돌이 두렵지 않습니다. 설정 파일인 &lt;code&gt;config.js&lt;/code&gt;를 병합하는 상황을 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 나는 1번 라인을 수정했고 동료는 100번 라인을 수정했다면, Git은 서로 침범하지 않았다고 판단하여 아무 에러 없이 자동으로 코드를 합쳐줍니다. 하지만 운이 나쁘게도 같은 라인을 동시에 고쳤을 때 비로소 충돌이 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;// 병합 시 충돌이 발생한 파일 내부의 모습
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD (내가 현재 서 있는 브랜치의 코드)
const API_TIMEOUT = 5000;
console.log(&quot;Timeout set to 5s&quot;);
=======
const API_TIMEOUT = 10000;
console.log(&quot;Timeout set to 10s due to slow DB&quot;);
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; origin/main (합치려고 가져온 동료의 최신 코드)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 열어보면 &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;=======&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;라는 특수 기호가 생겨 있습니다. 구분선 윗부분은 내 코드이고, 아랫부분은 상대방의 코드입니다. 해결 방법은 아주 단순합니다. 둘 중 서비스에 맞는 코드를 남기고(혹은 적절히 섞어서 새로 짜고) 저 특수 기호 3줄을 텍스트 에디터에서 깨끗하게 지워버린 뒤 저장하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;# 충돌 코드를 깔끔하게 정리한 후 완료 처리하기
git add config.js
git commit -m &quot;Merge: API 타임아웃 10초로 수정 및 충돌 해결&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. Git 머지 충돌이 버그가 아니라 지극히 당연하고 안전한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병합 충돌 메시지(Merge Conflict)를 보면 마치 내 로컬 작업이 잘못되어 시스템 에러가 터진 것처럼 느끼기 쉽습니다. 하지만 충돌은 Git이 고장 난 것이 아니라, 귀중한 코드가 덮어써져서 날아가는 사고를 막기 위해 기계가 판단을 포기하고 사람에게 개입해 달라고 요청하는 든든한 보호 장치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 브랜치를 병합할 때 단순히 파일의 현재 겉모습만 1:1로 비교하지 않습니다. 두 브랜치가 과거에 처음 갈라져 나온 최초의 공통 조상(Base)을 포함해 총 세 가지 시점을 동시에 입체적으로 비교하는 &lt;b&gt;3-Way Merge 알고리즘&lt;/b&gt;을 사용합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;공통 조상 (Base)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;내 코드 (Ours)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;상대 코드 (Theirs)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Git의 판정 결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;A 코드&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;B 코드로 수정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;A 코드 (변경 안 함)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;내 코드 B로 &lt;b&gt;자동 병합&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;A 코드&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;A 코드 (변경 안 함)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;C 코드로 수정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상대 코드 C로 &lt;b&gt;자동 병합&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;A 코드&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;B 코드로 수정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;C 코드로 수정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;충돌 발생! (수동 결정 요구)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표에서 보듯, 조상 대비 어느 한쪽만 코드를 고쳤다면 Git이 똑똑하게 바뀐 쪽의 손을 들어줍니다. 하지만 같은 위치를 양쪽이 다르게 고쳤다면, 컴퓨터가 독단적으로 한쪽을 삭제할 수 없으므로 잠시 병합 프로세스를 멈추고 인간의 판단을 기다리는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. Rebase 충돌이 체감상 유독 까다롭고 자주 터지는 구조적 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 분들이 &quot;Merge 충돌은 한 번 풀면 끝나는데, Rebase는 똑같은 파일에서 충돌이 계속 반복돼서 미칠 것 같다&quot;라고 토로합니다. 이는 두 명령어의 내부 커밋 처리 방식 차이에서 기인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Merge를 할 때는 아무리 충돌이 광범위하게 발생해도, 병합 커밋을 만드는 단 한 번의 시점에 모든 충돌을 몰아서 쫙 풀어버리면 상황이 종료됩니다. 반면 Rebase는 내 브랜치에 5개의 커밋이 있다면 1번 커밋부터 5번 커밋까지 차례대로 하나씩 다시 적용(Replay)하는 과정을 거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 첫 번째 커밋을 붙일 때 충돌이 나서 열심히 풀고 &lt;code&gt;git rebase --continue&lt;/code&gt;를 입력했는데, 두 번째 커밋을 붙일 때 방금 고쳤던 그 파일에서 또 충돌이 터지는 늪에 빠질 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  Rebase 충돌 스트레스를 1회로 줄이는 꿀팁&lt;/b&gt;&lt;br /&gt;Rebase를 수행하기 전에 &lt;code&gt;git rebase -i HEAD~N&lt;/code&gt; (인터랙티브 리베이스) 명령을 사용해 내 개인 브랜치의 자잘한 커밋들을 &lt;code&gt;squash&lt;/code&gt; 기능으로 한 덩어리로 꽉 뭉쳐보세요. 5개의 커밋이 1개로 합쳐지면, 최신 베이스로 옮길 때 발생하는 충돌 역시 단 1회로 깔끔하게 끝납니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 기간이 한 달이 넘어가고 커밋 수가 수십 개에 달하는 거대한 장기 프로젝트 브랜치라면, 무리하게 Rebase를 시도하기보다는 깔끔하게 Merge로 한 번에 병합하는 편이 정신 건강과 실무 효율에 훨씬 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 작업이 꼬였을 때 직전 상태로 완벽히 되돌리는 Abort 명령어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 충돌 마커를 지우다가 괄호를 실수로 날려서 문법 에러가 났거나, 병합해야 할 타깃 브랜치 자체를 잘못 지정했다면 어떻게 해야 할까요? 가장 빠르고 확실한 해결책은 억지로 수습하지 말고 '작업 시작 전 원점으로 시간을 통째로 되돌리는 것'입니다. 이때 사용하는 마법의 옵션이 &lt;code&gt;--abort&lt;/code&gt;입니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;# 1. Merge 진행 중 코드가 너무 꼬여서 머지 시작 전으로 원상복구하고 싶을 때
git merge --abort

# 2. Rebase 진행 중 끝없는 충돌 루프에 빠져 리베이스 직전으로 복구하고 싶을 때
git rebase --abort

# 3. 체리픽(Cherry-pick) 도중 엉뚱한 커밋을 가져와서 취소하고 싶을 때
git cherry-pick --abort&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;이 명령어를 터미널에 입력하면 Git은 현재 생성되어 있던 임시 충돌 파일과 마커들을 진공청소기처럼 싹 빨아들이고 정리해 줍니다. 그리고 명령어를 치기 바로 직전의 평화롭던 원래 상태(HEAD)로 완벽하게 롤백해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거처럼 로컬 저장소 폴더를 통째로 지우고 깃허브에서 다시 클론받거나, 복잡하게 리셋(reset) 옵션을 구글링할 필요가 없습니다. 충돌 해결이 감당 안 될 정도로 꼬였다면 망설이지 말고 &lt;code&gt;--abort&lt;/code&gt;를 입력해 한숨 돌린 뒤 처음부터 차분히 다시 시작하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 클릭 한 번으로 충돌과 되돌리기를 해결하는 최신 IDE 도구의 편리함&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전처럼 터미널 창에서 검은 배경에 흰 글씨만 보며 &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; 기호를 수동으로 백스페이스를 눌러가며 지우던 시절은 지났습니다. 최근의 개발 에디터들은 병합 작업을 시각적으로 극대화하여 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS Code나 IntelliJ 같은 현대적인 IDE는 충돌이 감지되면 즉시 화려한 3-Way 병합 전용 UI를 띄워줍니다. 화면 왼쪽에는 내 코드(Current), 오른쪽에는 밖에서 들어오는 코드(Incoming), 그리고 화면 맨 아래쪽에는 최종적으로 완성될 코드를 나란히 보여줍니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;개발 도구 종류&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;주요 병합 지원 기능&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;실무 편의성 체감 포인트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;VS Code&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3-Way Editor 지원 및 원클릭 버튼 제공&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상단 메뉴의 'Accept Current' 또는 'Accept Incoming' 버튼 클릭 한 번으로 코드 해결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;JetBrains (IntelliJ 등)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;GUI 기반 정밀 병합 도구 및 실시간 문법 검사&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;화살표 기호를 눌러 특정 라인만 섬세하게 가져올 수 있으며, 병합 중 문법 에러 실시간 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;SourceTree / GitKraken&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;커밋 그래프 시각화 및 GUI 기반 Abort 버튼&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;명령어를 몰라도 브랜치를 마우스로 드래그 앤 드롭하여 머지하고 UI 버튼으로 즉시 취소 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 복잡한 비즈니스 로직 충돌 시, IDE가 제공하는 '양쪽 변경 사항 모두 수용(Accept Both)' 기능을 쓰면 코드를 직접 복사해서 붙여넣는 수고를 덜 수 있습니다. 터미널 조작이 두렵다면 에디터가 제공하는 시각적 피드백을 적극 활용하시길 권장합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Rebase가 완전히 끝나버려서 커밋 해시가 다 바뀌었는데, 이것도 되돌릴 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, 가능합니다. 진행 중일 때는 &lt;code&gt;--abort&lt;/code&gt;로 취소하지만, 이미 완료되어 브랜치 끝이 원치 않는 곳으로 이동했다면 &lt;code&gt;git reflog&lt;/code&gt; 명령어가 구원투수가 됩니다. &lt;code&gt;git reflog&lt;/code&gt;를 조회하여 Rebase를 시작하기 직전의 커밋 시점(예: HEAD@{2})을 찾아낸 뒤, &lt;code&gt;git reset --hard HEAD@{2}&lt;/code&gt; 명령을 내리면 과거의 원상태로 완벽히 복구할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Merge할 때 가끔 Fast-Forward 머지라고 뜨면서 병합 커밋이 안 생기는데 왜 그런가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fast-Forward(빨리 감기) 병합은 기준이 되는 브랜치(예: main)에 어떠한 새로운 커밋도 추가되지 않은 평화로운 상태에서 병합을 시도할 때 발생합니다. 두 브랜치가 서로 엇갈린 분기점이 없으므로, Git은 불필요한 병합 커밋을 만드는 대신 main 브랜치의 포인터만 기능 브랜치의 최신 위치로 쓱 끌어올리고 효율적으로 작업을 끝냅니다. 정상적인 동작이니 안심하셔도 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;팀 프로젝트를 할 때 충돌을 최소화할 수 있는 평소 습관이 있을까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능 브랜치의 수명을 최대한 짧게 유지하는 것이 핵심입니다. 로컬에서 며칠씩 혼자서만 묵묵히 작업하지 마시고, 매일 아침 출근하면 원격 &lt;code&gt;main&lt;/code&gt; 브랜치의 최신 변경 사항을 내 브랜치로 가져와 싱크(merge 또는 rebase)를 맞춰두세요. 이렇게 하면 큰 충돌이 한 번에 터지는 것을 막고 아주 작은 충돌 단위로 안전하게 대응할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;충돌을 두려워하지 않는 브랜치 관리의 완성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git의 Merge와 Rebase는 커밋 히스토리를 사실적인 분기 형태로 남길 것인지, 아니면 깔끔하게 한 줄로 정렬할 것인지에 대한 전략적 선택지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격에 올라간 공유 브랜치는 무조건 Merge로 안전하게 처리하고, 내 로컬에서 다듬는 브랜치는 올바른 방향(반드시 내 커밋을 뒤에 붙이기)으로 Rebase를 활용한다는 대원칙만 숙지하시면 됩니다. 충돌이 발생해도 3-Way 병합의 원리에 따라 침착하게 코드를 선택하고, 심하게 꼬였다면 언제든 &lt;code&gt;--abort&lt;/code&gt;로 시간을 되돌릴 수 있다는 자신감을 갖고 편안하게 브랜치를 관리하시길 바랍니다.&lt;/p&gt;
&lt;h2 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787191370634&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&quot; data-og-description=&quot;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMWZC4/dJMb9ia7STE/KtQY2wFGmGtMFxIPVlVdR0/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/bCBUAA/dJMb9kmtflQ/9kxJCoBBGkx9POigDPlph1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/ca2v8a/dJMb9eT6e5l/HRmUx1FfWcvDS9icqMTE9k/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMWZC4/dJMb9ia7STE/KtQY2wFGmGtMFxIPVlVdR0/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/bCBUAA/dJMb9kmtflQ/9kxJCoBBGkx9POigDPlph1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/ca2v8a/dJMb9eT6e5l/HRmUx1FfWcvDS9icqMTE9k/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325');&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787191364660&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&quot; data-og-description=&quot;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9pcEG/dJMb9g5rJzm/SRadtwmv8acHFwlbUspKy1/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/bTDDQ4/dJMb8YqcoYY/FUQt1elqGVxX5C711UTuJk/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/bG63H7/dJMb9g5rJzn/qZx6rYGq6855kdBDVvK3oK/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-branch-commit-add-concept&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9pcEG/dJMb9g5rJzm/SRadtwmv8acHFwlbUspKy1/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/bTDDQ4/dJMb8YqcoYY/FUQt1elqGVxX5C711UTuJk/img.png?width=800&amp;amp;height=597&amp;amp;face=496_116_562_188,https://scrap.kakaocdn.net/dn/bG63H7/dJMb9g5rJzn/qZx6rYGq6855kdBDVvK3oK/img.png?width=1200&amp;amp;height=896&amp;amp;face=733_168_841_286');&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;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 도구/Git&amp;middot;깃허브</category>
      <category>3waymerge</category>
      <category>ai코딩</category>
      <category>git</category>
      <category>GitAbort</category>
      <category>gitmerge</category>
      <category>gitrebase</category>
      <category>깃명령어</category>
      <category>깃충돌</category>
      <category>브랜치병합</category>
      <category>실무팁</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/155</guid>
      <comments>https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide#entry155comment</comments>
      <pubDate>Thu, 20 Aug 2026 11:04:29 +0900</pubDate>
    </item>
    <item>
      <title>Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다</title>
      <link>https://devwar.tistory.com/entry/git-branch-commit-add-concept</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP7ycj/dJMcaf1YlMU/Gdkhzxy1JL9WiOFvtLOky1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP7ycj/dJMcaf1YlMU/Gdkhzxy1JL9WiOFvtLOky1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP7ycj/dJMcaf1YlMU/Gdkhzxy1JL9WiOFvtLOky1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP7ycj%2FdJMcaf1YlMU%2FGdkhzxy1JL9WiOFvtLOky1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Git 브랜치 커밋 add 개념, 최대한 쉽게 폴더 파일 예시로 설명합니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git 브랜치, 커밋, add 개념을 처음 접하면 까만 터미널 화면 때문에 무척 헷갈리고 두렵기 마련입니다. 하지만 우리가 윈도우나 맥에서 매일 쓰는 '폴더'와 '파일'이라는 개념에 대입해 보면 아주 쉽고 명확하게 이해할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;브랜치는 도대체 뭔가요? 나뭇가지?&quot;&lt;br /&gt;&quot;add랑 commit은 뭐가 다른 거죠? 그냥 바로 저장하면 안 되나요?&quot;&lt;br /&gt;&quot;검은 화면에 명령어 칠 때마다 코드가 날아갈까 봐 무서워요.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 처음 웹 개발을 시작했던 2012년 무렵만 해도, 프로젝트 백업을 한답시고 '기획전_최종.zip', '기획전_진짜최종_수정.zip' 같은 폴더와 압축 파일을 수십 개씩 바탕화면에 쌓아두곤 했습니다. 그러다 어떤 파일이 최신인지 몰라서 며칠 밤을 새운 적도 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 복잡한 구조도, 어려운 원리 설명도 다 빼겠습니다. 오직 우리가 아주 잘 아는 탐색기 폴더와 파일이라는 키워드로 Git의 핵심을 아주 쉽게 풀어보겠습니다. 이제 막 코딩을 시작해서 버전 관리가 낯선 분들에게 가장 직관적인 가이드가 되길 바랍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Git, 까만 화면부터 켜면 포기하게 됩니다&lt;/li&gt;
&lt;li&gt;개발자의 탐색기: 브랜치는 폴더, 커밋은 파일&lt;/li&gt;
&lt;li&gt;git branch: 안전한 '복사본 폴더' 만들기&lt;/li&gt;
&lt;li&gt;git add: 파일은 생성했지만 아직 '저장 전' 상태&lt;/li&gt;
&lt;li&gt;git commit: 최종 '파일'로 확정 짓고 도장 찍기&lt;/li&gt;
&lt;li&gt;실전 압축: 폴더 파고, 대기하고, 파일 만들기 흐름도&lt;/li&gt;
&lt;li&gt;초보자가 가장 많이 하는 Git 실수 3가지&lt;/li&gt;
&lt;li&gt;그냥 폴더 복사붙여넣기를 쓰면 안 되는 진짜 이유&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Git, 까만 화면부터 켜면 포기하게 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 Git을 배울 때 가장 큰 진입 장벽은 눈에 잘 보이지 않는다는 점입니다. 마우스로 폴더를 드래그해서 옮기던 습관에서 벗어나, 키보드로 영문 명령어를 쳐야 하니 내가 지금 무슨 짓을 하고 있는지 파악하기 어렵죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 '분산 버전 관리 시스템'이라는 거창한 기술 용어가 우리를 주눅 들게 합니다. 하지만 껍데기를 벗겨내고 본질을 파고들면, Git은 그저 아주 꼼꼼하고 똑똑한 윈도우 탐색기(혹은 맥의 파인더)와 다를 바 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 터미널 창의 깜빡이는 커서는 잊어버리세요. 바탕화면에 있는 노란색 폴더 아이콘 하나와 그 안에 들어있는 텍스트 파일 하나만 떠올리면 Git을 정복할 준비는 끝납니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 개발자의 탐색기: 브랜치는 폴더, 커밋은 파일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 기술 용어는 잠시 치워두고, Git의 3대장(Branch, Add, Commit)을 우리가 매일 쓰는 컴퓨터 탐색기 작업에 1:1로 매칭해 보겠습니다. 이 표 하나만 머릿속에 넣어두셔도 오늘 글의 절반은 이해하신 겁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Git 필수 개념&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;윈도우 탐색기 비유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;git branch&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;새로운 &lt;b&gt;'폴더'&lt;/b&gt; 만들기 (원본을 건드리지 않는 복사본 폴더)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;git add&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;b&gt;'파일'&lt;/b&gt;은 생성(수정)했지만 아직 &lt;b&gt;'저장 전'&lt;/b&gt;인 대기 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;git commit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최종 &lt;b&gt;'파일'&lt;/b&gt;로 버전을 확정 지어 하드디스크에 저장하기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표를 보시면 감이 오시죠? &lt;b&gt;브랜치(Branch)&lt;/b&gt;는 새 폴더를 파는 것이고, &lt;b&gt;커밋(Commit)&lt;/b&gt;은 그 폴더 안에 내용물을 파일 형태로 꽉 묶어서 저장하는 겁니다. 그리고 가장 헷갈려하시는 &lt;b&gt;애드(Add)&lt;/b&gt;는 파일을 만들거나 글자는 썼지만, 아직 Ctrl+S를 눌러서 완전히 저장하기 직전의 붕 떠 있는 상태라고 보시면 됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. git branch: 안전한 '복사본 폴더' 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 초보자들이 처음에 가장 두려워하면서도, 원리를 알고 나면 무릎을 탁 치는 기능이 바로 &lt;code&gt;git branch&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 보통 정말 중요한 발표 자료(파일)를 대대적으로 뜯어고치기 전에 어떻게 하나요? 바탕화면의 '발표원본_폴더'를 마우스 우클릭해서 복사한 다음, '발표원본_수정테스트_폴더'를 만들어서 그 안에서 이것저것 안전하게 고쳐보곤 합니다. 망치면? 쿨하게 테스트 폴더를 휴지통에 버리면 그만이니까요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  브랜치는 똑똑한 폴더 복사기입니다&lt;/b&gt;&lt;br /&gt;Git에서 브랜치를 새로 만든다는 건, 현재 작업 중인 메인 폴더의 '복사본 폴더'를 가상으로 하나 똑같이 떠놓는 것과 완벽하게 동일한 개념입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 팀의 뼈대가 되는 &lt;code&gt;main&lt;/code&gt; 브랜치가 있을 때, 여기서 새로운 브랜치를 만들면 &lt;code&gt;main&lt;/code&gt; 폴더를 통째로 복사해서 새 폴더를 만든 것과 같습니다. 이제 새 폴더 안에서 코드를 다 지우고 화면을 부숴놔도, &lt;code&gt;main&lt;/code&gt; 폴더의 원본 코드는 안전하게 보호됩니다.&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;# 'login-test'라는 이름의 새로운 복사본 폴더(브랜치) 생성하기
git branch login-test

# 내가 작업할 공간을 방금 만든 'login-test' 폴더 안으로 이동하기
git checkout login-test&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. git add: 파일은 생성했지만 아직 '저장 전' 상태&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 폴더(브랜치)에 들어왔으니 이제 코드를 짜야겠죠? 문서를 하나 새로 만들고(파일 생성), 그 안에 코드를 몇 줄 끄적였습니다(파일 수정). 일반적인 문서 작업이라면 그냥 여기서 저장 버튼을 누르면 끝이겠지만, Git은 한 단계를 더 거칩니다. 바로 &lt;code&gt;git add&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 개념은 &lt;b&gt;&quot;파일은 생성(수정)했지만 아직 확정 저장하기 전&quot;&lt;/b&gt; 상태라고 이해하시면 가장 정확합니다. 온라인 쇼핑몰의 '장바구니'와도 똑같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  그냥 바로 저장하면 안 되나요? (Add가 필요한 이유)&lt;/b&gt;&lt;br /&gt;파일 3개를 동시에 수정했다고 칩시다. A파일은 로그인 기능, B파일은 글꼴 변경, C파일은 회원가입 기능입니다. 이걸 한 번에 다 묶어서 저장해 버리면 나중에 관리하기 힘듭니다. 그래서 A파일만 먼저 Add(대기열에 올림)해서 하나의 파일로 확정(Commit) 짓고, 그다음 B와 C를 따로 처리할 수 있게 선택권을 주는 겁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 엑셀이나 워드를 켜놓고 막 글씨를 치고 있을 때, 컴퓨터 전원이 나가면 내용이 날아가죠? 아직 디스크에 '확정 저장'이 안 되었기 때문입니다. Git에서 &lt;code&gt;add&lt;/code&gt; 명령어는 바로 그 중간 단계에 파일들을 예쁘게 모아두는 작업입니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 내가 수정한 특정 파일 하나만 '저장 대기' 상태로 올리기
git add index.html

# 현재 폴더에서 수정한 모든 파일을 한 번에 싹 다 '저장 대기' 상태로 올리기
git add .&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. git commit: 최종 '파일'로 확정 짓고 도장 찍기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 &lt;code&gt;add&lt;/code&gt;를 통해 수정된 내용들을 대기열(장바구니)에 잘 올려두었다면, 이제 진짜 결제를 확정 짓고 도장을 쾅 찍을 차례입니다. 이게 바로 &lt;code&gt;git commit&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 안에서 며칠간 쪼물딱거리며 작업하던 내용들이 하나의 찰칵! 하는 스냅샷 사진처럼 굳어져서 &lt;b&gt;영구적인 '파일' 상태&lt;/b&gt;로 기록되는 순간입니다. 커밋을 할 때는 반드시 포스트잇에 메모를 남겨서 이 파일 겉면에 붙여줘야 합니다. &quot;나 이거 왜 고쳤어&quot;라고 이유를 적어두는 것이죠.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# 대기 상태(add)에 있는 것들을 최종 파일로 확정(commit)하며 메모 남기기
git commit -m &quot;로그인 버튼 색상을 파란색으로 변경 완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정성스럽게 남겨둔 커밋 메시지들이 나중에 히스토리로 주르륵 남게 됩니다. 나중에 &quot;아, 그때 로그인 버튼 언제 파란색으로 바꿨더라?&quot; 하고 과거로 돌아가고 싶을 때, 이 파일(커밋)들을 열어보며 길을 찾는 이정표 역할을 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 실전 압축: 폴더 파고, 대기하고, 파일 만들기 흐름도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 배운 브랜치(폴더), 애드(저장 전 대기), 커밋(확정 파일) 세 가지 개념이 터미널에서 어떻게 맞물려 돌아가는지 표로 쭉 정리해 보았습니다. 바탕화면에서 겪는 일들과 비교하며 읽어보세요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;순서&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Git 명령어&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;우리의 머릿속 탐색기 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1. 준비&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;git checkout -b new-work&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;안전하게 작업할 &lt;b&gt;'복사본 폴더'&lt;/b&gt;를 새로 파고 들어감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2. 작업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;(코드 수정 및 파일 만들기)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;새 폴더 안에서 텍스트 문서를 열심히 고치고 타이핑함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;3. 대기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;수정한 내용들을 &lt;b&gt;'저장 전'&lt;/b&gt; 대기 상태로 모아둠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;4. 확정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&lt;code&gt;git commit -m &quot;작업완료&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;대기 중인 내용을 영구적인 &lt;b&gt;'파일'&lt;/b&gt; 상태로 박제하고 도장 찍음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 2026년 현재 현업에서도 수많은 개발자들이 하루에도 수십 번씩 이 1단계부터 4단계까지의 사이클을 쳇바퀴처럼 반복하며 거대한 프로그램을 만들어가고 있습니다. 전혀 특별하거나 무서운 과정이 아닙니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 초보자가 가장 많이 하는 Git 실수 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유를 통해 개념을 머리로는 이해해도, 키보드를 치는 손가락이 익숙해지기 전까지는 누구나 실수를 연발합니다. 제가 신입 시절에 했거나, 주변 주니어분들 자리에서 자주 목격하는 흔한 실수 패턴들을 미리 체크해 두세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.1 대기(add) 없이 바로 확정(commit) 때리기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 흔하게 나오는 당황스러운 패턴입니다. 코드를 잔뜩 고쳐놓고 뿌듯한 마음에 &lt;code&gt;git commit -m &quot;코드 고침&quot;&lt;/code&gt; 명령어만 덩그러니 치는 경우죠. 대기열(add)에 올라간 파일이 단 하나도 없으니 당연히 저장(commit)할 것도 없습니다. Git은 무심하게 &quot;저장할 내용이 없다&quot;라고 튕겨냅니다. 반드시 &lt;code&gt;add&lt;/code&gt;를 먼저 해서 &quot;이 파일들을 저장할 거야&quot;라고 알려줘야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.2 커밋 포스트잇 메모 성의 없이 적기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;귀찮다고 &lt;code&gt;commit -m &quot;수정&quot;&lt;/code&gt;, &lt;code&gt;commit -m &quot;진짜수정&quot;&lt;/code&gt; 이렇게 대충 남기면 나중에 과거 코드를 뒤져야 할 때 엄청난 재앙이 찾아옵니다. 서류철 겉면에 '서류1', '서류2'라고만 적어둔 것과 똑같습니다. &quot;장바구니 결제 버튼 오타 수정&quot;처럼 미래의 나와 동료들을 위해 명확하게 적는 습관이 생명입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.3 메인 폴더(main 브랜치)에서 그냥 작업해버리기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전한 '복사본 폴더(새 브랜치)'를 딴 줄 알았는데, 깜빡 잊고 원본 폴더(main 혹은 master 브랜치)에서 코드를 마구 고쳐버리는 아찔한 실수입니다. 치명적인 오류가 발생하면 모두가 공유하는 원본이 망가질 수 있으므로, 키보드에 손을 올리기 전에 &lt;code&gt;git branch&lt;/code&gt; 명령어로 현재 내가 서 있는 폴더 위치가 어디인지 확인하는 버릇을 들여야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 그냥 폴더 복사붙여넣기를 쓰면 안 되는 진짜 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 읽으셨다면 한 가지 근본적인 의문이 들 수 있습니다. &quot;어차피 폴더 복사하고 파일 저장하는 거랑 똑같은 원리면, 그냥 윈도우 탐색기 열고 마우스 우클릭해서 복사붙여넣기 하면 되는 거 아닌가요? 굳이 왜 이렇게 명령어를 치나요?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자서 하루 이틀 깔짝거리는 소규모 개인 과제라면 사실 그래도 됩니다. 하지만 현업에서는 적게는 서너 명, 많게는 수백 명의 개발자가 같은 프로젝트 덩어리를 동시에 이리저리 수정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 각자 폴더를 통째로 압축해서 슬랙 같은 메신저로 주고받는다고 상상해 보세요. 누구의 파일이 제일 최신인지, 어제 퇴근 전에 누가 A줄을 지우고 B줄을 넣었는지 병합하고 추적하는 것은 인간의 영역이 아닙니다. Git은 이 모든 '폴더와 파일 내부의 아주 미세한 글자 단위 변화'를 기가 막히게 추적해서 기록하고, 여러 사람이 제각각 만든 복사본(브랜치)을 서로 마찰이나 충돌 없이 하나로 예쁘게 엮어주는 아주 강력한 심장을 가지고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;명령어 치다가 실수로 쓴 코드가 다 날아가면 어떡하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 여러분이 생각하는 것보다 코드를 날려먹지 못하도록 훨씬 방어적이고 끈질기게 설계되어 있습니다. 습관처럼 커밋(commit)만 틈틈이 해두었다면, 거의 모든 과거의 찰나로 타임머신을 타고 복구할 수 있습니다. 윈도우 탐색기에서 파일을 영구 삭제하는 것보다 Git에서 코드를 영구 삭제하는 게 훨씬 어렵습니다. 안심하고 연습하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마우스로 클릭하는 GUI 프로그램(소스트리, 깃허브 데스크탑)을 쓰면 안 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 쓰셔도 됩니다. 시각적으로 코드의 변화 흐름을 폴더 트리처럼 쫙 보여주기 때문에 초보자에게 아주 친절합니다. 다만, 본문에서 설명해 드린 add, commit, branch의 보이지 않는 내부 흐름을 머릿속에 이해한 상태에서 마우스를 클릭하는 것과, 무지성으로 화면에 뜬 초록색 버튼만 누르는 것은 나중에 실무에서 코드가 꼬였을 때 복구 능력이 천지차이로 벌어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널의 시커먼 배경색에 지레 압도당하지 마세요. 실체를 알고 나면 거창한 해킹 시스템이 아니라, 그저 여러분의 소중한 코드를 안전하게 보관해 주는 똑똑한 탐색기 폴더일 뿐입니다. 오늘 당장 테스트용 빈 폴더를 하나 만들고, 그 안에 파일을 끄적여서 저장(add, commit)해 보는 가벼운 실습부터 무작정 시작해 보시길 응원합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1787488924044&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;gitignore 작성법, 무조건 써야 하는 이유가 있습니다&quot; data-og-description=&quot;gitignore 사용법은 깃 명령어보다 먼저 알아야 한다고 말하고 싶습니다. 깃을 쓰는 순간 비밀번호가 담긴 설정 파일과 서버 로그 파일이 저장소에 딸려 올라갈 수 있고, 이 두 가지는 한 번 올라가&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/gitignore-usage-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/gitignore-usage-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bT58S5/dJMb8ZvSVJz/hSIdA61RkmIoQKaeukyIgK/img.png?width=800&amp;amp;height=597&amp;amp;face=572_135_627_195,https://scrap.kakaocdn.net/dn/WS6Sm/dJMb8Xkw4w0/BVVlOBOaFvcpbyhkScZXmk/img.png?width=800&amp;amp;height=597&amp;amp;face=572_135_627_195,https://scrap.kakaocdn.net/dn/kK1q0/dJMb8YX3lrc/AIA2f0QK6nzfEwE5GakfiK/img.png?width=1200&amp;amp;height=896&amp;amp;face=868_200_952_291&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/gitignore-usage-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/gitignore-usage-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bT58S5/dJMb8ZvSVJz/hSIdA61RkmIoQKaeukyIgK/img.png?width=800&amp;amp;height=597&amp;amp;face=572_135_627_195,https://scrap.kakaocdn.net/dn/WS6Sm/dJMb8Xkw4w0/BVVlOBOaFvcpbyhkScZXmk/img.png?width=800&amp;amp;height=597&amp;amp;face=572_135_627_195,https://scrap.kakaocdn.net/dn/kK1q0/dJMb8YX3lrc/AIA2f0QK6nzfEwE5GakfiK/img.png?width=1200&amp;amp;height=896&amp;amp;face=868_200_952_291');&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;gitignore 작성법, 무조건 써야 하는 이유가 있습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;gitignore 사용법은 깃 명령어보다 먼저 알아야 한다고 말하고 싶습니다. 깃을 쓰는 순간 비밀번호가 담긴 설정 파일과 서버 로그 파일이 저장소에 딸려 올라갈 수 있고, 이 두 가지는 한 번 올라가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787192771877&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&quot; data-og-description=&quot;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lEcxH/dJMb9fZMaxo/PjKFDM6RnbqxdxOWRBDXg1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/mKpWs/dJMb9cBYJvf/tOz7Eqsxnjy9s5o7BeHEB0/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/nZXtq/dJMb8TCqZeL/RRcR0ZI2BHWeU8g73KxCh0/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-merge-rebase-conflict-ai-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lEcxH/dJMb9fZMaxo/PjKFDM6RnbqxdxOWRBDXg1/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/mKpWs/dJMb9cBYJvf/tOz7Eqsxnjy9s5o7BeHEB0/img.png?width=800&amp;amp;height=597&amp;amp;face=375_128_436_194,https://scrap.kakaocdn.net/dn/nZXtq/dJMb8TCqZeL/RRcR0ZI2BHWeU8g73KxCh0/img.png?width=1200&amp;amp;height=896&amp;amp;face=562_189_655_292');&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;git 머지와 리베이스 쉬운 설명, 팀과 상황에 따라서 선택해서 써야 합니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 깃(Git)으로 협업을 진행하다 보면 가장 헷갈리고 두려운 순간이 브랜치를 합칠 때입니다. 특히 Git merge rebase 차이를 정확히 모르고 명령어를 치다가 커밋이 꼬이거나 충돌(Conflict)이 발&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787190086526&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&quot; data-og-description=&quot;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMWZC4/dJMb9ia7STE/KtQY2wFGmGtMFxIPVlVdR0/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/bCBUAA/dJMb9kmtflQ/9kxJCoBBGkx9POigDPlph1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/ca2v8a/dJMb9eT6e5l/HRmUx1FfWcvDS9icqMTE9k/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMWZC4/dJMb9ia7STE/KtQY2wFGmGtMFxIPVlVdR0/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/bCBUAA/dJMb9kmtflQ/9kxJCoBBGkx9POigDPlph1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/ca2v8a/dJMb9eT6e5l/HRmUx1FfWcvDS9icqMTE9k/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325');&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1787190078396&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;젯브레인 IDE가 유독 똑똑한 이유, 첫 제품은 IDE가 아니었습니다&quot; data-og-description=&quot;젯브레인 IDE를 왜 쓰냐는 질문을 받으면 답이 이상하게 길어집니다. 인텔리제이, 파이참, 웹스톰까지 제품 이름부터 늘어놓게 되고, 정작 &amp;quot;그래서 뭐가 좋은데&amp;quot;에는 잘 대답하지 못하거든요. 그&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%98-%EB%AA%85%ED%92%88-%EB%8F%84%EA%B5%AC-%EC%A0%AF%EB%B8%8C%EB%A0%88%EC%9D%B8JetBrains-IDE-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%98-%EB%AA%85%ED%92%88-%EB%8F%84%EA%B5%AC-%EC%A0%AF%EB%B8%8C%EB%A0%88%EC%9D%B8JetBrains-IDE-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkz81S/dJMb9jODEl1/viyhFrIZgngOTYYShC9zBK/img.png?width=800&amp;amp;height=597&amp;amp;face=483_153_566_244,https://scrap.kakaocdn.net/dn/Dj2gA/dJMb81HezfU/qLW6480Kvim8wqrY5FvPdK/img.png?width=800&amp;amp;height=597&amp;amp;face=483_153_566_244,https://scrap.kakaocdn.net/dn/dlM9wu/dJMb8QeDfHi/ekLAtUilGBOHp6Aa57i7m0/img.png?width=1200&amp;amp;height=896&amp;amp;face=725_236_837_357&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%98-%EB%AA%85%ED%92%88-%EB%8F%84%EA%B5%AC-%EC%A0%AF%EB%B8%8C%EB%A0%88%EC%9D%B8JetBrains-IDE-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%98-%EB%AA%85%ED%92%88-%EB%8F%84%EA%B5%AC-%EC%A0%AF%EB%B8%8C%EB%A0%88%EC%9D%B8JetBrains-IDE-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkz81S/dJMb9jODEl1/viyhFrIZgngOTYYShC9zBK/img.png?width=800&amp;amp;height=597&amp;amp;face=483_153_566_244,https://scrap.kakaocdn.net/dn/Dj2gA/dJMb81HezfU/qLW6480Kvim8wqrY5FvPdK/img.png?width=800&amp;amp;height=597&amp;amp;face=483_153_566_244,https://scrap.kakaocdn.net/dn/dlM9wu/dJMb8QeDfHi/ekLAtUilGBOHp6Aa57i7m0/img.png?width=1200&amp;amp;height=896&amp;amp;face=725_236_837_357');&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;젯브레인 IDE가 유독 똑똑한 이유, 첫 제품은 IDE가 아니었습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;젯브레인 IDE를 왜 쓰냐는 질문을 받으면 답이 이상하게 길어집니다. 인텔리제이, 파이참, 웹스톰까지 제품 이름부터 늘어놓게 되고, 정작 &quot;그래서 뭐가 좋은데&quot;에는 잘 대답하지 못하거든요. 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 도구/Git&amp;middot;깃허브</category>
      <category>git</category>
      <category>gitadd</category>
      <category>gitbranch</category>
      <category>gitcommit</category>
      <category>git기초</category>
      <category>깃</category>
      <category>버전관리</category>
      <category>브랜치개념</category>
      <category>커밋개념</category>
      <category>형상관리</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/154</guid>
      <comments>https://devwar.tistory.com/entry/git-branch-commit-add-concept#entry154comment</comments>
      <pubDate>Thu, 20 Aug 2026 10:44:12 +0900</pubDate>
    </item>
    <item>
      <title>HTTP/1.1 vs HTTP/2 vs HTTP/3 차이 완벽 정리 (2026) - 실무에서 뭘 써야 할까</title>
      <link>https://devwar.tistory.com/entry/http1-http2-http3-difference-2026</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfy3Yx/dJMcaald2fI/I3qVy3D15ECgIOxtAB0cT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfy3Yx/dJMcaald2fI/I3qVy3D15ECgIOxtAB0cT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfy3Yx/dJMcaald2fI/I3qVy3D15ECgIOxtAB0cT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfy3Yx%2FdJMcaald2fI%2FI3qVy3D15ECgIOxtAB0cT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;HTTP/1.1 vs HTTP/2 vs HTTP/3 차이 완벽 정리 (2026) - 실무에서 뭘 써야 할까&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;963&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1 vs HTTP/2 vs HTTP/3 차이를 구조&amp;middot;속도&amp;middot;보안 관점에서 비교하고, Apache가 HTTP/3를 지원하지 않는 이유와 CDN으로 HTTP/3를 적용하는 실무 방법까지 2026년 기준으로 정리합니다. 프로토콜 버전보다 HTTPS 적용과 CDN 활용이 더 중요한 이유를 다룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;HTTP/1.1은 아직도 현역인가요?&quot;&lt;br /&gt;&quot;HTTP/2로 바꾸면 진짜 빨라지긴 하나요?&quot;&lt;br /&gt;&quot;HTTP/3는 도대체 뭐가 다른 거죠? 굳이 신경 써야 하나요?&quot;&lt;br /&gt;&quot;Apache는 왜 HTTP/3가 안 된다는 거예요?&quot;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 직접 구성해 보거나 네트워크를 좀 깊게 파다 보면 반드시 한 번은 마주치는 질문들입니다. 저도 처음엔 &quot;최신 버전 쓰면 무조건 좋은 거 아냐?&quot; 싶었는데, 막상 실무에서 부딪혀 보니 그렇게 단순하지가 않더군요. 결론부터 말씀드리면, 프로토콜 버전 자체보다 &lt;b&gt;HTTPS를 적용했는가, CDN을 앞에 뒀는가&lt;/b&gt;가 훨씬 더 중요한 선택입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 세 버전의 탄생 배경과 구조적 차이를 짚고, 각 버전이 어떤 장점을 갖는지, 그리고 Apache가 HTTP/3를 지원하지 않는데도 실무에서 전혀 불편하지 않은 이유까지 풀어 보겠습니다. 서버 구성을 고민 중인 개발자, 내 사이트에 어떤 프로토콜을 써야 할지 헷갈리는 분이라면 끝까지 읽으시면 정리가 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;HTTP/1.1이 거의 30년을 버틴 이유&lt;/li&gt;
&lt;li&gt;HTTP/1.1의 구조적 한계 - HOL 블로킹&lt;/li&gt;
&lt;li&gt;HTTP/2 멀티플렉싱 - 연결 하나로 동시 처리&lt;/li&gt;
&lt;li&gt;HTTP/2 헤더 압축과 우선순위, 그리고 사라진 서버 푸시&lt;/li&gt;
&lt;li&gt;HTTP/2 이상을 써야 하는 진짜 이유 - 비밀번호 암호화&lt;/li&gt;
&lt;li&gt;HTTP/3와 QUIC - TCP를 버리다&lt;/li&gt;
&lt;li&gt;QUIC의 진짜 무기 - 스트림 독립성과 Connection Migration&lt;/li&gt;
&lt;li&gt;HTTP/1.1 vs HTTP/2 vs HTTP/3 한눈에 비교&lt;/li&gt;
&lt;li&gt;Apache는 왜 아직도 HTTP/3를 지원하지 않나&lt;/li&gt;
&lt;li&gt;nginx&amp;middot;LiteSpeed&amp;middot;Caddy는 되는데 - 2026년 지원 현황&lt;/li&gt;
&lt;li&gt;실무 경험담 - CDN + HTTP/1.1이면 충분하다&lt;/li&gt;
&lt;li&gt;상황별 프로토콜 선택 가이드&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. HTTP/1.1이 거의 30년을 버틴 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1은 1997년 RFC 2068로 처음 정의된 프로토콜입니다. 그 뒤로 여러 차례 개정을 거쳤지만, 큰 틀은 거의 30년 가까이 그대로 살아남았습니다. 단순히 오래돼서 관성으로 쓰는 게 아니라, 그 자체로 실질적인 장점이 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  호환성이라는 무기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;HTTP/1.1은 세상에 존재하는 거의 모든 웹 서버와 브라우저, HTTP 클라이언트에서 동작합니다. Apache, Nginx, IIS, LiteSpeed를 가리지 않고, 레거시 시스템부터 임베디드 장비, IoT 기기까지 통하지 않는 환경이 사실상 없습니다. HTTP/2나 HTTP/3가 아직 따라오지 못한 가장 강력한 무기죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 &lt;b&gt;Keep-Alive&lt;/b&gt;입니다. HTTP/1.0 시절엔 요청마다 TCP 연결을 새로 맺고 끊었습니다. HTTP/1.1에서 도입된 지속 연결은 TCP 연결 하나를 여러 요청에 재사용합니다. 핸드셰이크 오버헤드가 줄어드니, 소규모 요청이 많은 환경에서 체감 성능이 꽤 좋아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째는 디버깅입니다. HTTP/1.1은 사람이 그냥 읽을 수 있는 텍스트 형식이라, curl이나 telnet, Wireshark 같은 도구로 요청과 응답을 바로 눈으로 확인할 수 있습니다. HTTP/2와 HTTP/3는 바이너리 프레임이라 패킷을 떠도 별도 디코딩이 필요하죠. 장애가 터졌을 때 1분이라도 빨리 원인을 봐야 하는 운영 환경에서, 이건 생각보다 큰 차이입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;GET /index.html HTTP/1.1&lt;br /&gt;Host: example.com&lt;br /&gt;User-Agent: curl/7.88.0&lt;br /&gt;Accept: */*&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 진입 장벽이 낮습니다. HTTP/1.1은 TLS 없이 평문으로도 동작합니다. 내부망이나 로컬 개발 환경, 사설망 안쪽 마이크로서비스 통신에서는 인증서 발급 절차 없이 서버를 후딱 띄울 수 있습니다. HTTP/3가 TLS 1.3을 아예 내장하고 있는 것과 대비되는 부분이죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. HTTP/1.1의 구조적 한계 - HOL 블로킹&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 장점이 많은데도 HTTP/2가 나온 데는 이유가 있습니다. HTTP/1.1의 가장 큰 약점은 &lt;b&gt;한 TCP 연결에서 요청을 순서대로 처리한다&lt;/b&gt;는 점입니다. 앞 요청이 끝나야 다음 요청을 보낼 수 있어요. 이걸 HOL(Head-of-Line) 블로킹이라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 이 한계를 우회하려고 도메인당 6개쯤 TCP 연결을 동시에 열어 둡니다. 그래도 한계가 있죠. CSS, JS, 이미지가 수십 개씩 붙는 요즘 페이지에서는 이 6개 연결로도 줄이 막힙니다. 과거에 정적 리소스를 여러 서브도메인에 흩뿌리는 '도메인 샤딩' 같은 꼼수가 유행했던 것도 이 때문이었습니다. 지금 와서 보면 그 시절 우리가 했던 최적화가 사실은 프로토콜의 한계를 손으로 메우는 작업이었던 셈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. HTTP/2 멀티플렉싱 - 연결 하나로 동시 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/2는 2015년 RFC 7540으로 표준화됐습니다. Google의 SPDY 실험에서 출발한 이 버전은 바로 그 HOL 블로킹을 정조준했습니다. 같은 URL, 같은 서버, 같은 네트워크에서 프로토콜만 HTTP/2로 바꿔도 페이지 로드가 눈에 띄게 빨라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;멀티플렉싱&lt;/b&gt;입니다. TCP 연결 하나 위에서 여러 요청과 응답을 동시에 스트림 단위로 주고받습니다. 연결을 6개씩 열 필요가 없으니 핸드셰이크 오버헤드도 같이 줄어듭니다. 도메인 샤딩 같은 꼼수도 더는 필요 없어졌고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP/1.1: 요청1 끝 &amp;rarr; 요청2 시작 &amp;rarr; 요청2 끝 &amp;rarr; 요청3 시작...&lt;br /&gt;HTTP/2: 요청1 &amp;middot; 요청2 &amp;middot; 요청3 동시 전송, 응답도 동시 수신&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. HTTP/2 헤더 압축과 우선순위, 그리고 사라진 서버 푸시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/2의 두 번째 장점은 &lt;b&gt;HPACK 헤더 압축&lt;/b&gt;입니다. HTTP/1.1은 매 요청마다 Cookie, User-Agent, Accept 같은 헤더를 텍스트로 반복 전송합니다. 쿠키가 많은 사이트면 헤더만 수 킬로바이트에 달하죠. HPACK은 한 번 보낸 헤더를 테이블에 저장해 두고, 다음 요청부터는 바뀐 부분만 보냅니다. 반복 헤더가 많은 환경일수록 절약 효과가 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 스트림마다 우선순위를 줄 수 있어서, 렌더링을 막는 CSS&amp;middot;JS를 먼저 받고 이미지나 폰트는 나중에 받도록 조정할 수 있습니다. 같은 대역폭에서도 화면이 더 빨리 그려지는 효과가 나죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  서버 푸시(Server Push)는 이제 잊으셔도 됩니다&lt;/b&gt;&lt;br /&gt;HTTP/2를 설명하는 옛날 글들은 서버 푸시를 큰 장점으로 꼽습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트가 요청하기 전에 서버가 CSS&amp;middot;JS를 미리 밀어 넣는 기능이었죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 실제로는 캐시 처리가 까다롭고 대역폭만 낭비하는 경우가 많았습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;결국 Chrome 106(2022년)이 기본 비활성화했고,&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;2024년 10월 Firefox 132까지 지원을 빼면서 주요 브라우저에서 사실상 퇴장했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;지금은 103 Early Hints가 그 자리를 대체합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;오래된 자료를 보고 서버 푸시를 설정하려 애쓸 필요는 없습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. HTTP/2 이상을 써야 하는 진짜 이유 - 비밀번호 암호화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 얘기를 길게 했지만, 사실 더 중요한 건 보안입니다. 바로 비밀번호와 개인정보의 암호화 전송이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS 없이 평문 HTTP로 로그인 폼을 보내면, 같은 네트워크에 있는 누구나 Wireshark 같은 도구로 아이디와 비밀번호를 그대로 들여다볼 수 있습니다. 카페 와이파이, 회사 내부망, 공용 네트워크 어디서나 마찬가지예요. HTTPS(TLS)를 적용하면 이 페이로드 전체가 암호화돼서, 스니핑해도 랜덤 암호문만 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 현실적으로 &lt;b&gt;모든 브라우저가 HTTP/2를 HTTPS에서만 구현&lt;/b&gt;합니다. 즉 HTTP/2 이상을 쓴다는 건 곧 SSL 인증서를 적용한다는 뜻이기도 합니다. 성능 때문에 HTTP/2를 켜려다 보안까지 자연스럽게 챙기게 되는 구조죠.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2a9d8f; color: white;&quot;&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;HTTP (평문)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;HTTPS (TLS 암호화)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;비밀번호 전송&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;평문 노출 ❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;암호화 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개인정보 보호&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;스니핑 가능 ❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;보호 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;HTTP/2 사용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;브라우저 미지원 ❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;완전 지원 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;브라우저 표시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;안전하지 않음&quot; 경고 ❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;자물쇠 아이콘 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인증서 비용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;해당 없음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Let's Encrypt 무료 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Let's Encrypt 덕분에 SSL 인증서는 무료로 발급받을 수 있습니다. 비밀번호를 다루는 서비스라면 HTTPS는 선택이 아니라 기본이라고 보시면 됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. HTTP/3와 QUIC - TCP를 버리다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/3는 2022년 RFC 9114로 표준화된 가장 최신 버전입니다. 가장 큰 변화는 기반 전송 프로토콜이 TCP에서 &lt;b&gt;QUIC&lt;/b&gt;(Quick UDP Internet Connections)으로 바뀐 것입니다. 이름 그대로 UDP 위에서 동작하지만, 신뢰성과 순서 보장, 혼잡 제어는 QUIC이 자체적으로 구현합니다. &quot;UDP인데 안정적이라고?&quot; 싶지만, 그 안정성 로직을 TCP 대신 QUIC이 떠안았다고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 이점은 빠른 연결 수립입니다. TCP는 연결할 때 3-way 핸드셰이크가 필요하고, HTTPS라면 TLS 핸드셰이크까지 더해집니다. QUIC은 이 과정을 통합해 첫 연결에서도 한 번의 왕복으로 처리하고, 한 번 접속했던 서버라면 0-RTT로 데이터를 바로 보냅니다. 지연이 큰 환경일수록 이 한두 번의 왕복 차이가 체감으로 다가옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  연결 수립 왕복 횟수 비교&lt;/b&gt;&lt;br /&gt;HTTP/1.1 (HTTPS): TCP 3-way + TLS &amp;rarr; 최소 2 RTT&lt;br /&gt;HTTP/2 (HTTPS): TCP 3-way + TLS 1.3 &amp;rarr; 최소 2 RTT (TLS 1.2면 3 RTT)&lt;br /&gt;HTTP/3 (QUIC): 통합 핸드셰이크 &amp;rarr; 첫 연결 1 RTT, 재연결 0 RTT&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. QUIC의 진짜 무기 - 스트림 독립성과 Connection Migration&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QUIC의 진짜 매력은 따로 있습니다. 앞에서 HTTP/2가 멀티플렉싱으로 HOL 블로킹을 해결했다고 했는데, 그건 애플리케이션 레이어 얘기입니다. TCP 레이어의 HOL 블로킹은 HTTP/2에도 여전히 남아 있어요. TCP는 패킷이 하나라도 손실되면, 그 패킷이 재전송될 때까지 연결 전체가 대기합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QUIC은 UDP 위에서 각 스트림을 독립적으로 관리합니다. 스트림 A에서 패킷이 빠져도 스트림 B, C는 멈추지 않고 계속 갑니다. 패킷 손실이 잦은 모바일&amp;middot;무선 환경에서 HTTP/2보다 확실히 안정적인 이유가 여기에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  Connection Migration - 와이파이에서 LTE로 갈아타도 안 끊긴다&lt;/b&gt;&lt;br /&gt;TCP 연결은 IP와 포트의 조합으로 식별됩니다. 그래서 와이파이에서 LTE로 넘어가 IP가 바뀌면 연결이 끊기죠. QUIC은 Connection ID라는 별도 식별자로 연결을 관리해서, IP가 바뀌어도 연결이 그대로 이어집니다. 영상 스트리밍이나 실시간 통신에서 특히 빛을 발합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 HTTP/3는 TLS 1.3이 프로토콜 자체에 내장돼 있습니다. QUIC 없이는 HTTP/3가 성립하지 않고, 암호화 없는 연결도 불가능합니다. 보안이 옵션이 아니라 기본값인 셈이죠. YouTube나 Google 검색은 이미 QUIC을 기본으로 쓰고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. HTTP/1.1 vs HTTP/2 vs HTTP/3 한눈에 비교&lt;/h2&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;background: #2a9d8f; color: white;&quot;&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;HTTP/1.1&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;HTTP/2&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd;&quot;&gt;HTTP/3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;표준화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;1997년 (RFC 2068)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2015년 (RFC 7540)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;2022년 (RFC 9114)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;전송 프로토콜&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;TCP&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;TCP&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;UDP (QUIC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;데이터 형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;텍스트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;바이너리 프레임&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;바이너리 프레임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;멀티플렉싱&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅ (스트림 독립)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;헤더 압축&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅ HPACK&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅ QPACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;TCP HOL 블로킹&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;있음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;있음 (TCP 레이어)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;없음 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Connection Migration&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;TLS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;선택 (권장)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;사실상 필수&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;내장 (필수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Apache 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;✅ (mod_http2)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. Apache는 왜 아직도 HTTP/3를 지원하지 않나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx도 되고 Caddy도 되고 LiteSpeed도 되는데, Apache HTTP Server는 2026년 현재까지도 정식 릴리스에서 HTTP/3를 네이티브로 지원하지 않습니다. 버전 관리가 게을러서? 아닙니다. 구조적인 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache의 MPM(Multi-Processing Module) 구조는 처음부터 TCP 소켓 기반으로 설계됐습니다. 핵심 모듈들이 TCP 소켓 API를 직접 호출하도록 짜여 있죠. 그런데 HTTP/3는 TCP가 아니라 UDP 위의 QUIC을 씁니다. Apache에 HTTP/3를 넣으려면 네트워크 I/O 처리 방식, 즉 MPM 구조 자체를 다시 설계해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수십 년 쌓인 코드베이스의 뿌리를 건드리는 작업이라, 실험적 모듈 시도는 있어도 안정화까지는 시간이 걸리는 게 당연합니다. 개인적으로는 &quot;안 하는 게 아니라 못 하는 거에 가깝다&quot;고 봅니다. 그만큼 Apache가 TCP 위에서 단단하게 굳어 있다는 방증이기도 하고요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. nginx&amp;middot;LiteSpeed&amp;middot;Caddy는 되는데 - 2026년 지원 현황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 흔히 도는 오해 하나를 짚고 넘어가겠습니다. &quot;nginx는 유료 버전(Nginx Plus)에서만 HTTP/3가 된다&quot;는 얘기인데, 이건 옛날 정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  정정 - nginx 오픈소스도 HTTP/3 지원합니다&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;nginx는 1.25.0 버전(2023년)부터 오픈소스 공식 빌드에 HTTP/3를 포함했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;무료입니다. 서버 블록에 listen 443 quic 지시어를 추가하고 UDP 443 포트를 열어 주면 됩니다(TLS 1.3 필수).&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;더 이상 유료 버전을 살 필요가 없어요.&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- nginx : 오픈소스 1.25.0부터 HTTP/3 지원 (무료)&lt;br /&gt;- LiteSpeed / OpenLiteSpeed : 수년 전부터 기본 활성화. UDP 443만 열면 끝&lt;br /&gt;- Caddy : 기본값으로 HTTP/3 지원&lt;br /&gt;- Apache : 정식 릴리스 네이티브 미지원. 앞단에 nginx&amp;middot;LiteSpeed 리버스 프록시를 두거나 CDN으로 우회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니까 Apache를 쓴다고 HTTP/3를 포기해야 하는 게 아닙니다. 우회로가 멀쩡히 있고, 그게 오히려 더 편합니다. 바로 다음 섹션 얘기죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 실무 경험담 - CDN + HTTP/1.1이면 충분하다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터가 제가 가장 강조하고 싶은 부분입니다. 오리진 서버가 Apache라서 HTTP/1.1밖에 못 쓴다고 해도, &lt;b&gt;CDN을 앞에 두면 클라이언트는 HTTP/3로 통신할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot; data-ke-size=&quot;size16&quot;&gt;  클라이언트 (브라우저)&lt;br /&gt;&amp;darr; HTTP/3 (QUIC) &amp;mdash; 빠른 암호화 연결&lt;br /&gt;☁️ CDN Edge (Cloudflare &amp;middot; CloudFront)&lt;br /&gt;&amp;darr; HTTP/1.1 (TCP) &amp;mdash; 내부망, 지연 극소&lt;br /&gt; ️ 오리진 서버 (Apache)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조는 단순합니다. 클라이언트는 가까운 CDN 엣지 서버와 HTTP/3로 빠르게 통신하고, CDN이 오리진 Apache에는 HTTP/1.1로 요청을 전달합니다. CDN과 오리진 사이는 전용 백본망이나 데이터센터 내부라 지연이 극히 짧아서, 오리진이 구버전이어도 엔드 유저 입장에선 HTTP/3의 혜택을 그대로 누립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 블로그를 세 개 운영하면서 셋 다 앞에 Cloudflare 무료 플랜을 물려 두고 있습니다. 처음엔 &quot;오리진 서버 설정을 한참 만져야 하나&quot; 걱정했는데, 막상 해 보니 대시보드에서 토글 하나 켜는 걸로 HTTP/3가 붙더군요. 오리진은 손도 안 댔습니다. 색인이나 악성 트래픽으로 골치 썩을 때도 CDN 앞단이 1차 방어선 노릇을 해 줘서, 그 효용을 따지면 프로토콜 버전 고민은 사실 후순위였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  실무 구성 팁&lt;/b&gt;&lt;br /&gt;Cloudflare는 대시보드에서 Speed &amp;rarr; Optimization 메뉴의 HTTP/3 (with QUIC)를 켜면 즉시 적용됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;AWS CloudFront도 배포 설정에서 HTTP/3를 활성화할 수 있고요. 둘 다 오리진 설정은 건드릴 필요가 없습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache는 WordPress, PHP 생태계, .htaccess 기반 설정 같은 강력한 호환성을 가진 서버입니다. 멀쩡히 돌아가는 Apache를 HTTP/3 하나 때문에 nginx로 갈아엎는 건, 솔직히 대부분의 경우 과한 결정입니다. CDN 한 겹이면 마이그레이션 없이 성능과 보안을 다 챙길 수 있으니까요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. 상황별 프로토콜 선택 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결국 뭘 써야 하느냐. 상황별로 정리해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비밀번호&amp;middot;개인정보를 다루는 서비스 &amp;rarr; HTTPS(TLS)는 무조건 필수. 여기엔 타협이 없습니다.&lt;br /&gt;- 일반 웹 서비스 &amp;rarr; HTTP/2 + HTTPS가 현재의 표준이라고 보면 됩니다.&lt;br /&gt;- 이미 CDN을 쓰고 있다 &amp;rarr; HTTP/3는 설정 토글 한 번. 안 켤 이유가 없습니다.&lt;br /&gt;- 소규모 사이트&amp;middot;블로그 &amp;rarr; HTTP/1.1 + HTTPS + CDN 조합이면 차고 넘칩니다.&lt;br /&gt;- 내부망&amp;middot;로컬 개발&amp;middot;사설 마이크로서비스 &amp;rarr; HTTP/1.1 평문으로도 충분. 인증서 발급에 힘 뺄 필요 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 프로토콜 버전 숫자가 높다고 정답이 아니라는 점입니다. 비밀번호를 다루면 HTTPS, 트래픽이 글로벌이거나 정적 리소스가 많으면 CDN. 이 두 가지를 먼저 챙기고 나면, HTTP/3는 그 위에 얹히는 보너스에 가깝습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. HTTP/2를 쓰면 HTTP/1.1보다 얼마나 빨라지나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스가 많은 페이지(CSS&amp;middot;JS&amp;middot;이미지 수십 개)에서는 멀티플렉싱 효과로 로드 시간이 눈에 띄게 줄어드는 사례가 많습니다. 다만 리소스가 한두 개뿐인 단순 페이지나, 서버 응답 시간 자체가 병목인 경우엔 프로토콜만 바꿔서는 큰 효과를 보기 어렵습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 내 사이트가 HTTP/2를 지원하는지 어떻게 확인하나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chrome 개발자 도구(F12) &amp;rarr; Network 탭 &amp;rarr; Protocol 열을 보세요. h2면 HTTP/2, h3면 HTTP/3, http/1.1이면 HTTP/1.1입니다. Protocol 열이 안 보이면 헤더를 우클릭해서 추가하면 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. Apache에서 HTTP/2는 쓸 수 있나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능합니다. Apache 2.4.17 이상에서 mod_http2 모듈을 활성화하면 됩니다. 단 SSL(HTTPS)이 설정돼 있어야 합니다. HTTP/3는 앞서 설명한 대로 정식 지원이 안 되니, CDN을 앞에 두는 방식을 권합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. HTTP/3는 모든 브라우저에서 지원하나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 현재 Chrome, Firefox, Safari, Edge 등 주요 브라우저는 모두 HTTP/3를 지원합니다. 관건은 브라우저가 아니라 서버 측이에요. Cloudflare나 CloudFront를 쓰면 별도 서버 구성 없이 HTTP/3를 제공할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 소규모 서비스도 HTTP/3까지 신경 써야 하나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 그럴 필요는 없습니다. HTTP/1.1 + HTTPS + CDN 조합이면 소규모 서비스는 충분합니다. 비밀번호를 다룬다면 HTTPS만 빠뜨리지 마세요. HTTP/3는 CDN을 이미 쓰고 있다면 옵션만 켜면 되니, 따로 큰 작업을 들일 일은 아닙니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. HTTP/3 도입했는데 일부 연결이 HTTP/2로 떨어집니다. 정상인가요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상입니다. QUIC은 UDP를 쓰는데, 일부 기업 방화벽이나 통신 환경에서 UDP 443이 막혀 있으면 브라우저가 자동으로 HTTP/2(TCP)로 폴백합니다. HTTP/3는 &quot;되면 쓰고 안 되면 내려가는&quot; 구조라, 폴백 자체가 설계의 일부입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1은 호환성과 단순함으로 거의 30년을 버텼고, 디버깅이 쉬워 운영 환경에서 여전히 현역입니다. HTTP/2는 멀티플렉싱과 헤더 압축으로 성능을 끌어올리며 지금의 표준이 됐고, HTTPS와 묶이면서 보안까지 끌고 왔습니다. HTTP/3는 QUIC으로 TCP의 한계를 넘어 모바일&amp;middot;고손실 환경에서 빛납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 제가 실무에서 내린 결론은 좀 다른 결입니다. 프로토콜 버전 경쟁에 매달리기보다, &lt;b&gt;비밀번호를 다루면 HTTPS, 트래픽을 빠르게 뿌리려면 CDN&lt;/b&gt; &amp;mdash; 이 두 가지를 먼저 챙기는 게 훨씬 실질적입니다. Apache가 HTTP/3를 지원하든 안 하든, Cloudflare 앞단 한 겹이면 클라이언트는 HTTP/3를 누립니다. 멀쩡한 서버를 버전 숫자 하나 때문에 갈아엎는 건, 적어도 제 경험상으론 답이 아니었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 트래픽 규모가 어마어마하거나 오리진 단의 미세 최적화까지 짜내야 하는 서비스라면 얘기가 또 달라지겠죠. 정답은 결국 내 서비스의 규모와 트래픽 성격이 정해 줍니다. 이 글이 그 판단의 출발점이 됐으면 합니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;용어집 - 헷갈리는 네트워크 용어 정리&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본문에 나온 용어 중 처음 보면 막히기 쉬운 것들만 풀어서 정리했습니다. 위로 올라가 다시 읽기 귀찮을 때 여기서 빠르게 확인하세요.&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 647px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;용어&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;쉽게 풀어쓰면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;TCP / UDP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;데이터를 주고받는 두 가지 방식. TCP는 순서&amp;middot;도착을 꼼꼼히 보장하지만 느릴 수 있고, UDP는 일단 빠르게 보내는 방식. QUIC은 빠른 UDP 위에 TCP의 안정성을 다시 얹은 것.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;핸드셰이크 (Handshake)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;통신을 시작하기 전 서버와 &quot;연결할까요? 좋아요&quot; 하고 인사를 주고받는 과정. 인사 횟수가 많을수록 첫 연결이 느려진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;RTT / 0-RTT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;RTT(Round Trip Time)는 신호가 갔다가 돌아오는 한 번의 왕복 시간. 0-RTT는 그 왕복 없이 데이터를 바로 보내는 것으로, 재접속 시 체감 속도가 빨라진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;HOL 블로킹&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;Head-of-Line Blocking. 줄 맨 앞 사람이 막히면 뒷사람 전부 못 가는 상황. 앞 요청 하나가 늦으면 뒤 요청들이 다 같이 대기하는 병목.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 38px;&quot;&gt;&lt;b&gt;멀티플렉싱 (Multiplexing)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 38px;&quot;&gt;연결 하나로 여러 요청&amp;middot;응답을 동시에 주고받는 기술. 차선 하나에서 여러 대가 한꺼번에 달리는 셈.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 21px;&quot;&gt;&lt;b&gt;스트림 (Stream)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;연결 하나 안에서 독립적으로 흐르는 데이터의 한 줄기. HTTP/2&amp;middot;3는 여러 스트림을 동시에 다룬다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 21px;&quot;&gt;&lt;b&gt;Keep-Alive&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;한 번 맺은 연결을 끊지 않고 다음 요청에 재사용하는 것. 매번 새로 연결하는 수고를 던다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;QUIC&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;Quick UDP Internet Connections. HTTP/3의 토대가 되는 전송 프로토콜. UDP 위에서 동작하면서 신뢰성&amp;middot;암호화를 자체적으로 처리한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 21px;&quot;&gt;&lt;b&gt;TLS / TLS 1.3&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;통신 내용을 암호화하는 보안 규약. HTTPS의 'S'가 바로 이것. 1.3은 가장 최신 버전으로 더 빠르고 안전하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 21px;&quot;&gt;&lt;b&gt;HPACK / QPACK&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;반복되는 헤더를 압축해 대역폭을 아끼는 기술. HPACK은 HTTP/2, QPACK은 HTTP/3에서 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;Connection Migration&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;와이파이에서 LTE로 갈아타 IP가 바뀌어도 연결을 끊지 않고 이어 주는 QUIC의 기능. Connection ID라는 식별자로 연결을 추적한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;서버 푸시 / 103 Early Hints&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;서버 푸시는 요청 전에 리소스를 미리 밀어 넣던 HTTP/2 기능(현재 퇴장). 103 Early Hints는 &quot;이것들 미리 받아 두세요&quot;라고 힌트만 주는 대체 방식.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;도메인 샤딩&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;HTTP/1.1의 연결 수 한계를 우회하려고 리소스를 여러 서브도메인에 나눠 담던 옛날 기법. HTTP/2 멀티플렉싱 등장으로 더는 필요 없어졌다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;CDN / 오리진 / 엣지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;CDN은 콘텐츠를 사용자 가까이에 뿌려 주는 분산 네트워크. 원본 서버를 '오리진', 사용자와 가까운 CDN 서버를 '엣지'라 부른다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;리버스 프록시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;클라이언트 요청을 대신 받아 뒤쪽 서버로 전달하는 중간 서버. 앞단에서 HTTP/3를 받아 뒤 서버엔 HTTP/1.1로 넘기는 식으로 쓴다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;MPM (Apache)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;Multi-Processing Module. Apache가 연결과 요청을 처리하는 핵심 구조. TCP 기반으로 설계돼 있어 HTTP/3(UDP) 적용이 어렵다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 42px;&quot;&gt;&lt;b&gt;폴백 (Fallback)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;상위 방식이 안 되면 자동으로 하위 방식으로 내려가는 것. HTTP/3가 막히면 HTTP/2로 떨어지는 식으로 안전장치 역할을 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786939987531&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&quot; data-og-description=&quot;Apache, Nginx, Apache Tomcat의 차이를 한 번에 정리합니다. 셋 다 &amp;quot;서버&amp;quot;라는 이름이 붙지만 Apache와 Nginx는 웹서버, Tomcat은 WAS(서블릿 컨테이너)로 역할이 다릅니다. 이 글은 1995년부터 2026년까지 웹서버&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kDxvF/dJMb8QMsT3P/3omb9HRBiqUlTxU5PcmWs1/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/Wrfeo/dJMb8UagwRt/XP6E9DIeDiGLAFVcamXSgK/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/eZbEO/dJMb8TCqzII/gcyzWv0KrcaJvDtfY9OpnK/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kDxvF/dJMb8QMsT3P/3omb9HRBiqUlTxU5PcmWs1/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/Wrfeo/dJMb8UagwRt/XP6E9DIeDiGLAFVcamXSgK/img.png?width=800&amp;amp;height=679&amp;amp;face=493_151_554_217,https://scrap.kakaocdn.net/dn/eZbEO/dJMb8TCqzII/gcyzWv0KrcaJvDtfY9OpnK/img.png?width=1200&amp;amp;height=1019&amp;amp;face=740_226_831_325');&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;Apache Nginx Tomcat 차이 완벽 정리 - 웹서버 30년 변천사로 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Apache, Nginx, Apache Tomcat의 차이를 한 번에 정리합니다. 셋 다 &quot;서버&quot;라는 이름이 붙지만 Apache와 Nginx는 웹서버, Tomcat은 WAS(서블릿 컨테이너)로 역할이 다릅니다. 이 글은 1995년부터 2026년까지 웹서버&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786939964663&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&quot; data-og-description=&quot;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &amp;quot;이건 그냥 외워둬&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dkFJcg/dJMb8QMsT3E/YltMx04HkwdEIKjopZkeG1/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/E90Oq/dJMb8PGMRtU/ZpUhJEXMqz5RVAxJHilDS0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/8QQxv/dJMb89yuik3/sUHnguvET3XSLTKsbwCwgk/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dkFJcg/dJMb8QMsT3E/YltMx04HkwdEIKjopZkeG1/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/E90Oq/dJMb8PGMRtU/ZpUhJEXMqz5RVAxJHilDS0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/8QQxv/dJMb89yuik3/sUHnguvET3XSLTKsbwCwgk/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321');&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &quot;이건 그냥 외워둬&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786939961404&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&quot; data-og-description=&quot;DNS 레코드 타입은 도메인을 한 번이라도 직접 운영해 본 사람이라면 반드시 마주치는 개념입니다. A, AAAA, CNAME, MX, TXT, NS &amp;mdash; 이름만 보면 뭐가 뭔지 감이 잘 안 오지만, 각각 도메인 주소를 IP에 연&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpZoMC/dJMb8U9akmA/zcEkwCpFfkwkcTI0Wt7sb1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/pqxtS/dJMb8QMsT3A/j3Uxt6kG46oeocqacFQTOK/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/DtHS1/dJMb8UagwRj/cgRFirbbhwZxyZOUNkNVK0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpZoMC/dJMb8U9akmA/zcEkwCpFfkwkcTI0Wt7sb1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/pqxtS/dJMb8QMsT3A/j3Uxt6kG46oeocqacFQTOK/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/DtHS1/dJMb8UagwRj/cgRFirbbhwZxyZOUNkNVK0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316');&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DNS 레코드 타입은 도메인을 한 번이라도 직접 운영해 본 사람이라면 반드시 마주치는 개념입니다. A, AAAA, CNAME, MX, TXT, NS &amp;mdash; 이름만 보면 뭐가 뭔지 감이 잘 안 오지만, 각각 도메인 주소를 IP에 연&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786939958234&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;크론(cron) 표현식 완벽 정리 - 0 0 * * * 의미부터 초 단위 실행, 실시간 큐 전환까지&quot; data-og-description=&quot;크론(cron) 표현식은 리눅스 크론탭부터 스프링 @Scheduled, node-cron까지 거의 모든 백엔드 환경에서 쓰이지만, 막상 0 0 * * * 같은 표현을 볼 때마다 또 검색창을 열게 됩니다. 이 글에서는 다섯 칸의 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPwCHj/dJMb9bwiDrx/IRPKlWfBhnCcmNtfKdioE0/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/bqTNzn/dJMb9kUjkHL/e1aOP4yUezVzh9mC7mEJ51/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/t2LH3/dJMb9b38pLI/lpbClZ0kiAG8LM2YQkMPqk/img.png?width=1200&amp;amp;height=1016&amp;amp;face=834_206_952_335&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPwCHj/dJMb9bwiDrx/IRPKlWfBhnCcmNtfKdioE0/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/bqTNzn/dJMb9kUjkHL/e1aOP4yUezVzh9mC7mEJ51/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/t2LH3/dJMb9b38pLI/lpbClZ0kiAG8LM2YQkMPqk/img.png?width=1200&amp;amp;height=1016&amp;amp;face=834_206_952_335');&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;크론(cron) 표현식 완벽 정리 - 0 0 * * * 의미부터 초 단위 실행, 실시간 큐 전환까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크론(cron) 표현식은 리눅스 크론탭부터 스프링 @Scheduled, node-cron까지 거의 모든 백엔드 환경에서 쓰이지만, 막상 0 0 * * * 같은 표현을 볼 때마다 또 검색창을 열게 됩니다. 이 글에서는 다섯 칸의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786939954729&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;HTTP 상태 코드 정리표 - 404보다 무서운 건 200이었습니다&quot; data-og-description=&quot;HTTP 상태 코드는 서버가 브라우저의 요청을 어떻게 처리했는지 알려주는 세 자리 숫자입니다. 그런데 실무에서 저를 가장 오래 괴롭힌 장애는 404나 500이 아니었습니다. 멀쩡하게 200을 돌려주면&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rPafR/dJMb8RkiQdv/PFCMiy9c7mVgckVUNy7agk/img.png?width=800&amp;amp;height=641&amp;amp;face=498_148_569_225,https://scrap.kakaocdn.net/dn/89SB8/dJMb8U9akmr/a4knne2KBCZWsdzifmeOs0/img.png?width=800&amp;amp;height=641&amp;amp;face=498_148_569_225,https://scrap.kakaocdn.net/dn/clQzQQ/dJMb8QMsT3r/PFSaf8WKObO7UFY5myfLUK/img.png?width=1200&amp;amp;height=962&amp;amp;face=738_213_848_334&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rPafR/dJMb8RkiQdv/PFCMiy9c7mVgckVUNy7agk/img.png?width=800&amp;amp;height=641&amp;amp;face=498_148_569_225,https://scrap.kakaocdn.net/dn/89SB8/dJMb8U9akmr/a4knne2KBCZWsdzifmeOs0/img.png?width=800&amp;amp;height=641&amp;amp;face=498_148_569_225,https://scrap.kakaocdn.net/dn/clQzQQ/dJMb8QMsT3r/PFSaf8WKObO7UFY5myfLUK/img.png?width=1200&amp;amp;height=962&amp;amp;face=738_213_848_334');&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;HTTP 상태 코드 정리표 - 404보다 무서운 건 200이었습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 상태 코드는 서버가 브라우저의 요청을 어떻게 처리했는지 알려주는 세 자리 숫자입니다. 그런데 실무에서 저를 가장 오래 괴롭힌 장애는 404나 500이 아니었습니다. 멀쩡하게 200을 돌려주면&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>Apache</category>
      <category>CDN</category>
      <category>http1.1</category>
      <category>http2</category>
      <category>HTTP3</category>
      <category>QUIC</category>
      <category>네트워크</category>
      <category>아파치</category>
      <category>웹개발</category>
      <category>웹서버</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/100</guid>
      <comments>https://devwar.tistory.com/entry/http1-http2-http3-difference-2026#entry100comment</comments>
      <pubDate>Mon, 17 Aug 2026 13:13:29 +0900</pubDate>
    </item>
    <item>
      <title>동방생활 스킨 업데이트, 20260817 버전</title>
      <link>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2207&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ct1wc/dJMcaidrw5O/AFxu5EBHjtWpu5z46lkYyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ct1wc/dJMcaidrw5O/AFxu5EBHjtWpu5z46lkYyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ct1wc/dJMcaidrw5O/AFxu5EBHjtWpu5z46lkYyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCt1wc%2FdJMcaidrw5O%2FAFxu5EBHjtWpu5z46lkYyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2207&quot; height=&quot;1628&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2207&quot; data-origin-height=&quot;1628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동방생활&amp;nbsp;스킨&amp;nbsp;업데이트,&amp;nbsp;20260817&amp;nbsp;버전을 배포합니다. 이번 업데이트는 한 가지에 집중했습니다. &lt;b&gt;PC 넓은 화면에서 본문 양옆에 고정되는 플로팅 광고&lt;/b&gt;를 정식으로 구현했고, 좌측과 우측을 &lt;b&gt;각각 따로&lt;/b&gt; 켜고 끌 수 있게 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 솔직하게 말씀드리면, 이번 버전 까지는 스킨 옵션에 &quot;플로팅 광고 (PC)&quot; 항목이 있었지만 실제로 광고를 출력하는 코드가 빠져 있었습니다. 옵션을 켜고 슬롯 ID를 넣어도 화면에 아무것도 나오지 않았던 이유입니다. 혹시 켜보고 &quot;왜 안 되지?&quot; 하셨던 분이 있었다면, 이번 버전에서 해결됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무엇이 달라졌나요?&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; margin: 16px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background: #2563eb; color: #ffffff; padding: 10px 12px; border: 1px solid #c9ced8; text-align: left; width: 26%;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;background: #2563eb; color: #ffffff; padding: 10px 12px; border: 1px solid #c9ced8; text-align: left;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;&lt;b&gt;플로팅 광고 정식 구현&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;옵션만 있고 작동하지 않던 기능을 새로 만들었습니다. 화면 폭 1600px 이상 PC에서 본문 양옆에 세로형 애드센스가 스크롤을 따라 고정 표시됩니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;&lt;b&gt;좌/우 개별 on/off&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;기존의 통합 &quot;사용&quot; 옵션을 &quot;좌측 사용 / 우측 사용&quot;으로 분리했습니다. 왼쪽만, 오른쪽만, 양쪽 모두 &amp;mdash; 원하는 조합으로 운영할 수 있습니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;&lt;b&gt;본문 밀착 배치&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;광고가 화면 끝이 아니라 &lt;b&gt;본문 컬럼 양옆 16px 지점&lt;/b&gt;에 붙습니다. 와이드 모니터에서도 광고가 저 멀리 구석에서 따로 놀지 않고 콘텐츠 옆에 자연스럽게 자리합니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;&lt;b&gt;좁은 화면 자동 숨김&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8; vertical-align: top;&quot;&gt;1600px 미만(일부 노트북&amp;middot;태블릿&amp;middot;모바일)에서는 광고가 아예 렌더링되지 않습니다. 본문을 가리는 일도, 숨겨진 광고를 호출해서 생기는 애드센스 오류도 없습니다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;새 스킨 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킨 편집 &amp;rarr; 스킨 옵션의 &lt;b&gt;&quot;플로팅 광고 (PC)&quot;&lt;/b&gt; 그룹이 아래 4개 항목으로 바뀌었습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; margin: 16px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background: #2563eb; color: #ffffff; padding: 10px 12px; border: 1px solid #c9ced8; text-align: left; width: 24%;&quot;&gt;옵션&lt;/th&gt;
&lt;th style=&quot;background: #2563eb; color: #ffffff; padding: 10px 12px; border: 1px solid #c9ced8; text-align: left;&quot;&gt;설명&lt;/th&gt;
&lt;th style=&quot;background: #2563eb; color: #ffffff; padding: 10px 12px; border: 1px solid #c9ced8; text-align: left; width: 16%;&quot;&gt;기본값&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;좌측 사용&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;좌측 플로팅 광고 표시 여부&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;끔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;좌측 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;좌측에 표시할 애드센스 광고 단위 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;비어 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;우측 사용&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;우측 플로팅 광고 표시 여부&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;끔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;우측 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;우측에 표시할 애드센스 광고 단위 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;background: #ffffff; color: #333333; padding: 10px 12px; border: 1px solid #c9ced8;&quot;&gt;비어 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작 규칙은 이렇습니다. 플로팅 광고는 스킨의 &lt;b&gt;애드센스 전체 &quot;사용&quot; 옵션이 켜져 있고 클라이언트 ID가 입력된 상태&lt;/b&gt;에서만 출력됩니다. 슬롯 ID가 비어 있으면 그쪽 광고는 자동으로 숨겨지므로, 빈 값 때문에 레이아웃이 깨질 걱정은 없습니다. 광고 단위는 애드센스에서 &lt;b&gt;디스플레이 광고(세로형 권장)&lt;/b&gt;로 만들면 되고, 좌우에 같은 슬롯을 넣어도 무방합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 업데이트는 &lt;b&gt;index.xml(스킨 옵션 정의)이 함께 바뀌었기 때문에, 스킨 편집에서 HTML/CSS만 교체하면 새 옵션이 나타나지 않습니다.&lt;/b&gt; 스킨 등록으로 전체를 교체해 주세요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 스킨 옵션에 입력해 둔 값(애드센스 클라이언트 ID, 각종 슬롯 ID 등)을 먼저 메모해 둡니다. 새로 등록한 스킨은 옵션이 기본값에서 시작합니다&lt;/li&gt;
&lt;li&gt;관리 &amp;rarr; 꾸미기 &amp;rarr; &lt;b&gt;스킨 변경 &amp;rarr; 스킨 등록&lt;/b&gt;에서 배포 파일(index.xml, skin.html, style.css, 미리보기 이미지)을 업로드하고 보관함에 저장합니다&lt;/li&gt;
&lt;li&gt;보관함에서 새 스킨을 &lt;b&gt;적용&lt;/b&gt;한 뒤, 스킨 옵션에서 메모해 둔 값을 다시 입력하고 &quot;플로팅 광고 (PC)&quot;에서 원하는 쪽을 켭니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고하세요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스킨 편집 미리보기에서는 플로팅 광고가 보이지 않습니다.&lt;/b&gt; 미리보기 창은 폭이 좁아 1600px 조건에 걸리지 않고, 애드센스도 미리보기 화면에는 광고를 내보내지 않습니다. 실제 블로그를 PC 브라우저 최대화 상태로 열어 확인해 주세요&lt;/li&gt;
&lt;li&gt;적용 직후에는 광고 자리가 잠시 비어 보일 수 있습니다. 새 광고 단위는 애드센스가 광고를 채우기 시작할 때까지 시간이 걸리는 게 정상입니다&lt;/li&gt;
&lt;li&gt;기존 버전에서 플로팅 광고 &quot;사용&quot;을 켜두셨던 분은 옵션이 좌/우로 분리되면서 설정이 초기화되므로, 업데이트 후 다시 켜주셔야 합니다&lt;/li&gt;
&lt;li&gt;광고는 본문과 사이드바를 침범하지 않는 바깥 여백에만 표시되고 화면이 좁아지면 스스로 사라지도록 설계했습니다. 모바일 사용성이나 애드센스 정책 측면에서 부담 없는 배치입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용하다가 막히는 부분이나 이상 동작이 있으면 댓글로 알려주세요. 다음 업데이트에 반영하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cItaCv/dJMcahFsSZd/kyzzjOiljFiaa0nTKKEC9K/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C_20260817.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;동방생활_20260817.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFh6rN/dJMcahFuDyl/SiExKolrAkK3nx8sBYPRN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFh6rN/dJMcahFuDyl/SiExKolrAkK3nx8sBYPRN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFh6rN/dJMcahFuDyl/SiExKolrAkK3nx8sBYPRN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFh6rN%2FdJMcahFuDyl%2FSiExKolrAkK3nx8sBYPRN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;448&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/151</guid>
      <comments>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84#entry151comment</comments>
      <pubDate>Mon, 17 Aug 2026 13:04:16 +0900</pubDate>
    </item>
    <item>
      <title>개발은전투다 스킨 업데이트, 20260817 버전</title>
      <link>https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2246&quot; data-origin-height=&quot;1680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDgXer/dJMcaa0FOtb/AFoGmdYqCrtl5Nr6PVE2PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDgXer/dJMcaa0FOtb/AFoGmdYqCrtl5Nr6PVE2PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDgXer/dJMcaa0FOtb/AFoGmdYqCrtl5Nr6PVE2PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDgXer%2FdJMcaa0FOtb%2FAFoGmdYqCrtl5Nr6PVE2PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2246&quot; height=&quot;1680&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2246&quot; data-origin-height=&quot;1680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발은전투다 스킨 업데이트, 20260817을 배포합니다. 이번 업데이트는 v2.9 이후 변경을 한 번에 묶은 릴리스로, 크게 두 축입니다. 하나는 &lt;b&gt;PC에서 본문을 훨씬 넓게 쓰도록&lt;/b&gt; 레이아웃을 손본 것이고, 다른 하나는 &lt;b&gt;애드센스 배치 시스템 완성&lt;/b&gt;입니다. 기존의 사이드바 스티키 광고에 더해 PC 좌우 플로팅 광고와 목록 인피드 광고가 추가되어, 이제 광고 3종을 전부 스킨 옵션에서 코드 수정 없이 켜고 끌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 기능은 전부 &lt;b&gt;기본 꺼짐(off)&lt;/b&gt;입니다. 업데이트만 해서는 광고가 멋대로 생기지 않으니 안심하고 교체하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변경 요약&lt;/h3&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 1.4em 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;background: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d0d7de; text-align: left; width: 32%;&quot;&gt;변경 항목&lt;/th&gt;
&lt;th style=&quot;background: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d0d7de; text-align: left;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;PC 본문 폭 확대&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;본문 텍스트 폭 752px &amp;rarr; 974px (약 30% 확대)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;목차 자동 정리&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;'함께 보면 좋은 글' 같은 안내 섹션 제목을 목차에서 자동 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;안내 링크 푸터 이동&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;개인정보처리방침&amp;middot;블로그 소개 링크가 메뉴에서 푸터로 자동 이동 (PC&amp;middot;모바일 공통)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;PC 좌우 플로팅 애드센스 &lt;b&gt;(신규)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;넓은 화면 좌우 여백에 160&amp;times;600 광고, 좌/우 개별 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;목록 인피드 애드센스 &lt;b&gt;(신규)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;홈&amp;middot;카테고리&amp;middot;검색 목록에서 글 카드 N개마다 광고 삽입, 간격&amp;middot;최대 개수 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PC 본문이 훨씬 넓어졌습니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 버전은 가독성을 이유로 본문 텍스트 폭을 820px로 제한하고, 글 카드와 본문 영역에 이중으로 넉넉한 패딩을 두고 있었습니다. 큰 모니터에서 보면 좌우 여백이 과하게 남는 구조였죠. 이번에 세 군데를 함께 손봤습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 레이아웃 폭 1340px &amp;rarr; &lt;b&gt;1440px&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;글 카드 좌우 패딩 32px &amp;rarr; 20px, 본문 좌우 패딩 34px &amp;rarr; 28px&lt;/li&gt;
&lt;li&gt;본문 가독폭 제한(max-width 820px) 해제 &amp;mdash; 본문이 카드 폭을 가득 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 실제 텍스트가 차지하는 폭이 &lt;b&gt;752px에서 974px로 약 30% 넓어졌습니다.&lt;/b&gt; 표나 코드 블록이 많은 개발 글에서 특히 체감이 큽니다. 모바일 레이아웃은 별도 규칙을 쓰기 때문에 영향이 없고, 더 넓게(혹은 좁게) 쓰고 싶다면 style.css의 &lt;code&gt;--maxw&lt;/code&gt; 변수 하나만 바꾸면 카드&amp;middot;본문&amp;middot;광고 위치가 전부 따라갑니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;목차에서 안내 섹션이 사라집니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 끝에 '  함께 보면 좋은 글' 같은 관련 글 안내 섹션을 소제목(H2/H3)으로 넣는 분들이 많은데, 기존에는 이 제목까지 목차에 잡혀서 목차가 지저분해지는 문제가 있었습니다. 이제 목차를 만들 때 이런 안내성 제목은 자동으로 건너뜁니다. 기본 제외 키워드는 '함께 보면 좋은 글', '함께 읽으면 좋은 글', '같이 보면 좋은 글' 등이고, 본문에 있는 섹션 자체는 그대로 유지됩니다 &amp;mdash; 목차 목록에서만 빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 문구를 쓰고 계시다면 skin.html에서 &lt;code&gt;TOC_SKIP&lt;/code&gt; 배열을 찾아 키워드를 한 줄 추가하면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보처리방침&amp;middot;블로그 소개는 푸터로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애드센스 때문에 개인정보처리방침 페이지를 만들어 메뉴에 걸어두면, 상단 메뉴 한 자리를 안내용 링크가 차지하게 됩니다. 이번 버전부터는 이런 링크를 스킨이 알아서 &lt;b&gt;푸터(페이지 맨 아래)로 옮겨줍니다.&lt;/b&gt; PC 상단 메뉴와 모바일 서랍 메뉴 양쪽 모두에서요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동 규칙은 두 가지입니다. 주소에 &lt;code&gt;/pages/&lt;/code&gt;가 포함된 티스토리 페이지 링크는 전부 이동하고, 메뉴나 공지 목록에 있는 항목 중 제목이 '개인정보처리방침' 또는 '블로그 소개'인 것도 함께 이동합니다. 일반 공지(&quot;점검 안내&quot; 같은)는 건드리지 않고, 옮긴 뒤 공지 모듈이 비면 모듈째 숨겨서 빈 박스가 남지 않습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;신규: PC 좌우 플로팅 애드센스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이드 모니터에서 본문 좌우에 남는 여백에 160&amp;times;600 스카이스크래퍼 광고를 띄우는 기능입니다. 스크롤을 따라오는 고정(fixed) 방식이고, &lt;b&gt;왼쪽과 오른쪽을 각각 켜고 끌 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애드센스 정책에서 가장 조심해야 하는 게 '광고가 콘텐츠를 가리는 것'인데, 이 스킨은 화면 폭이 &lt;b&gt;1800px 이상일 때만&lt;/b&gt; 광고를 노출하도록 잠가뒀습니다. 그보다 좁은 화면에서는 광고 요청 자체를 보내지 않기 때문에 본문과 겹칠 일도, 노출 안 되는 광고를 요청해서 지표를 갉아먹을 일도 없습니다. FHD(1920px) 모니터 기준으로 광고와 본문 사이에 20px 간격이 유지됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;신규: 목록 인피드 애드센스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈&amp;middot;카테고리&amp;middot;검색 결과 목록에서 글 카드 사이사이에 광고를 끼워 넣는 기능입니다. 몇 개 카드마다 넣을지(기본 4), 한 페이지에 최대 몇 개까지 넣을지(기본 3)를 옵션으로 조절할 수 있습니다. 기본값 그대로면 목록 한 페이지(글 10개)에 4번째&amp;middot;8번째 카드 뒤로 광고 2개가 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 뒤에 이어지는 카드가 있을 때만 삽입되도록 해서, 목록 맨 끝에 광고만 덜렁 붙는 어색한 배치는 생기지 않습니다. 애드센스에서 &lt;b&gt;인피드 광고 단위&lt;/b&gt;를 만들어 layout-key 값을 입력하면 목록 디자인에 자연스럽게 녹아드는 형태로 나오고, 비워두면 일반 반응형 디스플레이 광고로 출력됩니다. 일단 기존 디스플레이 슬롯으로 켜보고 나중에 인피드 단위로 바꾸는 운영도 가능합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;새로 생긴 스킨 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 &amp;rarr; 꾸미기 &amp;rarr; 스킨 편집의 스킨 옵션에 두 그룹이 추가됐습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 1.4em 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;background: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d0d7de; text-align: left; width: 26%;&quot;&gt;그룹&lt;/th&gt;
&lt;th style=&quot;background: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d0d7de; text-align: left; width: 36%;&quot;&gt;옵션&lt;/th&gt;
&lt;th style=&quot;background: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d0d7de; text-align: left;&quot;&gt;기본값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot; rowspan=&quot;3&quot;&gt;광고 - PC 좌우 플로팅 애드센스&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;client ID (공통)&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;비어 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;왼쪽 표시 on/off + 왼쪽 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;오른쪽 표시 on/off + 오른쪽 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot; rowspan=&quot;4&quot;&gt;광고 - 목록 인피드 애드센스&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;표시 on/off + client + 슬롯 ID&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;인피드 layout-key (선택)&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;비어 있음 (반응형 폴백)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;삽입 간격 &amp;mdash; 카드 몇 개마다&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;페이지당 최대 개수&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d0d7de;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새로 설치하는 분&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;첨부된 파일 을 받습니다&lt;/li&gt;
&lt;li&gt;티스토리 관리 &amp;rarr; 꾸미기 &amp;rarr; 스킨 보관함에서 &lt;b&gt;스킨 등록&lt;/b&gt;으로 압축을 풀지 말고 파일들을 올린 뒤 적용합니다&lt;/li&gt;
&lt;li&gt;스킨 편집 &amp;rarr; 스킨 옵션에서 광고&amp;middot;색상 옵션을 설정합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 버전을 쓰고 계신 분&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디까지 적용할지에 따라 방법이 갈립니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;레이아웃 개선만 적용&lt;/b&gt; (본문 폭&amp;middot;목차&amp;middot;푸터 링크): 스킨 편집 &amp;rarr; html 편집에서 skin.html과 style.css 내용만 새 파일로 교체하면 됩니다. 새 광고 옵션 UI는 나타나지 않지만 나머지는 전부 동작합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 광고 기능까지 사용&lt;/b&gt;: 새 스킨 옵션은 index.xml에 정의되어 있어서 &lt;b&gt;스킨 보관함에 v3.2를 새로 등록 후 적용&lt;/b&gt;해야 옵션 입력란이 생깁니다. 스킨을 새로 적용하면 기존에 입력했던 스킨 옵션 값(포인트 색, 쿠팡 배너 id, 사이드 애드센스 등)이 초기화되니, 적용 전에 기존 값을 메모해 두세요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본문 폭 확대에 맞춰 에디터 기준 폭(contentWidth)이 720 &amp;rarr; 970으로 바뀌었습니다. 글 작성 화면이 기존보다 넓게 보이는 게 정상입니다&lt;/li&gt;
&lt;li&gt;플로팅 광고는 화면 폭 1800px 미만(대부분의 노트북)에서는 나오지 않습니다. 조건을 완화하면 본문과 겹쳐 정책 위반 소지가 있어 의도적으로 잠근 값입니다&lt;/li&gt;
&lt;li&gt;모든 광고 옵션은 client/슬롯 ID 형식이 올바를 때만 동작합니다. 값이 비었거나 틀리면 그 위치는 조용히 건너뜁니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하다 이상한 점이나 버그를 발견하면 이 글 댓글로 알려주세요. 재현 환경(브라우저&amp;middot;기기)과 함께 남겨주시면 다음 패치에 반영하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bO2XGX/dJMcaal0gj3/XzP2uJjTFekJiWyabqp3x1/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4_20260817.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;개발은전투다_20260817.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.13MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/150</guid>
      <comments>https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4-%EC%8A%A4%ED%82%A8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-20260817-%EB%B2%84%EC%A0%84#entry150comment</comments>
      <pubDate>Mon, 17 Aug 2026 12:28:14 +0900</pubDate>
    </item>
    <item>
      <title>개인정보처리방침</title>
      <link>https://devwar.tistory.com/pages/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인정보처리방침&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'개발은전투다'(https://devwar.tistory.com, 이하 '본 블로그')는 이용자의 개인정보를 소중하게 생각하며, 「개인정보 보호법」 등 관련 법령을 준수하기 위해 노력하고 있습니다. 본 블로그는 별도의 회원가입 절차 없이 누구나 자유롭게 열람할 수 있는 개인 블로그이며, 개인정보 처리에 관한 사항은 아래와 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 수집하는 정보 및 수집 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 이용자의 개인정보를 직접 수집하지 않습니다. 다만 아래와 같은 정보가 플랫폼 또는 자동화된 방식으로 처리될 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;댓글&amp;middot;방명록:&lt;/b&gt; 댓글과 방명록은 티스토리(카카오) 플랫폼을 통해 작성됩니다. 로그인 상태로 작성한 경우 관련 계정 정보는 카카오의 &lt;a href=&quot;https://www.kakao.com/policy/privacy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개인정보처리방침&lt;/a&gt;에 따라 처리되며, 비로그인 상태로 작성한 경우 입력한 닉네임과 비밀번호는 티스토리 시스템에 저장됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 수집 정보:&lt;/b&gt; 서비스 이용 과정에서 쿠키(Cookie), 방문 일시, 조회한 페이지, 브라우저&amp;middot;기기 정보, 유입 경로 등이 자동으로 수집될 수 있습니다. 이 정보는 통계 형태로만 활용되며, 특정 개인을 식별하는 목적으로 사용되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 수집한 정보의 이용 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방문자 통계 분석 및 콘텐츠 품질 개선&lt;/li&gt;
&lt;li&gt;Google 애드센스(AdSense)를 통한 광고 게재&lt;/li&gt;
&lt;li&gt;댓글 및 문의에 대한 응대&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 쿠키(Cookie)의 사용 및 거부 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 웹사이트가 이용자의 브라우저에 저장하는 소량의 정보 파일입니다. 본 블로그는 방문 통계 분석과 광고 제공을 위해 쿠키를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이용자는 웹 브라우저의 설정을 통해 쿠키 저장을 거부하거나 저장된 쿠키를 삭제할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Chrome:&lt;/b&gt; 설정 &amp;rarr; 개인 정보 보호 및 보안 &amp;rarr; 쿠키 및 기타 사이트 데이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Edge:&lt;/b&gt; 설정 &amp;rarr; 쿠키 및 사이트 권한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Safari:&lt;/b&gt; 환경설정 &amp;rarr; 개인 정보 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 쿠키 저장을 거부할 경우 맞춤형 광고 등 일부 기능의 이용에 제한이 있을 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Google 애드센스 광고에 관한 안내&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 Google 애드센스를 통해 광고를 게재하고 있으며, 이와 관련하여 다음 사항을 알려드립니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google을 포함한 제3자 광고 사업자는 쿠키를 사용하여 이용자가 본 블로그 및 다른 웹사이트에 방문한 기록을 바탕으로 광고를 게재합니다.&lt;/li&gt;
&lt;li&gt;Google은 광고 쿠키를 사용하여 이용자의 이전 방문 기록을 토대로 맞춤형 광고를 제공할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이용자는 &lt;a href=&quot;https://adssettings.google.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google 광고 설정&lt;/a&gt;에서 맞춤 광고를 사용 중지할 수 있습니다.&lt;/li&gt;
&lt;li&gt;또한 &lt;a href=&quot;https://www.aboutads.info&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.aboutads.info&lt;/a&gt;를 방문하여 제3자 광고 사업자의 맞춤 광고용 쿠키 사용을 거부할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Google의 광고 쿠키 사용에 관한 자세한 내용은 &lt;a href=&quot;https://policies.google.com/technologies/ads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google 광고 기술 정책&lt;/a&gt;에서 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 통계 분석 도구의 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 방문자 현황 파악과 콘텐츠 개선을 위해 티스토리 기본 통계 및 Google 애널리틱스(Google Analytics)를 사용하고 있습니다. 이 과정에서 수집되는 정보는 익명화된 통계 데이터로, 특정 개인을 식별할 수 없습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 개인정보의 제3자 제공&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 이용자의 개인정보를 제3자에게 제공하지 않습니다. 다만 법령의 규정에 따라 수사기관 등이 적법한 절차를 거쳐 요청하는 경우는 예외로 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 이용자의 권리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이용자는 본인이 작성한 댓글&amp;middot;방명록을 직접 삭제할 수 있으며, 직접 삭제가 어려운 경우 아래 문의처를 통해 삭제를 요청할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이용자는 언제든지 브라우저 설정을 통해 쿠키 저장을 거부하거나 삭제할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 아동의 개인정보 보호&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 만 14세 미만 아동의 개인정보를 수집하지 않습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. 개인정보처리방침의 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 방침의 내용이 추가&amp;middot;삭제&amp;middot;수정되는 경우 본 페이지를 통해 공지하며, 변경된 방침은 게시한 날부터 효력이 발생합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. 문의처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 처리와 관련한 문의 사항은 아래로 연락해 주시기 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블로그 댓글&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행일:&lt;/b&gt; 본 개인정보처리방침은 2026년 8월 17일부터 적용됩니다.&lt;/p&gt;</description>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/pages/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8</guid>
      <pubDate>Mon, 17 Aug 2026 00:24:55 +0900</pubDate>
    </item>
    <item>
      <title>개발은전투다 소개</title>
      <link>https://devwar.tistory.com/pages/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4-%EC%86%8C%EA%B0%9C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qngDe.jpg&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/StNU5/dJMcaij7SD4/8L2CkAKtFceJjmfTDzfRok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/StNU5/dJMcaij7SD4/8L2CkAKtFceJjmfTDzfRok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/StNU5/dJMcaij7SD4/8L2CkAKtFceJjmfTDzfRok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FStNU5%2FdJMcaij7SD4%2F8L2CkAKtFceJjmfTDzfRok%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;1712&quot; height=&quot;1152&quot; data-filename=&quot;qngDe.jpg&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발은전투다 소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 코딩은 가르쳐주지만, 그 역사는 잘 알려주지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발은전투다는 &lt;b&gt;코드 너머의 이야기&lt;/b&gt;를 다루는 블로그입니다. 지금 우리가 매일 쓰는 프로그래밍 언어와 개발 도구가 어떤 문제에서 태어나 어떤 길을 걸어왔는지, 그리고 그 안에 담긴 개발 철학과 IT 트렌드의 흐름을 풀어냅니다. 문법과 사용법은 어디서든 배울 수 있지만, &quot;왜 이렇게 만들어졌는가&quot;를 알면 기술을 보는 눈이 달라진다고 믿습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2012년부터 웹 개발 실무를 이어오고 있는 현직 개발자가 운영하며, 매일 다루는 기술의 뿌리를 찾아가는 과정을 기록하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이런 이야기를 다룹니다&lt;/h3&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 16px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d7dce2; text-align: left; width: 32%;&quot;&gt;주제&lt;/th&gt;
&lt;th style=&quot;background-color: #2c3e50; color: #ffffff; padding: 10px 12px; border: 1px solid #d7dce2; text-align: left;&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2; background-color: #f4f6f8;&quot;&gt;&lt;b&gt;프로그래밍 언어의 역사&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2;&quot;&gt;언어가 태어난 배경과 설계자의 고민, 성장과 쇠퇴, 그리고 오늘의 모습까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2; background-color: #f4f6f8;&quot;&gt;&lt;b&gt;개발 도구가 걸어온 길&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2;&quot;&gt;에디터, 프레임워크, 인프라 등 개발 도구의 탄생과 변천사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2; background-color: #f4f6f8;&quot;&gt;&lt;b&gt;개발 철학&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2;&quot;&gt;패러다임과 방법론, 개발 문화 속에 담긴 생각과 논쟁들&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2; background-color: #f4f6f8;&quot;&gt;&lt;b&gt;IT 트렌드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px 12px; border: 1px solid #d7dce2;&quot;&gt;기술의 흐름을 역사적 맥락 속에서 읽어내는 시선&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;콘텐츠 작성 원칙&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공식 문서, 원 개발자의 인터뷰&amp;middot;발표 등 1차 자료를 우선 확인하여 작성합니다.&lt;/li&gt;
&lt;li&gt;단편적인 사실 나열이 아니라, 흐름과 맥락이 보이도록 이야기로 정리합니다.&lt;/li&gt;
&lt;li&gt;새로운 사실이나 변화가 확인되면 내용을 업데이트합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;티스토리 스킨 안내&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그에서는 직접 제작한 티스토리 스킨을 &lt;b&gt;무료로 배포&lt;/b&gt;하고 있습니다. 적용 방법과 변경 사항은 각 스킨의 배포 글과 패치노트에서 안내하며, 사용 중 발견한 버그나 개선 의견은 해당 글의 댓글로 남겨주시면 업데이트에 반영하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;광고 게재 안내&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 운영을 위해 Google 애드센스 광고를 게재하고 있습니다. 광고와 쿠키 사용에 관한 자세한 내용은 &lt;a href=&quot;[개인정보처리방침 페이지 주소]&quot;&gt;개인정보처리방침&lt;/a&gt;에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글에 대한 의견, 스킨 관련 문의, 기타 제안은 아래를 통해 보내주세요. 확인하는 대로 답변드리겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블로그 댓글&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술의 역사를 알면, 오늘의 전투가 달라집니다. 감사합니다.&lt;/p&gt;</description>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/pages/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4-%EC%86%8C%EA%B0%9C</guid>
      <pubDate>Mon, 17 Aug 2026 00:24:37 +0900</pubDate>
    </item>
    <item>
      <title>제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?</title>
      <link>https://devwar.tistory.com/entry/google-gemini-model-versions</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kfwXC.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8RxIL/dJMcacYvfv7/cpyC5GK8nPTZKG8mkLUkV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8RxIL/dJMcacYvfv7/cpyC5GK8nPTZKG8mkLUkV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8RxIL/dJMcacYvfv7/cpyC5GK8nPTZKG8mkLUkV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8RxIL%2FdJMcacYvfv7%2FcpyC5GK8nPTZKG8mkLUkV0%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; alt=&quot;제미나이 3.7 플래시 등장, 프로는 왜 아직도 3.1일까?&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;kfwXC.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준, 구글 제미나이(Gemini) 모델 종류와 최신 라인업의 특징을 정리하고, 플래시(Flash)는 3.7까지 나왔는데 왜 프로(Pro) 버전은 아직도 3.1에 머물러 있는지 그 현실적인 이유를 알아봅니다. 제미나이 API를 실무에 도입하려다 보면 너무 자주 바뀌는 버전 때문에 혼란스러울 때가 많습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;제미나이 3.7 플래시가 나왔다는데 프로는 왜 아직도 3.1인가요?&quot;&lt;br /&gt;&quot;Flash랑 Pro 중에 실무에선 뭘 써야 요금 폭탄을 피할 수 있죠?&quot;&lt;br /&gt;&quot;Flash-Lite는 또 뭔가요? 버전 이름이 너무 헷갈립니다.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 개인 프로젝트에 AI 기능을 연동하면서 가장 먼저 한 고민이 바로 '어떤 모델 버전을 선택할 것인가'였습니다. 작년까지만 해도 1.5 Pro나 2.0 Flash 정도면 충분했는데, 최근 몇 달 새 3.5, 3.6, 3.7까지 소수점 업데이트가 미친 듯이 쏟아지고 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 구글 클라우드나 AI 스튜디오를 통해 제미나이를 도입하려는 개발자와 기획자를 위해, 현재 시점의 모델별 특징과 유독 Pro 모델의 업데이트가 더딘 이유, 그리고 상황에 맞는 최적의 모델 선택 기준을 공유해 보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;구글 제미나이 라인업의 현재 상황 (2026년 하반기)&lt;/li&gt;
&lt;li&gt;Pro와 Flash, 두 모델의 태생적 차이&lt;/li&gt;
&lt;li&gt;플래시(Flash) 모델이 3.7까지 폭풍 업데이트된 이유&lt;/li&gt;
&lt;li&gt;왜 Pro 버전은 아직도 3.1에 머물러 있을까?&lt;/li&gt;
&lt;li&gt;실제 개발 환경에서 체감한 3.1 Pro의 한계&lt;/li&gt;
&lt;li&gt;대안으로 떠오른 Flash-Lite 라인업의 활용처&lt;/li&gt;
&lt;li&gt;상황별 제미나이 API 버전 선택 가이드&lt;/li&gt;
&lt;li&gt;코드 레벨에서의 Gemini API 버전 지정 주의사항&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 구글 제미나이 라인업의 현재 상황 (2026년 하반기)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 구글의 제미나이 라인업은 크게 '능력'을 중시하는 Pro와 '속도 및 효율성'을 중시하는 Flash, 그리고 초경량화된 Flash-Lite로 나뉩니다. 2026년 8월 중순을 기준으로 메인스트림 모델들의 현황은 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모델명&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;최신 버전 (기준)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;상태&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Gemini Flash&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.7 Flash (2026.08 출시)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;안정화 및 주력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Gemini Pro&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.1 Pro (2026.02 출시) / 2.5 Pro (안정)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프리뷰 (일부 지연)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Gemini Flash-Lite&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;3.5 Flash-Lite (2026.07 출시)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;비용 효율화 주력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표에서 보시듯 Flash 계열은 3.5, 3.6을 거쳐 최근 3.7까지 거침없이 업데이트된 반면, Pro 계열은 올해 초 공개된 3.1 버전에 멈춰 있습니다. 심지어 실무에서 안정적으로 돌리려면 아직도 2.5 Pro를 써야 하는 상황이죠.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Pro와 Flash, 두 모델의 태생적 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 이렇게 라인업을 쪼개놓은 이유는 사용자들의 요구사항이 양극화되었기 때문입니다. 모든 작업에 엄청나게 똑똑하고 무거운 AI가 필요한 건 아니니까요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  Pro는 연구원, Flash는 행동대장&lt;/b&gt;&lt;br /&gt;Pro 모델은 복잡한 논리 구조를 풀거나 대규모 코드 베이스를 분석하는 데 특화된 거대한 모델입니다. 반면 Flash는 빠르고 가볍게, 여러 번 API를 호출해야 하는 '에이전틱 워크플로우(Agentic Workflow)'에 맞춰진 모델입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flash는 1.5 세대(2024년 5월)에 '싸고 빠른' 등급으로 추가된 이후, 모바일 디바이스나 실시간 응답이 필요한 웹 서비스 환경을 타깃으로 진화해 왔습니다. 반대로 Pro는 100만~200만 토큰에 달하는 방대한 문맥(Context)을 한 번에 읽고 추론하는 데 자원을 몰빵한 녀석입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 플래시(Flash) 모델이 3.7까지 폭풍 업데이트된 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 유독 Flash 모델만 3.1, 3.5, 3.6, 3.7로 숨 가쁘게 버전업을 하는 이유는 무엇일까요? 가장 큰 이유는 &lt;b&gt;'비용 대비 성능(가성비) 전쟁'&lt;/b&gt; 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 트렌드는 하나의 똑똑한 AI에게 모든 걸 묻는 방식에서, 빠르고 저렴한 AI 여러 개를 동시에 굴려서 정답을 찾는 구조(에이전트 병렬 처리)로 넘어왔습니다. 구글 입장에서는 토큰당 단가를 낮추면서도 속도를 극한으로 끌어올린 Flash 모델을 지속적으로 개선해 시장 점유율을 방어해야만 했죠. 3.7 Flash의 경우 3.6 대비 다단계 워크플로우와 코드 생성 능력을 올리면서도 토큰 소비량은 오히려 줄이는 방향으로 최적화되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 왜 Pro 버전은 아직도 3.1에 머물러 있을까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 분들이 의아해하는 지점입니다. &quot;아니, 구글 정도 되는 기업이 왜 Pro 모델은 업데이트를 안 하나요?&quot; 결론부터 말씀드리면, &lt;b&gt;파운데이션 모델을 처음부터 다시 학습시키는 데는 엄청난 시간과 천문학적인 비용이 들기 때문&lt;/b&gt;입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  물리적인 학습 시간의 한계&lt;/b&gt;&lt;br /&gt;Flash 모델은 기존 모델의 파라미터를 다이어트(Distillation)하거나 최적화하는 방식으로 비교적 빠르게 버전을 올릴 수 있습니다. 하지만 3.1 Pro 같은 대형 추론 모델은 데이터셋 수집, 학습, 안전성 테스트(Red Teaming)를 거치는 데 수개월이 꼬박 걸립니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해외 개발자 커뮤니티(Reddit 등)의 동향을 보면, 원래 예정되었던 3.5 Pro의 출시가 몇 차례 지연되었다는 소식도 들려옵니다. 복잡한 추론(Deep Think) 모드와 멀티모달 처리 능력을 동시에 끌어올리면서 환각(Hallucination) 현상을 잡는 과정이 생각보다 까다로운 것으로 보입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실제 개발 환경에서 체감한 3.1 Pro의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 역시 사내 내부 툴을 만들면서 초기에는 &quot;무조건 똑똑한 게 좋지&quot;라며 Pro 버전을 연동했습니다. 하지만 곧 두 가지 현실적인 벽에 부딪혔습니다.&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;응답 지연(Latency):&lt;/b&gt; 간단한 JSON 파싱이나 텍스트 요약을 시켜도 Pro 모델은 응답하기까지 수 초 이상의 딜레이가 발생했습니다. 실시간 채팅 서비스에 붙이기엔 유저 이탈을 부르는 속도였죠.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요금 압박:&lt;/b&gt; 입력 토큰과 출력 토큰의 단가가 Flash와는 비교도 안 되게 비쌉니다. 무거운 모델이 굳이 안 해도 될 가벼운 고민까지 하느라 돈을 태우는 꼴이었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 전체 로직의 80%는 빠르고 싼 Flash로 돌리고, 정말 복잡한 알고리즘이나 법률 약관을 해석해야 하는 20%의 영역에만 Pro를 호출하도록 구조를 갈아엎어야 했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 대안으로 떠오른 Flash-Lite 라인업의 활용처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전이 파편화되면서 3.1과 3.5 버전대에 'Flash-Lite'라는 라인업이 추가되었습니다. 이 녀석은 Flash보다 더 가볍고 빠릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 어디에 쓰느냐 하면, 사용자의 입력값이 욕설인지 아닌지 판별하는 텍스트 분류(Classification) 작업이나 다국어 단순 번역, 혹은 대량의 로그 데이터를 정해진 포맷으로 깎아내는 파이프라인 작업에 제격입니다. 지연 시간에 극도로 민감한 프로덕션 환경이라면 현재로서는 3.5 Flash-Lite가 가장 합리적인 선택지입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 상황별 제미나이 API 버전 선택 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 지금 프로젝트를 시작하신다면 목적에 맞게 모델을 취사선택하셔야 합니다. 아래 기준을 참고해 보세요.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0px; height: 77px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; height: 20px;&quot;&gt;이용 목적&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; height: 20px;&quot;&gt;추천 모델&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #dddddd; background: #2a9d8f; color: white; height: 20px;&quot;&gt;선택 이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; height: 19px;&quot;&gt;&lt;b&gt;일반적인 웹/앱 챗봇 구축&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;3.7 Flash&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;최신 지식, 빠른 속도, 가성비의 최적 밸런스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; height: 19px;&quot;&gt;&lt;b&gt;대규모 데이터 실시간 파싱&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;3.5 Flash-Lite&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;응답 속도 최우선, 비용 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; background: #f9f9f9; height: 19px;&quot;&gt;&lt;b&gt;코드 리뷰, 논문 요약 등 심도 있는 분석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;2.5 Pro 또는 3.1 Pro(Preview)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #dddddd; height: 19px;&quot;&gt;컨텍스트를 깊게 이해하고 복잡한 추론 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 코드 레벨에서의 Gemini API 버전 지정 주의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이 API를 호출하실 때, 특정 소수점 버전(예: `gemini-3.7-flash`)을 코드에 하드코딩하는 것은 리스크가 있습니다. 구글이 이전 버전을 빠르게 Deprecated(지원 종료) 시키는 경향이 있기 때문입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;const { GoogleGenAI } = require(&quot;@google/genai&quot;);
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// 하드코딩 지양: 특정 버전이 만료되면 API 에러가 발생할 수 있습니다.
// const model = &quot;gemini-3.1-pro&quot;;

// 권장 방식: 안정화된 대표 별칭(Alias)을 사용하거나 환경변수로 관리하세요.
const model = process.env.GEMINI_MODEL || &quot;gemini-flash-latest&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 서비스가 중단되는 장애를 막으려면 환경변수(ENV)로 모델명을 분리해 두고, 구글 콘솔 공지를 모니터링하다가 안전하게 최신 버전으로 갈아타는 방식을 추천합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pro 버전의 향후 업데이트 일정은 어떻게 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 확실하게 공식 발표된 3.5 Pro의 출시일은 없으나, 커뮤니티 동향상 연말이나 내년 초에 대규모 추론 기능(Deep Think)이 보강된 새로운 Pro 라인업이 공개될 것으로 예상하고 있습니다. 그때까지는 2.5 Pro가 가장 안정적인 실무 선택지입니다. (10월 추가: 구글이 9월 30일 새 최고급 모델 제미나이 4 아르곤을 공개해 단계적으로 풀고 있고, 2.5 Pro는 이제 기존 사용자만 쓸 수 있어서 새 프로젝트라면 3.8 Flash부터 검토하시는 게 좋습니다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Flash-Lite가 Flash보다 무조건 싼가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, 맞습니다. 텍스트 입출력 기준으로 Flash-Lite 라인업은 Flash 대비 토큰당 가격이 훨씬 저렴하게 책정되어 있습니다. 단순 반복 작업이라면 무조건 Lite 라인업으로 전환하시길 권장합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무료(Free) 티어에서는 어떤 버전을 쓸 수 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 AI 스튜디오를 통하면 대부분의 Flash 최신 버전과 Pro 구버전(또는 프리뷰)을 일정 쿼리 제한(RPM) 내에서 무료로 테스트해 볼 수 있습니다. 단, 과금 카드를 등록하지 않으면 모델 학습에 데이터가 활용될 수 있으니 사내 기밀 데이터를 넣을 땐 주의해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시대가 변하면서 이제는 '가장 좋은 AI'를 하나 고르는 게 아니라, 상황에 맞게 &lt;b&gt;여러 버전의 모델을 적절히 조립하는 아키텍처 설계 능력&lt;/b&gt;이 개발자에게 요구되고 있습니다. 이번 글이 복잡한 제미나이 라인업을 이해하는 데 도움이 되셨길 바랍니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786890995722&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;Claude 챗&amp;middot;코워크&amp;middot;코드 차이 - 같은 모델인데 왜 일하는 성격이 다를까 (2026)&quot; data-og-description=&quot;&amp;quot;챗은 답이 정확한데 좀 느린 느낌이고&amp;hellip;&amp;quot;&amp;quot;코워크는 처음엔 답답한데 쓰다 보면 손발이 맞아.&amp;quot;&amp;quot;코드는 일단 만들어 놓고 보는 스타일 아니야?&amp;quot;&amp;quot;같은 Claude인데 왜 셋이 성격이 달라?&amp;quot; 요즘 동료들&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgNs1z/dJMb9jODc8M/RzgAwWSohEZ8JXJKRVCjPK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/wHfRj/dJMb9llnpYG/cKjJYcYsAdMjVPjqgEcSRK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/bjHEzt/dJMb9bwiAAe/TxS5zGhwB0CJDfKgFfEPQK/img.png?width=1200&amp;amp;height=962&amp;amp;face=731_238_824_339&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgNs1z/dJMb9jODc8M/RzgAwWSohEZ8JXJKRVCjPK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/wHfRj/dJMb9llnpYG/cKjJYcYsAdMjVPjqgEcSRK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/bjHEzt/dJMb9bwiAAe/TxS5zGhwB0CJDfKgFfEPQK/img.png?width=1200&amp;amp;height=962&amp;amp;face=731_238_824_339');&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;Claude 챗&amp;middot;코워크&amp;middot;코드 차이 - 같은 모델인데 왜 일하는 성격이 다를까 (2026)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;챗은 답이 정확한데 좀 느린 느낌이고&amp;hellip;&quot;&quot;코워크는 처음엔 답답한데 쓰다 보면 손발이 맞아.&quot;&quot;코드는 일단 만들어 놓고 보는 스타일 아니야?&quot;&quot;같은 Claude인데 왜 셋이 성격이 달라?&quot; 요즘 동료들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786890974329&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&quot; data-og-description=&quot;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kk6es/dJMb8WeQp6n/OMDAjkXNSHjNK8K8kk5kBk/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/c79lnf/dJMb9eT5NjD/xWEemKfAjKZXKMIWrrTcg0/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/ggHY5/dJMb8UagswX/FY8CK8uCEm2lq5WEAJ2XTk/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kk6es/dJMb8WeQp6n/OMDAjkXNSHjNK8K8kk5kBk/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/c79lnf/dJMb9eT5NjD/xWEemKfAjKZXKMIWrrTcg0/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/ggHY5/dJMb8UagswX/FY8CK8uCEm2lq5WEAJ2XTk/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309');&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786890965637&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdqh5c/dJMb9llnpYz/hxvfkJIPpolA58e1CmRvi0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/dFBgXD/dJMb87gm6hb/jdRFA5PMvpA2iYKEqyxPo1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/wAnwC/dJMb9kUjhR0/3hZzkAAbabApl6zEKmrcPk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdqh5c/dJMb9llnpYz/hxvfkJIPpolA58e1CmRvi0/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/dFBgXD/dJMb87gm6hb/jdRFA5PMvpA2iYKEqyxPo1/img.jpg?width=800&amp;amp;height=536&amp;amp;face=551_83_628_166,https://scrap.kakaocdn.net/dn/wAnwC/dJMb9kUjhR0/3hZzkAAbabApl6zEKmrcPk/img.jpg?width=1168&amp;amp;height=784&amp;amp;face=801_118_919_247');&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;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.실제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>ai스튜디오</category>
      <category>API연동</category>
      <category>Gemini</category>
      <category>LLM</category>
      <category>개발자블로그</category>
      <category>구글제미나이</category>
      <category>인공지능모델</category>
      <category>제미나이프로</category>
      <category>제미나이플래시</category>
      <category>트러블슈팅</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/146</guid>
      <comments>https://devwar.tistory.com/entry/google-gemini-model-versions#entry146comment</comments>
      <pubDate>Sun, 16 Aug 2026 23:36:59 +0900</pubDate>
    </item>
    <item>
      <title>그록 코딩이 클로드보다 빠른 이유</title>
      <link>https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5CH1N.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcZmV/dJMb99N9MZl/FqRKQGICdd1oH3iDlc41L0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcZmV/dJMb99N9MZl/FqRKQGICdd1oH3iDlc41L0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcZmV/dJMb99N9MZl/FqRKQGICdd1oH3iDlc41L0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcZmV%2FdJMb99N9MZl%2FFqRKQGICdd1oH3iDlc41L0%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; alt=&quot;그록 코딩이 클로드보다 빠른 이유&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;784&quot; data-filename=&quot;5CH1N.jpg&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그록 코딩이 클로드&amp;middot;챗지피티&amp;middot;제미나이와 어떻게 다른지 궁금한 개발자가 많습니다. 2026년 8월 기준으로 Grok 4.6은 속도&amp;middot;비용 효율&amp;middot;에이전틱 작업에서 두드러진 모습을 보이고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 개발자들이 검색창에 자주 던지는 질문은 이런 것들입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;그록이 코딩에 진짜 쓸 만한가요?&quot;&lt;br /&gt;&quot;클로드가 느리다는 말이 많은데 그록은 어떤가요?&quot;&lt;br /&gt;&quot;비용 대비 성능이 제일 좋은 AI 코딩 모델은?&quot;&lt;br /&gt;&quot;Cursor랑 연동해서 쓸 때 어떤 모델이 편한가요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 웹 개발을 오래 해 오면서 여러 AI를 번갈아 써 봤습니다. 최근에는 Claude가 품질은 좋은데 응답이 느려서 답답할 때가 있었고, Grok은 같은 프롬프트를 넣어도 훨씬 빠르게 결과가 나오는 느낌을 받았습니다. 이 글에서는 그 차이를 벤치마크와 실무 관점에서 정리해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 2026년 8월 시점의 Grok 4.6, Claude Opus 4.8&amp;middot;Fable 5, GPT-5.6 계열, Gemini 3.x를 기준으로 작성했습니다. 모델이 자주 바뀌는 만큼 버전과 시점을 함께 확인하시기 바랍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2026년 AI 코딩 모델 지형 한눈에 보기&lt;/li&gt;
&lt;li&gt;Grok의 전반적인 장점&lt;/li&gt;
&lt;li&gt;코딩 벤치마크로 본 Grok의 위치&lt;/li&gt;
&lt;li&gt;Claude와 코딩이 다른 점&lt;/li&gt;
&lt;li&gt;ChatGPT와 코딩이 다른 점&lt;/li&gt;
&lt;li&gt;Gemini와 코딩이 다른 점&lt;/li&gt;
&lt;li&gt;Grok이 특히 유리한 코딩 시나리오&lt;/li&gt;
&lt;li&gt;실무에서 모델 조합으로 쓰는 방법&lt;/li&gt;
&lt;li&gt;비용과 토큰 효율 비교&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 2026년 AI 코딩 모델 지형 한눈에 보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 중반을 지나면서 AI 코딩 모델은 크게 세 갈래로 나뉘는 분위기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품질 최상단을 차지하는 Claude 계열, 에이전틱&amp;middot;도구 활용에 강한 GPT-5.6 계열, 그리고 비용과 속도를 앞세운 Grok 계열입니다. Gemini는 긴 컨텍스트와 구글 생태계 연동에서 강점을 유지하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok 4.6은 2026년 8월 12일 공개됐습니다. 이전 모델인 Grok 4.5보다 여러 벤치마크에서 개선됐고, Artificial Analysis Intelligence Index에서 GPT-5.6 Sol과 동점을 기록하기도 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 &amp;ldquo;최고 점수&amp;rdquo;만으로 선택하지 않는다는 것입니다. 실제 개발 현장에서는 응답 속도, 토큰 비용, IDE 연동 편의성이 더 큰 영향을 미칩니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;강점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;코드 품질, 멀티파일 리팩터링&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;상대적으로 느린 응답, 높은 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;GPT-5.6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;에이전틱 작업, 도구 생태계&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일부 작업에서 토큰 소비 큼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Grok 4.6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;속도, 비용 효율, Cursor 연동&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;일부 벤치마크에서 최고점 미달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Gemini&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;긴 컨텍스트, 구글 서비스 연동&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;코딩 특화 에이전트 성숙도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Grok의 전반적인 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok의 가장 큰 차별점은 xAI의 철학에서 나옵니다. 실시간 X(구 트위터) 데이터를 직접 활용할 수 있고, 다른 모델에 비해 검열 강도가 낮은 편입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 측면에서는 Cursor와 함께 학습된 점이 눈에 띕니다. 실제로 Cursor 안에서 Grok을 기본 모델로 쓰는 개발자가 늘어나고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 속도도 체감 차이가 있습니다. 같은 프롬프트를 넣었을 때 Claude Opus 계열이 생각 시간을 길게 가져가는 반면, Grok은 비교적 빠르게 첫 토큰이 나오는 경우가 많습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  실무에서 느낀 점&lt;/b&gt;&lt;br /&gt;최근 간단한 버그 수정이나 유틸 함수를 만들 때 Claude에 맡기면 &amp;ldquo;생각하는 중&amp;hellip;&amp;rdquo;이 길어질 때가 있었습니다. Grok은 같은 요청에서도 훨씬 빨리 결과가 나와서 반복 작업할 때 편했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 눈에 띄는 점은 토큰 효율입니다. 같은 작업을 처리하는 데 출력 토큰을 상대적으로 적게 쓰는 경향이 보고되고 있습니다. 에이전트처럼 여러 번 호출하는 환경에서는 이 차이가 비용으로 바로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 코딩 벤치마크로 본 Grok의 위치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤치마크만 놓고 보면 Grok 4.6은 최상위권에 진입했습니다. Artificial Analysis Intelligence Index에서 GPT-5.6 Sol과 동점(61점)을 기록했고, CursorBench에서도 경쟁력 있는 점수를 냈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 SWE-bench 계열이나 Terminal-Bench에서는 Claude나 GPT-5.6이 앞서는 경우가 많습니다. 특히 복잡한 멀티파일 리팩터링이나 장시간 에이전트 작업에서는 Claude Fable 5나 Opus 계열이 여전히 강합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 벤치마크 점수보다 &amp;ldquo;실제 작업당 비용&amp;rdquo;입니다. 일부 측정에서는 Grok이 같은 작업을 훨씬 낮은 비용으로 처리하는 결과가 나왔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  참고&lt;/b&gt;&lt;br /&gt;벤치마크 수치는 측정 환경과 하네스에 따라 달라질 수 있습니다. 2026년 8월 기준으로 공개된 수치를 참고용으로만 보세요.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Claude와 코딩이 다른 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude는 여전히 코드 품질과 설명력에서 앞서는 경우가 많습니다. 특히 프론트엔드 컴포넌트 구조나 복잡한 비즈니스 로직을 정리할 때 &amp;ldquo;왜 이렇게 했는지&amp;rdquo;를 잘 설명해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 속도 면에서는 차이가 느껴집니다. Claude Opus나 Fable 계열은 신중하게 추론하는 대신 응답이 느려질 수 있습니다. 간단한 수정 작업을 반복할 때는 이 차이가 꽤 크게 다가옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용도 차이가 있습니다. Claude의 고성능 모델은 입력&amp;middot;출력 토큰 단가가 Grok보다 높은 편입니다. 대량으로 코드를 생성하거나 에이전트를 돌릴 때는 이 차이가 누적됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, 품질과 안정성을 최우선으로 할 때는 Claude, 속도와 비용을 중시할 때는 Grok 쪽으로 기울어지는 패턴이 보입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. ChatGPT와 코딩이 다른 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-5.6 계열은 에이전틱 작업과 도구 사용에서 강합니다. Codex나 터미널 기반 에이전트를 쓸 때 안정적인 편이고, 다양한 플러그인&amp;middot;함수 호출 생태계도 잘 갖춰져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok은 상대적으로 가벼우면서도 빠른 응답을 유지하는 쪽에 가깝습니다. Cursor와의 연동이 자연스럽고, 실시간 데이터를 활용해야 하는 작업에서 유리한 면이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 GPT 쪽은 긴 대화 맥락을 유지하면서 여러 도구를 순차적으로 호출하는 작업에서 더 성숙한 모습을 보입니다. 한 번에 많은 단계를 밟아야 하는 복잡한 파이프라인에서는 GPT를 선호하는 개발자가 여전히 많습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Gemini와 코딩이 다른 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemini의 가장 큰 무기는 긴 컨텍스트 창과 구글 생태계 연동입니다. 대규모 코드베이스를 한 번에 올려놓고 분석할 때 유리한 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 전용 에이전트나 IDE 연동 측면에서는 Grok이나 Claude보다 한 발 늦게 느껴질 때가 있습니다. 구글 워크스페이스나 BigQuery 등과 연결해서 쓰는 환경이라면 Gemini가 편하지만, 순수 코딩 작업만 놓고 보면 Grok이 더 빠른 피드백을 주는 편입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간 정보 접근 방식도 다릅니다. Gemini는 웹 검색과 구글 인덱스를 활용하고, Grok은 X의 실시간 흐름을 직접 가져옵니다. 최신 라이브러리 이슈나 커뮤니티 반응을 빠르게 확인해야 할 때는 Grok이 유리할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Grok이 특히 유리한 코딩 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok이 잘 맞는 경우는 비교적 명확합니다.&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;Cursor 안에서 빠르게 아이디어를 검증할 때&lt;/li&gt;
&lt;li&gt;토큰 비용을 아끼면서 에이전트를 여러 번 돌릴 때&lt;/li&gt;
&lt;li&gt;실시간으로 최신 정보가 필요한 라이브러리 이슈 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 대규모 레거시 코드를 안전하게 리팩터링하거나, 복잡한 아키텍처 결정을 내려야 할 때는 Claude나 GPT를 함께 쓰는 편이 낫습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  추천 조합&lt;/b&gt;&lt;br /&gt;설계와 복잡한 리팩터링은 Claude, 빠른 구현과 반복 작업은 Grok으로 나누는 방식이 실무에서 많이 쓰입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 실무에서 모델 조합으로 쓰는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 모델만 고집하기보다 역할에 따라 나누는 것이 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아키텍처 설계나 핵심 로직 검토는 Claude에 맡기고, 실제 코드 작성과 테스트 코드 생성은 Grok으로 빠르게 돌리는 식입니다. GPT는 터미널 기반 에이전트나 데이터 처리 파이프라인을 만들 때 보완적으로 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cursor 사용자라면 Grok을 기본 모델로 두고, 중요한 리뷰 단계에서만 Claude로 전환하는 방법도 가능합니다. 이 방식이 속도와 품질을 동시에 잡는 데 도움이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 비용과 토큰 효율 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준 API 가격을 대략적으로 비교하면 다음과 같습니다. (입력/출력 백만 토큰당 달러 기준) GPT-5.6 Sol은 정가 기준이고, 8월 21일부터는 할인가 $4/$20이 적용되고 있습니다(최소 11월 21일까지).&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;모델&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;입력&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;출력&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Grok 4.6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude Sonnet 계열&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$2~3&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$10~15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;Claude Opus 계열&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;GPT-5.6 Sol&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$5&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;$30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 단가뿐 아니라 실제 작업당 소모 토큰 수도 중요합니다. Grok이 같은 작업을 더 적은 출력 토큰으로 끝내는 경우가 보고되고 있어, 에이전트를 자주 돌리는 환경에서는 체감 비용 차이가 더 커질 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그록만으로 실무 코딩이 가능한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 기능 구현과 반복 작업은 충분히 가능합니다. 다만 대규모 리팩터링이나 아키텍처 수준의 결정은 Claude나 GPT와 함께 쓰는 편이 안전합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cursor에서 Grok을 쓰면 어떤 점이 좋은가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok이 Cursor와 함께 학습된 배경이 있어서 코드 컨텍스트를 잘 읽는 편입니다. 응답 속도도 빠른 편이라 편집기 안에서 바로바로 확인하기 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클로드가 느리다고 느끼는 건 저만의 경험인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고성능 모드일수록 추론 시간을 길게 가져가는 경향이 있습니다. 간단한 요청에도 &amp;ldquo;생각하는 중&amp;rdquo;이 길어질 때가 있어, 속도와 비용을 중시하는 작업에서는 Grok이 더 편하게 느껴질 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 8월 기준으로 Grok 4.6은 코딩에서 &amp;ldquo;최고 품질&amp;rdquo;보다는 &amp;ldquo;속도와 비용 효율&amp;rdquo;을 앞세운 선택지입니다. Claude가 품질 리더의 자리를 지키고 있고, GPT는 에이전틱 작업에서 강점을 보이는 가운데, Grok은 실무 개발자가 매일 반복하는 작업에서 부담을 줄여 주는 역할에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 모델만 고집하기보다 작업 성격에 따라 나눠 쓰는 것이 현재로서는 가장 현실적인 접근입니다. 속도가 필요할 때는 Grok, 신중함이 필요할 때는 Claude를 떠올려 보시면 좋겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786875914948&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&quot; data-og-description=&quot;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s4ayu/dJMb87OduUX/JN8drVTXzLVyh79v29tgR1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/s60xG/dJMb88GlENq/g3KhrelAJrKGclGUMsQKDk/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/SP4HR/dJMb83SzFaN/zq9mddVMYbsNKu5akyT5C1/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s4ayu/dJMb87OduUX/JN8drVTXzLVyh79v29tgR1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/s60xG/dJMb88GlENq/g3KhrelAJrKGclGUMsQKDk/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/SP4HR/dJMb83SzFaN/zq9mddVMYbsNKu5akyT5C1/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263');&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786875899460&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&quot; data-og-description=&quot;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAmQHp/dJMb8Xkv8Xr/3FDCvHimpe71kixAlYERG1/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/dLQc9V/dJMb8ZvR0A3/cpyaNOzYbLTPnkjhP7ZOTK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/coXrtF/dJMb8XSmw31/cHSBLWydXBeb2D5KqHqBB1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAmQHp/dJMb8Xkv8Xr/3FDCvHimpe71kixAlYERG1/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/dLQc9V/dJMb8ZvR0A3/cpyaNOzYbLTPnkjhP7ZOTK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/coXrtF/dJMb8XSmw31/cHSBLWydXBeb2D5KqHqBB1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249');&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786875896171&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&quot; data-og-description=&quot;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kk6es/dJMb8WeQp6n/OMDAjkXNSHjNK8K8kk5kBk/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/c79lnf/dJMb9eT5NjD/xWEemKfAjKZXKMIWrrTcg0/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/ggHY5/dJMb8UagswX/FY8CK8uCEm2lq5WEAJ2XTk/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kk6es/dJMb8WeQp6n/OMDAjkXNSHjNK8K8kk5kBk/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/c79lnf/dJMb9eT5NjD/xWEemKfAjKZXKMIWrrTcg0/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/ggHY5/dJMb8UagswX/FY8CK8uCEm2lq5WEAJ2XTk/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309');&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786875892185&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;Supabase 특징 및 AI 백엔드 구축 시 생기는 변화&quot; data-og-description=&quot;AI 코딩 도구를 활용한 서비스 개발이 대세가 되면서 Supabase 특징과 백엔드 구축 방식에 대한 관심이 급증하고 있습니다. 데이터베이스 세팅부터 사용자 인증, API 자동 생성까지 한 번에 처리되&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/supabase-features-ai-backend&quot; data-og-url=&quot;https://devwar.tistory.com/entry/supabase-features-ai-backend&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0M7BY/dJMb9frVIQg/iUFykll3ddXOTELOuPkOZK/img.png?width=800&amp;amp;height=597&amp;amp;face=512_100_567_160,https://scrap.kakaocdn.net/dn/bGbLZy/dJMb8Xkv8Xi/nbmz3dNnisEBuHKu6mLeoK/img.png?width=800&amp;amp;height=597&amp;amp;face=512_100_567_160,https://scrap.kakaocdn.net/dn/ixxMF/dJMb9ia7rpL/knLn00D2wZhMDoykJVBPc1/img.png?width=1200&amp;amp;height=896&amp;amp;face=765_142_856_241&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/supabase-features-ai-backend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/supabase-features-ai-backend&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0M7BY/dJMb9frVIQg/iUFykll3ddXOTELOuPkOZK/img.png?width=800&amp;amp;height=597&amp;amp;face=512_100_567_160,https://scrap.kakaocdn.net/dn/bGbLZy/dJMb8Xkv8Xi/nbmz3dNnisEBuHKu6mLeoK/img.png?width=800&amp;amp;height=597&amp;amp;face=512_100_567_160,https://scrap.kakaocdn.net/dn/ixxMF/dJMb9ia7rpL/knLn00D2wZhMDoykJVBPc1/img.png?width=1200&amp;amp;height=896&amp;amp;face=765_142_856_241');&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;Supabase 특징 및 AI 백엔드 구축 시 생기는 변화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구를 활용한 서비스 개발이 대세가 되면서 Supabase 특징과 백엔드 구축 방식에 대한 관심이 급증하고 있습니다. 데이터베이스 세팅부터 사용자 인증, API 자동 생성까지 한 번에 처리되&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>2026 AI 모델</category>
      <category>AI 코딩 비교</category>
      <category>chatGPT 코딩</category>
      <category>cursor ai</category>
      <category>Gemini 코딩</category>
      <category>Grok 4.6</category>
      <category>그록</category>
      <category>그록 코딩</category>
      <category>코딩 에이전트</category>
      <category>클로드 vs 그록</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/145</guid>
      <comments>https://devwar.tistory.com/entry/grok-coding-vs-claude-gpt-gemini#entry145comment</comments>
      <pubDate>Sun, 16 Aug 2026 19:29:52 +0900</pubDate>
    </item>
    <item>
      <title>동방생활 스킨 업데이트, 20260815 버전</title>
      <link>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C%EC%8A%A4%ED%82%A820260815</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_3pqjv13pqjv13pqj.png&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9ljS/dJMcaft71Mk/fakAk4fTqSj5VB9CUCACI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9ljS/dJMcaft71Mk/fakAk4fTqSj5VB9CUCACI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9ljS/dJMcaft71Mk/fakAk4fTqSj5VB9CUCACI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9ljS%2FdJMcaft71Mk%2FfakAk4fTqSj5VB9CUCACI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;동방생활 스킨 업데이트 &amp;mdash; 20260815 버전&quot; loading=&quot;lazy&quot; width=&quot;2400&quot; height=&quot;1792&quot; data-filename=&quot;Gemini_Generated_Image_3pqjv13pqjv13pqj.png&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 &quot;메뉴&quot; 기능을 정식 지원합니다. 페이지 관리에서 만든 페이지나 직접 등록한 링크를 이제 스킨에서 바로 보여줄 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐가 좋아졌나요?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블로그 관리의 &lt;b&gt;메뉴 관리&lt;/b&gt;에서 설정한 메뉴(페이지&amp;middot;외부 링크)가 이제 스킨에 표시됩니다. 기존 버전은 메뉴를 설정해도 화면 어디에도 나오지 않는 문제가 있었어요&lt;/li&gt;
&lt;li&gt;메뉴 위치는 &lt;b&gt;푸터(블로그 맨 아래)&lt;/b&gt; 입니다. 블로그 이름 바로 아래, RSS&amp;middot;방명록&amp;middot;태그 링크 위에 가로로 나란히 나옵니다. 본문을 가리지 않으면서 어떤 페이지에서든 접근할 수 있는 자리예요&lt;/li&gt;
&lt;li&gt;PC와 모바일 모두 같은 위치에 나와서 어느 기기로 봐도 헷갈리지 않습니다. 화면이 좁으면 메뉴가 자동으로 줄바꿈됩니다&lt;/li&gt;
&lt;li&gt;메뉴를 설정하지 않은 블로그에서는 메뉴 영역 자체가 표시되지 않습니다. 기존 사용자는 업데이트해도 화면이 달라지지 않으니 안심하고 교체하세요&lt;/li&gt;
&lt;li&gt;내부적으로 쓰지 않는 코드를 정리해서 스타일 파일이 조금 가벼워졌습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/NVdch/dJMcahlhkf9/MyZ33Ge7w6k2MaRHqgvdl1/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C_20260815.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;동방생활_20260815.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/144</guid>
      <comments>https://devwar.tistory.com/entry/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C%EC%8A%A4%ED%82%A820260815#entry144comment</comments>
      <pubDate>Sat, 15 Aug 2026 10:44:09 +0900</pubDate>
    </item>
    <item>
      <title>AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감</title>
      <link>https://devwar.tistory.com/entry/ai-spec-driven-development-trend</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjSoRr/dJMcaaM8H9f/2S1S9GFVj2MAMMdsl4l7V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjSoRr/dJMcaaM8H9f/2S1S9GFVj2MAMMdsl4l7V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjSoRr/dJMcaaM8H9f/2S1S9GFVj2MAMMdsl4l7V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjSoRr%2FdJMcaaM8H9f%2F2S1S9GFVj2MAMMdsl4l7V1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;911&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 개발 트렌드가 급격하게 변화하면서 개발자가 직접 소스 코드를 작성하는 방식 대신 정책서와 가이드 문서 기반의 스펙 주도 개발(SDD)이 실무의 핵심으로 자리 잡고 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;요즘 진짜 코드를 안 보고 문서만 써서 개발한다는 게 사실인가요?&quot;&lt;br /&gt;&quot;GitHub Copilot이나 Cursor 같은 도구가 나온 뒤로 개발자의 역할이 어떻게 바뀐 건가요?&quot;&lt;br /&gt;&quot;AI가 코드를 다 짜주면 이제 개발자는 정책서만 잘 쓰면 되는 시대인가요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2012년부터 웹 개발을 시작해 어느덧 13년 차에 접어든 저 역시 최근 개발 작업을 진행하며 이전과는 차원이 다른 생경함을 느끼고 있습니다. 불과 몇 년 전만 해도 에디터에서 직접 구문을 고민하며 타이핑하던 일상이 이제는 상세한 시스템 정책서와 가이드 문서를 만드는 일로 대체되었기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 GitHub Copilot의 주석 추천 시절부터 Cursor의 자동완성, 그리고 최근의 스펙 주도 개발로 이어진 AI 코딩 트렌드의 변천사를 살펴보고, 현직 개발자가 느낀 솔직한 체감과 실무 변화를 공유하고자 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GitHub Copilot의 첫인상: 주석 한 줄로 시작된 AI 코딩&lt;/li&gt;
&lt;li&gt;Cursor IDE가 가져온 자동완성의 충격과 변화&lt;/li&gt;
&lt;li&gt;코드를 보지 않는 개발: 정책서와 가이드 문서 중심의 변화&lt;/li&gt;
&lt;li&gt;AI 페어 프로그래밍 3단계 발전 과정 비교&lt;/li&gt;
&lt;li&gt;바이브 코딩의 한계와 스펙 주도 개발 SDD의 부상&lt;/li&gt;
&lt;li&gt;프롬프트 엔지니어링을 넘어선 컨텍스트 엔지니어링&lt;/li&gt;
&lt;li&gt;직접 코딩과 문서 기반 AI 개발의 장단점 비교&lt;/li&gt;
&lt;li&gt;AI 에이전트 시대 개발자의 진짜 역할 변화&lt;/li&gt;
&lt;li&gt;13년 차 개발자가 체감하는 미래 개발 생태계 전망&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. GitHub Copilot의 첫인상: 주석 한 줄로 시작된 AI 코딩&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Copilot이 처음 세상에 등장했을 때의 기억이 아직도 생생합니다. 코드 상단에 주석으로 의도를 적으면 아래에 그럴듯한 소스 코드가 추천되는 방식이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이메일 형식을 검증하는 함수 주석을 작성하면, AI가 Stack Overflow에서 찾아볼 법한 코드를 바로 제안해 주는 형태였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에는 구글링하고 복사해서 붙여넣는 수고를 조금 줄여주는 똑똑한 보조 도구 정도의 느낌이 강했습니다. 추천 결과가 프로젝트의 전체 맥락을 파악하지 못해 이상한 로직을 뱉어내면, 결국 사람이 직접 수정해야 하는 일이 많았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Cursor IDE가 가져온 자동완성의 충격과 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 2년 전 Cursor IDE가 등장하면서 AI 코딩의 흐름은 완전히 다른 차원으로 접어들었습니다. 단순히 라인 단위 코드를 추천하는 수준을 넘어섰기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cursor는 프로젝트 전체 코드베이스를 인덱싱하고 이해한 상태에서 작동했습니다. IDE 내부에서 파일과 파일 사이의 연관 관계를 파악해 멀티 파일 수정과 정교한 자동완성을 제공했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 키보드에 손을 올리고 구문을 치기 시작하면, 다음에 작성할 로직과 다른 파일의 변경 사항까지 연쇄적으로 제안해 주는 모습이 인상적이었습니다. 이때부터 일일이 타이핑하는 행위 자체가 점차 줄어들기 시작했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 코드를 보지 않는 개발: 정책서와 가이드 문서 중심의 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 실무에서 느껴지는 가장 신기한 변화는 제가 개발 소스 코드를 직접 보는 시간이 현저히 줄어들었다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는 IDE를 열고 코드 한 줄 한 줄을 읽으며 로직을 추적했다면, 지금은 서비스 정책서, 데이터 흐름도, 에러 처리 가이드라인 문서를 작성하는 데 대부분의 시간을 쏟고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 작성된 가이드 문서와 정책서를 AI 도구에 전달하면, AI 에이전트가 알아서 로직을 구현하고 테스트 코드까지 작성해 줍니다. 코드를 직접 수정하기보다 정책서의 예외 조건이나 모호한 문장을 바로잡는 것이 주된 개발 업무가 되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. AI 페어 프로그래밍 3단계 발전 과정 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구가 발전해 온 과정을 핵심 요소별로 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;1세대 (Copilot 초창기)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;2세대 (Cursor 부상기)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;3세대 (현재 Agentic SDD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;주석 기반 라인 추천&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;IDE 전체 자동완성 및 인덱싱&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정책서 및 명세 문서 기반 자율 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발자 주 업무&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;직접 코딩 및 추천 선택&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;AI 제안 수용 및 부분 수정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;시스템 정책서 및 가이드 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;컨텍스트 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;단일 파일 및 라인 단위&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프로젝트 전체 코드베이스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;비즈니스 요구사항 및 시스템 전체 명세&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주요 산출물&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;소스 코드 스니펫&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;소스 코드 및 프롬프트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정책 문서, 가이드라인, 시스템 규격서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 바이브 코딩의 한계와 스펙 주도 개발 SDD의 부상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각나는 대로 프롬프트에 문장을 던져 앱을 만드는 이른바 '바이브 코딩'이 한때 눈길을 끌었습니다. 그러나 실무 시스템에서는 대단히 위험한 접근이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 규모가 커지고 비즈니스 로직이 복잡해지면, 명확한 지침 없는 프롬프트는 기존 코드를 덮어쓰거나 엉뚱한 환각을 만들어내기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 한계를 극복하기 위해 부상한 것이 스펙 주도 개발(SDD, Spec-Driven Development)입니다. 개발에 앞서 요구사항과 예외 처리 규칙을 명확한 문서로 정의하고, AI가 해당 명세를 따라 코드를 생성하도록 통제하는 방식입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 프롬프트 엔지니어링을 넘어선 컨텍스트 엔지니어링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 AI에게 질문을 어떻게 잘 던질 것인가를 고민하는 프롬프트 엔지니어링이 강조되었습니다. 하지만 지금은 컨텍스트 엔지니어링의 중요성이 훨씬 높아졌습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  컨텍스트 엔지니어링이란?&lt;/b&gt;&lt;br /&gt;AI에게 전달할 질문의 기술보다, AI가 참조해야 할 프로젝트 규칙, 코딩 컨벤션, 시스템 구조, 정책 문서를 체계적으로 배치하고 설계하는 기술을 의미합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 루티에 `.cursorrules`나 `CLAUDE.md` 같은 시스템 가이드 문서를 촘촘히 작성해 두는 이유가 여기에 있습니다. AI가 시스템의 울타리를 벗어나지 않도록 가드레일을 쳐두는 일입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 직접 코딩과 문서 기반 AI 개발의 장단점 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스를 직접 타이핑하던 방식과 정책서 위주로 개발하는 방식은 각각 명확한 장단점을 가지고 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;평가 항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;전통적 직접 코딩 방식&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;정책서 기반 AI 개발 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;구문 작성 및 오타 수정에 많은 시간 소요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;명세 작성 후 AI 구현으로 속도 대폭 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;시스템 이해도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;손으로 한 줄씩 짜며 미세 로직 숙지&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;전체 아키텍처 중심으로 파악 및 세부 구현 간과 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;예외 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개발자 개인의 경험과 숙련도에 의존&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정책서에 명시된 규칙에 따라 일관되게 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;문제 해결 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;코드 브레이크포인트 추적 및 디버깅&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정책 문서의 모호함 정정 및 요구사항 재정의&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. AI 에이전트 시대 개발자의 진짜 역할 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13년 전 처음 개발을 시작했을 때는 프로그래밍 언어의 문법을 얼마나 빠르게 숙지하고 깔끔한 코드를 치느냐가 실력의 기준이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 지금 개발자의 진짜 경쟁력은 소스 코딩보다 비즈니스 문제를 명확한 기술 언어로 번역하고 구조화하는 능력에서 나옵니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  변화된 개발자의 핵심 역량&lt;/b&gt;&lt;br /&gt;1. 서비스 요구사항을 모호함 없이 정교한 정책서로 작성하는 문서화 능력&lt;br /&gt;2. AI가 만들어낸 결과물의 보안, 성능, 예외 상황 결함을 검증하는 안목&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 작성자에서 시스템 전체의 방향을 잡고 검증하는 조향사로 역할이 이동한 셈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 13년 차 개발자가 체감하는 미래 개발 생태계 전망&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손으로 소스 코드를 치지 않고 문서를 작성하면서 개발한다는 것이 처음에는 월급 받기 민망하거나 약간의 정체성 혼란을 주기도 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 돌이켜보면 과거 어셈블리 언어에서 C언어로, 그리고 고성능 프레임워크로 추상화 계층이 높아졌던 역사와 크게 다르지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로의 개발 환경은 도구적 코딩 행위 자체보다 &quot;어떤 문제를 해결하기 위해 시스템을 어떻게 설계할 것인가&quot;라는 질문이 훨씬 더 중요해질 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. 정책서나 가이드 문서만 잘 작성하면 코딩 지식 없이도 실무 개발이 가능한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않습니다. AI가 생성한 소스 코드의 오류나 보안 허점을 알아채고 예외 처리를 검증하려면 깊이 있는 아키텍처 이해도와 프로그래밍 경험이 필수적입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. Cursor나 Copilot 도입 시 기존 프로젝트에 바로 적용해도 괜찮나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 프로젝트에 적용할 때는 전체 코드베이스 인덱싱을 진행한 후, 프로젝트 가이드라인 문서를 먼저 작성해 AI에게 시스템 규칙을 학습시키는 과정이 필요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q3. 바이브 코딩과 스펙 주도 개발(SDD)의 가장 큰 차이점은 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이브 코딩은 구체적인 문서 없이 즉흥적인 프롬프트에 의존하지만, SDD는 사전 정의된 요구사항 및 정책서라는 단일 진실 공급원을 바탕으로 개발합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스펙과 가이드 문서가 만드는 새로운 개발 패러다임&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Copilot의 주석 추천으로 신기해하던 시절을 지나, Cursor의 자동완성에 놀라던 순간, 그리고 이제는 정책서와 가이드 문서로 시스템을 설계하는 현재에 이르렀습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 직접 손대지 않는 생경함 속에서도 분명한 점은, 개발의 중심이 단순 타이핑에서 사고와 설계로 이동하고 있다는 사실입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 변화 속에서 도구에 휘둘리기보다 비즈니스 맥락을 명확히 정의하는 단단한 기본기를 다져나가는 것이 무엇보다 중요한 시점입니다.&lt;/p&gt;
&lt;h2 id=&quot;h-13&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786536048247&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;스펙 주도 개발 SDD가 API 개발 생산성을 비약적으로 높이는 이유&quot; data-og-description=&quot;스펙 주도 개발 SDD(Spec-Driven Development)는 소프트웨어 개발 과정에서 API 명세서나 인터페이스 스펙을 가장 먼저 정의하고 이를 단일 진실 출처로 활용하는 엔지니어링 방법론입니다.&amp;quot;API 문서와 실&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/spec-driven-development-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/spec-driven-development-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cHzqS1/dJMb8TCp04P/4tEeIZUlHvN6uPYZKaQ4h0/img.png?width=800&amp;amp;height=608&amp;amp;face=553_115_610_177,https://scrap.kakaocdn.net/dn/EPXxE/dJMb8Z3HEgF/kbF3i6aA2pHR3YNQ3CC0nK/img.png?width=800&amp;amp;height=608&amp;amp;face=553_115_610_177,https://scrap.kakaocdn.net/dn/bFfSPm/dJMb8PGMjo8/Bun8MkcKOWH31UkzrEckk1/img.png?width=1200&amp;amp;height=913&amp;amp;face=832_181_914_271&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/spec-driven-development-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/spec-driven-development-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHzqS1/dJMb8TCp04P/4tEeIZUlHvN6uPYZKaQ4h0/img.png?width=800&amp;amp;height=608&amp;amp;face=553_115_610_177,https://scrap.kakaocdn.net/dn/EPXxE/dJMb8Z3HEgF/kbF3i6aA2pHR3YNQ3CC0nK/img.png?width=800&amp;amp;height=608&amp;amp;face=553_115_610_177,https://scrap.kakaocdn.net/dn/bFfSPm/dJMb8PGMjo8/Bun8MkcKOWH31UkzrEckk1/img.png?width=1200&amp;amp;height=913&amp;amp;face=832_181_914_271');&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;스펙 주도 개발 SDD가 API 개발 생산성을 비약적으로 높이는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스펙 주도 개발 SDD(Spec-Driven Development)는 소프트웨어 개발 과정에서 API 명세서나 인터페이스 스펙을 가장 먼저 정의하고 이를 단일 진실 출처로 활용하는 엔지니어링 방법론입니다.&quot;API 문서와 실&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786536003139&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;웹개발 직군 변천사 - 웹마스터에서 AI 시대까지 (프론트&amp;middot;백엔드&amp;middot;DBA&amp;middot;DevOps)&quot; data-og-description=&quot;&amp;quot;예전엔 웹마스터 한 명이 사이트를 통째로 만들었다던데 진짜예요?&amp;quot; &amp;quot;프론트만 파도 먹고살 수 있나요, 아니면 백엔드까지 해야 하나요?&amp;quot; &amp;quot;풀스택 되라는데 그게 사람이 할 수 있는 범위가 맞나&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MHzpM/dJMb9gxBqgi/NM0cnz0KbPGWKTDo4csZvK/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/bZ50IT/dJMb9jOCJDF/ZiJCvXEjkah2pAK09w3lkk/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/dBmowj/dJMb9fZLfQx/fH87WdASHi4mDNaTZaI5F0/img.png?width=1200&amp;amp;height=960&amp;amp;face=879_228_987_346&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A7%81%EA%B5%B0-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%9B%B9%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90%EC%84%9C-AI-%EC%8B%9C%EB%8C%80%EA%B9%8C%EC%A7%80-%ED%94%84%EB%A1%A0%ED%8A%B8%C2%B7%EB%B0%B1%EC%97%94%EB%93%9C%C2%B7DBA%C2%B7DevOps&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MHzpM/dJMb9gxBqgi/NM0cnz0KbPGWKTDo4csZvK/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/bZ50IT/dJMb9jOCJDF/ZiJCvXEjkah2pAK09w3lkk/img.png?width=800&amp;amp;height=640&amp;amp;face=585_156_653_231,https://scrap.kakaocdn.net/dn/dBmowj/dJMb9fZLfQx/fH87WdASHi4mDNaTZaI5F0/img.png?width=1200&amp;amp;height=960&amp;amp;face=879_228_987_346');&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;웹개발 직군 변천사 - 웹마스터에서 AI 시대까지 (프론트&amp;middot;백엔드&amp;middot;DBA&amp;middot;DevOps)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;예전엔 웹마스터 한 명이 사이트를 통째로 만들었다던데 진짜예요?&quot; &quot;프론트만 파도 먹고살 수 있나요, 아니면 백엔드까지 해야 하나요?&quot; &quot;풀스택 되라는데 그게 사람이 할 수 있는 범위가 맞나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786535998915&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;같은 연차에 200만 원 더 받는데, 프리랜서를 안 하는 개발자들&quot; data-og-description=&quot;&amp;quot;선배님은 왜 프리 안 나가세요? 지금 단가 좋은데.&amp;quot;&amp;quot;같은 연차인데 프리가 실수령 200은 더 가져간다던데, 손해 보는 거 아니에요?&amp;quot;&amp;quot;개발자 35살 넘으면 끝이라는데, 벌 수 있을 때 바짝 벌어야죠.&amp;quot;&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/why-not-freelance&quot; data-og-url=&quot;https://devwar.tistory.com/entry/why-not-freelance&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/O8LhE/dJMb9gxBqgb/KII8IMw0mh3bXxzGZixwl1/img.png?width=800&amp;amp;height=640&amp;amp;face=560_165_774_301,https://scrap.kakaocdn.net/dn/lGys4/dJMb9eT5kUK/KYRDW5lP3fI2uY1JGcBFxK/img.png?width=800&amp;amp;height=640&amp;amp;face=560_165_774_301,https://scrap.kakaocdn.net/dn/bvoMMB/dJMb81f8Hk5/paeCuJCvVwxsHy3m3nIhk1/img.png?width=1200&amp;amp;height=961&amp;amp;face=840_245_1158_440&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/why-not-freelance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/why-not-freelance&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/O8LhE/dJMb9gxBqgb/KII8IMw0mh3bXxzGZixwl1/img.png?width=800&amp;amp;height=640&amp;amp;face=560_165_774_301,https://scrap.kakaocdn.net/dn/lGys4/dJMb9eT5kUK/KYRDW5lP3fI2uY1JGcBFxK/img.png?width=800&amp;amp;height=640&amp;amp;face=560_165_774_301,https://scrap.kakaocdn.net/dn/bvoMMB/dJMb81f8Hk5/paeCuJCvVwxsHy3m3nIhk1/img.png?width=1200&amp;amp;height=961&amp;amp;face=840_245_1158_440');&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;같은 연차에 200만 원 더 받는데, 프리랜서를 안 하는 개발자들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;선배님은 왜 프리 안 나가세요? 지금 단가 좋은데.&quot;&quot;같은 연차인데 프리가 실수령 200은 더 가져간다던데, 손해 보는 거 아니에요?&quot;&quot;개발자 35살 넘으면 끝이라는데, 벌 수 있을 때 바짝 벌어야죠.&quot;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786535995291&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;트레이드 오프는 기술 선택에서 가장 중요한 개념인데, 13년 넘게 개발 일을 하면서 느낀 건 이 개념을 모르는 개발자가 생각보다 많다는 사실입니다. 신기술 도입 회의에서 장점 목록은 줄줄 나&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/tradeoff-tech-selection&quot; data-og-url=&quot;https://devwar.tistory.com/entry/tradeoff-tech-selection&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Pkwgc/dJMb85W9rzs/lpeExeRsO4phT9xK4oAMi0/img.png?width=800&amp;amp;height=597&amp;amp;face=193_117_717_237,https://scrap.kakaocdn.net/dn/AgxMz/dJMb88fgOqm/gRjvoAv7JsEXk0t0f1Jcu1/img.png?width=800&amp;amp;height=597&amp;amp;face=193_117_717_237,https://scrap.kakaocdn.net/dn/9MvmH/dJMb87OcZ9Z/kKstovcHjZ733py3QDoNK1/img.png?width=2400&amp;amp;height=1792&amp;amp;face=239_143_898_296&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/tradeoff-tech-selection&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/tradeoff-tech-selection&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Pkwgc/dJMb85W9rzs/lpeExeRsO4phT9xK4oAMi0/img.png?width=800&amp;amp;height=597&amp;amp;face=193_117_717_237,https://scrap.kakaocdn.net/dn/AgxMz/dJMb88fgOqm/gRjvoAv7JsEXk0t0f1Jcu1/img.png?width=800&amp;amp;height=597&amp;amp;face=193_117_717_237,https://scrap.kakaocdn.net/dn/9MvmH/dJMb87OcZ9Z/kKstovcHjZ733py3QDoNK1/img.png?width=2400&amp;amp;height=1792&amp;amp;face=239_143_898_296');&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;트레이드 오프는 기술 선택에서 가장 중요한 개념인데, 13년 넘게 개발 일을 하면서 느낀 건 이 개념을 모르는 개발자가 생각보다 많다는 사실입니다. 신기술 도입 회의에서 장점 목록은 줄줄 나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786535989270&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;SI, SM, 서비스 회사 차이 - 개발자가 일할 회사는 크게 세 종류입니다&quot; data-og-description=&quot;개발자로 일할 회사를 알아보다 보면 SI, SM, 서비스 회사, 유지보수 업체, 금융권 SI 같은 말이 정리 안 된 채로 쏟아집니다. 같은 개발자라도 어느 유형에 들어가느냐에 따라 매일 하는 일, 만지&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNVPcq/dJMb8YqbtkN/I90VfVyESelvYkVn7ULR5k/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/cqzWY5/dJMb8YqbtkM/hJjj8upiVyD1MV13bNxpoK/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/bkXF06/dJMb8XSl3Ug/Ba74DPEKrAqC2fEiJpqf3K/img.png?width=1200&amp;amp;height=896&amp;amp;face=761_153_867_269&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/si-sm-service-company-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNVPcq/dJMb8YqbtkN/I90VfVyESelvYkVn7ULR5k/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/cqzWY5/dJMb8YqbtkM/hJjj8upiVyD1MV13bNxpoK/img.png?width=800&amp;amp;height=597&amp;amp;face=506_106_578_184,https://scrap.kakaocdn.net/dn/bkXF06/dJMb8XSl3Ug/Ba74DPEKrAqC2fEiJpqf3K/img.png?width=1200&amp;amp;height=896&amp;amp;face=761_153_867_269');&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;SI, SM, 서비스 회사 차이 - 개발자가 일할 회사는 크게 세 종류입니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발자로 일할 회사를 알아보다 보면 SI, SM, 서비스 회사, 유지보수 업체, 금융권 SI 같은 말이 정리 안 된 채로 쏟아집니다. 같은 개발자라도 어느 유형에 들어가느냐에 따라 매일 하는 일, 만지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>ai개발트렌드</category>
      <category>AI코딩가이드</category>
      <category>CursorIDE</category>
      <category>githubcopilot</category>
      <category>IT트렌드</category>
      <category>SDD</category>
      <category>개발생산성</category>
      <category>개발자커리어</category>
      <category>스펙주도개발</category>
      <category>컨텍스트엔지니어링</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/142</guid>
      <comments>https://devwar.tistory.com/entry/ai-spec-driven-development-trend#entry142comment</comments>
      <pubDate>Wed, 12 Aug 2026 21:00:16 +0900</pubDate>
    </item>
    <item>
      <title>스펙 주도 개발 SDD가 API 개발 생산성을 비약적으로 높이는 이유</title>
      <link>https://devwar.tistory.com/entry/spec-driven-development-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFOQi/dJMcajpCIiV/4BsX1KhgedHJ7NuEFK8g1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFOQi/dJMcajpCIiV/4BsX1KhgedHJ7NuEFK8g1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFOQi/dJMcajpCIiV/4BsX1KhgedHJ7NuEFK8g1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFOQi%2FdJMcajpCIiV%2F4BsX1KhgedHJ7NuEFK8g1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;스펙 주도 개발 SDD가 API 개발 생산성을 비약적으로 높이는 이유&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;913&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발 과정에서 설계 문서와 실제 구현 코드가 시간이 지남에 따라 서로 어긋나는 현상은 흔히 발생하는 문제입니다. 초기에는 명확했던 요구사항 정의서나 API 명세서가 거듭되는 수정과 배포를 거치며 업데이트에서 누락되고, 결국 코드는 변경되었으나 문서는 과거에 머무르는 문서와 코드의 불일치가 발생합니다. 이러한 간극을 구조적으로 해결하기 위한 접근법으로 스펙 주도 개발(SDD, Spec-Driven Development)이 주목받고 있습니다. 명세를 단순한 참고용 기록이 아니라 개발의 출발점이자 단일 진실 공급원(Single Source of Truth)으로 삼아, 문서와 코드가 분리되지 않도록 강제하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 여기에서 스펙 주도 개발이 문서와 코드의 불일치 문제를 구체적으로 어떻게 방지하는지 그 핵심 원리와 작동 방식을 살펴보고자 합니다. 명세서를 작성하는 단계부터 이를 기반으로 코드 생성, 테스트 검증, 그리고 지속적인 통합 파이프라인에 이르기까지 스펙이 전체 개발 주기와 동기화되는 과정을 다룹니다. 나아가 선언적 명세를 중심으로 협업과 유지보수 체계를 구축할 때 고려해야 할 기술적 요소와 적용 범위를 함께 정리해 보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스펙 주도 개발 SDD 기본 개념과 등장 배경&lt;/li&gt;
&lt;li&gt;기존 개발 방식과 스펙 주도 개발의 핵심 차이&lt;/li&gt;
&lt;li&gt;SDD와 TDD DDD BDD 비교 파악하기&lt;/li&gt;
&lt;li&gt;스펙 주도 개발 도입 시 얻는 실무적 이점&lt;/li&gt;
&lt;li&gt;SDD 생태계를 이끄는 대표적인 도구와 기술&lt;/li&gt;
&lt;li&gt;성공적인 SDD 도입을 위한 4단계 워크플로우&lt;/li&gt;
&lt;li&gt;SDD 적용 과정에서 겪기 쉬운 문제와 해결책&lt;/li&gt;
&lt;li&gt;현재 IT 업계에서 SDD를 활용하는 실제 사례&lt;/li&gt;
&lt;li&gt;조직에 SDD를 안착시키기 위한 실천 전략&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스펙 주도 개발 SDD 기본 개념과 등장 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스펙 주도 개발(Spec-Driven Development)은 시스템의 동작이나 API 규격을 담은 스펙(Specification)을 최우선으로 작성하고, 이를 기반으로 코드, 테스트, 문서를 파생시키는 개발 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 코드를 먼저 작성한 뒤 문서(Swagger, Postman 등)를 부차적으로 만드는 방식이 주를 이루었습니다. 하지만 이 경우 기능 변경 시 문서를 누락하거나, 문서와 실제 API 스펙이 어긋나는 현상이 자주 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDD는 스펙 자체를 '단일 진실 출처(Single Source of Truth, SSOT)'로 설정합니다. 명세서가 결정되면 이를 바탕으로 목(Mock) 서버가 자동 생성되고, 클라이언트 SDK 및 백엔드 스텁 코드가 생성되므로 문서와 코드의 완전한 동기화를 달성할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  핵심 포인트&lt;/b&gt;&lt;br /&gt;SDD에서 스펙은 단순한 설명서가 아니라, 코드 생성과 테스트 자동화를 이끄는 '실행 가능한 계약(Executable Contract)' 역할을 수행합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 기존 개발 방식과 스펙 주도 개발의 핵심 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 코드 우선(Code-First) 개발 방식과 스펙 주도(Spec-First) 개발 방식은 프로젝트 초기 협업 구조와 소스 코드 생성 흐름에서 명확한 차이를 보입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;기존 방식 (Code-First)&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;스펙 주도 개발 (SDD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발 순서&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;비즈니스 로직 구현 &amp;rarr; API 문서 작성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;API 스펙 정의 &amp;rarr; 스텁 코드/목 서버 생성 &amp;rarr; 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;진실 출처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;백엔드 소스 코드&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;API 스펙 파일 (OpenAPI, TypeSpec 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;협업 병목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;백엔드 API 배포 전까지 프론트엔드 대기&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;스펙 기반 목 서버로 즉시 병렬 개발 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;동기화 여부&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;수동 업데이트 누락 시 불일치 발생&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;스펙 변경 시 자동 검증 및 코드 재생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. SDD와 TDD DDD BDD 비교 파악하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학에는 다양한 주도 개발 방법론이 존재하며, SDD는 다른 방법론과 대립 관계가 아닌 상호 보완 관계에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 주도 개발(TDD)이 단일 모듈의 도메인 로직 정확성에 집중한다면, SDD는 모듈 간, 혹은 클라이언트와 서버 간의 '연결 계약(Contract)'에 초점을 맞춥니다. 도메인 주도 설계(DDD)를 통해 도메인 모델을 정립한 후, 이를 외부 인터페이스로 노출하는 단계에서 SDD를 적용할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;방법론&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;주요 초점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center; vertical-align: top;&quot;&gt;핵심 산출물&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;TDD&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;내부 로직 품질 및 리팩터링 안전성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;단위/통합 테스트 코드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;DDD&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;비즈니스 도메인 모델링 및 바운디드 컨텍스트&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;유비쿼터스 언어, 도메인 엔티티&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;BDD&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;사용자 시나리오 기반의 행동 검증&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Given-When-Then 시나리오 명세&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top; background: #f9f9f9;&quot;&gt;&lt;b&gt;SDD&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;시스템 간 인터페이스 표준화 및 계약 자동화&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;OpenAPI / Protobuf 스펙 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 스펙 주도 개발 도입 시 얻는 실무적 이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDD 프로세스를 구축하면 개발팀 전체의 생산성과 소프트웨어 품질 측면에서 명확한 효과를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 프론트엔드와 백엔드 팀 간의 의존성이 제거됩니다. 스펙이 정의되는 즉시 목(Mock) 서버를 띄울 수 있으므로, 백엔드 구현이 끝나지 않아도 프론트엔드는 실제 데이터와 동일한 형태의 응답을 받으며 화면을 개발할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 불필요한 커뮤니케이션 비용이 줄어듭니다. 데이터 타입, 필수 필드 여부, 에러 코드 정의가 스펙 문서에 명확히 기술되어 있어 구두나 챗봇으로 질문하고 답변받는 과정이 대폭 줄어듭니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  개발 생산성 인사이트&lt;/b&gt;&lt;br /&gt;스펙 문서를 기반으로 클라이언트 타입(TypeScript 인터페이스 등)과 백엔드 라우터 스텁을 자동 생성하면, 필드명 오탈자로 인한 런타임 오류를 사전에 완전 차단할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. SDD 생태계를 이끄는 대표적인 도구와 기술&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDD를 성공적으로 실현하기 위해서는 스펙 작성을 지원하고 자동화 도구와 연동되는 관련 기술 생태계를 이해해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 널리 쓰이는 표준은 OpenAPI Specification(구 Swagger)입니다. REST API의 요청, 응답, 인증 방식을 YAML이나 JSON 형태로 정밀하게 정의할 수 있습니다. 최근에는 Microsoft에서 개발한 TypeSpec과 같이 TypeScript 스타일의 간결한 구문으로 OpenAPI 스펙을 컴파일해 주는 도구도 주목받고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC 환경에서는 Protocol Buffers(.proto) 파일이 SDD의 스펙 역할을 담당하며, GraphQL 생태계에서는 Schema-First 개발 방식이 SDD의 대표적인 형태입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Spectral을 활용한 OpenAPI 스펙 정적 검증 (스펙 린트)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 스펙 문서가 모든 개발 과정의 단일 진실 공급원(Single Source of Truth) 역할을 수행한다는 점을 강조하고 있습니다. 문서 자체가 설계도이자 기준점이 되려면, 코드를 린트(Lint)하듯 스펙 문서 자체의 문법 오류와 구조적 누락을 먼저 점검해야 합니다. 스키마와 &lt;b&gt;타입 정의&lt;/b&gt;가 아무리 정교하더라도, OpenAPI 규격에서 권장하는 메타데이터가 빠지면 코드 생성기나 문서화 도구에서 예기치 않은 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 스펙 파일의 품질을 객관적으로 검증하기 위해 오픈소스 API 린터인 &lt;b&gt;Spectral&lt;/b&gt;(&lt;code&gt;@stoplight/spectral-cli&lt;/code&gt;)을 활용합니다. 실제로 2026년 10월 20일(KST) 기준, 기본 엔드포인트(&lt;code&gt;/pets/{petId}&lt;/code&gt;)만 작성한 최소한의 &lt;code&gt;openapi.yaml&lt;/code&gt; 파일을 대상으로 로컬 환경에서 린트를 실행해 보았습니다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ npx @stoplight/spectral-cli lint openapi.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과, 문법 자체의 치명적인 결함을 뜻하는 에러는 &lt;b&gt;0건(`0 errors`)&lt;/b&gt;이었으나, 실무 규격 보완을 권고하는 경고는 총 &lt;b&gt;6건(`6 warnings`)&lt;/b&gt;이 검출되었습니다. 검출된 6개의 경고 규칙은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;oas3-api-servers&lt;/code&gt;: API 요청을 보낼 대상 서버(&lt;code&gt;servers&lt;/code&gt; 배열) URL 정의 누락&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info-contact&lt;/code&gt;: 스펙 문서 관리 주체 및 문의처(&lt;code&gt;info.contact&lt;/code&gt;) 누락&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info-description&lt;/code&gt;: API 전체의 목적을 설명하는 &lt;code&gt;info.description&lt;/code&gt; 누락&lt;/li&gt;
&lt;li&gt;&lt;code&gt;operation-description&lt;/code&gt;: 개별 엔드포인트 동작에 대한 상세 설명 누락&lt;/li&gt;
&lt;li&gt;&lt;code&gt;operation-operationId&lt;/code&gt;: 코드 생성 시 함수명 매핑의 기준이 되는 고유 식별자(&lt;code&gt;operationId&lt;/code&gt;) 누락&lt;/li&gt;
&lt;li&gt;&lt;code&gt;operation-tags&lt;/code&gt;: 문서 그룹화를 위한 태그(&lt;code&gt;tags&lt;/code&gt;) 분류 누락&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉보기에는 정상 작동할 것 같은 YAML 파일이라도, 정적 분석기를 통과시켜 보면 이처럼 클라이언트 SDK 생성이나 게이트웨이 연동에 필수적인 항목(&lt;code&gt;operationId&lt;/code&gt;, &lt;code&gt;servers&lt;/code&gt; 등)이 빠진 것을 즉시 파악할 수 있습니다. 스펙이 곧 시스템 간 소통의 규약인 만큼, API의 기본 개념과 연결 구조가 궁금하신 분들은 제가 이전에 정리한 &lt;a href=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;디지털 웨이터로 배우는 API 연결의 철학&lt;/a&gt; 글을 함께 읽어보시기를 권합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 성공적인 SDD 도입을 위한 4단계 워크플로우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀에 스펙 주도 개발을 체계적으로 적용하기 위한 파이프라인 단계는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단계는 스펙 설계 및 디자인입니다. 기능 요구사항이 결정되면 프론트엔드, 백엔드, 기획자가 함께 모여 API 엔드포인트, 요청 파라미터, 응답 데이터 구조를 정의하고 OpenAPI 문서를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2단계는 스펙 린팅 및 검증입니다. 작성된 YAML 파일이 표준 규칙을 준수하는지 Spectral 등의 린터를 통해 CI 파이프라인에서 검증합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계는 자동화 아티팩트 생성입니다. 스펙 파일로부터 Prism 등을 활용해 가상 목 서버를 띄우고, openapi-generator를 통해 TypeScript 타입 정의 및 API 호출 클라이언트 코드를 자동 생성합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prism 목 서버(Mock Server)로 프론트엔드&amp;middot;백엔드 병렬 개발하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDD가 개발 생산성을 끌어올리는 가장 직접적인 비결은 백엔드 구현이 끝나기를 기다리지 않고 프론트엔드와 백엔드가 동시에 작업을 시작할 수 있다는 점입니다. 합의된 &lt;code&gt;openapi.yaml&lt;/code&gt; 파일 하나만 있으면, 실제 비즈니스 로직이나 데이터베이스 없이도 스펙에 정의된 응답 타입을 그대로 반환하는 가짜 서버(Mock Server)를 즉시 띄울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 앞서 Spectral로 검증한 동일한 &lt;code&gt;openapi.yaml&lt;/code&gt; 파일을 사용해 &lt;b&gt;Prism&lt;/b&gt;(&lt;code&gt;@stoplight/prism-cli&lt;/code&gt;) 목 서버를 로컬(&lt;code&gt;127.0.0.1:4010&lt;/code&gt;)에 구동하고 응답을 실측해 보았습니다(2026년 10월 20일 KST 기준).&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 1. 로컬 4010 포트로 Prism 목 서버 실행
$ npx @stoplight/prism-cli mock openapi.yaml --host 127.0.0.1 --port 4010
​
# 2. 정의된 경로(/pets/1)로 GET 요청 전송
$ curl -i http://127.0.0.1:4010/pets/1
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8
​
{&quot;id&quot;:0,&quot;name&quot;:&quot;string&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 백엔드 컨트롤러 코드를 단 한 줄도 작성하지 않았지만, Prism은 스펙 문서의 응답 스키마(&lt;code&gt;integer&lt;/code&gt; 타입의 &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt; 타입의 &lt;code&gt;name&lt;/code&gt;)를 해석해 &lt;code&gt;HTTP/1.1 200 OK&lt;/code&gt; 상태 코드와 &lt;code&gt;{&quot;id&quot;:0,&quot;name&quot;:&quot;string&quot;}&lt;/code&gt;이라는 유효한 JSON 본문을 즉시 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 도입하면 프론트엔드 개발자는 로컬 목 서버(&lt;code&gt;127.0.0.1:4010&lt;/code&gt;)를 바라보며 UI 상태 관리와 데이터 바인딩을 선행 구현할 수 있고, 백엔드 개발자는 동일한 스펙을 만족하는 비즈니스 로직 작성에만 집중할 수 있습니다. 나아가 이 응답 스키마를 검증 기준 삼아 계약 테스트(Contract Test)까지 자동화할 수 있는데, 테스트를 먼저 정의하고 구현을 이어가는 호흡이 궁금하시다면 &lt;a href=&quot;https://devwar.tistory.com/entry/TDD%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EB%B2%84%EA%B7%B8-%EC%97%86%EB%8A%94-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%95%B5%EC%8B%AC-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TDD(테스트 주도 개발)란 무엇인가: 버그 없는 소프트웨어를 위한 핵심 가이드&lt;/a&gt; 글과 비교해 보셔도 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계는 실제 로직 구현 및 계약 테스트(Contract Testing)입니다. 백엔드는 스펙에 맞게 내부 로직을 완성하고, 실제 API 응답이 정의된 스펙과 일치하는지 테스트 모듈을 통해 검증합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. SDD 적용 과정에서 겪기 쉬운 문제와 해결책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스펙 주도 개발을 처음 도입할 때 조직 내에서 발생하는 대표적인 장애 요소와 이를 극복하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 설계 단계에서 복잡한 YAML 파일이나 스펙 문서를 작성하는 작업은 개발자에게 부담으로 작용할 수 있습니다. 이를 해결하기 위해 GUI 기반의 스펙 에디터(Stoplight, Postman)나 TypeSpec처럼 친숙한 언어 형태의 도구를 도입하는 것이 좋습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  스펙 변경 관리 주의사항&lt;/b&gt;&lt;br /&gt;스펙 변경이 필요할 때는 코드를 먼저 고치고 문서를 수정하는 것이 아니라, 반드시 스펙 파일을 먼저 수정하고 Pull Request를 통해 승인받는 절차를 준수해야 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드와 문서의 괴리를 막는 SDD 실전 워크플로 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스펙 주도 개발을 도입할 때 가장 경계해야 할 문제는 시간이 흐르면서 발생하는 &lt;b&gt;'스펙 드리프트(Spec Drift)'&lt;/b&gt;, 즉 초기 스펙 문서와 실제 운영 코드가 서로 달라지는 현상입니다. 일정이 급하다는 이유로 코드를 먼저 수정하고 스펙 업데이트를 미루기 시작하면, 스펙 문서는 금세 아무도 믿지 못하는 레거시 문서로 전락합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 스펙의 생명력을 유지하기 위해 제가 권장하는 세 가지 파이프라인 규칙을 정리해 드립니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;스펙 변경을 PR(Pull Request)의 시작점으로 삼기&lt;/b&gt;: 기능 추가나 필드 변경이 필요할 때는 코드가 아니라 &lt;code&gt;openapi.yaml&lt;/code&gt; 수정 커밋이 가장 먼저 올라와야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CI 파이프라인에 린트 강제하기&lt;/b&gt;: 앞서 살펴본 Spectral 검증에서 &lt;code&gt;operation-operationId&lt;/code&gt;나 &lt;code&gt;oas3-api-servers&lt;/code&gt; 같은 필수 규칙을 팀 컨벤션에 맞게 에러 수준으로 격상하고, 린트를 통과하지 못하면 병합(Merge)을 차단합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타입 및 클라이언트 코드 자동 생성&lt;/b&gt;: 수작업으로 DTO나 인터페이스를 옮겨 적다가 발생하는 휴먼 에러(예: &lt;b&gt;타입 정의&lt;/b&gt; 불일치)를 막기 위해, 빌드 단계에서 스펙 파일을 읽어 코드를 자동 생성하도록 구성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근에는 AI 코딩 에이전트에게 자연어로 모호한 지시를 내리는 대신, 정제된 스펙 문서를 프롬프트 컨텍스트로 주입해 구현 정확도를 높이는 흐름이 뚜렷해지고 있습니다. AI 시대에 SDD가 어떻게 진화하고 있는지 더 깊이 알아보고 싶으시다면 &lt;a href=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI 시대의 스펙 주도 개발(SDD) 트렌드 분석&lt;/a&gt; 글에서 이어지는 내용을 확인해 보시기 바랍니다. 스펙을 먼저 다듬는 습관이 곧 가장 빠른 개발의 지름길입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 현재 IT 업계에서 SDD를 활용하는 실제 사례&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 테크 기업 및 국내 주요 IT 서비스 기업들은 마이크로서비스 간 통신 장애를 줄이기 위해 SDD를 적극 활용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수십 개의 미니 앱과 모바일 웹을 운영하는 환경에서는 API 스펙이 변경될 때마다 각 플랫폼에 적용하는 데 큰 시간이 소요됩니다. SDD를 도입한 조직에서는 CI/CD 파이프라인 내에서 API 스펙 변경 시 iOS, Android, Web용 SDK 라이브러리를 자동으로 빌드하여 패키지 저장소에 배포하는 체계를 갖추고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 자동화 체계는 플랫폼별 개발자가 일일이 API 문서를 열어보고 타입을 정의하는 수작업을 완전히 없애 줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 조직에 SDD를 안착시키기 위한 실천 전략&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전사 시스템을 한 번에 SDD로 전환하는 것은 높은 위험을 동반하므로 단계적 접근이 바람직합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 신설되는 신규 마이크로서비스나 외부 연동이 많은 결제&amp;middot;인증 모듈과 같이 인터페이스가 명확한 영역을 선정하여 시범 적용해 보는 것을 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 스펙 문서가 작성되었을 때 코드 리뷰처럼 팀원들이 함께 인터페이스 디자인을 리뷰하는 문화를 만드는 것이 핵심입니다. 올바른 인터페이스 설계는 후반부 버그 발생 가능성을 비약적으로 줄여 줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. SDD를 도입하면 기존 TDD나 DDD 방법론은 사용할 수 없나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않습니다. SDD는 외부 시스템 및 클라이언트와의 '인터페이스 계약'을 다루고, TDD와 DDD는 내부 도메인 모델과 비즈니스 로직의 안정성을 다룹니다. 따라서 두 접근법을 함께 사용할 때 전체 소프트웨어 품질이 더욱 향상됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. 소규모 단일 프로젝트에서도 SDD 도입이 유용한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 1~2명이 참여하는 소규모 프로젝트의 경우 복잡한 자동화 파이프라인까지 구축하는 것은 오버헤드가 될 수 있습니다. 다만 간단한 OpenAPI 문서 작성만으로도 타입 정의 생성 및 API 명세 정리 효과를 얻을 수 있으므로 가벼운 스펙 작성을 권장합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q3. 백엔드 코드가 변경되면 스펙 문서도 매번 수동으로 고쳐야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDD 원칙상 코드보다 스펙이 먼저 수정되어야 합니다. 스펙을 수정하면 CI/CD 파이프라인에서 자동으로 테스트 코드와 스텁을 재생성하므로, 백엔드 개발자는 변경된 스펙 스텁에 맞춰 로직 구현만 업데이트하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스펙 주도 개발 도입을 고민하는 팀을 위하여&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어의 규모가 커지고 조직이 세분화될수록 명확한 인터페이스 정의는 프로젝트의 성공을 좌우하는 핵심 요소가 됩니다. 스펙 주도 개발은 단순한 문서화 기법이 아니라, 문서와 코드를 일치시키고 개발팀 간 협업의 병목을 없애 주는 효율적인 엔지니어링 표준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 문서 불일치로 인한 버그나 프론트엔드-백엔드 간 대기 시간으로 고민하고 있다면, 작은 서비스부터 API 스펙을 먼저 정의하는 SDD 워크플로우를 차근차근 적용해 보시기 바랍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792457831430&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;AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감&quot; data-og-description=&quot;AI 개발 트렌드가 급격하게 변화하면서 개발자가 직접 소스 코드를 작성하는 방식 대신 정책서와 가이드 문서 기반의 스펙 주도 개발(SDD)이 실무의 핵심으로 자리 잡고 있습니다.&amp;quot;요즘 진짜 코드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEs2xE/dJMb8UIesyA/epMjKOekOoGHBr2zXYMHn0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/cSuMrg/dJMb8QeLms6/4uyzQCKaqWRyHznq8UhJo1/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/EIuf0/dJMb8TCzeyN/nWZcV1fTh03sVTv7zt2Ji0/img.png?width=1200&amp;amp;height=911&amp;amp;face=0_0_1200_911&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-spec-driven-development-trend&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEs2xE/dJMb8UIesyA/epMjKOekOoGHBr2zXYMHn0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/cSuMrg/dJMb8QeLms6/4uyzQCKaqWRyHznq8UhJo1/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/EIuf0/dJMb8TCzeyN/nWZcV1fTh03sVTv7zt2Ji0/img.png?width=1200&amp;amp;height=911&amp;amp;face=0_0_1200_911');&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;AI 코딩으로 코드를 안 보게 된다고? 13년 차 개발자의 솔직한 체감&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 개발 트렌드가 급격하게 변화하면서 개발자가 직접 소스 코드를 작성하는 방식 대신 정책서와 가이드 문서 기반의 스펙 주도 개발(SDD)이 실무의 핵심으로 자리 잡고 있습니다.&quot;요즘 진짜 코드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792457841610&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;API 뜻, 식당 웨이터 비유로 끝내는 가장 쉬운 설명&quot; data-og-description=&quot;API 뜻을 검색하면 '응용 프로그램 프로그래밍 인터페이스'라는 번역만 나오고, 몇 번을 읽어도 프로그램들이 어떻게 소통하는지 감이 잘 잡히지 않습니다. 추상적인 용어가 겹쳐 있어 데이터가 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; data-og-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnre4m/dJMb8QeLmtg/sb5S6XauEJIbO558e0vkn0/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/9Mxtu/dJMb8UIesyG/oXYq1wTCNEDMiRK6oNoljk/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/bpeUkC/dJMb89yCS9w/2Zrcm4kLcJJKrLPuAadpyK/img.png?width=1024&amp;amp;height=872&amp;amp;face=0_0_1024_872&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/API-%EC%95%84%EC%A7%81%EB%8F%84-%EC%96%B4%EB%A0%B5%EB%82%98%EC%9A%94-%EB%94%94%EC%A7%80%ED%84%B8-%EC%9B%A8%EC%9D%B4%ED%84%B0%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%97%B0%EA%B2%B0%EC%9D%98-%EC%B2%A0%ED%95%99&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnre4m/dJMb8QeLmtg/sb5S6XauEJIbO558e0vkn0/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/9Mxtu/dJMb8UIesyG/oXYq1wTCNEDMiRK6oNoljk/img.png?width=800&amp;amp;height=681&amp;amp;face=0_0_800_681,https://scrap.kakaocdn.net/dn/bpeUkC/dJMb89yCS9w/2Zrcm4kLcJJKrLPuAadpyK/img.png?width=1024&amp;amp;height=872&amp;amp;face=0_0_1024_872');&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;API 뜻, 식당 웨이터 비유로 끝내는 가장 쉬운 설명&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API 뜻을 검색하면 '응용 프로그램 프로그래밍 인터페이스'라는 번역만 나오고, 몇 번을 읽어도 프로그램들이 어떻게 소통하는지 감이 잘 잡히지 않습니다. 추상적인 용어가 겹쳐 있어 데이터가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792457841999&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;CSRF란? 개념부터 방어까지 쉽게 정리&quot; data-og-description=&quot;CSRF(크로스 사이트 요청 위조)는 웹 보안을 공부하다 보면 XSS와 함께 가장 먼저 마주치는 공격입니다. 그런데 이름이 낯설다 보니 &amp;quot;결국 세션을 훔치는 거 아니야?&amp;quot;라고 오해하기 쉽습니다. 사실 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; data-og-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pu5xm/dJMb9llvLLA/K044gLTy5FJYef3aU1pKR1/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/dZG3Eu/dJMb9kUrCcY/fjWgKK7Zkg4KokdwKSPTHK/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/kh6T7/dJMb9kUrCcZ/sUVwZm6R7H4bueSFKMlIe0/img.png?width=1200&amp;amp;height=930&amp;amp;face=729_217_811_307&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/what-is-csrf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pu5xm/dJMb9llvLLA/K044gLTy5FJYef3aU1pKR1/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/dZG3Eu/dJMb9kUrCcY/fjWgKK7Zkg4KokdwKSPTHK/img.png?width=800&amp;amp;height=620&amp;amp;face=480_136_545_207,https://scrap.kakaocdn.net/dn/kh6T7/dJMb9kUrCcZ/sUVwZm6R7H4bueSFKMlIe0/img.png?width=1200&amp;amp;height=930&amp;amp;face=729_217_811_307');&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;CSRF란? 개념부터 방어까지 쉽게 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CSRF(크로스 사이트 요청 위조)는 웹 보안을 공부하다 보면 XSS와 함께 가장 먼저 마주치는 공격입니다. 그런데 이름이 낯설다 보니 &quot;결국 세션을 훔치는 거 아니야?&quot;라고 오해하기 쉽습니다. 사실&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792457848004&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;CORS는 왜 항상 프론트 개발자만 잡을까 - 동일 출처 정책의 역사와 현장 이야기&quot; data-og-description=&quot;CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 개발을 하다 보면 누구나 한 번쯤 마주치는 빨간 에러 메시지입니다. Access-Control-Allow-Origin 헤더가 없다느니, 프리플라이트(preflight) 요청&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jrype/dJMb84qxuG2/Y6dxneNHDqdly2Fc7DbBNK/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cAvGYZ/dJMb86omGQk/8zt7pkGruIr0vCkkKpc96k/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cgdnpl/dJMb8UIeqGs/j3KZLMeQocpe1jMsKWxP31/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=765_220_870_334&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cors-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cors-explained&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jrype/dJMb84qxuG2/Y6dxneNHDqdly2Fc7DbBNK/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cAvGYZ/dJMb86omGQk/8zt7pkGruIr0vCkkKpc96k/img.jpg?width=800&amp;amp;height=594&amp;amp;face=520_147_585_218,https://scrap.kakaocdn.net/dn/cgdnpl/dJMb8UIeqGs/j3KZLMeQocpe1jMsKWxP31/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=765_220_870_334');&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;CORS는 왜 항상 프론트 개발자만 잡을까 - 동일 출처 정책의 역사와 현장 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 개발을 하다 보면 누구나 한 번쯤 마주치는 빨간 에러 메시지입니다. Access-Control-Allow-Origin 헤더가 없다느니, 프리플라이트(preflight) 요청&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792457850732&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;&amp;quot;왜?&amp;quot;를 다섯 번 묻는 습관 - 개발자의 진짜 실력을 가르는 5 Why 원인 분석법 (2026)&quot; data-og-description=&quot;장애가 나면 눈앞의 증상만 급히 수습하기 쉽고, 그러면 비슷한 장애가 다시 찾아옵니다. 빨간불만 끄고 근본 원인을 끝까지 묻지 않기 때문입니다.이 글에서는 5 Why로 원인을 파는 방법과 흔한 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/5why-root-cause&quot; data-og-url=&quot;https://devwar.tistory.com/entry/5why-root-cause&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhdBA0/dJMb9jOLBoC/F1aa3i24iJ4ryo2CBe0Gs1/img.png?width=800&amp;amp;height=638&amp;amp;face=457_162_745_361,https://scrap.kakaocdn.net/dn/179wA/dJMb8Zv0xjm/VLwnfyF09fNlsFK8GbJ6IK/img.png?width=800&amp;amp;height=638&amp;amp;face=457_162_745_361,https://scrap.kakaocdn.net/dn/eGYA9/dJMb85wejOd/tUwkOFq2qf5rWrSij74nOk/img.png?width=1200&amp;amp;height=957&amp;amp;face=686_243_852_424&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/5why-root-cause&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/5why-root-cause&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhdBA0/dJMb9jOLBoC/F1aa3i24iJ4ryo2CBe0Gs1/img.png?width=800&amp;amp;height=638&amp;amp;face=457_162_745_361,https://scrap.kakaocdn.net/dn/179wA/dJMb8Zv0xjm/VLwnfyF09fNlsFK8GbJ6IK/img.png?width=800&amp;amp;height=638&amp;amp;face=457_162_745_361,https://scrap.kakaocdn.net/dn/eGYA9/dJMb85wejOd/tUwkOFq2qf5rWrSij74nOk/img.png?width=1200&amp;amp;height=957&amp;amp;face=686_243_852_424');&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;&quot;왜?&quot;를 다섯 번 묻는 습관 - 개발자의 진짜 실력을 가르는 5 Why 원인 분석법 (2026)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;장애가 나면 눈앞의 증상만 급히 수습하기 쉽고, 그러면 비슷한 장애가 다시 찾아옵니다. 빨간불만 끄고 근본 원인을 끝까지 묻지 않기 때문입니다.이 글에서는 5 Why로 원인을 파는 방법과 흔한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>api명세서</category>
      <category>OpenAPI</category>
      <category>SDD</category>
      <category>SWAGGER</category>
      <category>TypeSpec</category>
      <category>개발생산성</category>
      <category>백엔드개발</category>
      <category>소프트웨어아키텍처</category>
      <category>스펙주도개발</category>
      <category>프론트엔드협업</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/141</guid>
      <comments>https://devwar.tistory.com/entry/spec-driven-development-guide#entry141comment</comments>
      <pubDate>Wed, 12 Aug 2026 17:59:07 +0900</pubDate>
    </item>
    <item>
      <title>개발은전투다_20260809 버전</title>
      <link>https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A420260809-%EB%B2%84%EC%A0%84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qHdne/dJMcacYpJek/BAhazAWpNauLIlvNIxHyok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qHdne/dJMcacYpJek/BAhazAWpNauLIlvNIxHyok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qHdne/dJMcacYpJek/BAhazAWpNauLIlvNIxHyok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqHdne%2FdJMcacYpJek%2FBAhazAWpNauLIlvNIxHyok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;개발은전투다_20260809 버전&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발은전투다_20260809 버전&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bUgy9L/dJMcagNmHh1/Wt2rPaezNCKt79wGQLSvnk/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A4_20260809.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;개발은전투다_20260809.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.13MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일에서 글을 찾고 읽는 경험을 크게 손봤습니다. 특히 스마트폰에서 글 목록이 한결 보기 편해졌어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐가 좋아졌나요?&lt;/p&gt;
&lt;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;글 속 목차가 스마트폰에서는 접힌 상태로 시작합니다. 본문이 목차에 밀려 한참 아래로 내려가던 불편이 사라졌고, &quot;펼치기&quot; 버튼으로 필요할 때만 열어볼 수 있어요. 목차에서 항목을 누르면 이동 후 알아서 닫힙니다&lt;/li&gt;
&lt;li&gt;메뉴 버튼(&amp;equiv;)을 열면 맨 위에 검색창이 생겼습니다. 어디서든 메뉴만 열면 바로 블로그 안 글을 검색할 수 있어요&lt;/li&gt;
&lt;li&gt;태블릿 화면도 따로 다듬어서, 어떤 기기로 봐도 목록이 어색하지 않게 나옵니다&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>티스토리 무료 스킨</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/140</guid>
      <comments>https://devwar.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9D%80%EC%A0%84%ED%88%AC%EB%8B%A420260809-%EB%B2%84%EC%A0%84#entry140comment</comments>
      <pubDate>Sun, 9 Aug 2026 14:00:23 +0900</pubDate>
    </item>
    <item>
      <title>Next.js Nuxt.js NestJS 차이점과 프로젝트에 꼭 써야 하는 이유</title>
      <link>https://devwar.tistory.com/entry/next-nuxt-nest-difference-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oovu8/dJMcadppRZA/uHabILe2KOOgKvfoekJ9OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oovu8/dJMcadppRZA/uHabILe2KOOgKvfoekJ9OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oovu8/dJMcadppRZA/uHabILe2KOOgKvfoekJ9OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foovu8%2FdJMcadppRZA%2FuHabILe2KOOgKvfoekJ9OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Next.js Nuxt.js NestJS 차이점과 프로젝트에 꼭 써야 하는 이유&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js, Nuxt.js, NestJS는 이름이 비슷해 초보 개발자들이 자주 헷갈리는 프레임워크입니다. 하지만 각각 React, Vue, Node.js 기반으로 사용 목적과 레이어가 전혀 다릅니다. 각 프레임워크의 역할과 왜 써야 하는지 핵심 이유를 알면 프로젝트에 맞는 기술 스택을 명확히 선택할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;React 쓰는데 Next.js도 꼭 배워야 하나요?&quot;&lt;br /&gt;&quot;Vue 개발자인데 Nuxt.js를 도입하면 뭐가 좋은가요?&quot;&lt;br /&gt;&quot;NestJS는 Express랑 뭐가 다르길래 백엔드에서 많이 쓰나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 현장이나 커뮤니티에서 많은 분들이 비슷한 이름 때문에 세 가지 기술을 같은 라인선상에서 비교하곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 프론트엔드 영역과 백엔드 영역, 그리고 사용하는 기반 라이브러리가 엄연히 다릅니다. 이번 글에서는 Next.js, Nuxt.js, NestJS의 핵심 차이점부터 &lt;b&gt;왜 이 프레임워크들을 꼭 써야 하는지&lt;/b&gt; 그 이유를 명확하게 정리해 드리겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이름만 비슷한 3가지 프레임워크, 무엇이 다른가?&lt;/li&gt;
&lt;li&gt;Next.js: React 생태계의 중심, 왜 써야 할까?&lt;/li&gt;
&lt;li&gt;Nuxt.js: Vue.js 프로젝트의 핵심, 왜 써야 할까?&lt;/li&gt;
&lt;li&gt;NestJS: Node.js 엔터프라이즈 백엔드, 왜 써야 할까?&lt;/li&gt;
&lt;li&gt;Next vs Nuxt vs Nest 한눈에 보는 핵심 스펙 비교&lt;/li&gt;
&lt;li&gt;내 프로젝트에는 무엇을 골라야 할까?&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;나에게 맞는 기술 스택을 선택하는 기준&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 이름만 비슷한 3가지 프레임워크, 무엇이 다른가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 프레임워크를 구별하는 가장 쉬운 방법은 &lt;b&gt;'어느 영역(Layer)에서 작동하는가'&lt;/b&gt;와 &lt;b&gt;'기반이 되는 언어/라이브러리가 무엇인가'&lt;/b&gt;를 확인하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js와 Nuxt.js는 웹 화면을 만드는 프론트엔드 메타 프레임워크입니다. Next는 React를 기반으로 하고, Nuxt는 Vue.js를 기반으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 NestJS는 이름 마지막에 'st'가 들어가지만, 프론트엔드가 아닌 Node.js 기반의 백엔드 서버 프레임워크입니다. 즉, Next와 Nuxt는 경쟁 관계에 가깝고, NestJS는 이들과 함께 백엔드로 조합해서 사용하는 관계입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Next.js: React 생태계의 중심, 왜 써야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js는 Vercel에서 제작하고 관리하는 React 기반의 서버 사이드 렌더링(SSR) 및 풀스택 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 React(CSR)만으로 웹 애플리케이션을 만들 때 겪는 한계를 극복하기 위해 탄생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next.js를 왜 써야 할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;검색엔진 노출(SEO)과 초기 접속 속도 개선&lt;/b&gt; 때문입니다. 일반 React는 브라우저에서 JavaScript를 실행한 뒤 화면을 그리기 때문에 검색엔진 크롤러가 내용을 수집하기 어렵습니다. Next.js는 서버에서 완성된 HTML을 미리 생성하여 내려주므로 SEO에 매우 유리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;개발 생산성을 높여주는 자동화 기능&lt;/b&gt;입니다. 파일 시스템 기반의 라우팅, 이미지 및 폰트 성능 개선, 코드 분할(Code Splitting)이 기본 내장되어 있어 복잡한 Webpack 설정 없이 빠르게 개발에 집중할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;풀스택 확장성&lt;/b&gt;입니다. API Routes 기능이나 Server Actions를 활용하면 별도의 백엔드 서버 없이도 간단한 데이터베이스 조회나 서버 로직을 직접 구현할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  Next.js 도입 이유 한 줄 요약&lt;/b&gt;&lt;br /&gt;React 기반 프로젝트에서 검색엔진 노출, 초기 로딩 속도, 라우터 자동화가 필요할 때 가장 먼저 고려해야 할 필수 기술입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Nuxt.js: Vue.js 프로젝트의 핵심, 왜 써야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nuxt.js는 Vue.js 생태계에서 가장 널리 사용되는 공식 메타 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js가 React 환경을 지원하듯, Nuxt.js는 Vue.js 개발자들에게 동일하게 강력한 SSR 환경과 확장성을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nuxt.js를 왜 써야 할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;Vue.js 특유의 뛰어난 개발 경험(DX)을 극대화&lt;/b&gt;해 줍니다. 컴포넌트, 컴포저블 함수, 유틸리티 등을 별도로 import 하지 않아도 자동으로 인식하는 Auto-import 기능 덕분에 작성해야 하는 코드량이 획기적으로 줄어듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;유연한 렌더링 전략&lt;/b&gt;입니다. 하나의 프로젝트 안에서 SSR(서버 사이드 렌더링), SSG(정적 사이트 생성), SPA(단일 페이지 애플리케이션) 모드를 페이지별로 자유롭게 섞어서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;강력하고 풍부한 모듈 생태계&lt;/b&gt;입니다. Tailwind CSS, Pinia, Google Analytics 등 자주 쓰이는 도구들을 명령어 한 줄로 완벽히 통합 설정할 수 있는 전용 모듈들이 잘 갖춰져 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  Nuxt.js 도입 이유 한 줄 요약&lt;/b&gt;&lt;br /&gt;Vue.js의 쉬운 문법적 장점을 유지하면서, SEO와 자동 라우팅, 높은 생산성을 동시에 확보하고 싶을 때 최적의 선택입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. NestJS: Node.js 엔터프라이즈 백엔드, 왜 써야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NestJS는 Express나 Fastify 위에서 동작하는 TypeScript 기반의 백엔드 서버 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름이 유사하여 프론트엔드 도구로 오해받기 쉽지만, Spring Boot나 ASP.NET과 견줄 수 있는 전문 백엔드 아키텍처를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NestJS를 왜 써야 할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;체계적이고 정돈된 아키텍처 구조&lt;/b&gt;를 제공합니다. 기존 Express는 자유도가 너무 높아 개발자마다 코드 스타일이 제각각이고 서비스가 커지면 유지보수가 어려워졌습니다. NestJS는 모듈, 컨트롤러, 서비스로 역할을 명확히 나누는 가이드라인을 강제하여 코드 품질을 일정하게 유지해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;TypeScript와 의존성 주입(DI)의 기본 내장&lt;/b&gt;입니다. 타입 안정성을 확보할 수 있어 대규모 서비스에서 발생할 수 있는 런타임 에러를 사전에 방지하며, 객체지향 프로그래밍(OOP) 패러다임을 정석대로 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;엔터프라이즈급 확장 도구 모음&lt;/b&gt;입니다. Microservice 아키텍처 전환, WebSocket 통신, GraphQL 대응, Swagger API 문서 자동화 기능을 프레임워크 차원에서 공식 지원합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  NestJS 도입 이유 한 줄 요약&lt;/b&gt;&lt;br /&gt;Node.js 환경에서 팀 단위로 대규모 백엔드 API 서버를 구축하고, 유지보수성이 뛰어난 표준 구조를 도입하고 싶을 때 선택합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Next vs Nuxt vs Nest 한눈에 보는 핵심 스펙 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 프레임워크의 핵심 항목을 한눈에 구별할 수 있도록 비교 표로 정리했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Next.js&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Nuxt.js&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;NestJS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주요 레이어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프론트엔드 (풀스택)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프론트엔드 (풀스택)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;백엔드 (API 서버)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;기반 기술&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;React, JavaScript/TS&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Vue.js, JavaScript/TS&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Node.js, Express, TS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;핵심 목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;React SSR 및 SEO 최적화&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Vue SSR 및 개발 생산성&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;구조화된 백엔드 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;주요 사용처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이커머스, 랜딩페이지, SNS&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;대시보드, 포털, 서비스 웹&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;REST API, 마이크로서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 내 프로젝트에는 무엇을 골라야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택을 선택할 때 가장 중요한 것은 '우리가 지금 만들고자 하는 서비스의 성격'과 '팀원들의 숙련도'입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황별 권장 스택 선택 기준은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;React를 주로 사용하고 네이버나 구글 검색 노출이 필수적인 서비스&lt;/b&gt;라면 &lt;b&gt;Next.js&lt;/b&gt;를 선택하는 것이 자연스럽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;Vue.js 생태계에 익숙하며 빠르게 프로토타입이나 웹 서비스를 구축&lt;/b&gt;하고 싶다면 &lt;b&gt;Nuxt.js&lt;/b&gt;가 최상의 생산성을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;백엔드 영역에서 TypeScript를 활용해 체계적이고 규모 있는 API 서버&lt;/b&gt;를 개발해야 한다면 &lt;b&gt;NestJS&lt;/b&gt;가 정답입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  실무 조합 가이드&lt;/b&gt;&lt;br /&gt;실제 현업 프로젝트에서는 하나만 고르는 것이 아니라 조합하여 사용하는 경우가 많습니다.&lt;br /&gt;예를 들어 프론트엔드는 Next.js(또는 Nuxt.js)로 구축하여 화면과 SEO를 처리하고, 백엔드는 NestJS로 분리하여 비즈니스 로직과 API를 처리하는 방식이 매우 대중적입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Next.js나 Nuxt.js를 사용하면 NestJS 같은 백엔드가 전혀 필요 없나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 데이터 조회나 서브 로직은 Next.js/Nuxt.js의 서버 기능으로 충분히 처리할 수 있습니다. 하지만 복잡한 비즈니스 로직, 대용량 트랜잭션, 데이터베이스 분리, 마이크로서비스 아키텍처가 필요하다면 NestJS와 같은 전용 백엔드 서버를 따로 두는 것이 유지보수 측면에서 유리합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Next.js와 Nuxt.js 중 취업에 더 유리한 기술은 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 국내 IT 채용 시장에서는 React 생태계의 비중이 더 크기 때문에 Next.js의 채용 공고가 상대적으로 우세한 편입니다. 다만 Vue.js를 주요 스택으로 채택한 기업이나 스타트업에서는 Nuxt.js 숙련자를 적극적으로 찾고 있으므로, 본인이 주력으로 다루는 프론트엔드 라이브러리에 맞추어 고르는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Express를 잘 쓰고 있는데 NestJS로 전환해야 하는 이유가 있을까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소규모 프로젝트나 단순한 API 서버는 Express로도 충분합니다. 하지만 팀원 수가 늘어나거나 프로젝트 규모가 커지면 Express는 코드 구조가 무너지기 쉽습니다. NestJS는 엄격한 모듈 아키텍처를 제공하므로 여러 개발자가 협업할 때 정돈된 구조를 유지할 수 있다는 큰 장점이 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 나에게 맞는 기술 스택을 선택하는 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js, Nuxt.js, NestJS는 이름은 비슷하지만 저마다 명확한 존재 이유와 해결하고자 하는 문제가 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드에서 React 중심으로 SEO와 성능을 끌어올리고 싶다면 Next.js, Vue의 직관성과 빠른 개발을 원한다면 Nuxt.js, 그리고 백엔드에서 견고한 아키텍처를 갖추고 싶다면 NestJS를 선택하는 것이 합리적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트의 목적과 레이어를 명확히 구분하여 최적의 프레임워크를 도입해 보시기 바랍니다.&lt;/p&gt;
&lt;h2 id=&quot;h-11&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786103798810&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;자바와 자바스크립트 차이는? 10일 만에 만들어진 자바스크립트 역사 이야기&quot; data-og-description=&quot;자바(Java)와 자바스크립트(JavaScript)의 차이는 개발 공부를 막 시작한 분들이 가장 많이 헷갈려 하는 부분입니다. &amp;quot;자바랑 자바스크립트랑 같은 거 아니에요?&amp;quot; 제가 13년째 가장 자주 듣는 질문이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEVLRt/dJMb8VNLi4g/Pk3b1IyEhCRKzfS81jzqa1/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/dcf3OX/dJMb8SpXxSc/85bWKdknSkRccQehLYFDd1/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/baJ1dT/dJMb9c9M7YD/IXHBaX2i2kcFnm4xktn4Sk/img.png?width=1200&amp;amp;height=896&amp;amp;face=727_183_833_299&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEVLRt/dJMb8VNLi4g/Pk3b1IyEhCRKzfS81jzqa1/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/dcf3OX/dJMb8SpXxSc/85bWKdknSkRccQehLYFDd1/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/baJ1dT/dJMb9c9M7YD/IXHBaX2i2kcFnm4xktn4Sk/img.png?width=1200&amp;amp;height=896&amp;amp;face=727_183_833_299');&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;자바와 자바스크립트 차이는? 10일 만에 만들어진 자바스크립트 역사 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)와 자바스크립트(JavaScript)의 차이는 개발 공부를 막 시작한 분들이 가장 많이 헷갈려 하는 부분입니다. &quot;자바랑 자바스크립트랑 같은 거 아니에요?&quot; 제가 13년째 가장 자주 듣는 질문이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786103755595&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;프론트엔드 3대장 비교 - 리액트 뷰 앵귤러 탄생 이유와 장단점 (2026)&quot; data-og-description=&quot;&amp;quot;프론트 시작하려는데 앵귤러, 리액트, 뷰 중에 뭘 배워야 하죠?&amp;quot; &amp;quot;셋이 뭐가 그렇게 다른가요?&amp;quot; &amp;quot;회사는 리액트 쓰는데 저는 뷰가 편해요, 괜찮을까요?&amp;quot; &amp;quot;신입인데 그냥 제일 인기 많은 거 하면 되&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-3%EB%8C%80%EC%9E%A5-%EB%B9%84%EA%B5%90-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B7%B0-%EC%95%B5%EA%B7%A4%EB%9F%AC-%ED%83%84%EC%83%9D-%EC%9D%B4%EC%9C%A0%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90-2026&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-3%EB%8C%80%EC%9E%A5-%EB%B9%84%EA%B5%90-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B7%B0-%EC%95%B5%EA%B7%A4%EB%9F%AC-%ED%83%84%EC%83%9D-%EC%9D%B4%EC%9C%A0%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90-2026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c4F1aG/dJMb9b37fEQ/kgyrHReahEos8QQEUviNd1/img.png?width=800&amp;amp;height=616&amp;amp;face=572_128_635_198,https://scrap.kakaocdn.net/dn/cGoTKU/dJMb9lMqGqS/hGmwccwKlPKwJTB60nte3K/img.png?width=800&amp;amp;height=616&amp;amp;face=572_128_635_198,https://scrap.kakaocdn.net/dn/cDG9mh/dJMb9jgMIDp/asPWyyIKBfFXGrqsBmWmp0/img.png?width=1200&amp;amp;height=924&amp;amp;face=843_187_964_320&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-3%EB%8C%80%EC%9E%A5-%EB%B9%84%EA%B5%90-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B7%B0-%EC%95%B5%EA%B7%A4%EB%9F%AC-%ED%83%84%EC%83%9D-%EC%9D%B4%EC%9C%A0%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-3%EB%8C%80%EC%9E%A5-%EB%B9%84%EA%B5%90-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B7%B0-%EC%95%B5%EA%B7%A4%EB%9F%AC-%ED%83%84%EC%83%9D-%EC%9D%B4%EC%9C%A0%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90-2026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c4F1aG/dJMb9b37fEQ/kgyrHReahEos8QQEUviNd1/img.png?width=800&amp;amp;height=616&amp;amp;face=572_128_635_198,https://scrap.kakaocdn.net/dn/cGoTKU/dJMb9lMqGqS/hGmwccwKlPKwJTB60nte3K/img.png?width=800&amp;amp;height=616&amp;amp;face=572_128_635_198,https://scrap.kakaocdn.net/dn/cDG9mh/dJMb9jgMIDp/asPWyyIKBfFXGrqsBmWmp0/img.png?width=1200&amp;amp;height=924&amp;amp;face=843_187_964_320');&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;프론트엔드 3대장 비교 - 리액트 뷰 앵귤러 탄생 이유와 장단점 (2026)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;프론트 시작하려는데 앵귤러, 리액트, 뷰 중에 뭘 배워야 하죠?&quot; &quot;셋이 뭐가 그렇게 다른가요?&quot; &quot;회사는 리액트 쓰는데 저는 뷰가 편해요, 괜찮을까요?&quot; &quot;신입인데 그냥 제일 인기 많은 거 하면 되&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786103751980&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&quot; data-og-description=&quot;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccMfW1/dJMb9cBXcjL/lFQJIKEQvVUL4VAGXOtHkk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/bzrDXD/dJMb9ia6lwH/zbb10I9tCio4MZBLdE2M31/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/KTues/dJMb9b37fEK/RISKSoR2GA8kp0IwqEDAQK/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccMfW1/dJMb9cBXcjL/lFQJIKEQvVUL4VAGXOtHkk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/bzrDXD/dJMb9ia6lwH/zbb10I9tCio4MZBLdE2M31/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/KTues/dJMb9b37fEK/RISKSoR2GA8kp0IwqEDAQK/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241');&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786103748637&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;Ajax fetch axios 차이, 10년 넘게 쓰며 알게 된 것들&quot; data-og-description=&quot;Ajax, fetch, axios 차이를 검색하면 문법 비교표는 많이 나옵니다. 그런데 이 셋이 어떤 흐름으로 이어져 왔는지, 실무에서 어느 지점에서 문제가 터지는지를 다룬 글은 의외로 적습니다. 저는 XMLHttp&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ajax-fetch-axios-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ajax-fetch-axios-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cvxOHl/dJMb83SyvgJ/0U1aLeEWXaN4HJCh8GiPc0/img.png?width=800&amp;amp;height=655&amp;amp;face=568_101_648_188,https://scrap.kakaocdn.net/dn/bhFhi6/dJMb82e2nwq/MRQLyBDhVkFgAM0jpH1vW1/img.png?width=800&amp;amp;height=655&amp;amp;face=568_101_648_188,https://scrap.kakaocdn.net/dn/cOIyoC/dJMb896jaMs/gpLIShg5Y4Pte5kU5I28b1/img.png?width=1200&amp;amp;height=983&amp;amp;face=851_150_978_288&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ajax-fetch-axios-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ajax-fetch-axios-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cvxOHl/dJMb83SyvgJ/0U1aLeEWXaN4HJCh8GiPc0/img.png?width=800&amp;amp;height=655&amp;amp;face=568_101_648_188,https://scrap.kakaocdn.net/dn/bhFhi6/dJMb82e2nwq/MRQLyBDhVkFgAM0jpH1vW1/img.png?width=800&amp;amp;height=655&amp;amp;face=568_101_648_188,https://scrap.kakaocdn.net/dn/cOIyoC/dJMb896jaMs/gpLIShg5Y4Pte5kU5I28b1/img.png?width=1200&amp;amp;height=983&amp;amp;face=851_150_978_288');&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;Ajax fetch axios 차이, 10년 넘게 쓰며 알게 된 것들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ajax, fetch, axios 차이를 검색하면 문법 비교표는 많이 나옵니다. 그런데 이 셋이 어떤 흐름으로 이어져 왔는지, 실무에서 어느 지점에서 문제가 터지는지를 다룬 글은 의외로 적습니다. 저는 XMLHttp&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786103745211&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;npm 탄생 배경, 편하려고 만든 게 아니라 고통 때문에 나왔습니다&quot; data-og-description=&quot;npm이란 무엇이고 왜 탄생했는지를 이야기하려면, npm이 없던 시절의 웹 개발이 어땠는지부터 꺼내야 합니다. 지금은 터미널에 명령어 한 줄이면 끝나는 일이, 그때는 반나절짜리 노동이었습니다&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%96%B8%EC%96%B4%EC%9D%98-%EC%97%AD%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9A%B4%EB%AA%85%EC%9D%84-%EB%B0%94%EA%BE%BC-%EB%A7%88%EB%B2%95%EC%9D%98-%EC%84%B8-%EA%B8%80%EC%9E%90-npm-%EB%8C%80%EC%B2%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%96%B8%EC%96%B4%EC%9D%98-%EC%97%AD%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9A%B4%EB%AA%85%EC%9D%84-%EB%B0%94%EA%BE%BC-%EB%A7%88%EB%B2%95%EC%9D%98-%EC%84%B8-%EA%B8%80%EC%9E%90-npm-%EB%8C%80%EC%B2%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sjXgK/dJMb8YqaPbS/Yzj8dpyOsj2HT1nwvgEcUK/img.png?width=800&amp;amp;height=597&amp;amp;face=578_92_626_144,https://scrap.kakaocdn.net/dn/j99ag/dJMb84qnWEZ/9qZb1sTOYKbT7XpId3HmE0/img.png?width=800&amp;amp;height=597&amp;amp;face=578_92_626_144,https://scrap.kakaocdn.net/dn/bu0xEF/dJMb8QeBEOX/vLgfUH5JXByDlpuKhZe1a1/img.png?width=1200&amp;amp;height=896&amp;amp;face=875_144_935_209&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%96%B8%EC%96%B4%EC%9D%98-%EC%97%AD%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9A%B4%EB%AA%85%EC%9D%84-%EB%B0%94%EA%BE%BC-%EB%A7%88%EB%B2%95%EC%9D%98-%EC%84%B8-%EA%B8%80%EC%9E%90-npm-%EB%8C%80%EC%B2%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%96%B8%EC%96%B4%EC%9D%98-%EC%97%AD%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9A%B4%EB%AA%85%EC%9D%84-%EB%B0%94%EA%BE%BC-%EB%A7%88%EB%B2%95%EC%9D%98-%EC%84%B8-%EA%B8%80%EC%9E%90-npm-%EB%8C%80%EC%B2%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sjXgK/dJMb8YqaPbS/Yzj8dpyOsj2HT1nwvgEcUK/img.png?width=800&amp;amp;height=597&amp;amp;face=578_92_626_144,https://scrap.kakaocdn.net/dn/j99ag/dJMb84qnWEZ/9qZb1sTOYKbT7XpId3HmE0/img.png?width=800&amp;amp;height=597&amp;amp;face=578_92_626_144,https://scrap.kakaocdn.net/dn/bu0xEF/dJMb8QeBEOX/vLgfUH5JXByDlpuKhZe1a1/img.png?width=1200&amp;amp;height=896&amp;amp;face=875_144_935_209');&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;npm 탄생 배경, 편하려고 만든 게 아니라 고통 때문에 나왔습니다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;npm이란 무엇이고 왜 탄생했는지를 이야기하려면, npm이 없던 시절의 웹 개발이 어땠는지부터 꺼내야 합니다. 지금은 터미널에 명령어 한 줄이면 끝나는 일이, 그때는 반나절짜리 노동이었습니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>nestjs</category>
      <category>nextjs</category>
      <category>nodejs</category>
      <category>NuxtJS</category>
      <category>react</category>
      <category>vuejs</category>
      <category>기술스택</category>
      <category>백엔드</category>
      <category>웹개발</category>
      <category>프론트엔드</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/139</guid>
      <comments>https://devwar.tistory.com/entry/next-nuxt-nest-difference-guide#entry139comment</comments>
      <pubDate>Fri, 7 Aug 2026 20:57:04 +0900</pubDate>
    </item>
    <item>
      <title>Supabase 특징 및 AI 백엔드 구축 시 생기는 변화</title>
      <link>https://devwar.tistory.com/entry/supabase-features-ai-backend</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP2vB5/dJMcacqCGJp/UU6Ufs12doL1rDBjEKYNm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP2vB5/dJMcacqCGJp/UU6Ufs12doL1rDBjEKYNm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP2vB5/dJMcacqCGJp/UU6Ufs12doL1rDBjEKYNm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP2vB5%2FdJMcacqCGJp%2FUU6Ufs12doL1rDBjEKYNm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Supabase 특징 및 AI 백엔드 구축 시 생기는 변화&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구를 활용한 서비스 개발이 대세가 되면서 Supabase 특징과 백엔드 구축 방식에 대한 관심이 급증하고 있습니다. 데이터베이스 세팅부터 사용자 인증, API 자동 생성까지 한 번에 처리되는 구조적 이유를 살펴보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;Cursor나 v0로 개발할 때 백엔드로 Supabase를 많이 추천하는 이유가 무엇인가요?&quot;&lt;br /&gt;&lt;br /&gt;&quot;AI 서비스에 필요한 pgvector는 기존 DB와 어떻게 연동되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 기반 데이터베이스 인프라 구축의 트렌드가 급격히 변화하면서, 코드 생성 AI와의 호환성과 데이터 제어 자율성이 백엔드 선택의 핵심 기준이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Supabase의 기업 철학과 기술적 기반, AI 개발 생태계에서 주목받는 이유, 그리고 AI 도구가 코드를 생성하는 환경에서 개발자가 반드시 점검해야 할 핵심 보안 사용법을 다룹니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Supabase 기업 개요와 오픈소스 철학&lt;/li&gt;
&lt;li&gt;AI 시대에 Supabase 백엔드가 각광받는 이유&lt;/li&gt;
&lt;li&gt;기존 백엔드 인프라 방식과 Supabase 비교&lt;/li&gt;
&lt;li&gt;AI 코딩 환경에서 챙겨야 할 최소한의 Supabase 사용법&lt;/li&gt;
&lt;li&gt;자주 묻는 질문 (FAQ)&lt;/li&gt;
&lt;li&gt;AI 백엔드 생태계에서 Supabase의 가치&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Supabase 기업 개요와 오픈소스 철학&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 &quot;Build in a weekend, scale to millions (주말 동안 만들고, 수백만 명에게 확장하라)&quot;라는 슬로건을 바탕으로 설립된 오픈소스 BaaS(Backend as a Service) 플랫폼입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자적인 폐쇄형 규격을 구축하는 대신, 전 세계적으로 널리 쓰이는 관계형 데이터베이스인 PostgreSQL을 핵심 엔진으로 사용합니다. 여기에 서비스 구축 시 반복되는 회원가입 인증, 파일 스토리지, 실시간 데이터 구독, 엣지 컴퓨팅 기능을 결합한 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 스택이 오픈소스로 공개되어 있어 특정 클라우드 벤더에 대한 종속(Vendor Lock-in) 위험이 적습니다. 표준 PostgreSQL 기능을 그대로 지원하므로, 필요 시 표준 마이그레이션 도구를 통해 자체 서버나 타 클라우드 환경으로 데이터를 이전하기 용이합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. AI 시대에 Supabase 백엔드가 각광받는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 코딩 에이전트(Cursor, Bolt, v0 등)의 활용이 늘어남에 따라, 백엔드 인프라로서 Supabase의 채택 비율이 급격히 높아졌습니다. 주요 원인은 AI 코드 생성 모델과의 높은 문법 상호운용성과 자체 벡터 검색 확장 기능에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구들은 Supabase의 JavaScript/TypeScript SDK 및 SQL 문법을 정확하게 학습한 상태입니다. 프롬프트 형태로 필요한 데이터 구조와 기능을 요청하면 클라이언트에서 직접 호출 가능한 안전한 API와 DB 스키마를 즉시 출력해 냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 PostgreSQL 확장 모듈인 pgvector가 기본 탑재되어 있어, RAG(검색 증강 생성) 시스템이나 AI 임베딩 데이터 검색을 별도의 외부 벡터 DB 설치 없이 하나의 데이터베이스 내부에서 처리할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  pgvector 데이터 통합 관리의 이점&lt;/b&gt;&lt;br /&gt;외부 벡터 전용 데이터베이스를 별도로 구축할 경우 유저 정보와 벡터 데이터 간 동기화 이슈가 발생하기 쉽습니다. Supabase는 동일한 PostgreSQL 내부에서 일반 Relational 데이터와 Vector 데이터를 트랜잭션 단위로 함께 처리할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 기존 백엔드 인프라 방식과 Supabase 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 백엔드 서버 구축 방식과 비교한 주요 기술 항목별 차이점은 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;전통적인 백엔드 직접 구축&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;Supabase 환경&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인프라 구성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서버 인스턴스 할당, OS 보안 패치, DB 직접 설치 필요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;대시보드 프로젝트 생성으로 즉시 환경 구성 완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;API 레이어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;라우터, 라우팅 컨트롤러, ORM 및 DTO 직접 구현&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;PostgreSQL 스키마 기반 RESTful / GraphQL API 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;AI 임베딩 연동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;별도 서드파티 Vector DB 도입 및 데이터 파이프라인 연동&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;PostgreSQL 내 pgvector 확장을 통한 통합 쿼리 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;데이터 이전성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프레임워크 및 ORM 의존성에 따라 이기종 전환 복잡&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;표준 pg_dump 및 SQL 스크립트를 통한 데이터 반출 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. AI 코딩 환경에서 챙겨야 할 최소한의 Supabase 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구가 클라이언트 연동 코드와 기본적인 SQL을 생성해 줄 수 있으나, 백엔드의 보안 규칙과 데이터 무결성 설정은 개발자가 직접 검증해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase 환경에서는 중간 API 서버 없이 클라이언트에서 DB로 직접 연결되므로, &lt;b&gt;RLS(Row Level Security)&lt;/b&gt; 정책 설정이 필수적입니다. RLS가 비활성화되어 있거나 올바르지 않게 설정된 경우, 인증되지 않은 클라이언트가 전체 데이터를 읽거나 수정할 위험이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 작성 후에는 각 CRUD(SELECT, INSERT, UPDATE, DELETE) 권한에 대해 사용자 ID(auth.uid) 기반의 세부 접근 제어 정책을 명확하게 선언하고 검증해야 합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  RLS (Row Level Security) 설정 보안 지침&lt;/b&gt;&lt;br /&gt;테이블 생성 후 RLS를 활성화하지 않거나 전체 허용(true) 구문으로 방치할 경우, 클라이언트 엔드포인트를 통한 데이터 유출 위험이 발생합니다. 반드시 auth.uid() 기반의 조회 및 수정 권한 규칙을 검증해야 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로컬 개발 환경에서 Supabase 테스트가 가능한가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase CLI를 사용하면 Docker 기반으로 오프라인 로컬 환경을 구성할 수 있습니다. 데이터베이스 마이그레이션 파일과 타입을 로컬에서 테스트한 후 서버로 적용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pgvector 사용 시 대용량 데이터 검색 성능은 어떻게 관리하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 수량이 증가할 경우 HNSW(Hierarchical Navigable Small World) 인덱스를 생성하여 검색 연산 시간을 단축시킵니다. 데이터 규모에 따라 적절한 인덱스 파라미터를 설정하는 것이 중요합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. AI 백엔드 생태계에서 Supabase의 가치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 중심 개발 환경에서는 애플리케이션 구축 속도와 함께 데이터 구조의 유연성이 핵심적인 요소로 평가받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 오픈소스 PostgreSQL의 높은 신뢰성과 확장성을 유지하면서, AI 코딩 도구 및 pgvector 생태계와 안정적으로 맞물리는 인프라 선택지를 제공합니다.&lt;/p&gt;
&lt;h2 id=&quot;h-7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1786070420423&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;SaaS 뜻과 사례, 우리가 매달 내는 구독료의 정체&quot; data-og-description=&quot;SaaS란 무엇일까요. 뉴스나 경제 기사에서 한 번쯤 보셨을 이 단어는 '서비스형 소프트웨어(Software as a Service)'의 줄임말입니다. 어렵게 들리지만, 사실 우리는 매일 SaaS를 쓰고 있습니다. 넷플릭스&quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/saas-meaning-examples&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/saas-meaning-examples&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b87tUb/dJMb8QeBzYl/JzukIJPAkXAKKe5VqAm881/img.png?width=800&amp;amp;height=638&amp;amp;face=590_121_647_183,https://scrap.kakaocdn.net/dn/n9xoR/dJMb8WePcjC/6BRKkKbGe7M5QtxTxma350/img.png?width=800&amp;amp;height=638&amp;amp;face=590_121_647_183,https://scrap.kakaocdn.net/dn/brRlH9/dJMb9c9M3an/PF76hFnakIGooWJ1zXKs01/img.png?width=1200&amp;amp;height=958&amp;amp;face=888_181_974_274&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/saas-meaning-examples&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/saas-meaning-examples&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b87tUb/dJMb8QeBzYl/JzukIJPAkXAKKe5VqAm881/img.png?width=800&amp;amp;height=638&amp;amp;face=590_121_647_183,https://scrap.kakaocdn.net/dn/n9xoR/dJMb8WePcjC/6BRKkKbGe7M5QtxTxma350/img.png?width=800&amp;amp;height=638&amp;amp;face=590_121_647_183,https://scrap.kakaocdn.net/dn/brRlH9/dJMb9c9M3an/PF76hFnakIGooWJ1zXKs01/img.png?width=1200&amp;amp;height=958&amp;amp;face=888_181_974_274');&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;SaaS 뜻과 사례, 우리가 매달 내는 구독료의 정체&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SaaS란 무엇일까요. 뉴스나 경제 기사에서 한 번쯤 보셨을 이 단어는 '서비스형 소프트웨어(Software as a Service)'의 줄임말입니다. 어렵게 들리지만, 사실 우리는 매일 SaaS를 쓰고 있습니다. 넷플릭스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786070399580&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;Claude 챗&amp;middot;코워크&amp;middot;코드 차이 - 같은 모델인데 왜 일하는 성격이 다를까 (2026)&quot; data-og-description=&quot;&amp;quot;챗은 답이 정확한데 좀 느린 느낌이고&amp;hellip;&amp;quot;&amp;quot;코워크는 처음엔 답답한데 쓰다 보면 손발이 맞아.&amp;quot;&amp;quot;코드는 일단 만들어 놓고 보는 스타일 아니야?&amp;quot;&amp;quot;같은 Claude인데 왜 셋이 성격이 달라?&amp;quot; 요즘 동료들&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0037B/dJMb84qnR55/vk2VKmuMkmBHRhA02gnSz1/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/nLsvf/dJMb8YX1c7Z/X2jFkJk1j6oKfHEfav9emK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/oHWlT/dJMb82e2iXl/yfEvXh2Vgp8334ohmRm1Lk/img.png?width=1200&amp;amp;height=962&amp;amp;face=731_238_824_339&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-chat-cowork-code-difference&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0037B/dJMb84qnR55/vk2VKmuMkmBHRhA02gnSz1/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/nLsvf/dJMb8YX1c7Z/X2jFkJk1j6oKfHEfav9emK/img.png?width=800&amp;amp;height=641&amp;amp;face=477_148_558_236,https://scrap.kakaocdn.net/dn/oHWlT/dJMb82e2iXl/yfEvXh2Vgp8334ohmRm1Lk/img.png?width=1200&amp;amp;height=962&amp;amp;face=731_238_824_339');&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;Claude 챗&amp;middot;코워크&amp;middot;코드 차이 - 같은 모델인데 왜 일하는 성격이 다를까 (2026)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;챗은 답이 정확한데 좀 느린 느낌이고&amp;hellip;&quot;&quot;코워크는 처음엔 답답한데 쓰다 보면 손발이 맞아.&quot;&quot;코드는 일단 만들어 놓고 보는 스타일 아니야?&quot;&quot;같은 Claude인데 왜 셋이 성격이 달라?&quot; 요즘 동료들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786070378874&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&quot; data-og-description=&quot;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5hKrN/dJMb9kmrFih/BdwUEMos2qOUd2TdSqkRU1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/ZWAUN/dJMb9g5p6Xn/Wkb3xsRvrl2KAgDuHP8KP0/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/cyDh1y/dJMb9bwho2Q/L5lEBifOEK0BvgDV7kTrJK/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-convention&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5hKrN/dJMb9kmrFih/BdwUEMos2qOUd2TdSqkRU1/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/ZWAUN/dJMb9g5p6Xn/Wkb3xsRvrl2KAgDuHP8KP0/img.png?width=800&amp;amp;height=577&amp;amp;face=513_162_565_218,https://scrap.kakaocdn.net/dn/cyDh1y/dJMb9bwho2Q/L5lEBifOEK0BvgDV7kTrJK/img.png?width=2400&amp;amp;height=1731&amp;amp;face=648_204_702_263');&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;AI 코딩 컨벤션 시대, 컨벤션 문서의 독자가 바뀌었다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 코딩 컨벤션이라는 말이 낯설게 들릴 수 있습니다. 코드 컨벤션은 원래 사람 팀원끼리 지키던 약속이었는데, 요즘은 그 규칙 문서를 읽는 쪽이 AI로 바뀌었습니다. CLAUDE.md, AGENTS.md 같은 파일이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786070372520&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&quot; data-og-description=&quot;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMG16m/dJMb84Yd4ra/ArEcQwECYrLu1qRYBtN0oK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/be9t3s/dJMb84Yd4q9/XjaedrhI2d29vaOJL0DoJK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bWuPSj/dJMb9jOB2En/8bFr1sC3qPrskHZ86vnuw1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/claude-code-permission-modes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMG16m/dJMb84Yd4ra/ArEcQwECYrLu1qRYBtN0oK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/be9t3s/dJMb84Yd4q9/XjaedrhI2d29vaOJL0DoJK/img.png?width=800&amp;amp;height=597&amp;amp;face=543_130_576_166,https://scrap.kakaocdn.net/dn/bWuPSj/dJMb9jOB2En/8bFr1sC3qPrskHZ86vnuw1/img.png?width=1200&amp;amp;height=896&amp;amp;face=815_195_865_249');&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;클로드코드 권한 모드 4개 아니라 사실 6개, Auto와 Plan 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클로드코드 권한 모드는 흔히 아는 것보다 하나 더, 둘 더 있습니다. Shift+Tab을 눌러 순환하면 Manual, Accept edits, Plan, 조건이 맞으면 Auto까지 서너 개가 돌아가는데, 공식 문서 기준 실제 권한 모드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1786070367141&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&quot; data-og-description=&quot;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mmHGS/dJMb8VNLee9/PmKt9q7RuKXbgk0aTFNw2k/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/PyQr8/dJMb8XSljIE/AGxx8rmgaTRtZQFuc3xORK/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/bb4HSZ/dJMb9jgMDPl/o66KNh6zjN6h1OOPkKxXLK/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/ai-coding-agent-goal-commands&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mmHGS/dJMb8VNLee9/PmKt9q7RuKXbgk0aTFNw2k/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/PyQr8/dJMb8XSljIE/AGxx8rmgaTRtZQFuc3xORK/img.png?width=800&amp;amp;height=597&amp;amp;face=523_130_583_195,https://scrap.kakaocdn.net/dn/bb4HSZ/dJMb9jgMDPl/o66KNh6zjN6h1OOPkKxXLK/img.png?width=1200&amp;amp;height=896&amp;amp;face=776_193_882_309');&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;AI 코딩 에이전트 goal&amp;middot;ultracode 명령어 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2026년 들어 AI 코딩 에이전트를 쓰는 방식이 한 번 크게 바뀌었습니다. 예전에는 한 번 시키고 결과를 확인한 뒤 다시 시키는 식이었다면, 이제는 goal 같은 명령어로 '완료 조건'만 정해주면 에이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>AI 소식&amp;middot;도구</category>
      <category>AI백엔드</category>
      <category>BaaS</category>
      <category>Cursor연동</category>
      <category>pgvector</category>
      <category>PostgreSQL</category>
      <category>RLS보안</category>
      <category>supabase</category>
      <category>Supabase특징</category>
      <category>백엔드구축</category>
      <category>백엔드인프라</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/138</guid>
      <comments>https://devwar.tistory.com/entry/supabase-features-ai-backend#entry138comment</comments>
      <pubDate>Fri, 7 Aug 2026 11:40:59 +0900</pubDate>
    </item>
    <item>
      <title>Ajax fetch axios 차이, 10년 넘게 쓰며 알게 된 것들</title>
      <link>https://devwar.tistory.com/entry/ajax-fetch-axios-difference</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;983&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0BBvc/dJMcahSDSBP/XoPZLT4cku3k3TiKVyb5x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0BBvc/dJMcahSDSBP/XoPZLT4cku3k3TiKVyb5x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0BBvc/dJMcahSDSBP/XoPZLT4cku3k3TiKVyb5x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0BBvc%2FdJMcahSDSBP%2FXoPZLT4cku3k3TiKVyb5x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Ajax fetch axios 차이, 10년 넘게 쓰며 알게 된 것들&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;983&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;983&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax, fetch, axios 차이를 검색하면 문법 비교표는 많이 나옵니다. 그런데 이 셋이 어떤 흐름으로 이어져 왔는지, 실무에서 어느 지점에서 문제가 터지는지를 다룬 글은 의외로 적습니다. 저는 XMLHttpRequest와 jQuery Ajax 시절부터 이 흐름을 현장에서 겪었고, fetch의 함정에 실제로 당해 본 적도 있습니다. 이 글에서는 그 경험을 바탕으로 세 도구의 관계와 차이를 코드와 함께 짚어보겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;fetch가 있는데 axios를 왜 설치하나요?&quot;&lt;br /&gt;&quot;404인데 왜 catch로 안 떨어지죠?&quot;&lt;br /&gt;&quot;회사 코드는 axios인데 강의는 다 fetch로 가르치던데요.&quot;&lt;br /&gt;&quot;둘 중 뭘 배워야 하나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주니어 개발자들에게 실제로 자주 받는 질문들입니다. 저도 처음 fetch를 만졌을 때 404 응답이 catch 블록으로 떨어지지 않아서 한참 헤맸습니다. jQuery의 &lt;code&gt;$.ajax&lt;/code&gt;에 길들여진 습관 때문이었는데, 알고 보니 그건 습관 문제가 아니라 설계 철학의 차이였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 fetch와 axios를 처음 비교하는 분, 그리고 &quot;왜 이렇게 만들어졌는지&quot;까지 알고 싶은 분에게 도움이 될 겁니다. 문법 차이만 나열하지 않고, XMLHttpRequest부터 2026년 현재까지의 흐름 속에서 두 도구를 놓고 보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Ajax는 라이브러리가 아니라 기법이었습니다&lt;/li&gt;
&lt;li&gt;jQuery $.ajax가 사실상 표준이던 시절&lt;/li&gt;
&lt;li&gt;fetch API가 등장한 배경&lt;/li&gt;
&lt;li&gt;fetch의 첫 번째 함정 - 404는 에러가 아닙니다&lt;/li&gt;
&lt;li&gt;fetch의 두 번째 함정 - 타임아웃과 JSON 처리&lt;/li&gt;
&lt;li&gt;axios가 해결해 주는 것들&lt;/li&gt;
&lt;li&gt;fetch axios 차이 한눈에 비교&lt;/li&gt;
&lt;li&gt;2026년 지금은 무엇을 써야 할까&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Ajax는 라이브러리가 아니라 기법이었습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 용어부터 정리할 필요가 있습니다. Ajax는 설치하는 라이브러리가 아닙니다. Asynchronous JavaScript and XML의 약자로, &quot;페이지를 새로고침하지 않고 서버와 데이터를 주고받는 기법&quot; 자체를 가리키는 말이었습니다. 그리고 그 기법의 실제 엔진이 브라우저 내장 객체인 XMLHttpRequest였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XMLHttpRequest를 날것으로 쓰면 이런 모양이 됩니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/users');
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      var data = JSON.parse(xhr.responseText);
      console.log(data);
    } else {
      console.error('요청 실패: ' + xhr.status);
    }
  }
};
xhr.send();&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;readyState가 4가 될 때까지 기다리고, status를 직접 확인하고, 응답 문자열을 JSON.parse로 직접 파싱합니다. GET 하나에 이 정도 코드가 필요했습니다. POST로 폼 데이터를 보내려면 헤더 설정과 인코딩까지 손으로 다 해야 했고요. 이걸 매번 쓰는 사람은 사실 거의 없었습니다. 다들 무언가로 감싸서 썼는데, 그 &quot;무언가&quot;가 바로 jQuery였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. jQuery $.ajax가 사실상 표준이던 시절&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 실무를 시작한 2012년 무렵에는 비동기 통신 코드를 짠다는 말이 곧 &lt;code&gt;$.ajax&lt;/code&gt;를 쓴다는 뜻이었습니다. 당시 만들던 모바일 웹 페이지들도 전부 이 패턴이었습니다.&lt;/p&gt;
&lt;pre class=&quot;lua&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;$.ajax({
  url: '/api/users',
  type: 'GET',
  dataType: 'json',
  success: function (data) {
    console.log(data);
  },
  error: function (xhr, status, err) {
    console.error('요청 실패: ' + xhr.status);
  }
});&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;XMLHttpRequest의 잡일을 전부 숨겨주고, dataType만 지정하면 JSON 파싱도 알아서 해 줬습니다. 그리고 중요한 점 하나. 서버가 404나 500을 돌려주면 error 콜백이 호출됐습니다. HTTP 상태 코드가 실패면 에러로 취급한다는, 개발자 입장에서 직관적인 동작이었습니다. 이 감각이 나중에 fetch를 만났을 때 발목을 잡습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 시절이 좋기만 했던 건 아닙니다. 요청 결과를 받아 다음 요청을 보내고, 그 결과로 또 요청을 보내는 화면을 만들다 보면 success 안에 success가 계속 중첩됐습니다. 흔히 콜백 지옥이라고 부르던 그 코드입니다. 당시엔 그게 이상하다는 생각조차 못 하고 들여쓰기를 여섯 단계씩 파고 들어갔습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  시대 배경&lt;/b&gt;&lt;br /&gt;2012년 전후엔 IE 하위 버전 호환이 필수 요구사항이었습니다. XMLHttpRequest조차 브라우저마다 생성 방식이 달랐기 때문에, 이 차이를 흡수해 주는 jQuery는 선택이 아니라 생존 도구에 가까웠습니다. 지금 기준으로 당시 코드를 평가하면 안 되는 이유입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. fetch API가 등장한 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2015년을 전후해 상황이 바뀝니다. ES6에서 Promise가 언어 표준이 되면서, 콜백 기반의 XMLHttpRequest를 대체할 새로운 표준 API로 fetch가 브라우저에 들어왔습니다. 라이브러리 없이 브라우저가 직접 Promise 기반 HTTP 통신을 제공하게 된 겁니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;// 기본 사용법 - async/await와 결합하면 더 깔끔해집니다
const response = await fetch('/api/users');
const data = await response.json();
console.log(data);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XMLHttpRequest 코드와 비교하면 차이가 큽니다. readyState 확인도, 수동 JSON.parse도 없습니다. 이후 async/await까지 언어에 들어오면서 비동기 코드가 동기 코드처럼 읽히게 됐고, fetch는 그 흐름의 중심에 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저만의 이야기도 아닙니다. Node.js도 18 버전부터 fetch를 내장하기 시작해서, 이제는 브라우저와 서버가 같은 표준 API로 HTTP 요청을 보낼 수 있습니다. &quot;Ajax 한다&quot;는 말이 사라지고 &quot;fetch 한다&quot;는 말이 그 자리를 차지한 배경입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 fetch는 jQuery Ajax의 후계자가 아닙니다. 설계 철학이 다릅니다. fetch는 편의 기능을 얹은 도구가 아니라, HTTP 통신의 저수준 기본기를 표준으로 만든 API입니다. 이 차이를 모르고 쓰면 함정에 빠집니다. 제가 빠졌던 것처럼요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. fetch의 첫 번째 함정 - 404는 에러가 아닙니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch로 옮겨온 개발자가 가장 먼저 당하는 지점입니다. 아래 코드를 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;try {
  const response = await fetch('/api/users/999'); // 존재하지 않는 유저
  const data = await response.json();
  console.log(data);
} catch (err) {
  // 404여도 여기로 안 옵니다
  console.error('에러 발생:', err);
}&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;서버가 404를 돌려줘도 catch 블록은 실행되지 않습니다. fetch 입장에서 &quot;서버가 응답을 줬다&quot;는 사실 자체는 통신 성공이기 때문입니다. fetch가 reject되는 경우는 네트워크 단절, CORS 차단처럼 응답 자체를 못 받은 상황뿐입니다. 그래서 상태 코드 확인은 개발자 몫입니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;const response = await fetch('/api/users/999');

if (!response.ok) { // status가 200번대가 아니면 false
  throw new Error(`HTTP 에러: ${response.status}`);
}

const data = await response.json();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;response.ok&lt;/code&gt; 체크 한 줄을 모든 요청마다 넣어야 합니다. 저는 이걸 몰라서 에러 페이지 대신 undefined 데이터로 화면을 그리는 버그를 만든 적이 있습니다. 서버 로그엔 404가 찍히는데 프론트 콘솔은 조용하니, 원인을 찾는 데 시간이 꽤 걸렸습니다. jQuery 시절의 &quot;실패하면 error 콜백&quot;이라는 감각이 오히려 독이 된 경우였습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #2a9d8f;&quot;&gt;&lt;b&gt;  왜 이렇게 설계했을까&lt;/b&gt;&lt;br /&gt;fetch는 &quot;HTTP 통신이 이루어졌는가&quot;와 &quot;응답 내용이 원하는 것인가&quot;를 분리해서 봅니다. 404도 서버가 보낸 정상적인 HTTP 응답이라는 관점입니다. 표준 API로서는 일관된 철학이지만, 매번 ok 체크를 강제한다는 점에서 실무 편의와는 거리가 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. fetch의 두 번째 함정 - 타임아웃과 JSON 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch에는 타임아웃 옵션이 없습니다. 서버가 응답을 안 주면 브라우저 기본 한계까지 하염없이 기다립니다. 사내망이나 모바일 환경처럼 네트워크가 불안정한 곳에서는 치명적입니다. 예전에는 setTimeout과 AbortController를 조합해 직접 구현해야 했는데, 지금은 &lt;code&gt;AbortSignal.timeout()&lt;/code&gt;이 표준에 들어와서 한 줄로 처리됩니다. 2024년부터 주요 브라우저에서 기본 지원됩니다.&lt;/p&gt;
&lt;pre class=&quot;qml&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;try {
  const response = await fetch('/api/slow-endpoint', {
    signal: AbortSignal.timeout(5000) // 5초 제한
  });
  if (!response.ok) throw new Error(`HTTP 에러: ${response.status}`);
  const data = await response.json();
} catch (err) {
  if (err.name === 'TimeoutError') {
    console.error('5초 안에 응답이 오지 않았습니다');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 전송도 손이 갑니다. POST로 객체를 보내려면 헤더 지정과 문자열 변환을 직접 해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;await fetch('/api/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: '홍길동' }) // 직접 문자열로 변환
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한두 번이면 괜찮은데, 프로젝트 전체에서 매번 이 보일러플레이트를 반복하다 보면 결국 공통 함수로 감싸게 됩니다. ok 체크, 타임아웃, JSON 변환, 에러 가공까지 넣다 보면 어느새 작은 HTTP 라이브러리를 하나 만들고 있는 자신을 발견합니다. 그리고 그 지점에서 이런 생각이 듭니다. 이거, 누가 이미 만들어 놓지 않았을까?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. axios가 해결해 주는 것들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 답이 axios입니다. 2014년에 나온 Promise 기반 HTTP 클라이언트로, 방금 나열한 불편을 대부분 기본값으로 해결합니다. 2026년 현재도 npm에서 주간 수천만 건씩 내려받는, 이 분야에서 가장 널리 쓰이는 라이브러리입니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;import axios from 'axios';

try {
  // JSON 변환, Content-Type 헤더 자동 처리
  const res = await axios.post('/api/users',
    { name: '홍길동' },
    { timeout: 5000 } // 타임아웃 옵션 내장
  );
  console.log(res.data); // 파싱된 JSON이 바로 나옴
} catch (err) {
  // 404, 500 등 실패 상태 코드도 여기로 떨어짐
  if (err.response) {
    console.error('서버 응답 에러:', err.response.status);
  } else {
    console.error('요청 자체가 실패:', err.message);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch에서 손으로 하던 일들이 전부 사라졌습니다. 4xx, 5xx 응답이 catch로 떨어지는 동작은 jQuery 시절의 감각과 같아서, 저처럼 그 시절을 지나온 개발자에게는 오히려 axios 쪽이 자연스럽게 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규모가 있는 프로젝트에서 진짜 힘을 발휘하는 건 인터셉터입니다. 모든 요청과 응답이 지나가는 길목에 공통 로직을 심을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;background: #f6f8fa; padding: 15px; border-radius: 6px; overflow-x: auto;&quot;&gt;&lt;code&gt;const api = axios.create({ baseURL: '/api', timeout: 5000 });

// 모든 요청에 인증 토큰 자동 첨부
api.interceptors.request.use((config) =&amp;gt; {
  config.headers.Authorization = `Bearer ${getToken()}`;
  return config;
});

// 401 응답이 오면 어디서든 로그인 페이지로
api.interceptors.response.use(
  (res) =&amp;gt; res,
  (err) =&amp;gt; {
    if (err.response?.status === 401) {
      location.href = '/login';
    }
    return Promise.reject(err);
  }
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 토큰 첨부, 공통 에러 처리, 로깅 같은 횡단 관심사를 요청 코드 바깥에서 한 번에 관리할 수 있습니다. fetch로 이걸 하려면 래퍼 함수를 직접 설계해야 하는데, 팀 규모가 커질수록 그 래퍼의 유지보수가 부담이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 axios는 브라우저에서 내부적으로 XMLHttpRequest를 사용합니다. fetch보다 오래된 엔진 위에서 돌아간다는 뜻인데, 업로드 진행률 이벤트처럼 fetch에 아직 없는 기능을 제공할 수 있는 이유이기도 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. fetch axios 차이 한눈에 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지의 내용을 표로 정리하면 이렇습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;fetch&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;axios&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;불필요 (브라우저&amp;middot;Node 18+ 내장)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;npm 설치 필요 (십수 KB 수준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;4xx/5xx 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;reject 안 됨, response.ok 직접 확인&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;에러로 reject되어 catch로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;JSON 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;json() 호출&amp;middot;stringify 직접&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;요청&amp;middot;응답 모두 자동 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;타임아웃&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;AbortSignal.timeout()으로 지정&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;timeout 옵션 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인터셉터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;없음 (래퍼 직접 구현)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;요청&amp;middot;응답 인터셉터 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;내부 엔진(브라우저)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;브라우저 네이티브 구현&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;XMLHttpRequest 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;엣지 런타임&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Cloudflare Workers 등에서 동작&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Node 전용 모듈 의존으로 동작 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;업로드 진행률&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;표준 이벤트 없음&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;onUploadProgress 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표만 보면 axios가 편의성에서 앞서는 것처럼 보이지만, 마지막에서 두 번째 줄에 주목할 필요가 있습니다. Cloudflare Workers나 Vercel Edge 같은 엣지 런타임에서는 Node의 http 모듈이 없어서 axios가 아예 동작하지 않습니다. 실행 환경이 다양해질수록 표준 API인 fetch의 가치가 올라가는 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 2026년 지금은 무엇을 써야 할까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 기준은 이렇습니다. 확실한 정답이라기보다 현장에서 쓰는 판단 기준 정도로 봐 주시면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청이 몇 개 안 되는 작은 프로젝트, 정적 사이트, 서버리스 함수라면 fetch면 충분합니다. 의존성 하나 없이 표준만으로 해결되고, AbortSignal.timeout이 들어온 뒤로는 예전만큼 불편하지도 않습니다. 반대로 인증 토큰 갱신, 공통 에러 처리, 여러 API 서버를 오가는 규모의 서비스라면 axios의 인터셉터와 인스턴스 구조가 주는 이득이 큽니다. 이미 axios로 짜인 코드베이스를 fetch로 갈아엎을 이유는 더더욱 없고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 제3의 선택지도 있습니다. fetch를 얇게 감싸서 axios 수준의 편의를 제공하는 ky, ofetch 같은 라이브러리들입니다. 용량이 axios의 몇 분의 일 수준이고 표준 fetch 위에서 돌아가기 때문에 엣지 런타임에서도 그대로 쓸 수 있습니다. 새 프로젝트라면 이쪽을 검토해 볼 가치가 있다고 봅니다. 다만 생태계와 레퍼런스 양은 아직 axios가 앞서니, 팀원 구성에 따라 답이 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아보면 XMLHttpRequest에서 jQuery로, fetch로, 다시 fetch 래퍼로 이어지는 이 흐름은 결국 하나의 방향이었습니다. 플랫폼 표준이 저수준 기반을 다지면, 그 위의 편의는 가벼운 라이브러리가 채우는 구조로 계속 이동해 온 겁니다. 지금 뭘 배워야 하냐고 묻는다면, 도구 이전에 fetch가 왜 404를 에러로 안 던지는지부터 이해하시라고 답하고 싶습니다. 그 설계 의도를 알면 axios를 쓰든 ky를 쓰든 헤맬 일이 줄어듭니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 묻는 질문&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;jQuery Ajax는 이제 배울 필요가 없나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 배울 필요는 없습니다. 다만 오래된 사내 시스템이나 레거시 프로젝트에는 여전히 $.ajax 코드가 살아 있어서, 유지보수 업무를 맡으면 읽을 줄은 알아야 합니다. 콜백 구조만 이해하면 읽는 건 어렵지 않습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;axios도 결국 XMLHttpRequest면 구식 아닌가요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔진이 오래됐다고 도구가 구식인 건 아닙니다. XMLHttpRequest는 여전히 모든 브라우저에서 잘 동작하고, axios는 이를 기반으로 업로드 진행률처럼 fetch가 못 하는 기능도 제공합니다. 2026년 현재도 꾸준히 새 버전이 나오며 관리되고 있습니다. 다만 엣지 런타임 미지원 같은 구조적 한계는 이 엔진 선택에서 비롯된 것이 맞습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;React나 Vue에서는 뭘 쓰는 게 좋나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크 자체는 어느 쪽이든 상관없습니다. 실무에서는 TanStack Query 같은 서버 상태 라이브러리와 조합하는 경우가 많은데, 이때 실제 요청 함수는 fetch든 axios든 자유롭게 끼울 수 있습니다. 팀의 기존 코드베이스를 따라가는 게 보통 가장 나은 선택입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;fetch만 쓰면 인터셉터 같은 건 포기해야 하나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 래퍼 함수를 만들거나, ky처럼 훅(hook) 시스템을 제공하는 fetch 래퍼를 쓰면 됩니다. ky의 beforeRequest, afterResponse 훅이 axios 인터셉터와 비슷한 역할을 합니다. 규모가 작다면 async 함수 하나로 감싸는 것만으로도 충분한 경우가 많습니다.&lt;/p&gt;
&lt;h2 id=&quot;h-14&quot; style=&quot;background-color: #ffffff; color: #111418; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1784305675623&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;&amp;quot;자바스크립트는 너무 자유분방해서 탈이야.&amp;quot; &amp;quot;이거 실행해봐야 에러가 나는지 알 수 있잖아.&amp;quot; &amp;quot;남이 짠 자바스크립트 코드는 대체 뭘 주고받는지 모르겠어.&amp;quot; 웹 개발을 오래 하다 보면 자바스크&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/typescript-history&quot; data-og-url=&quot;https://devwar.tistory.com/entry/typescript-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bks4Fn/dJMb9hDdGrx/dP8d3HrUrE1HZ8CTyMqVe0/img.png?width=800&amp;amp;height=619&amp;amp;face=517_123_597_210,https://scrap.kakaocdn.net/dn/ZdBsr/dJMb9bweMqx/S777l2PrSICsxwkpt4ZK60/img.png?width=800&amp;amp;height=619&amp;amp;face=517_123_597_210,https://scrap.kakaocdn.net/dn/yOTVD/dJMb9efqzEv/WC5U9LoqQNeh69n4pPqGs0/img.png?width=1023&amp;amp;height=792&amp;amp;face=674_169_755_256&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/typescript-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/typescript-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bks4Fn/dJMb9hDdGrx/dP8d3HrUrE1HZ8CTyMqVe0/img.png?width=800&amp;amp;height=619&amp;amp;face=517_123_597_210,https://scrap.kakaocdn.net/dn/ZdBsr/dJMb9bweMqx/S777l2PrSICsxwkpt4ZK60/img.png?width=800&amp;amp;height=619&amp;amp;face=517_123_597_210,https://scrap.kakaocdn.net/dn/yOTVD/dJMb9efqzEv/WC5U9LoqQNeh69n4pPqGs0/img.png?width=1023&amp;amp;height=792&amp;amp;face=674_169_755_256');&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;&quot;자바스크립트는 너무 자유분방해서 탈이야.&quot; &quot;이거 실행해봐야 에러가 나는지 알 수 있잖아.&quot; &quot;남이 짠 자바스크립트 코드는 대체 뭘 주고받는지 모르겠어.&quot; 웹 개발을 오래 하다 보면 자바스크&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784305671723&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;자바와 자바스크립트 차이는? 10일 만에 만들어진 자바스크립트 역사 이야기&quot; data-og-description=&quot;자바(Java)와 자바스크립트(JavaScript)의 차이는 개발 공부를 막 시작한 분들이 가장 많이 헷갈려 하는 부분입니다. &amp;quot;자바랑 자바스크립트랑 같은 거 아니에요?&amp;quot; 제가 13년째 가장 자주 듣는 질문이&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; data-og-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3aAky/dJMb85v1HVO/FdLi41OFttD7TtzZD0wUQK/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/4zODZ/dJMb87gjbhs/kwe484dd6hlCH8ths87Vek/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/PLV18/dJMb9jOzp72/ETuGbM6M4KjMPp2TMOf9I1/img.png?width=1200&amp;amp;height=896&amp;amp;face=727_183_833_299&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript%EB%8A%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EC%83%9D%EC%9D%BC%EA%B9%8C-10%EC%9D%BC-%EB%A7%8C%EC%97%90-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B8%B0%EC%A0%81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3aAky/dJMb85v1HVO/FdLi41OFttD7TtzZD0wUQK/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/4zODZ/dJMb87gjbhs/kwe484dd6hlCH8ths87Vek/img.png?width=800&amp;amp;height=597&amp;amp;face=485_122_556_199,https://scrap.kakaocdn.net/dn/PLV18/dJMb9jOzp72/ETuGbM6M4KjMPp2TMOf9I1/img.png?width=1200&amp;amp;height=896&amp;amp;face=727_183_833_299');&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;자바와 자바스크립트 차이는? 10일 만에 만들어진 자바스크립트 역사 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)와 자바스크립트(JavaScript)의 차이는 개발 공부를 막 시작한 분들이 가장 많이 헷갈려 하는 부분입니다. &quot;자바랑 자바스크립트랑 같은 거 아니에요?&quot; 제가 13년째 가장 자주 듣는 질문이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784305667495&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&quot; data-og-description=&quot;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/big81H/dJMb9dHAL2J/gBQ2B8PZIWVbJkDgmJ6CkK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/dVsZ9v/dJMb9b34xXJ/p2wilaXifml50yLEmAnoa1/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/jh5i6/dJMb9efqzEs/8EyTUKAdEks95XFioqykNK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/html-history-who-and-why&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/big81H/dJMb9dHAL2J/gBQ2B8PZIWVbJkDgmJ6CkK/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/dVsZ9v/dJMb9b34xXJ/p2wilaXifml50yLEmAnoa1/img.png?width=800&amp;amp;height=625&amp;amp;face=432_138_488_199,https://scrap.kakaocdn.net/dn/jh5i6/dJMb9efqzEs/8EyTUKAdEks95XFioqykNK/img.png?width=999&amp;amp;height=781&amp;amp;face=521_157_630_275');&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;HTML 역사, 누가 왜 만들었을까 (태그 18개의 시작)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 역사를 조금만 거슬러 올라가 보면, 우리가 매일 아무렇지 않게 넘기는 웹페이지가 원래는 스위스의 한 물리학 연구소에서 문서 몇 개를 편하게 주고받으려고 급조한 도구였다는 사실과 마&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784305663853&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&quot; data-og-description=&quot;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eg3ihR/dJMb81HabTB/h6CquwlS454tWzruuOdfaK/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/bIzAc7/dJMb86oaiw1/rkkEFSEYJm5PzJKwuGCKuk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/hTcMQ/dJMb85v1HVN/1nIHQVOWSZUuHnBKgKojQK/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/nodejs-birth-story-javascript-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eg3ihR/dJMb81HabTB/h6CquwlS454tWzruuOdfaK/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/bIzAc7/dJMb86oaiw1/rkkEFSEYJm5PzJKwuGCKuk/img.png?width=800&amp;amp;height=613&amp;amp;face=363_143_411_196,https://scrap.kakaocdn.net/dn/hTcMQ/dJMb85v1HVN/1nIHQVOWSZUuHnBKgKojQK/img.png?width=1000&amp;amp;height=767&amp;amp;face=457_173_519_241');&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;Node.js 탄생 비화, 자바스크립트가 서버를 삼킨 날&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js는 브라우저 안에서만 돌던 자바스크립트를 서버로 끌어낸 런타임입니다. 2009년에 등장한 이 도구 하나가 이후 십수 년간 웹 개발의 판을 바꿔 놨는데요. 오늘은 그 탄생 비화를, 당시 업계&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1784305660889&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&quot; data-og-description=&quot;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fvK7c/dJMb9jOzp7X/N3EcSRBKOI9APxfLvaaOA1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/I4RfP/dJMb9jOzp7Y/JsbQIwMeFIkbjysSmYCupK/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/qFWjB/dJMb9iITozZ/vYXbV3Imr6h2kSz7PnhQE0/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/git-history-linus-torvalds&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fvK7c/dJMb9jOzp7X/N3EcSRBKOI9APxfLvaaOA1/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/I4RfP/dJMb9jOzp7Y/JsbQIwMeFIkbjysSmYCupK/img.png?width=800&amp;amp;height=631&amp;amp;face=568_130_651_221,https://scrap.kakaocdn.net/dn/qFWjB/dJMb9iITozZ/vYXbV3Imr6h2kSz7PnhQE0/img.png?width=1200&amp;amp;height=947&amp;amp;face=858_200_974_325');&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;Git 역사, 리누스가 열흘 만에 만든 버전관리 도구&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Git 역사를 거슬러 올라가 보면 시작은 의외로 초라합니다. 지금은 전 세계 개발자 대부분이 매일 쓰는 도구지만, 애초에는 리누스 토르발스 한 사람이 자기 리눅스 커널을 관리하려고 급하게 만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>언어&amp;middot;프레임워크</category>
      <category>AJAX</category>
      <category>Ajax fetch axios 차이</category>
      <category>axios</category>
      <category>axios 인터셉터</category>
      <category>Fetch API</category>
      <category>fetch 타임아웃</category>
      <category>HTTP 클라이언트</category>
      <category>XMLHttpRequest</category>
      <category>자바스크립트 비동기</category>
      <category>프론트엔드 면접</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/132</guid>
      <comments>https://devwar.tistory.com/entry/ajax-fetch-axios-difference#entry132comment</comments>
      <pubDate>Thu, 6 Aug 2026 19:00:40 +0900</pubDate>
    </item>
    <item>
      <title>동방생활 스킨 업데이트 (2026.08.04) - 광고 노출 개선</title>
      <link>https://devwar.tistory.com/entry/blog-notice-20260804</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBM5Qd/dJMcaftZHFK/ATlhdh8N2A4nfZEkFJc0k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBM5Qd/dJMcaftZHFK/ATlhdh8N2A4nfZEkFJc0k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBM5Qd/dJMcaftZHFK/ATlhdh8N2A4nfZEkFJc0k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBM5Qd%2FdJMcaftZHFK%2FATlhdh8N2A4nfZEkFJc0k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;동방생활 스킨 업데이트 (2026.08.04) - 광고 노출 개선&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;동방생활_20260804 버전&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dd3Xnt/dJMcai5f1IG/tbz66fwBY1k9DHTGugYz7k/%EB%8F%99%EB%B0%A9%EC%83%9D%ED%99%9C_20260804.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;동방생활_20260804.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고가 화면을 방해하지 않도록 크게 손봤습니다. 특히 스마트폰에서 읽기가 한결 쾌적해졌어요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;뭐가 좋아졌나요?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스마트폰에서 글 목록 사이에 화면을 꽉 채울 만큼 길게 나오던 광고가, 이제 적당한 크기로만 나옵니다. 스크롤 몇 번에 광고만 보이던 답답함이 사라졌어요&lt;/li&gt;
&lt;li&gt;본문 위아래 배너가 화면 폭에 딱 맞게 자동으로 조절됩니다. 광고가 옆으로 잘리거나 튀어나오는 일이 없어졌습니다&lt;/li&gt;
&lt;li&gt;배너 높이가 일정하게 고정되어, 페이지가 뜨는 중에 화면이 덜컹 밀리는 현상이 줄었습니다&lt;/li&gt;
&lt;li&gt;사이드바 배너도 옆 공간 폭에 맞춰 자동 정렬됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적용 된 사이트 목록&lt;/h3&gt;
&lt;figure id=&quot;og_1785813747198&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;서울 가볼만한곳 24곳 지도순 정리, 처음이면 이 순서가 편합니다&quot; data-og-description=&quot;서울 가볼만한곳을 검색하면 명소 이름은 금방 모입니다. 경복궁, 북촌, 남산, 성수동, 한강. 문제는 이 이름들이 서울 어디쯤에 있는지가 잘 안 보인다는 것입니다. 목록만 보고 일정을 짜면 하&quot; data-og-host=&quot;hkorea.tistory.com&quot; data-og-source-url=&quot;https://hkorea.tistory.com/entry/seoul-attractions-by-area&quot; data-og-url=&quot;https://hkorea.tistory.com/entry/seoul-attractions-by-area&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/db21Kl/dJMb9gxAhLc/FqxTP1pZKK8VM8UTK6vQjk/img.png?width=800&amp;amp;height=597&amp;amp;face=548_148_584_188,https://scrap.kakaocdn.net/dn/AArGl/dJMb9jOBCG7/rLFxqbxGTVrKUZD94kkt71/img.png?width=800&amp;amp;height=597&amp;amp;face=548_148_584_188,https://scrap.kakaocdn.net/dn/blzpD0/dJMb9cBWHFl/eMSfamI9FjCMgoEx8LZUck/img.png?width=1200&amp;amp;height=1070&amp;amp;face=228_298_293_371&quot;&gt;&lt;a href=&quot;https://hkorea.tistory.com/entry/seoul-attractions-by-area&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hkorea.tistory.com/entry/seoul-attractions-by-area&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/db21Kl/dJMb9gxAhLc/FqxTP1pZKK8VM8UTK6vQjk/img.png?width=800&amp;amp;height=597&amp;amp;face=548_148_584_188,https://scrap.kakaocdn.net/dn/AArGl/dJMb9jOBCG7/rLFxqbxGTVrKUZD94kkt71/img.png?width=800&amp;amp;height=597&amp;amp;face=548_148_584_188,https://scrap.kakaocdn.net/dn/blzpD0/dJMb9cBWHFl/eMSfamI9FjCMgoEx8LZUck/img.png?width=1200&amp;amp;height=1070&amp;amp;face=228_298_293_371');&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;서울 가볼만한곳 24곳 지도순 정리, 처음이면 이 순서가 편합니다&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;hkorea.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1785813716534&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;티스토리 SEO를 위한 HTML 태그 사용법 - h1 중복부터 메타 디스크립션까지 (무료 스킨 공개)&quot; data-og-description=&quot;티스토리 SEO에서 글솜씨만큼 중요한 것이 HTML 태그 구조입니다. h1 태그가 몇 개인지, 제목 계층이 어떻게 흐르는지, 메타 디스크립션이 무엇으로 채워지는지에 따라 같은 글도 검색엔진에게 전&quot; data-og-host=&quot;lsy7651.tistory.com&quot; data-og-source-url=&quot;https://lsy7651.tistory.com/entry/tistory-seo-html-tags-free-skin&quot; data-og-url=&quot;https://lsy7651.tistory.com/entry/tistory-seo-html-tags-free-skin&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5tIjx/dJMb8ZvQmJ5/ecJdfOvynoX3LmxSkwUDY0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=485_138_573_235,https://scrap.kakaocdn.net/dn/XlRzD/dJMb8ZvQmJ6/ZKWmZEAS3fpEqH4rCLEL8k/img.jpg?width=800&amp;amp;height=594&amp;amp;face=485_138_573_235,https://scrap.kakaocdn.net/dn/u9FRX/dJMb8QMrayf/1ZtzzgUmutj5LlOWmadAOK/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=717_205_848_349&quot;&gt;&lt;a href=&quot;https://lsy7651.tistory.com/entry/tistory-seo-html-tags-free-skin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lsy7651.tistory.com/entry/tistory-seo-html-tags-free-skin&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5tIjx/dJMb8ZvQmJ5/ecJdfOvynoX3LmxSkwUDY0/img.jpg?width=800&amp;amp;height=594&amp;amp;face=485_138_573_235,https://scrap.kakaocdn.net/dn/XlRzD/dJMb8ZvQmJ6/ZKWmZEAS3fpEqH4rCLEL8k/img.jpg?width=800&amp;amp;height=594&amp;amp;face=485_138_573_235,https://scrap.kakaocdn.net/dn/u9FRX/dJMb8QMrayf/1ZtzzgUmutj5LlOWmadAOK/img.jpg?width=1184&amp;amp;height=880&amp;amp;face=717_205_848_349');&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;티스토리 SEO를 위한 HTML 태그 사용법 - h1 중복부터 메타 디스크립션까지 (무료 스킨 공개)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;티스토리 SEO에서 글솜씨만큼 중요한 것이 HTML 태그 구조입니다. h1 태그가 몇 개인지, 제목 계층이 어떻게 흐르는지, 메타 디스크립션이 무엇으로 채워지는지에 따라 같은 글도 검색엔진에게 전&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lsy7651.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;del&gt;동방생활_20260726 버전&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;글 읽기가 한결 편해졌고, 스마트폰에서는 글 목록을 훨씬 빠르게 훑어볼 수 있게 됐습니다.&lt;/del&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;del&gt;뭐가 좋아졌나요?&lt;/del&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;del&gt;긴 글 위쪽에 목차가 자동으로 생깁니다. 원하는 부분을 누르면 바로 그 위치로 이동해요&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;글을 읽는 동안 화면 맨 위에 파란 진행바가 차올라서, 어디까지 읽었는지 한눈에 보입니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;스마트폰 글 목록이 사진과 제목이 나란히 놓인 가로형으로 바뀌어, 한 화면에서 두세 배 많은 글을 볼 수 있습니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;썸네일이 와이드(16:9) 비율로 바뀌어 목록이 더 시원하게 정리됐습니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;태블릿에서는 사이드 메뉴가 햄버거(☰) 버튼으로 들어가고, 본문이 화면을 넓게 씁니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;스크롤을 내려도 사이드바가 함께 따라 내려와서, 옆 공간이 텅 비지 않습니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;관련 글이 PC에서 한 줄 3개로 조정되어 제목이 잘리지 않아요&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;del&gt;동방생활_20260725 버전&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;상세 페이지가 더 보기 좋아졌고, 블로그 방문자 수도 한눈에 볼 수 있게 됐습니다.&lt;/del&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;del&gt;뭐가 좋아졌나요?&lt;/del&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;del&gt;글 하단 &quot;관련 글&quot;의 썸네일이 흐릿하게 보이던 문제를 고쳤습니다. 이제 또렷한 고화질 이미지로 나옵니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;관련 글이 두 줄로 어정쩡하게 나뉘던 것을, PC에서는 한 줄에 4개가 깔끔하게 정렬되도록 바꿨습니다 (태블릿&amp;middot;모바일에서는 2개씩 자동 정렬)&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;사이드바에 방문자 수 위젯이 생겼습니다. 전체 &amp;middot; 오늘 &amp;middot; 어제 방문자를 한눈에 확인할 수 있어요&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;del&gt;동방생활_20260723 버전&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;블로그가 더 빨라졌습니다. 특히 스마트폰에서 체감될 거예요.&lt;/del&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;del&gt;뭐가 좋아졌나요?&lt;/del&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;del&gt;글 목록의 썸네일 이미지가 훨씬 가벼워져서 페이지가 빨리 뜹니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;화면에 보이지 않는 이미지는 스크롤할 때 불러와서 데이터를 아낍니다&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;광고가 페이지를 느리게 만들지 않도록, 화면이 다 뜬 뒤에 불러옵니다 (광고 수익에는 영향 없음)&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>티스토리 무료 스킨</category>
      <category>동방생활</category>
      <category>모바일최적화</category>
      <category>블로그개편</category>
      <category>블로그공지</category>
      <category>스킨수정</category>
      <category>스킨업데이트</category>
      <category>업데이트내역</category>
      <category>클린카드</category>
      <category>티스토리스킨</category>
      <category>패치노트</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/136</guid>
      <comments>https://devwar.tistory.com/entry/blog-notice-20260804#entry136comment</comments>
      <pubDate>Tue, 4 Aug 2026 12:22:39 +0900</pubDate>
    </item>
    <item>
      <title>MVP 최소 기능 제품 뜻, 적게 만들라는 말이 아니었습니다</title>
      <link>https://devwar.tistory.com/entry/MVP%EC%B5%9C%EC%86%8C-%EA%B8%B0%EB%8A%A5-%EC%A0%9C%ED%92%88-%EB%9C%BB-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EC%99%84%EB%B2%BD%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%B4%EC%95%BC-%EB%8C%80%EB%B0%95%EB%82%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6rLrH/dJMcadQqrGI/ZXTqQGXOk6sWxz97Km2BEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6rLrH/dJMcadQqrGI/ZXTqQGXOk6sWxz97Km2BEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6rLrH/dJMcadQqrGI/ZXTqQGXOk6sWxz97Km2BEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6rLrH%2FdJMcadQqrGI%2FZXTqQGXOk6sWxz97Km2BEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;MVP 최소 기능 제품 뜻, 적게 만들라는 말이 아니었습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;971&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP 최소 기능 제품 뜻을 검색하면 대부분 &quot;최소한의 기능만 담아 빠르게 내놓는 제품&quot;이라는 설명이 나옵니다. 틀린 말은 아닌데, 이 용어를 처음 만든 사람이 하려던 말과는 거리가 꽤 있습니다. 더 묘한 건 용어를 만든 사람과 세상에 퍼뜨린 사람이 서로 다른 것을 가리키고 있었다는 점입니다. 지금 회의실에서 벌어지는 혼란은 거기서 시작됐습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;일단 MVP로 가시죠.&quot;&lt;br /&gt;&quot;MVP인데 관리자 페이지까지 필요한가요?&quot;&lt;br /&gt;&quot;이거 MVP라면서요. 왜 이렇게 오래 걸려요?&quot;&lt;br /&gt;&quot;MVP니까 결제는 수기로 처리하시면 됩니다.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 회의에서 나온 네 문장인데, 네 사람이 각기 다른 것을 상상하고 있습니다. 그리고 이 어긋남은 대부분 개발 일정과 코드 품질 쪽으로 청구서가 날아옵니다. 저는 이 용어가 잘못 쓰이는 장면을 여러 번 봤고, 그때마다 원인이 사람이 아니라 용어 자체에 있다는 생각을 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 MVP라는 말이 어디서 나왔고, 왜 지금 같은 혼란이 생겼는지를 출처와 함께 정리합니다. 드롭박스 영상 이야기 같은 익숙한 사례는 최소한으로만 다루고, 대신 그 사례들이 왜 오해를 키웠는지에 초점을 맞춥니다. 기획자와 개발자가 같은 단어를 쓰면서 계속 어긋나고 있다면 도움이 될 내용입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;MVP 최소 기능 제품 뜻, 원래 정의는 무엇이었나&lt;/li&gt;
&lt;li&gt;이 말을 만든 사람은 에릭 리스가 아닙니다&lt;/li&gt;
&lt;li&gt;로빈슨의 MVP와 리스의 MVP는 다른 개념입니다&lt;/li&gt;
&lt;li&gt;Minimum보다 먼저 읽어야 할 단어는 Viable&lt;/li&gt;
&lt;li&gt;스케이트보드 그림을 그린 사람은 이 용어를 버렸습니다&lt;/li&gt;
&lt;li&gt;드롭박스와 자포스 사례가 오해를 키운 이유&lt;/li&gt;
&lt;li&gt;MVP가 그대로 본서비스가 되는 문제&lt;/li&gt;
&lt;li&gt;회의에서 MVP를 꺼내기 전에 맞춰야 할 세 가지&lt;/li&gt;
&lt;li&gt;용어를 고르는 일이 곧 범위를 정하는 일입니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. MVP 최소 기능 제품 뜻, 원래 정의는 무엇이었나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP는 Minimum Viable Product의 약자입니다. 우리말로는 최소 기능 제품, 또는 최소 실행 가능 제품으로 옮깁니다. 번역어가 두 개인 것부터가 이미 신호입니다. 앞의 번역은 기능의 양에 무게를 두고, 뒤의 번역은 실행 가능성에 무게를 둡니다. 같은 영어 세 단어를 두고 한국어권에서도 강조점이 갈렸다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 용어를 처음 정의한 사람은 컨설팅 회사 SyncDev의 프랭크 로빈슨(Frank Robinson)입니다. 2001년의 일입니다. 그가 남긴 정의는 지금 통용되는 설명과 결이 다릅니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  로빈슨의 원래 정의 (2001)&lt;/b&gt;&lt;br /&gt;공급자와 고객 &lt;b&gt;양쪽 모두에게&lt;/b&gt; 위험 대비 수익(return on risk)을 가장 크게 만드는 제품. 채택과 만족과 판매를 일으킬 만큼은 크되, 비대해져서 위험해질 만큼 크지는 않은 크기.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 &quot;빠르게&quot;라는 말은 없습니다. &quot;실험&quot;이라는 말도 없습니다. 로빈슨이 풀려던 문제는 따로 있었습니다. 그의 고객사 팀들이 &quot;이번에 기능 800개를 추가했습니다&quot; 같은 보고를 자랑스럽게 해오는 상황이었습니다. 기능 개수를 성과로 착각하는 조직에게, 기능이 늘수록 개발 비용과 QA 부담과 출시 시점이 함께 밀리고 한계 수익은 떨어진다는 점을 설득하려던 개념이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 로빈슨의 MVP는 &lt;b&gt;범위 결정 도구&lt;/b&gt;였습니다. 만들 것인지 말 것인지가 아니라, 이미 만들기로 한 것을 어디까지 만들 것인지 정하는 계산법에 가까웠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 이 말을 만든 사람은 에릭 리스가 아닙니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국 자료에서 MVP를 설명할 때 거의 예외 없이 에릭 리스(Eric Ries)와 린 스타트업이 먼저 등장합니다. 그런데 리스는 이 용어를 만든 사람이 아닙니다. 그의 책 『린 스타트업』이 나온 해는 2011년이고, 로빈슨이 용어를 쓴 것은 그보다 10년 전입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계보를 시간순으로 놓으면 이렇게 됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;시점&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;인물&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;한 일&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2001년&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;프랭크 로빈슨&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;용어를 만들고 정의. 위험 대비 수익 관점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2005년&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;스티브 블랭크&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;『4단계로 배우는 창업 방법론』에서 고객 개발 방법론과 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2009년&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;에릭 리스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;&quot;검증된 학습을 가장 많이 얻는 버전&quot;으로 재정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2011년&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;에릭 리스&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;『린 스타트업』 출간. 용어가 업계 표준어로 굳음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 리스가 로빈슨의 정의를 그대로 가져온 게 아니라는 데 있습니다. 그는 이 단어에 전혀 다른 임무를 맡겼습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 로빈슨의 MVP와 리스의 MVP는 다른 개념입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스가 2009년에 내놓은 정의는 이렇습니다. 새 제품의 어떤 버전으로서, 팀이 고객에 대해 &lt;b&gt;검증된 학습(validated learning)&lt;/b&gt;을 최소 노력으로 최대한 얻어낼 수 있게 해주는 것. 여기서는 판매도 수익도 중심이 아닙니다. 중심은 학습입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 정의를 나란히 놓으면 차이가 분명해집니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;로빈슨의 MVP&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;리스의 MVP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;답하려는 질문&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;얼마나 만들어야 돈이 되는가&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이걸 원하는 사람이 있기는 한가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;전제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;시장 수요는 이미 어느 정도 파악된 상태&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;수요 자체가 아직 미검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;판단 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;위험 대비 수익&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;검증된 학습의 양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;산출물&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;팔 수 있는 제품&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;실험 장치. 영상이나 랜딩 페이지도 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;다음 단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;판매와 확장&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;가설 채택 또는 폐기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;개발자에게 주는 지시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;제대로 만들되 범위를 줄여라&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;버려질 수 있으니 싸게 만들어라&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 아랫줄이 실무에서 가장 크게 갈리는 지점입니다. 로빈슨식으로 이해한 사람은 &quot;기능은 적어도 품질은 출시 수준&quot;을 기대합니다. 리스식으로 이해한 사람은 &quot;어차피 버릴 거니까 대충&quot;을 허용합니다. 이 두 사람이 같은 회의실에 앉아 &quot;MVP로 갑시다&quot;에 합의하면, 합의된 건 단어뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어권에서도 사정은 비슷합니다. 위키백과의 MVP 항목조차 이 용어가 프로토타입 수준부터 완성된 상용 제품까지 아주 넓은 범위를 가리키는 데 쓰인다고 적어두고 있습니다. 정의가 모호하다는 사실 자체가 백과사전에 명시돼 있는 셈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Minimum보다 먼저 읽어야 할 단어는 Viable&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 단어 중 현장에서 가장 자주 삭제되는 단어가 Viable입니다. Minimum은 누구나 기억합니다. Product도 기억합니다. 그런데 &quot;실행 가능한&quot;이라는 조건은 슬그머니 빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Viable이 빠지면 MVP는 그냥 미완성품이 됩니다. 로그인은 되는데 비밀번호 재발급이 없고, 주문은 되는데 취소가 없고, 목록은 나오는데 페이징이 없는 화면. 기능을 줄인 게 아니라 흐름을 끊어놓은 상태입니다. 사용자는 그 지점에서 이탈하고, 우리는 &quot;수요가 없었다&quot;는 잘못된 결론을 얻습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  판단 기준 하나&lt;/b&gt;&lt;br /&gt;기능을 잘라낸 뒤에도 사용자가 &lt;b&gt;목적을 끝까지 달성할 수 있는가&lt;/b&gt;. 달성할 수 있으면 최소 기능 제품이고, 중간에 막히면 그냥 덜 만든 제품입니다. 리스 본인도 MVP가 최소한의 제품을 만드는 일이 아니라고 여러 차례 덧붙였습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세로로 얇게 자르되 위아래는 뚫려 있어야 한다는 이야기입니다. 가로로 잘라서 화면만 있고 뒷단이 없는 상태는 검증에 쓸 수 없습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 스케이트보드 그림을 그린 사람은 이 용어를 버렸습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP를 설명할 때 거의 반드시 등장하는 그림이 있습니다. 위쪽 줄에는 바퀴, 차체, 완성된 자동차가 순서대로 놓이고, 아래쪽 줄에는 스케이트보드, 킥보드, 자전거, 오토바이, 자동차가 놓인 그 그림입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 그림을 그린 사람은 스웨덴의 애자일 코치 헨릭 크니베르그(Henrik Kniberg)입니다. 그리고 2016년 1월, 그는 자신의 블로그에 이 그림을 해설하는 글을 올리면서 결론부에 이렇게 적었습니다. &lt;b&gt;MVP라는 용어는 피하라&lt;/b&gt;는 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 제목 자체가 그 입장을 담고 있습니다. &quot;Making sense of MVP &amp;mdash; and why I prefer Earliest Testable/Usable/Lovable&quot;. 그가 제안한 대안은 하나의 단어가 아니라 세 단계였습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;단계&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;크니베르그의 용어&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;이 단계에서 확인하려는 것&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;1단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Earliest Testable Product&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;이 접근이 작동하기는 하는가. 사용자가 아직 만족하지 않아도 괜찮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;2단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Earliest Usable Product&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;실제 업무나 생활에서 쓸 만한 수준인가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;3단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;Earliest Lovable Product&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;계속 쓰고 싶고 남에게 권하고 싶은가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Minimum을 Earliest로 바꾼 게 핵심입니다. &quot;최소&quot;는 얼마나 적게 만들 것인가를 묻지만, &quot;가장 이른&quot;은 언제 확인할 것인가를 묻습니다. 질문이 양에서 시점으로 옮겨가면 논쟁의 성격이 달라집니다. 기능 개수를 놓고 싸우는 대신, 무엇을 확인하려는지를 놓고 이야기하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크니베르그는 그림에 대해서도 단서를 달았습니다. 이건 비유일 뿐이니 너무 문자 그대로 받아들이지 말라는 것이었습니다. 그런데 현실에서는 그 단서만 빠진 채 그림만 돌아다녔습니다. 실제로 스케이트보드 회사가 자동차 회사가 된 사례는 없다는 반론이 나오는 것도 그래서입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 드롭박스와 자포스 사례가 오해를 키운 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP 사례로 가장 많이 인용되는 두 가지가 있습니다. 드롭박스의 시연 영상과 자포스의 수동 배송입니다. 사실관계부터 정리하면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드롭박스의 드류 휴스턴은 파일 동기화 제품을 다 만들기 전에 동작 방식을 보여주는 짧은 시연 영상을 만들어 해커뉴스와 디그에 올렸습니다. 베타 대기자 명단이 하룻밤 사이 5천 명에서 7만 5천 명으로 늘었다는 게 널리 알려진 결과입니다. 다만 이 수치는 휴스턴 측의 회고에서 나온 것이고, 영상이 올라간 시점도 자료마다 2007년과 2008년으로 갈립니다. 인용할 때 참고할 만한 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자포스의 닉 스윈먼은 재고와 물류 시스템을 갖추기 전에 동네 신발 가게 진열대를 촬영해 간단한 웹사이트에 올렸고, 주문이 들어오면 직접 매장에서 사서 부쳤습니다. 이 회사는 2009년 아마존에 인수됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 사례 모두 훌륭한 검증 사례입니다. 문제는 이 사례들이 &lt;b&gt;수요 검증 이야기인데 개발 방법론 이야기로 인용된다&lt;/b&gt;는 데 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  자주 생기는 비약&lt;/b&gt;&lt;br /&gt;드롭박스는 &lt;b&gt;제품을 만들지 않았습니다.&lt;/b&gt; 영상만 만들었습니다. 자포스도 시스템을 만들지 않았습니다. 사람이 대신 뛰었습니다. 그런데 이 사례들이 &quot;MVP는 대충 만들어서 빨리 내는 것&quot;의 근거로 쓰입니다. 원래 교훈은 정반대에 가깝습니다. 확신이 없으면 아예 만들지 말고 다른 방법으로 확인하라는 쪽입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 한 줄도 쓰지 않고 검증한 사례를, 코드를 대충 쓰는 근거로 삼는 셈입니다. 이 비약이 국내 아티클에서도 상당히 반복되고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. MVP가 그대로 본서비스가 되는 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 쪽에서 MVP라는 말이 특히 조심스러운 이유는 따로 있습니다. 버리기로 하고 만든 것이 잘 안 버려지기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험용으로 짠 코드가 반응이 괜찮으면 그대로 운영에 올라갑니다. 그러면 임시로 넣어둔 것들이 함께 올라갑니다. 하드코딩된 설정값, 트랜잭션 없이 처리한 결제, 인덱스 없는 조회 쿼리, 수기로 돌리기로 한 정산 배치 같은 것들입니다. 이 시점에는 아무도 문제 삼지 않습니다. 사용자가 적으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 드러나는 시점은 보통 그로부터 한참 뒤입니다. 트러블슈팅으로 불려 가서 원인을 추적하다 보면 결국 초기 MVP 코드에 닿는 경우가 적지 않았습니다. 당시 판단이 틀렸다기보다는, 검증이 끝난 뒤 정리할 시간이 배정된 적이 없었다는 쪽에 가깝습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  실험 코드를 지키는 장치&lt;/b&gt;&lt;br /&gt;MVP를 시작할 때 성공 기준과 함께 &lt;b&gt;검증 종료 후 처리 방침&lt;/b&gt;도 같이 적어두는 방법이 있습니다. 가설이 맞으면 어디까지 다시 만들 것인지, 틀리면 언제 걷어낼 것인지. 문서 한 줄이지만 나중에 일정 협상의 근거가 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;린 스타트업의 원래 흐름에도 이 단계가 들어 있습니다. 만들고, 측정하고, 배우고, 다시 만드는 순환입니다. 그런데 현장에서는 만들기와 측정까지만 돌고 배우기와 다시 만들기가 생략되는 일이 흔합니다. 순환이 아니라 직선으로 끝나는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 회의에서 MVP를 꺼내기 전에 맞춰야 할 세 가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용어 자체를 없앨 수는 없습니다. 이미 너무 널리 쓰입니다. 대신 이 단어가 나왔을 때 확인할 것들이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무엇을 확인하려는 실험인지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수요가 있는지 보려는 건지, 이미 수요는 있고 어디까지 만들지를 정하려는 건지. 앞이라면 코드보다 랜딩 페이지가 나을 수 있고, 뒤라면 실험이 아니라 그냥 1차 릴리스입니다. 이 구분만 해도 절반은 정리됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성공과 실패의 숫자가 정해져 있는지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;반응 보고 결정하죠&quot;는 기준이 아닙니다. 몇 명이 가입하면 계속 가는지, 몇 퍼센트가 재방문하면 성공인지가 미리 정해져 있어야 실험입니다. 숫자가 없으면 결과가 어떻게 나오든 &quot;조금 더 지켜보자&quot;로 끝납니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검증 이후 코드를 어떻게 할 것인지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그대로 쓸 건지, 다시 만들 건지, 얼마를 배정할 건지. 이걸 시작 시점에 합의해두지 않으면 나중에는 협상 자체가 안 됩니다. 이미 돌아가는 서비스를 멈추고 손댈 명분을 찾기 어려워지기 때문입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 나오는 질문&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVP와 프로토타입은 무엇이 다른가요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토타입은 내부 검토용이고 실제 사용자에게 가치를 전달할 필요가 없습니다. MVP는 정의상 사용자가 실제로 써서 목적을 달성할 수 있어야 합니다. 다만 리스식 정의에서는 영상이나 수동 운영도 MVP로 인정되기 때문에 경계가 흐려지는 경우가 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVP는 얼마나 걸려야 적당한가요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기간으로 정하면 대부분 어긋납니다. 확인하려는 가설의 개수로 잡는 편이 낫습니다. 가설 하나를 확인하는 데 필요한 최소 구성이 곧 범위가 됩니다. 가설이 세 개면 세 번 나눠 가는 게 원래 취지에 맞습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVP라는 말 대신 쓸 만한 표현이 있을까요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크니베르그가 제안한 Earliest Testable/Usable/Lovable이 대안 중 하나입니다. 그는 이것도 예시일 뿐이니 이해관계자에게 가장 덜 혼란스러운 용어를 고르라고 했습니다. 국내 팀이라면 &quot;가설 검증판&quot;, &quot;1차 릴리스&quot; 같은 표현으로 나눠 부르는 것도 방법입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MVP로 만든 코드는 다시 만드는 게 맞나요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황에 따라 다릅니다. 판단 기준은 코드 품질보다 가설의 결과 쪽입니다. 가설이 크게 바뀌었다면 구조도 바뀌어야 하니 다시 만드는 편이 낫고, 가설이 그대로 맞았다면 부분 보강으로 가는 경우도 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 용어를 고르는 일이 곧 범위를 정하는 일입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP를 둘러싼 혼란은 누가 게을러서 생긴 게 아닙니다. 서로 다른 두 개념이 20년 넘게 같은 이름을 쓰고 있고, 그림을 그린 사람조차 용어를 바꾸자고 한 상태입니다. 이 정도면 개인의 이해력 문제로 보기는 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 실무에서 할 수 있는 건 단어를 정확히 쓰는 일보다, 단어를 꺼낼 때마다 무엇을 확인하려는지 같이 말하는 일에 가깝습니다. &quot;MVP로 가시죠&quot; 대신 &quot;결제 의사가 있는지만 확인하는 버전으로 가시죠&quot;라고 말하면, 범위 논쟁의 절반은 그 문장에서 이미 끝납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧붙이자면 지금은 2001년이나 2011년과 사정이 또 다릅니다. 클라우드와 관리형 서비스, 노코드 도구가 흔해지면서 검증에 드는 비용 자체가 크게 내려갔습니다. 예전 같으면 MVP를 직접 개발해야 확인할 수 있던 것들이 이제는 코드 없이도 확인되는 경우가 많습니다. 그렇다면 만들기 전에 한 번 더 물어볼 여지가 생깁니다. 이건 정말 만들어야만 알 수 있는 것인가.&lt;/p&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>MVP</category>
      <category>개발용어</category>
      <category>기술부채</category>
      <category>린스타트업</category>
      <category>애자일</category>
      <category>에릭리스</category>
      <category>제품개발</category>
      <category>최소기능제품</category>
      <category>프랭크로빈슨</category>
      <category>헨릭크니베르그</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/72</guid>
      <comments>https://devwar.tistory.com/entry/MVP%EC%B5%9C%EC%86%8C-%EA%B8%B0%EB%8A%A5-%EC%A0%9C%ED%92%88-%EB%9C%BB-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EC%99%84%EB%B2%BD%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%B4%EC%95%BC-%EB%8C%80%EB%B0%95%EB%82%98%EB%8A%94-%EC%9D%B4%EC%9C%A0#entry72comment</comments>
      <pubDate>Tue, 4 Aug 2026 11:38:24 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 상태 코드 정리표 - 404보다 무서운 건 200이었습니다</title>
      <link>https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mf90g/dJMcabcNRaQ/3mdEwigdLHEJQaPSPJVnA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mf90g/dJMcabcNRaQ/3mdEwigdLHEJQaPSPJVnA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mf90g/dJMcabcNRaQ/3mdEwigdLHEJQaPSPJVnA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmf90g%2FdJMcabcNRaQ%2F3mdEwigdLHEJQaPSPJVnA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;HTTP 상태 코드 정리표 - 404보다 무서운 건 200이었습니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;962&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 API를 설계하고 연동하는 과정에서 HTTP 상태 코드는 클라이언트와 서버가 요청의 처리 결과를 주고받는 핵심적인 규약입니다. 그러나 실제 구현에서는 모든 오류 상황을 일괄적으로 &lt;code&gt;500 Internal Server Error&lt;/code&gt;로 반환하거나, 요청이 실패했음에도 &lt;code&gt;200 OK&lt;/code&gt; 응답 본문에 별도의 에러 코드를 담아 전달하는 등 표준의 본래 목적과 어긋나게 사용하는 문제가 빈번하게 발생합니다. 이처럼 상태 코드가 실제 결과를 정확히 반영하지 못하면 클라이언트의 예외 처리 로직이 불필요하게 복잡해질 뿐만 아니라, 캐시 서버나 API 게이트웨이 같은 중간 인프라가 응답의 성격을 오판하여 예기치 않은 부작용을 초래할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 글에서 저는 RFC 표준 명세를 바탕으로 실무에서 가장 자주 쓰이면서도 혼동하기 쉬운 주요 상태 코드들의 정확한 의미와 선택 기준을 정리하고자 합니다. 본문에서는 &lt;code&gt;2xx&lt;/code&gt; 성공 응답부터 &lt;code&gt;4xx&lt;/code&gt; 클라이언트 오류 및 &lt;code&gt;5xx&lt;/code&gt; 서버 오류에 이르기까지 각 범주의 핵심 역할을 살펴보고, 특히 구분이 모호해지기 쉬운 &lt;code&gt;400&lt;/code&gt;과 &lt;code&gt;422&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;과 &lt;code&gt;403&lt;/code&gt;, 그리고 &lt;code&gt;502&lt;/code&gt;&amp;middot;&lt;code&gt;503&lt;/code&gt;&amp;middot;&lt;code&gt;504&lt;/code&gt; 상태 코드를 어떤 기준으로 구분하여 적용해야 하는지 구체적인 판단 범위를 다루겠습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic; text-align: left; vertical-align: top;&quot;&gt;&quot;404랑 403이 뭐가 달라요?&quot;&lt;br /&gt;&quot;화면에 502 떴다는데 우리 서버 문제예요, 아니에요?&quot;&lt;br /&gt;&quot;301로 옮겼는데 왜 옛날 주소로 계속 가요?&quot;&lt;br /&gt;&quot;에러는 나는데 상태 코드는 200이에요. 이게 말이 되나요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영을 하다 보면 이런 질문을 정말 자주 받습니다. 저도 매번 코드 전체를 외우고 있지는 않습니다. 다만 첫 자리 숫자로 문제가 어느 쪽에 있는지 가르고, 헷갈리는 몇 쌍만 정확히 구분하는 습관이 생겼을 뿐입니다. 그 정도만 돼도 장애 대응 속도가 확 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 [가끔보는CODE표] 시리즈답게 그룹별 표를 중심으로 정리했습니다. 표 사이사이에 제가 실제로 데였던 코드들 이야기를 짧게 붙였으니, 북마크해 두고 필요할 때 표만 훑으셔도 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;첫 자리 숫자부터 읽으면 장애 지점이 보입니다&lt;/li&gt;
&lt;li&gt;2xx 성공 코드 표 - 그런데 200이 항상 성공은 아닙니다&lt;/li&gt;
&lt;li&gt;3xx 리다이렉션 코드 표 - 301 캐시에 데인 이야기&lt;/li&gt;
&lt;li&gt;4xx 클라이언트 오류 표 - 401과 403은 다른 문제입니다&lt;/li&gt;
&lt;li&gt;5xx 서버 오류 표 - 502와 504가 가리키는 곳&lt;/li&gt;
&lt;li&gt;실무에서 자주 헷갈리는 세 쌍 비교&lt;/li&gt;
&lt;li&gt;상태 코드 직접 확인하는 법 - F12와 curl&lt;/li&gt;
&lt;li&gt;자주 받는 질문&lt;/li&gt;
&lt;li&gt;외우는 표가 아니라 찾아보는 표입니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 첫 자리 숫자부터 읽으면 장애 지점이 보입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 상태 코드는 첫 자리 숫자가 곧 분류입니다. 세부 코드를 몰라도 첫 자리만 보면 &quot;누구 잘못인지&quot;가 대략 갈립니다. 장애 전화를 받았을 때 제가 제일 먼저 묻는 것도 &quot;몇 번대 코드냐&quot;입니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;그룹&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;의미&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;먼저 의심할 곳&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;1xx&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;정보성 임시 응답, 처리 계속 중&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;실무에서 직접 볼 일 거의 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;2xx&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;요청 성공&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;코드는 정상, 응답 내용을 의심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;3xx&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;다른 주소로 이동 필요&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;리다이렉트 설정, 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4xx&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;요청한 쪽(클라이언트)의 문제&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;URL, 파라미터, 인증, 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;5xx&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;받은 쪽(서버)의 문제&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;서버 로그, 중간 서버(프록시&amp;middot;LB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4xx는 부르는 쪽, 5xx는 받는 쪽. 이 구분 하나로 &quot;우리 문제냐 저쪽 문제냐&quot;를 놓고 벌어지는 소모전의 절반은 줄일 수 있습니다. 물론 예외도 있는데, 그 예외들이 바로 뒤에 나옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 2xx 성공 코드 표 - 그런데 200이 항상 성공은 아닙니다&lt;/h2&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;코드&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;이름&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;실무 포인트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;200&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;OK&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;요청 성공, 본문에 결과 데이터 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;201&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Created&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;리소스 생성 완료, 주로 POST 응답&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;204&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;No Content&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;성공했지만 돌려줄 본문 없음, 삭제 후 자주 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도입부에서 예고한 이야기를 여기서 하겠습니다. 예전에 외부 결제&amp;middot;인증 계열 API를 붙이는 일을 여러 번 했는데, 그중 일부는 처리에 실패해도 HTTP 상태 코드는 200을 주고 본문 안에 result: FAIL 같은 자체 코드를 담아 보냈습니다. 모니터링은 상태 코드만 보고 있었으니 대시보드는 온통 초록불인데 고객 문의는 쌓이는, 그런 상황을 겪었습니다. 그 뒤로는 연동 문서를 받으면 &quot;실패를 몇 번으로 주는지&quot;부터 확인하는 버릇이 생겼습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  200 뒤에 숨은 실패&lt;/b&gt;&lt;br /&gt;외부 API 연동 시 상태 코드만 믿으면 안 됩니다. 200 + 본문 에러 코드 조합으로 실패를 알리는 API가 생각보다 많습니다. 모니터링 지표에 본문 결과 코드를 함께 넣어야 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 3xx 리다이렉션 코드 표 - 301 캐시에 데인 이야기&lt;/h2&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;코드&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;이름&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;실무 포인트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;301&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Moved Permanently&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;영구 이동. 검색엔진 평가가 새 주소로 넘어감. 브라우저가 강하게 캐시함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;302&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Found&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;일시 이동. 검색엔진은 기존 주소를 유지. 이벤트&amp;middot;점검 페이지용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;304&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Not Modified&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;캐시된 버전 사용 지시. 전송량과 로딩 속도에 관여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;307/308&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Temporary/Permanent Redirect&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;302/301과 비슷하지만 요청 메서드(POST 등)를 바꾸지 않고 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2016년 이후 현장 트러블슈팅을 다니면서 리다이렉트 문제를 꽤 자주 만났습니다. 기억에 남는 건 임시로 걸어야 할 리다이렉트를 301로 걸었다가 롤백한 뒤에도 사용자 브라우저가 캐시된 301을 계속 따라가던 일입니다. 서버 설정은 이미 원복했는데 &quot;여전히 이상한 페이지로 간다&quot;는 문의가 며칠씩 이어졌습니다. 서버 쪽에선 아무 흔적이 안 남으니 원인을 찾는 데 한참 걸렸고요. 그 뒤로 확신이 없으면 302부터 걸고, 충분히 검증한 다음에 301로 바꾸는 순서를 지킵니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;  301은 되돌리기 어렵습니다&lt;/b&gt;&lt;br /&gt;301은 브라우저와 중간 캐시가 오래 기억합니다. 임시 조치라면 302, 주소 이전이 확정일 때만 301. 순서를 반대로 하면 롤백해도 사용자 쪽 캐시는 남습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 4xx 클라이언트 오류 표 - 401과 403은 다른 문제입니다&lt;/h2&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;코드&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;이름&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;실무 포인트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;400&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Bad Request&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;요청 자체가 잘못됨. 파라미터, 본문 형식부터 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;401&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Unauthorized&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;인증 실패. &quot;너 누구야?&quot; 단계. 로그인&amp;middot;토큰 만료 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;403&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Forbidden&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;권한 부족. &quot;누군지는 아는데 자격이 없다&quot; 단계. 권한&amp;middot;IP 차단 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;404&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Not Found&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;리소스 없음. 오타, 삭제된 콘텐츠, 라우팅 누락&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;429&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Too Many Requests&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;요청 과다. API 호출 제한(rate limit)에 걸린 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;401과 403은 헷갈리기 쉬운데, 디버깅 방향이 완전히 다릅니다. 401이면 인증 수단(세션, 토큰) 쪽을 보고, 403이면 인증은 통과했으니 권한 설정이나 서버의 접근 제한(IP 차단, 방화벽 규칙)을 봐야 합니다. 블로그를 운영하면서 악성 트래픽을 차단할 때도 이 구분을 씁니다. 차단된 봇에게는 403이 정확한 응답입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;429는 요즘 들어 더 자주 만나는 코드입니다. 외부 API를 쓰다 보면 호출량 제한에 걸려 429를 받는 경우가 있는데, 이때 무작정 재시도하면 제한이 더 길어지기도 합니다. 응답 헤더의 Retry-After를 확인하고 그만큼 기다렸다 재시도하는 게 정석입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 5xx 서버 오류 표 - 502와 504가 가리키는 곳&lt;/h2&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;코드&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;이름&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;실무 포인트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;500&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Internal Server Error&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;애플리케이션 내부 예외. 서버 에러 로그 직행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;502&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Bad Gateway&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;프록시&amp;middot;LB가 뒤쪽 서버에서 이상한 응답을 받음. 뒤쪽 서버 다운&amp;middot;재기동 의심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;503&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Service Unavailable&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;과부하 또는 점검 중. 일시적 상태라는 신호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;504&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;Gateway Timeout&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;뒤쪽 서버가 제한 시간 안에 응답을 못 줌. 느린 쿼리&amp;middot;외부 연동 지연 의심&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;502와 504는 둘 다 &quot;중간에 있는 서버가 뒤쪽과 통신에 실패했다&quot;는 뜻이라 같은 문제처럼 보이지만, 뉘앙스가 다릅니다. 502는 뒤쪽이 이상한 응답을 줬거나 아예 연결이 안 되는 상황이고, 504는 응답이 오긴 하는데 너무 느린 상황입니다. 제 경험상 502는 배포 직후 애플리케이션이 아직 안 떴을 때, 504는 새벽 배치나 느린 SQL이 커넥션을 물고 있을 때 많이 나왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT나 프록시가 겹겹이 있는 환경에서 트러블슈팅을 해 보면, 사용자가 보는 5xx가 정작 애플리케이션 로그에는 없는 경우가 있습니다. 중간 장비가 만들어낸 응답이기 때문입니다. 그래서 5xx 장애는 애플리케이션 로그와 프록시(nginx 등) 로그를 같이 봐야 전체 그림이 나옵니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;curl을 활용한 상태 줄(Status Line) 및 조건부 헤더 점검 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애 대응이나 API 연동 테스트 시 브라우저 개발자 도구만으로는 리다이렉트 체인이나 캐시 조건부 헤더를 즉시 재현하기 번거로울 때가 많습니다. 이때 터미널에서 &lt;code&gt;curl -i&lt;/code&gt; 또는 &lt;code&gt;curl -I&lt;/code&gt; 옵션에 조건부 헤더를 조합하면 상태 줄(Status Line)과 핵심 응답 헤더를 빠르게 검증할 수 있습니다. 아래는 &lt;code&gt;nginx 1.26.3&lt;/code&gt; 및 Python 백엔드(&lt;code&gt;127.0.0.1:18082&lt;/code&gt;) 환경에서 각 테스트 경로를 호출했을 때 반환된 상태 줄과 핵심 헤더 요약입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 2xx 성공 응답 (/ok, /created)
HTTP/1.1 200 OK
HTTP/1.1 201 Created

# 3xx 리다이렉션 및 조건부 캐시 검증 (/gone, /temp, /static.txt + If-None-Match)
HTTP/1.1 301 Moved Permanently
HTTP/1.1 302 Found
HTTP/1.1 304 Not Modified

# 4xx 클라이언트 오류 및 처리율 제한 (/auth, /forbid, /missing, /ratelimit)
HTTP/1.1 401 Unauthorized
HTTP/1.1 403 Forbidden
HTTP/1.1 404 Not Found
HTTP/1.1 429 Too Many Requests
Retry-After: 3

# 5xx 백엔드 및 게이트웨이 오류 (/boom, /badgw, /gateway-timeout)
HTTP/1.1 500 Internal Server Error
HTTP/1.1 502 Bad Gateway
HTTP/1.1 504 Gateway Timeout&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/static.txt&lt;/code&gt; 경로처럼 정적 파일을 조회할 때 클라이언트가 이전 응답의 ETag 값을 &lt;code&gt;If-None-Match&lt;/code&gt; 헤더에 담아 보내면, 서버는 본문 전송을 생략하고 &lt;code&gt;304 Not Modified&lt;/code&gt;만 반환하여 네트워크 대역폭을 절약합니다. 또한 &lt;code&gt;/ratelimit&lt;/code&gt; 응답에 포함된 &lt;code&gt;Retry-After: 3&lt;/code&gt; 헤더를 확인하면 클라이언트 재시도 로직(Backoff)의 대기 시간을 정밀하게 설계할 수 있습니다. 한편, &lt;code&gt;curl&lt;/code&gt; 요청 자체가 서버에 도달하지 못하고 호스트 이름 해석 단계에서 실패한다면 HTTP 상태 코드가 생성되기 이전의 문제이므로 &lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DNS 레코드 종류와 동작 구조&lt;/a&gt;를 먼저 점검해야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 실무에서 자주 헷갈리는 세 쌍 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 표들 중에서 질문이 가장 많이 나오는 세 쌍만 따로 모았습니다. 이 표 하나만 기억해도 대응 방향이 갈립니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;헷갈리는 쌍&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;핵심 차이&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white; text-align: center;&quot;&gt;고르는 기준&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;301 vs 302&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;영구 이동 vs 일시 이동. 검색엔진 평가 이전 여부와 캐시 강도가 다름&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;되돌릴 가능성이 조금이라도 있으면 302&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;401 vs 403&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;인증 실패 vs 권한 부족. &quot;누구인지 모름&quot; vs &quot;알지만 안 됨&quot;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;로그인 전 상태면 401, 로그인 후 거부면 403&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9; text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;502 vs 504&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;잘못된 응답 vs 응답 시간 초과. 뒤쪽 서버의 다운 vs 느림&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; text-align: left; vertical-align: top;&quot;&gt;502는 프로세스 생존 확인, 504는 느린 지점 추적&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;500&amp;middot;502&amp;middot;504 서버 오류 분리 진단과 근본 원인 분석 절차&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 운영 환경에서 가장 혼동하기 쉬운 구간은 &lt;code&gt;500&lt;/code&gt;, &lt;code&gt;502&lt;/code&gt;, &lt;code&gt;504&lt;/code&gt; 상태 코드입니다. 세 코드 모두 서버 측 장애를 뜻하지만, 장애가 발생한 계층과 확인해야 할 로그의 위치가 서로 다릅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt; (&lt;code&gt;/boom&lt;/code&gt;)&lt;/b&gt;: 요청이 Nginx를 통과하여 Python 백엔드(&lt;code&gt;127.0.0.1:18082&lt;/code&gt;)까지 정상 전달되었으나, 애플리케이션 내부의 예외 미처리나 데이터베이스 쿼리 오류로 인해 백엔드가 직접 반환한 응답입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;502 Bad Gateway&lt;/code&gt; (&lt;code&gt;/badgw&lt;/code&gt;)&lt;/b&gt;: 리버스 프록시인 Nginx가 상위(Upstream) 백엔드로 연결을 시도했으나 프로세스가 내려가 있거나 소켓 연결이 비정상 종료되었을 때 Nginx가 생성하여 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;504 Gateway Timeout&lt;/code&gt; (&lt;code&gt;/gateway-timeout&lt;/code&gt;)&lt;/b&gt;: 백엔드 연결은 수립되었지만 슬로우 쿼리나 외부 API 대기 등으로 인해 프록시의 &lt;code&gt;proxy_read_timeout&lt;/code&gt; 임계치 안에 응답이 오지 않을 때 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 웹 서버와 WAS(애플리케이션 서버)의 역할 분담에 따라 오류의 발생 지점이 달라지므로, 계층별 아키텍처 차이는 &lt;a href=&quot;https://devwar.tistory.com/entry/nginx-apache-tomcat-difference&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Nginx, Apache, Tomcat의 구조적 차이점&lt;/a&gt;을 참고하면 훨씬 명확하게 이해할 수 있습니다. 또한 &lt;code&gt;502&lt;/code&gt;나 &lt;code&gt;504&lt;/code&gt;가 발생했을 때 단순히 백엔드 프로세스를 재시작하거나 타임아웃 수치만 늘리는 임시방편에 그치지 않으려면, 커넥션 풀 고갈이나 데드락 등 표면적 증상 이면의 원인을 끝까지 추적하는 &lt;a href=&quot;https://devwar.tistory.com/entry/5why-root-cause&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5 Why 기법을 활용한 장애 근본 원인 분석(RCA)&lt;/a&gt; 프로세스를 적용하는 것이 효과적입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 상태 코드 직접 확인하는 법 - F12와 curl&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표를 활용하려면 지금 무슨 코드가 오가는지 볼 줄 알아야 합니다. 방법은 두 가지면 충분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서는 F12로 개발자 도구를 열고 Network 탭을 보면 됩니다. 페이지를 새로고침하면 요청마다 Status 열에 코드가 찍힙니다. 리다이렉트 추적이 목적이라면 Preserve log를 켜 두는 게 좋습니다. 이동 전 요청 기록이 지워지지 않아서 301인지 302인지 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서는 curl이 편합니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; text-align: left; vertical-align: top;&quot;&gt;curl -I https://example.com &amp;nbsp;&amp;rarr; 응답 헤더와 상태 코드만 확인&lt;br /&gt;curl -IL https://example.com &amp;nbsp;&amp;rarr; 리다이렉트를 따라가며 각 단계의 코드 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-I는 헤더만 받아오는 옵션이고, -L을 붙이면 리다이렉트 체인을 끝까지 따라갑니다. 301 캐시 문제처럼 브라우저가 끼면 헷갈리는 상황에서, curl은 캐시 없이 서버의 현재 설정을 그대로 보여주기 때문에 원인 분리에 유용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로컬 프록시&amp;middot;백엔드 환경에서의 주요 상태 코드 실측 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적인 정의만으로는 프록시 서버와 애플리케이션 서버 중 어느 구간에서 상태 코드가 생성되는지 구분하기 어렵습니다. 국제 인터넷 표준화 기구(IETF)의 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP Semantics 표준(RFC 9110)&lt;/a&gt;에 정의된 주요 상태 코드들이 실제 리버스 프록시 환경에서 어떻게 반환되는지 확인하기 위해, 2026년 10월 20일(KST) 기준 &lt;code&gt;nginx 1.26.3&lt;/code&gt;과 Python 백엔드(&lt;code&gt;127.0.0.1:18082&lt;/code&gt;)를 연동하여 각 엔드포인트별 응답을 측정했습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; table-layout: fixed; word-break: keep-all; border-collapse: collapse;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center; width: 32%;&quot;&gt;분류 / 엔드포인트&lt;/th&gt;
&lt;th style=&quot;text-align: center; width: 34%;&quot;&gt;실측 상태 코드 및 주요 응답 헤더&lt;/th&gt;
&lt;th style=&quot;text-align: center; width: 34%;&quot;&gt;응답 생성 주체 및 동작 의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;2xx 성공&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/ok&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;백엔드가 요청을 정상 처리하고 본문을 반환합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;2xx 성공&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/created&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;201 Created&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;신규 리소스 생성이 완료되었음을 나타냅니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;3xx 리다이렉션&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/gone&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;301 Moved Permanently&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;요청한 URI가 영구적으로 이동했음을 알립니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;3xx 리다이렉션&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/temp&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;302 Found&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;요청한 URI가 일시적으로 다른 위치로 변경되었습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;3xx 캐시 검증&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/static.txt&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;304 Not Modified&lt;/code&gt; (&lt;code&gt;If-None-Match&lt;/code&gt; 조건부 요청)&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;리소스가 변경되지 않아 기존 캐시를 그대로 사용하도록 지시합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4xx 클라이언트 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/auth&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;401 Unauthorized&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;유효한 인증 자격 증명이 누락되었거나 실패했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4xx 클라이언트 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/forbid&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;403 Forbidden&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;서버가 요청을 이해했으나 접근 권한이 없어 거부합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4xx 클라이언트 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/missing&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;요청한 경로에 해당하는 리소스가 존재하지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;4xx 클라이언트 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/ratelimit&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt; (&lt;code&gt;Retry-After: 3&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;요청 빈도 제한을 초과하여 3초 뒤 재시도하도록 안내합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;5xx 서버 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/boom&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;Python 백엔드 내부 로직 실행 중 예외가 발생했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;5xx 서버 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/badgw&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;502 Bad Gateway&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;Nginx가 백엔드로부터 유효한 응답을 받지 못했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;b&gt;5xx 서버 오류&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/gateway-timeout&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;&lt;code&gt;504 Gateway Timeout&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; vertical-align: top;&quot;&gt;백엔드 응답이 지정된 시간 내에 도착하지 않았습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 환경에서 프런트엔드와 백엔드 도메인이 분리된 경우, 상태 코드가 &lt;code&gt;200 OK&lt;/code&gt;이더라도 프리플라이트(Preflight)나 응답 헤더 설정 문제로 스크립트에서 응답을 읽지 못할 수 있습니다. 이러한 교차 출처 차단 현상과 상태 코드의 관계는 &lt;a href=&quot;https://devwar.tistory.com/entry/cors-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CORS 동작 원리와 해결 방법&lt;/a&gt; 글에서 자세히 확인할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 자주 받는 질문&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;404 페이지도 따로 만들어야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만드는 쪽을 권합니다. 기본 404 화면은 사용자를 그대로 이탈시키는데, 검색창이나 인기 글 링크를 넣은 맞춤 404 페이지는 다른 페이지로 흘려보낼 수 있습니다. 다만 존재하지 않는 주소에서 200을 주며 홈으로 보내는 방식(소프트 404)은 검색엔진이 싫어하니, 상태 코드는 404를 유지한 채 화면만 꾸미는 게 맞습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;418 같은 이상한 코드는 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;418 I'm a teapot은 만우절 농담 규격(HTCPCP)에서 나온 코드입니다. 실무 표준은 아니지만 일부 서비스가 봇 차단 응답 등에 장난스럽게 쓰기도 합니다. 이런 코드를 만나면 상대 서버가 뭔가 비표준적인 처리를 하고 있다는 신호로 읽으면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상태 코드만 잘 관리하면 SEO에 도움이 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본기에 해당합니다. 죽은 링크가 404를 정확히 반환하고, 이전한 주소가 301로 연결되고, 임시 페이지가 302로 처리되는 것은 검색엔진이 사이트 구조를 신뢰하는 바탕이 됩니다. 다만 상태 코드는 감점을 피하는 요소에 가깝고, 순위를 올리는 건 결국 콘텐츠라고 생각합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 외우는 표가 아니라 찾아보는 표입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 이 코드들을 전부 외우고 있지 않습니다. 첫 자리로 방향을 잡고, 헷갈리는 세 쌍의 기준만 기억하고, 나머지는 이런 표를 찾아봅니다. 그거면 충분했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나만 덧붙이면, 상태 코드는 서버가 하는 말이지 진실 그 자체는 아닙니다. 200 뒤에 실패가 숨기도 하고, 5xx가 애플리케이션이 아닌 중간 장비의 목소리일 때도 있습니다. 코드를 출발점으로 삼되 응답 본문과 로그까지 확인하는 습관이 결국 장애 대응 시간을 줄여줬습니다. 이 표가 그 출발점 역할을 해주면 좋겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  함께 보면 좋은 글&lt;/h2&gt;
&lt;figure id=&quot;og_1792458423178&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&quot; data-og-description=&quot;도메인을 연결하거나 서버 설정을 바꿀 때마다 DNS 레코드 설정 화면 앞에서 멈칫하게 됩니다. 자주 다루는 작업이 아니다 보니 설정할 때마다 각 항목의 역할과 규칙이 낯설고 헷갈리기 때문입&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzRHbi/dJMb81ghMki/BpyJapvgKpOZ46E37lqob1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/cXUQym/dJMb81HmNAi/3B0jBbi9kYpZ3SVjEckts1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/b7XzGq/dJMb85wejSy/8oJEwaW5yhQX7G30nOY2S0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/dns-record-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/dns-record-types&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzRHbi/dJMb81ghMki/BpyJapvgKpOZ46E37lqob1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/cXUQym/dJMb81HmNAi/3B0jBbi9kYpZ3SVjEckts1/img.png?width=800&amp;amp;height=597&amp;amp;face=547_150_593_201,https://scrap.kakaocdn.net/dn/b7XzGq/dJMb85wejSy/8oJEwaW5yhQX7G30nOY2S0/img.png?width=1200&amp;amp;height=896&amp;amp;face=811_217_902_316');&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;DNS 레코드 타입 종류 총정리 &amp;mdash; A&amp;middot;AAAA&amp;middot;CNAME&amp;middot;MX&amp;middot;TXT&amp;middot;NS, 실무에서 진짜 쓰는 6가지&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;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792458449849&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&quot; data-og-description=&quot;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &amp;quot;이건 그냥 외워둬&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1fgF0/dJMb8UapjpC/nOCKDyDiTq2AQ0TFo7p1M0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/cLaWih/dJMb8XkETuJ/fWeYwqQ6HkSdNK1M8xDvPk/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/eKdqY/dJMb9iI5pWw/DdOVLEmgqGyvYZ7TeKcwN0/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/TCPUDP-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8-%EB%AA%A8%EC%9D%8C-%EB%A7%A4%EB%B2%88-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%C2%B7%EC%84%9C%EB%B2%84-%EA%B4%80%EB%A6%AC%EC%9E%90-%ED%95%84%EC%88%98-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%ED%91%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1fgF0/dJMb8UapjpC/nOCKDyDiTq2AQ0TFo7p1M0/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/cLaWih/dJMb8XkETuJ/fWeYwqQ6HkSdNK1M8xDvPk/img.png?width=800&amp;amp;height=640&amp;amp;face=501_151_562_217,https://scrap.kakaocdn.net/dn/eKdqY/dJMb9iI5pWw/DdOVLEmgqGyvYZ7TeKcwN0/img.png?width=1200&amp;amp;height=960&amp;amp;face=755_230_839_321');&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;꼭 외워야 할 TCP/UDP 포트 번호 모음 - 13년 차 개발자가 후배에게 외우라고 하는 포트들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TCP/UDP 포트 번호는 방화벽을 설정하거나 포트 포워딩을 할 때마다 마주치는데, 매번 검색하기가 은근히 번거롭습니다. 그래서 실무에서 자주 쓰는 포트, 그중에서도 후배한테 &quot;이건 그냥 외워둬&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792458486459&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;MySQL 에러 코드 정리 - 1062&amp;middot;1213&amp;middot;1452 자주 만나는 코드 한눈에 보는 가이드&quot; data-og-description=&quot;MySQL 에러 코드는 외울 필요까진 없지만, 자주 만나는 1062 중복키, 1213 데드락, 1452 외래키 위반, 1822 인덱스 누락, 2006 연결 끊김 정도는 번호만 봐도 원인이 떠올라야 작업 속도가 붙습니다. 이 글&quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/DB-%EC%82%BD%EC%A7%88-%EC%8B%9C%EA%B0%84%EC%9D%84-110%EB%A1%9C-%EC%A4%84%EC%97%AC%EC%A3%BC%EB%8A%94-MySQL-%EC%A3%BC%EC%9A%94-%EC%97%90%EB%9F%AC-%EC%BD%94%EB%93%9C-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C-%EA%B0%80%EB%81%94%EB%B3%B4%EB%8A%94CODE%ED%91%9C&quot; data-og-url=&quot;https://devwar.tistory.com/entry/DB-%EC%82%BD%EC%A7%88-%EC%8B%9C%EA%B0%84%EC%9D%84-110%EB%A1%9C-%EC%A4%84%EC%97%AC%EC%A3%BC%EB%8A%94-MySQL-%EC%A3%BC%EC%9A%94-%EC%97%90%EB%9F%AC-%EC%BD%94%EB%93%9C-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C-%EA%B0%80%EB%81%94%EB%B3%B4%EB%8A%94CODE%ED%91%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/banSgd/dJMb8WMOTnN/v83x2V5nBDkeo0Fd3bBJQ0/img.png?width=800&amp;amp;height=642&amp;amp;face=473_110_566_212,https://scrap.kakaocdn.net/dn/fHA90/dJMb8QeLksq/ZEC60vR7weKkAmWECOee01/img.png?width=800&amp;amp;height=642&amp;amp;face=473_110_566_212,https://scrap.kakaocdn.net/dn/brllb1/dJMb8SXXar0/uLoS08AmXK4Ie5OM8GLlsK/img.png?width=1200&amp;amp;height=963&amp;amp;face=731_172_836_286&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/DB-%EC%82%BD%EC%A7%88-%EC%8B%9C%EA%B0%84%EC%9D%84-110%EB%A1%9C-%EC%A4%84%EC%97%AC%EC%A3%BC%EB%8A%94-MySQL-%EC%A3%BC%EC%9A%94-%EC%97%90%EB%9F%AC-%EC%BD%94%EB%93%9C-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C-%EA%B0%80%EB%81%94%EB%B3%B4%EB%8A%94CODE%ED%91%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/DB-%EC%82%BD%EC%A7%88-%EC%8B%9C%EA%B0%84%EC%9D%84-110%EB%A1%9C-%EC%A4%84%EC%97%AC%EC%A3%BC%EB%8A%94-MySQL-%EC%A3%BC%EC%9A%94-%EC%97%90%EB%9F%AC-%EC%BD%94%EB%93%9C-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C-%EA%B0%80%EB%81%94%EB%B3%B4%EB%8A%94CODE%ED%91%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/banSgd/dJMb8WMOTnN/v83x2V5nBDkeo0Fd3bBJQ0/img.png?width=800&amp;amp;height=642&amp;amp;face=473_110_566_212,https://scrap.kakaocdn.net/dn/fHA90/dJMb8QeLksq/ZEC60vR7weKkAmWECOee01/img.png?width=800&amp;amp;height=642&amp;amp;face=473_110_566_212,https://scrap.kakaocdn.net/dn/brllb1/dJMb8SXXar0/uLoS08AmXK4Ie5OM8GLlsK/img.png?width=1200&amp;amp;height=963&amp;amp;face=731_172_836_286');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 에러 코드 정리 - 1062&amp;middot;1213&amp;middot;1452 자주 만나는 코드 한눈에 보는 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 에러 코드는 외울 필요까진 없지만, 자주 만나는 1062 중복키, 1213 데드락, 1452 외래키 위반, 1822 인덱스 누락, 2006 연결 끊김 정도는 번호만 봐도 원인이 떠올라야 작업 속도가 붙습니다. 이 글&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1792458505093&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;크론(cron) 표현식 완벽 정리 - 0 0 * * * 의미부터 초 단위 실행, 실시간 큐 전환까지&quot; data-og-description=&quot;크론(cron) 표현식은 리눅스 크론탭부터 스프링 @Scheduled, node-cron까지 거의 모든 백엔드 환경에서 쓰이지만, 막상 0 0 * * * 같은 표현을 볼 때마다 또 검색창을 열게 됩니다. 이 글에서는 다섯 칸의 &quot; data-og-host=&quot;devwar.tistory.com&quot; data-og-source-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; data-og-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsDdt3/dJMb84qxuyS/iKFimq6SFKF8spK3K3PJOk/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/LbVaJ/dJMb9aK3Qdx/uWes8kP1Gq7qhFclUuSpVk/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/bdoN19/dJMb82fbZqp/rFqhHR2zY1pLC2bvmjtmx1/img.png?width=1200&amp;amp;height=1016&amp;amp;face=834_206_952_335&quot;&gt;&lt;a href=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devwar.tistory.com/entry/cron-expression-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsDdt3/dJMb84qxuyS/iKFimq6SFKF8spK3K3PJOk/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/LbVaJ/dJMb9aK3Qdx/uWes8kP1Gq7qhFclUuSpVk/img.png?width=800&amp;amp;height=677&amp;amp;face=556_137_634_223,https://scrap.kakaocdn.net/dn/bdoN19/dJMb82fbZqp/rFqhHR2zY1pLC2bvmjtmx1/img.png?width=1200&amp;amp;height=1016&amp;amp;face=834_206_952_335');&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;크론(cron) 표현식 완벽 정리 - 0 0 * * * 의미부터 초 단위 실행, 실시간 큐 전환까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크론(cron) 표현식은 리눅스 크론탭부터 스프링 @Scheduled, node-cron까지 거의 모든 백엔드 환경에서 쓰이지만, 막상 0 0 * * * 같은 표현을 볼 때마다 또 검색창을 열게 됩니다. 이 글에서는 다섯 칸의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devwar.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 개념 쉬운 설명</category>
      <category>301리다이렉트</category>
      <category>401403차이</category>
      <category>404에러</category>
      <category>500에러</category>
      <category>502에러</category>
      <category>HTTP상태코드</category>
      <category>상태코드정리</category>
      <category>서버응답코드</category>
      <category>웹개발기초</category>
      <category>트러블슈팅</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/62</guid>
      <comments>https://devwar.tistory.com/entry/%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%ED%95%84%EC%88%98-%EC%83%81%EC%8B%9D-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9CStatus-Code-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-1xx5xx#entry62comment</comments>
      <pubDate>Tue, 4 Aug 2026 11:23:40 +0900</pubDate>
    </item>
    <item>
      <title>ISMS 인증 받아도 해킹당하는 이유, 애초에 보안 보증서가 아닙니다</title>
      <link>https://devwar.tistory.com/entry/%ED%98%91%EC%97%85%ED%88%B4-ISMS-%EC%9D%B8%EC%A6%9D-%EC%B5%9C%EC%8B%A0-%EA%B0%9C%EC%A0%95-%EA%B8%B0%EC%A4%80-%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC-%EB%82%A9%EB%8B%88%EB%8B%A4-%EC%95%88%EC%A0%84%ED%95%9C-SaaS-%EB%8F%84%EC%9E%85-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIiTq4/dJMcaiYtpKO/cimoPp5AmUYFOsmFdelmt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIiTq4/dJMcaiYtpKO/cimoPp5AmUYFOsmFdelmt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIiTq4/dJMcaiYtpKO/cimoPp5AmUYFOsmFdelmt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIiTq4%2FdJMcaiYtpKO%2FcimoPp5AmUYFOsmFdelmt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ISMS 인증 받아도 해킹당하는 이유, 애초에 보안 보증서가 아닙니다&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;896&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증이 무엇인지 물어보면 보안 담당자가 아닌 이상 대부분 &quot;회사에서 하라니까 하는 그 문서 작업&quot;이라고 답합니다. 저도 오랫동안 그렇게 생각했습니다. 심사 시즌만 되면 개발 일정이 밀리고, 평소에 안 쓰던 양식의 문서를 급하게 만들어내는 연례행사. 그런데 여러 조직을 거치면서 생각이 조금 달라졌습니다. 이 제도가 현장과 안 맞는 건 사실인데, 이것마저 없는 조직이 어떤 모습인지를 직접 봤기 때문입니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; padding: 15px; border-left: 4px solid #999; font-style: italic;&quot;&gt;&quot;ISMS요? 그거 서류 잘 꾸미면 통과되는 거 아니에요?&quot;&lt;br /&gt;&quot;우리 회사는 매출 기준 안 되니까 상관없죠?&quot;&lt;br /&gt;&quot;인증 받은 회사도 털리던데 그게 무슨 의미가 있어요?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전부 제가 실제로 들어본 말입니다. 셋 다 절반은 맞고 절반은 틀립니다. 그리고 그 틀린 절반 때문에 큰돈이 나가는 회사를 여럿 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 ISMS 인증이 무엇이고, 누가 왜 만들었으며, 어떤 회사가 의무적으로 받아야 하는지 정리합니다. 그리고 실무자 입장에서 이 제도가 현장과 어긋나는 지점, 그럼에도 불구하고 왜 최소한의 가이드로서 의미가 있는지를 이야기합니다. 2026년 4월에 발표된 인증제 전면 개편 내용도 함께 다룹니다. 협업툴이나 SaaS 도입을 검토하는 분, 회사가 의무대상인지 궁금한 분, 그리고 &quot;이거 왜 하는 거야&quot;라는 질문을 품고 증적 문서를 만들고 계신 분께 도움이 될 겁니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ISMS 인증이란 - 법이 정한 보안의 최소선&lt;/li&gt;
&lt;li&gt;왜 만들어졌을까 - 인증이 다섯 개나 난립하던 시절&lt;/li&gt;
&lt;li&gt;누가 받아야 하나 - 의무대상 기준과 과태료&lt;/li&gt;
&lt;li&gt;인증 기준 80개와 101개의 정체&lt;/li&gt;
&lt;li&gt;현장과 안 맞는 이유 - 심사는 스냅샷, 운영은 매일&lt;/li&gt;
&lt;li&gt;그런데도 필요한 이유 - 이것마저 없던 조직의 풍경&lt;/li&gt;
&lt;li&gt;2026년 전면 개편 - 인증 보유에서 운영 입증으로&lt;/li&gt;
&lt;li&gt;협업툴과 SaaS 도입할 때 인증서를 읽는 법&lt;/li&gt;
&lt;li&gt;ISMS 인증 자주 묻는 질문&lt;/li&gt;
&lt;li&gt;서류가 아니라 습관이 남는다면&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. ISMS 인증이란 - 법이 정한 보안의 최소선&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS는 정보보호 관리체계(Information Security Management System)의 약자입니다. 기업이나 기관이 정보 자산을 보호하기 위한 체계를 갖추고 운영하는지, 국가가 정한 기준에 따라 심사해서 인증하는 제도입니다. 법적 근거는 정보통신망법 제47조에 있고, 개인정보 영역까지 포함하는 ISMS-P는 개인정보보호법 제32조의2가 근거입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 구조를 보면 과학기술정보통신부와 개인정보보호위원회가 법령을 총괄하고, 실제 인증 심사와 제도 운영은 한국인터넷진흥원(KISA)이 주관합니다. 국제 표준인 ISO 27001과 비슷한 성격이지만, ISMS는 한국 법에 따라 의무가 부과된다는 점이 다릅니다. ISO 27001은 안 받아도 벌칙이 없지만, ISMS는 의무대상이 안 받으면 과태료가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 관점 하나를 미리 말씀드리면, 이 제도는 &quot;이 회사는 해킹당하지 않는다&quot;를 보증하는 게 아닙니다. &quot;이 회사는 보안을 관리하는 체계를 최소한 갖추고 있다&quot;를 확인하는 제도입니다. 최소선이라는 표현을 쓴 이유가 여기에 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 만들어졌을까 - 인증이 다섯 개나 난립하던 시절&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증은 2002년에 시작됐습니다. 당시 정보통신부가 민간 정보통신망의 안정성을 확보하겠다며 정보통신서비스 제공자를 대상으로 도입한 제도입니다. 초창기 인터넷 기업들이 급성장하던 시기인데, 보안 체계는 회사마다 제각각이었고 사고가 나도 &quot;우리는 몰랐다&quot;로 끝나는 경우가 많았습니다. 국가 입장에서는 최소한의 공통 기준이 필요했던 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이후 흐름이 좀 우스꽝스럽게 흘러갑니다. 정보보호가 중요해지자 부처마다 비슷한 인증을 만들기 시작했습니다. 민간 대상 ISMS, 공공기관용 G-ISMS, 금융권용 F-ISMS, 방송통신위원회의 개인정보보호 인증 PIMS, 행정안전부의 PIPL까지. 기업 입장에서는 사실상 같은 내용을 부처별로 따로 심사받는 상황이 벌어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리가 시작된 건 한참 뒤입니다. 2016년에 PIMS와 PIPL이 먼저 합쳐졌고, 2018년 11월에 ISMS와 PIMS가 지금의 ISMS-P로 일원화됐습니다. 그래서 현재는 두 가지 트랙이 남았습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;ISMS&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;ISMS-P&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;보호 대상&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정보서비스와 정보 자산&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;정보 자산 + 개인정보 처리 전 과정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인증 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;80개 항목&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;101개 항목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;적합한 경우&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개인정보 흐름 보호가 핵심이 아닌 경우&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;개인정보를 대량으로 다루는 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 2026년 2월 기준으로 ISMS 의무대상은 593개사이고, 전체 인증 보유 건수는 1,257건입니다. ISMS가 942건, ISMS-P가 315건이니 아직은 ISMS 단독 인증이 다수입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 누가 받아야 하나 - ISMS 인증 의무대상 기준과 과태료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의무대상은 정보통신망법 제47조 제2항에 명시되어 있습니다. 다음 중 하나라도 해당하면 인증을 받아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전국적으로 정보통신망 서비스를 제공하는 사업자(ISP)&lt;br /&gt;- 타인의 정보통신서비스 제공을 위해 집적정보통신시설을 운영&amp;middot;관리하는 사업자(IDC)&lt;br /&gt;- 연간 매출액 또는 세입이 1,500억 원 이상이거나, 정보통신서비스 부문 전년도 매출액이 100억 원 이상이거나, 전년도 말 기준 직전 3개월 일일평균 이용자 수가 100만 명 이상인 사업자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의무대상인데 인증을 취득하지 않으면 정보통신망법 제76조에 따라 3,000만 원 이하의 과태료가 부과됩니다. 여기서 실무자들이 자주 놓치는 함정이 하나 있습니다. 이 기준은 회사가 스스로 판단해서 신청해야 한다는 점입니다. 국가가 &quot;당신 회사는 올해부터 의무대상입니다&quot;라고 친절하게 통보해주지 않습니다. 매출이나 이용자 수가 기준선을 넘은 걸 회사가 인지하지 못한 채 지나가다가, 나중에 확인되어 과태료를 무는 사례가 실제로 있습니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #fff8e1; padding: 15px; border-left: 4px solid #ffa726;&quot;&gt;&lt;b&gt;  의무대상 진입 시점 주의&lt;/b&gt;&lt;br /&gt;의무대상이 되어 인증을 처음 신청하는 경우 다음 해 8월 31일까지 인증을 취득해야 합니다. 준비부터 취득까지 통상 6개월 이상 걸리고, 신청 전에 관리체계를 최소 2개월 이상 운영한 실적이 필요합니다. 기준선을 넘은 걸 알았을 때는 이미 시간이 빠듯한 경우가 많습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준에 해당하지 않는 회사도 자율적으로 신청할 수 있습니다. 임의신청이라고 부르는데, B2B 영업에서 고객사가 보안 인증을 요구하는 경우가 늘면서 의무가 아닌데도 받는 회사가 꽤 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 인증 기준 80개와 101개의 정체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증 기준은 크게 두 덩어리입니다. 관리체계 수립&amp;middot;운영에 관한 기준 16개와 보호대책 요구사항 64개를 합쳐 80개. ISMS-P는 여기에 개인정보 처리 단계별 요구사항 21개가 붙어 101개가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 이름만 보면 추상적인데, 내용을 열어보면 의외로 실무와 직결됩니다. 접근 권한을 누가 승인하고 언제 회수하는지, 서버 계정과 비밀번호를 어떻게 관리하는지, 취약점 점검과 패치를 어떤 주기로 하는지, 로그를 얼마나 보관하고 누가 검토하는지. 개발자라면 한 번쯤 &quot;이거 왜 이렇게 귀찮게 해야 하지&quot;라고 투덜거려 본 통제들이 대부분 이 기준에서 나온 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 경험을 하나 이야기하면, 2016년 이후 여러 현장을 다니며 트러블슈팅을 하던 시기에 운영 서버 접근 권한 신청 절차가 조직마다 얼마나 다른지를 체감했습니다. 어떤 곳은 결재 한 번에 하루가 걸려서 답답했고, 어떤 곳은 슬쩍 물어보면 공용 계정 비밀번호를 메신저로 보내줬습니다. 그때는 전자가 비효율의 상징처럼 느껴졌는데, 지금 돌아보면 후자가 훨씬 무서운 조직이었습니다. 그 절차의 뼈대가 바로 이 인증 기준입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 현장과 안 맞는 이유 - 심사는 스냅샷, 운영은 매일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터가 솔직한 이야기입니다. ISMS가 현장에서 욕을 먹는 데는 이유가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 문제는 심사가 특정 시점의 스냅샷이라는 점입니다. 심사는 정해진 기간에 서면과 샘플링 위주로 진행되어 왔습니다. 그러다 보니 조직의 에너지가 &quot;일상적으로 보안을 운영하는 것&quot;이 아니라 &quot;심사 기간에 통과할 상태를 만드는 것&quot;에 쏠립니다. 심사 몇 달 전부터 증적 문서를 몰아서 만들고, 평소에 안 하던 점검 회의록을 소급해서 채우는 풍경. 겪어본 분이라면 아실 겁니다. 저도 심사 시즌에 개발 일정이 통째로 밀리면서 &quot;이게 보안을 위한 건지 서류를 위한 건지&quot; 답답했던 기억이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 문제는 기준이 획일적이었다는 점입니다. 수백 명 규모의 플랫폼 기업과 갓 기준선을 넘은 회사에 같은 80개 항목이 적용됩니다. 작은 조직에는 과한 항목이 있고, 통신사나 데이터센터급 사업자에게는 오히려 느슨한 항목이 있습니다. 옷 치수는 하나인데 입어야 하는 사람의 체격이 제각각인 셈입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 인증과 실제 보안 수준의 간극이 있습니다. 인증을 보유한 통신사와 이커머스 기업에서 대형 해킹 사고가 연이어 터지면서 &quot;인증이 있는데 왜 뚫리나&quot;라는 실효성 논란이 커졌습니다. 당연한 일입니다. 인증은 관리체계가 기준에 적합하다는 확인이지, 공격을 막아주는 방패가 아니니까요. 하지만 일반 이용자 입장에서 이 구분은 와닿지 않고, 그래서 인증 제도 전체가 형식적이라는 비판을 받게 됐습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 그런데도 필요한 이유 - 이것마저 없던 조직의 풍경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 폐지하면 되느냐. 저는 반대입니다. 이 제도가 없거나 무시되는 조직이 어떤 모습인지 봤기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퇴사한 지 몇 달 된 직원의 계정이 운영 서버에 살아 있습니다. DB 접속 정보가 팀 공용 위키에 평문으로 적혀 있고, 그 위키는 전 직원이 볼 수 있습니다. 장애가 나서 로그를 찾으면 보관 주기라는 개념 자체가 없어서 이미 날아가 있습니다. 외주 개발사에 열어준 접근 권한은 프로젝트가 끝나고도 회수한 사람이 없습니다. 과장이 아니라, SI 현장을 다니던 시절 실제로 마주친 장면들입니다. 문제는 이런 조직일수록 사고가 나기 전까지는 아무 일도 없어 보인다는 겁니다.&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f8ff; padding: 15px; border-left: 4px solid #4a90e2;&quot;&gt;&lt;b&gt;  최소한의 가이드라는 말의 의미&lt;/b&gt;&lt;br /&gt;ISMS 기준은 보안을 잘하는 회사의 목표치가 아니라, 보안을 생각조차 안 해본 조직에게 &quot;적어도 이건 하라&quot;고 내미는 출발선에 가깝습니다. 계정 관리, 권한 회수, 로그 보관, 패치 주기 같은 항목들은 지키지 않는 사람들이 있기 때문에 문서로 강제된 것입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 통제라는 게 원래 그렇습니다. 알아서 잘하는 조직에게는 불필요한 요식이고, 안 하는 조직에게는 유일한 안전장치입니다. 그리고 제 경험상 &quot;우리는 알아서 잘한다&quot;고 자신하는 조직의 상당수가 실제로는 후자에 가까웠습니다. 현장과 어긋나는 부분이 분명히 있지만, 그 어긋남을 이유로 통째로 무시하기에는 바닥이 너무 낮은 조직이 여전히 많습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 2026년 전면 개편 - 인증 보유에서 운영 입증으로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 비판을 정부도 알고 있었던 모양입니다. 2026년 4월 10일, 과학기술정보통신부와 개인정보보호위원회가 인증제 실효성 강화방안을 발표했습니다. 제도 시행 이후 가장 큰 폭의 개편이라고 봐도 될 내용입니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3577809341016554&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 20px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;항목&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;기존&lt;/th&gt;
&lt;th style=&quot;padding: 12px; border: 1px solid #ddd; background: #2a9d8f; color: white;&quot;&gt;개편안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;인증 체계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;단일 기준 (ISMS 80개 / ISMS-P 101개)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;강화&amp;middot;표준&amp;middot;간편 3단계, 강화군에 별도 기준 20개 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;ISMS-P 취득&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;사실상 자율&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;공공시스템 운영기관, 이동통신사, 본인확인기관, 대규모 개인정보처리자 의무화 추진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;심사 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;서면&amp;middot;샘플링 중심&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;예비심사 &amp;rarr; 기술심사 &amp;rarr; 본심사 &amp;rarr; 이행심사 4단계, 현장실증 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;심사 규모&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;5명 내외, 7일 수준&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;표준군 6명 5~7일, 강화군&amp;middot;사고기업 10명 10~12일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd; background: #f9f9f9;&quot;&gt;&lt;b&gt;취약점 점검 자산&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;10대 수준&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border: 1px solid #ddd;&quot;&gt;최대 500대까지 확대&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방향을 한 문장으로 줄이면 &quot;인증서를 갖고 있느냐&quot;에서 &quot;실제로 운영하고 있음을 입증하느냐&quot;로 감독의 초점이 옮겨간 겁니다. 예비심사 단계에서 CISO 권한, 자산 식별, 암호화 적용, 취약점&amp;middot;패치 관리 같은 핵심 항목이 미충족이면 본심사 자체가 진행되지 않고, 사고 기업에 대한 사후관리도 상시 점검 체제로 바뀝니다. CVE 취약점 스캔, 보안설정 점검, 소스코드 진단, 모의침투 같은 기술심사가 정식 단계로 들어온 것도 개발자 입장에서는 체감이 클 변화입니다. 서류 벼락치기로 넘어가던 시대가 구조적으로 어려워지는 셈입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 유의할 점이 있습니다. ISMS-P 의무화 대상의 구체적 기준(매출 구간, 처리하는 정보주체 수 등)은 아직 시행령과 고시로 확정되지 않았습니다. 2027년 시행을 목표로 작업 중인 단계라, 지금 시점에서 &quot;우리 회사는 해당/비해당&quot;을 단정하기는 이릅니다. 인증 수수료도 심사 인력과 기간 확대에 따라 오를 예정이라고 하니, 대상이 될 가능성이 있는 회사라면 예산 계획에 미리 반영해 두는 편이 낫겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 협업툴과 SaaS 도입할 때 인증서를 읽는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그에서 협업툴 이야기를 자주 하다 보니, ISMS를 SaaS 도입 관점에서 어떻게 봐야 하는지도 짚고 넘어가겠습니다. 특정 제품 추천보다는 어떤 제품이든 적용할 수 있는 확인 원칙을 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인증 보유 여부는 KISA의 ISMS-P 인증 현황 페이지에서 직접 조회합니다. 벤더사 홈페이지의 배지 이미지만 믿지 말고, 유효기간이 살아 있는지 확인하는 게 먼저입니다.&lt;br /&gt;- 인증서의 범위를 봐야 합니다. 회사 전체가 아니라 특정 서비스나 특정 인프라만 인증 범위인 경우가 있습니다. 내가 쓰려는 그 서비스가 범위 안에 있는지가 핵심입니다.&lt;br /&gt;- 인증은 3년 유효에 매년 사후심사를 받는 구조입니다. 취득 시점만 확인하고 끝내면 곤란하고, 갱신이 유지되고 있는지를 봅니다.&lt;br /&gt;- 인증이 있다는 것과 우리 회사 데이터가 안전하다는 것은 같은 말이 아닙니다. 접근 권한 설계, 퇴사자 계정 처리, 감사 로그 활용 같은 운영 책임은 도입한 회사 몫으로 남습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꿔 말하면 인증서는 벤더사를 걸러내는 1차 필터일 뿐입니다. 필터를 통과한 다음의 보안은 결국 쓰는 쪽의 운영에 달려 있습니다. 앞에서 계속 이야기한 &quot;최소선&quot;이라는 성격이 여기서도 똑같이 적용됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. ISMS 인증 자주 묻는 질문&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실무자들이 자주 헷갈리는 것들&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. ISMS와 ISO 27001 중 뭘 받아야 하나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내 법적 의무를 이행해야 한다면 선택지는 ISMS뿐입니다. ISO 27001은 국제 거래나 글로벌 고객사 요구에 대응하는 용도이고, 한국의 의무 인증을 대체하지 못합니다. 두 제도의 기준이 상당 부분 겹치기 때문에 함께 준비하는 회사도 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 의무대상인데 ISMS-P를 받으면 어떻게 되나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 의무대상이 ISMS-P를 취득하면 의무를 이행한 것으로 인정됩니다. 상위 호환 개념이라고 보면 됩니다. 개인정보를 대량으로 다루는 서비스라면 처음부터 ISMS-P로 가는 편이 재작업을 줄입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 인증만 받으면 개인정보 유출 시 책임이 면제되나요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아닙니다. 인증은 과징금 산정 시 감경 요소로 고려될 수 있는 정도이고, 사고 책임 자체를 없애주지 않습니다. 이번 개편안에서는 ISMS-P 의무화 대상이 인증을 받지 않은 경우 과징금 감경 대상에서 제외하는 방향까지 언급되고 있어서, 오히려 안 받았을 때의 불이익이 커지는 추세입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 스타트업인데 미리 준비할 필요가 있을까요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 의무는 아니더라도, 성장 속도가 빠르다면 기준선(정보통신서비스 매출 100억 원, 일평균 이용자 100만 명)을 넘는 시점이 생각보다 일찍 올 수 있습니다. 준비에 6개월 이상 걸리는 걸 감안하면, 계정 관리와 권한 회수 절차 정도는 지금부터 습관으로 만들어 두는 게 나중에 비용을 크게 줄입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 서류가 아니라 습관이 남는다면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증은 분명 불완전한 제도입니다. 심사는 스냅샷이었고, 기준은 획일적이었고, 인증을 받은 회사에서도 사고는 났습니다. 2026년 개편이 그 간극을 얼마나 좁힐지는 시행령이 나오고 실제 심사가 돌아가 봐야 알 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 저는 이 제도를 &quot;지키지 않는 사람들을 위한 최소한의 가이드&quot;라고 부르고 싶습니다. 알아서 잘하는 조직에게 인증 기준은 이미 하고 있는 일의 문서화에 불과합니다. 하지만 퇴사자 계정이 방치되고 DB 비밀번호가 위키에 굴러다니는 조직에게는, 이 귀찮은 80개 항목이 사고와의 거리를 벌려주는 거의 유일한 장치입니다. 심사가 끝나고 서류만 남으면 실패한 인증이고, 권한 회수와 로그 점검이 습관으로 남으면 성공한 인증입니다. 확실하진 않지만, 개편된 제도가 노리는 지점도 결국 그 차이가 아닐까 생각합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJBrKT/dJMcaivGWQf/eO2AucKMobygEYgbOylKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJBrKT/dJMcaivGWQf/eO2AucKMobygEYgbOylKkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJBrKT/dJMcaivGWQf/eO2AucKMobygEYgbOylKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJBrKT%2FdJMcaivGWQf%2FeO2AucKMobygEYgbOylKkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;824&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버&amp;middot;DB&amp;middot;보안</category>
      <category>ISMS-P</category>
      <category>ISMS개편</category>
      <category>ISMS의무대상</category>
      <category>ISMS인증</category>
      <category>KISA인증</category>
      <category>saas도입</category>
      <category>개인정보보호</category>
      <category>보안인증제도</category>
      <category>정보보호관리체계</category>
      <category>정보통신망법</category>
      <author>개발선생</author>
      <guid isPermaLink="true">https://devwar.tistory.com/65</guid>
      <comments>https://devwar.tistory.com/entry/%ED%98%91%EC%97%85%ED%88%B4-ISMS-%EC%9D%B8%EC%A6%9D-%EC%B5%9C%EC%8B%A0-%EA%B0%9C%EC%A0%95-%EA%B8%B0%EC%A4%80-%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC-%EB%82%A9%EB%8B%88%EB%8B%A4-%EC%95%88%EC%A0%84%ED%95%9C-SaaS-%EB%8F%84%EC%9E%85-%EA%B0%80%EC%9D%B4%EB%93%9C#entry65comment</comments>
      <pubDate>Tue, 4 Aug 2026 11:22:17 +0900</pubDate>
    </item>
  </channel>
</rss>