<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>근현대 고슴도치 기술</title>
    <link>https://all-new-dochi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 17:33:36 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>근현대 고슴도치</managingEditor>
    <image>
      <title>근현대 고슴도치 기술</title>
      <url>https://tistory1.daumcdn.net/tistory/6505720/attach/880467e46f7341f6b1efb639d58b0304</url>
      <link>https://all-new-dochi.tistory.com</link>
    </image>
    <item>
      <title>현대차 아틀라스 로봇 뒤에 숨은 디지털 트윈, 왜 오토에버가 주목받을까-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/slazr/dJMcaciRjtj/HZF2C3dj15jBOaKumGSZhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/slazr/dJMcaciRjtj/HZF2C3dj15jBOaKumGSZhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/slazr/dJMcaciRjtj/HZF2C3dj15jBOaKumGSZhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fslazr%2FdJMcaciRjtj%2FHZF2C3dj15jBOaKumGSZhk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;디지털 트윈이라는 단어, 왜 갑자기 자주 보일까&lt;/h2&gt;
&lt;p&gt;CES 2026 이후로 디지털 트윈이라는 단어가 부쩍 자주 보임&lt;/p&gt;
&lt;p&gt;특히 현대차그룹이 아틀라스 휴머노이드 로봇을 공개하면서 &amp;quot;현대오토에버가 디지털 트윈으로 아틀라스 뇌를 학습시킨다&amp;quot;는 식의 해석이 따라붙기 시작했음&lt;/p&gt;
&lt;p&gt;막상 공식 보도를 따라가보면 그 표현은 절반쯤만 맞는 이야기더라.&lt;/p&gt;
&lt;p&gt;학습의 실제 주체와 디지털 트윈이 쓰이는 위치를 한 번 정리하지 않으면 기사 해석이 어긋나기 쉬움&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;디지털 트윈의 정의&lt;/h2&gt;
&lt;p&gt;디지털 트윈(Digital Twin)은 현실의 사물·공간·공정을 가상 공간에 1:1로 복제해 실시간으로 동기화하는 기술임&lt;/p&gt;
&lt;p&gt;단순 3D 모델링과는 다름&lt;/p&gt;
&lt;p&gt;센서 데이터, 물리 시뮬레이션, 환경 변수까지 함께 묶여서 가상에서 일어난 변화가 실제 자산 상태를 반영하거나, 실제 자산의 변화가 가상 모델에 그대로 흘러가는 양방향 구조가 핵심임&lt;/p&gt;
&lt;p&gt;제조업에서 먼저 활용됐고, 항공·에너지·도시 설계로 확장됐음&lt;/p&gt;
&lt;p&gt;요즘 디지털 트윈이 다시 주목받는 가장 큰 이유는 피지컬 AI 때문임&lt;/p&gt;
&lt;p&gt;로봇이나 자율주행차처럼 물리 세계에서 움직이는 AI는 학습 데이터를 현실에서 모으려면 시간과 비용이 천문학적으로 들기 때문에, 가상 환경에서 미리 수백만 번 시뮬레이션을 돌리는 방식이 사실상 유일한 해법으로 자리잡았다.&lt;/p&gt;
&lt;p&gt;쉽게 말해, 디지털 트윈은 피지컬 AI에게 무한히 반복 가능한 연습장을 제공하는 셈임&lt;/p&gt;
&lt;p&gt;체감상 디지털 트윈이라는 단어가 추상적으로 들린다면 &amp;quot;현실을 미리 돌려보는 시뮬레이터&amp;quot;라고 이해해도 무리가 없음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;휴머노이드 로봇이 디지털 트윈에 의존하는 이유&lt;/h2&gt;
&lt;p&gt;현실에서 로봇이 한 번 넘어지면 부품 수리에 며칠이 걸리지만, 가상 공간에서는 수천 번 넘어져도 비용이 거의 들지 않음&lt;/p&gt;
&lt;p&gt;직접 사람이 일일이 동작을 입력하기보다, 강화학습이 돌아가는 가상 환경 자체를 잘 만드는 쪽이 훨씬 빠르고 안전함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;아틀라스의 실제 학습 구조&lt;/h2&gt;
&lt;p&gt;보도된 바에 따르면 아틀라스의 학습은 크게 세 축으로 구성됨&lt;/p&gt;
&lt;p&gt;첫 번째 축은 보스턴다이내믹스와 RAI(Robotics &amp;amp; AI Institute)가 담당하는 몸체 제어·동작 학습임&lt;/p&gt;
&lt;p&gt;모션 캡처 데이터와 강화학습 시뮬레이션을 통해 균형·보행·물체 조작을 익히는 영역임&lt;/p&gt;
&lt;p&gt;두 번째 축은 구글 딥마인드와의 제휴로 추가된 추론·언어·판단 영역임&lt;/p&gt;
&lt;p&gt;이른바 &amp;quot;두 개의 두뇌&amp;quot; 구조에서 인지 두뇌에 해당한다.&lt;/p&gt;
&lt;p&gt;세 번째 축이 바로 시뮬레이션 환경임&lt;/p&gt;
&lt;p&gt;보도상 엔비디아 옴니버스(Omniverse)를 활용해 실제 공장 환경과 거의 동일한 가상 라인을 만들고, 그 안에서 부품 집기·정렬·운반 같은 반복 작업을 수만 번 돌리는 방식임&lt;/p&gt;
&lt;p&gt;흥미로운 점은 옴니버스 자체가 엔비디아 플랫폼이라는 사실이다.&lt;/p&gt;
&lt;p&gt;즉 아틀라스 뇌의 직접 학습 파이프라인은 현대차그룹 자체 디지털 트윈이 아닌, 엔비디아 기반 시뮬레이션이 핵심 축이라는 뜻임&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;현대오토에버의 실제 포지션&lt;/h2&gt;
&lt;p&gt;여기서 현대오토에버의 위치가 종종 오해되는 지점이 생김&lt;/p&gt;
&lt;p&gt;오토에버는 그룹의 시스템통합(SI)과 스마트팩토리 소프트웨어를 담당하는 계열사임&lt;/p&gt;
&lt;p&gt;보도된 역할을 정리하면 다음과 같음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로봇이 투입될 공장의 디지털 트윈·MES·SCM 인프라 운영&lt;/li&gt;
&lt;li&gt;로봇 데이터 수집·관리 파이프라인 구축&lt;/li&gt;
&lt;li&gt;로봇 재판매·통합 솔루션·사후 관리 등 전 주기 매출 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, 아틀라스가 공장에 배치된 뒤 그 로봇이 일할 환경을 디지털 트윈으로 모사하고, 거기서 운영 데이터를 모으고 최적화하는 쪽에 가까움&lt;/p&gt;
&lt;p&gt;체감상 &amp;quot;아틀라스의 뇌를 직접 학습시킨다&amp;quot;라는 표현보다 &amp;quot;아틀라스가 일할 공장의 뇌를 디지털 트윈으로 운영한다&amp;quot;가 보도 기준으로는 훨씬 정확한 표현임&lt;/p&gt;
&lt;p&gt;물론 공장 디지털 트윈에서 누적된 운영 데이터가 향후 아틀라스 추가 학습용 데이터셋으로 환원될 가능성은 충분히 있음&lt;/p&gt;
&lt;p&gt;증권가에서 오토에버를 핵심 수혜주로 분류하는 이유도 이 환원 흐름에 대한 기대 때문이라고 보면 됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;시장 기대와 실제의 간극&lt;/h2&gt;
&lt;p&gt;일부 보도와 커뮤니티에서는 &amp;quot;오토에버 = 아틀라스 학습 담당&amp;quot;이라는 단순화된 도식이 떠도는데, 공식 자료에서 그렇게 단정한 표현은 발견되지 않음&lt;/p&gt;
&lt;p&gt;흔히 알려진 바로는 현시점 오토에버의 핵심 가치는 &amp;quot;AI 인프라 투자 사이클에서 가장 빠르게 매출이 인식되는 그룹 SI 계열사&amp;quot;라는 위치라는 점임&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;그래서 정리하면&lt;/h2&gt;
&lt;p&gt;디지털 트윈은 피지컬 AI 시대의 가장 중요한 인프라 중 하나라는 점은 분명함&lt;/p&gt;
&lt;p&gt;아틀라스의 직접 학습 파이프라인은 보스턴다이내믹스·딥마인드·엔비디아 옴니버스가 짊어지고 있고, 현대오토에버는 그 로봇이 일할 공장과 운영 데이터 흐름을 디지털 트윈으로 받쳐주는 위치로 보는 것이 보도 기준으로 가장 정확함&lt;/p&gt;
&lt;p&gt;투자 관점에서든 기술 트렌드 관점에서든, 디지털 트윈이라는 단어를 만났을 때 &amp;quot;학습 자체에 쓰이는 디지털 트윈인지, 운영에 쓰이는 디지털 트윈인지&amp;quot;를 한 번 구분해서 보면 기사 해석이 한층 선명해진다.&lt;/p&gt;</description>
      <category>ces2026</category>
      <category>디지털트윈</category>
      <category>보스턴다이내믹스</category>
      <category>스마트팩토리</category>
      <category>아틀라스로봇</category>
      <category>옴니버스</category>
      <category>피지컬ai</category>
      <category>현대오토에버</category>
      <category>휴머노이드</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/85</guid>
      <comments>https://all-new-dochi.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 22 May 2026 14:14:06 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code에서 한 줄 통째로 지우려고 백스페이스 누르고 있었다면-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUXSXy/dJMcadBVIdG/G6XGPkdqXQeFBorxiIVbkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUXSXy/dJMcadBVIdG/G6XGPkdqXQeFBorxiIVbkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUXSXy/dJMcadBVIdG/G6XGPkdqXQeFBorxiIVbkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUXSXy%2FdJMcadBVIdG%2FG6XGPkdqXQeFBorxiIVbkk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;백스페이스 함정&lt;/h2&gt;
&lt;p&gt;Claude Code 쓰다 보면 한 줄 통째로 지우고 다시 입력해야 할 때가 자주 있음&lt;/p&gt;
&lt;p&gt;긴 프롬프트 잘못 적어서 처음부터 다시 쓰려는데, 백스페이스만 누르고 있으면 시간이 꽤 걸림&lt;/p&gt;
&lt;p&gt;체감상 매번 백스페이스로 한 글자씩 지우던 사람이라면 단축키 두 개만 알아도 입력 속도가 확연히 달라짐&lt;/p&gt;
&lt;p&gt;이 글에서는 한 줄 지우는 단축키를 시작으로, Claude Code 입력창에서 자주 쓰이는 키와 슬래시 명령어를 묶어서 정리함&lt;/p&gt;
&lt;p&gt;검색해보면 단편적인 팁은 많지만 한 화면에 묶어 정리해둔 글이 의외로 드물어, 자주 쓰는 것만 추려서 한 번에 보이도록 구성함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;한 줄 삭제 단축키&lt;/h2&gt;
&lt;p&gt;가장 핵심은 &lt;code&gt;Ctrl+U&lt;/code&gt; 와 &lt;code&gt;Ctrl+K&lt;/code&gt; 두 개임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+U&lt;/code&gt; 는 커서 위치 기준 앞쪽을 전부 지움 — 보통은 줄 끝에 커서가 있으니 사실상 줄 전체가 한 번에 사라짐&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+K&lt;/code&gt; 는 반대로 커서 위치 기준 뒤쪽을 전부 지움&lt;/p&gt;
&lt;p&gt;긴 명령을 일부만 살리고 뒷부분을 통째로 잘라낼 때 &lt;code&gt;Ctrl+K&lt;/code&gt; 가 편하더라&lt;/p&gt;
&lt;p&gt;두 키 모두 Unix readline 계열에서 표준으로 쓰는 키라, Claude Code 외에 bash·zsh 일반 터미널에서도 동일하게 동작함&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ctrl+U  →  커서 앞쪽 줄 전체 삭제
Ctrl+K  →  커서 뒤쪽 줄 전체 삭제&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;써보면 백스페이스 연타로 보내던 몇 초가 거의 0에 가까워짐&lt;/p&gt;
&lt;p&gt;여러 줄 모드(&lt;code&gt;Shift+Enter&lt;/code&gt;로 줄바꿈 입력) 상태라면, &lt;code&gt;Ctrl+U&lt;/code&gt; 는 현재 커서가 위치한 한 줄만 영향을 준다는 점만 기억하면 됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;커서 이동·단어 삭제 단축키&lt;/h2&gt;
&lt;p&gt;한 글자씩이 아니라 단어 단위로 다루는 키도 자주 쓰임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+W&lt;/code&gt; 는 커서 바로 앞 단어 하나만 삭제함 — 오타 난 단어 하나만 빠르게 지울 때 직접 쓰면 차이가 크게 느껴짐&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+A&lt;/code&gt; 는 커서를 줄 맨 앞으로, &lt;code&gt;Ctrl+E&lt;/code&gt; 는 줄 맨 끝으로 이동시킴&lt;/p&gt;
&lt;p&gt;긴 프롬프트 중간에 끼어들어 수정할 때 화살표 키로 한참 이동하지 않고 한 번에 점프할 수 있어서 손목이 편하네&lt;/p&gt;
&lt;table&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;code&gt;Ctrl+W&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;커서 앞 단어 하나 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;줄 맨 앞으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+E&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;줄 맨 끝으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Alt+B&lt;/code&gt; / &lt;code&gt;Alt+F&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;단어 단위 좌/우 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;외울 게 많아 보여도 보통은 &lt;code&gt;Ctrl+U&lt;/code&gt;·&lt;code&gt;Ctrl+W&lt;/code&gt; 두 개만 손에 익혀도 입력 효율이 크게 올라감&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;슬래시 명령어 활용&lt;/h2&gt;
&lt;p&gt;입력창 맨 앞에 &lt;code&gt;/&lt;/code&gt; 를 치면 Claude Code 내부 명령어 목록이 자동완성으로 뜨네&lt;/p&gt;
&lt;p&gt;자주 쓰이는 명령어 몇 개만 외워두면 세션 관리가 훨씬 수월함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/clear&lt;/code&gt; — 현재 대화 컨텍스트 초기화, 긴 작업이 끝나고 새 주제로 넘어갈 때 필수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compact&lt;/code&gt; — 컨텍스트를 요약해 압축, 토큰 절약용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/help&lt;/code&gt; — 사용 가능한 명령어 전체 조회&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/init&lt;/code&gt; — 현재 프로젝트에 &lt;code&gt;CLAUDE.md&lt;/code&gt; 자동 생성&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model&lt;/code&gt; — 사용 모델 변경 (Opus / Sonnet / Haiku)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/config&lt;/code&gt; — 설정 화면 진입&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/agents&lt;/code&gt; — 서브에이전트 관리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/review&lt;/code&gt; — 변경 사항 코드 리뷰&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/cost&lt;/code&gt; — 현재 세션 토큰 사용량 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;특히 &lt;code&gt;/clear&lt;/code&gt; 는 작업이 길어져 컨텍스트가 무거워졌다 싶을 때 한 번씩 쳐주면 응답 속도와 정확도가 같이 살아남&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/compact&lt;/code&gt; 는 컨텍스트는 유지하되 토큰만 줄이고 싶을 때 쓰는데, 직접 써보면 둘 차이가 확연함 — &lt;code&gt;/clear&lt;/code&gt; 는 메모리를 비우고, &lt;code&gt;/compact&lt;/code&gt; 는 요약본을 남김&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;프리픽스 단축 입력&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/&lt;/code&gt; 외에도 입력 첫 글자로 동작이 바뀌는 프리픽스가 몇 개 더 있음&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!&lt;/code&gt; 를 맨 앞에 붙이면 그 줄은 bash 명령으로 실행됨 — 예를 들어 &lt;code&gt;!ls&lt;/code&gt; 만 쳐도 현재 디렉터리 목록이 바로 출력되고, 결과는 컨텍스트에도 함께 들어감&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#&lt;/code&gt; 으로 시작하면 그 메시지를 메모리(&lt;code&gt;CLAUDE.md&lt;/code&gt; 등)에 기록함, 프로젝트 규칙이나 자주 쓰는 정보 저장에 유용함&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@파일경로&lt;/code&gt; 형식으로 입력하면 해당 파일을 컨텍스트에 첨부할 수 있음 — 보통 &lt;code&gt;@src/main.py&lt;/code&gt; 처럼 자동완성과 함께 사용함&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;!명령어     → bash 한 줄 실행
#메모       → CLAUDE.md 에 메모리 저장
@파일경로   → 파일을 컨텍스트에 첨부&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;체감상 &lt;code&gt;@&lt;/code&gt; 자동완성은 파일 찾는 시간을 크게 줄여줘서 한 번 손에 익으면 다시 돌아가기 어렵네&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;세션 제어 키&lt;/h2&gt;
&lt;p&gt;작업을 중간에 끊거나 화면을 정리하는 키도 알아두면 편함&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Esc&lt;/code&gt; 는 현재 진행 중인 응답을 중단시킴 — 잘못된 방향으로 가고 있을 때 즉시 멈추는 용도임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+L&lt;/code&gt; 은 화면을 깔끔하게 비움, 위쪽 출력이 너무 많아져 답답할 때 쓰면 좋음&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+C&lt;/code&gt; 는 입력 중인 줄을 취소함 (응답이 진행 중이 아닐 때) — 한 번 더 누르면 세션 종료 안내가 뜸&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Shift+Tab&lt;/code&gt; 은 자동 승인(auto-accept) 모드를 토글하는데, 반복 편집 작업에서 매번 승인 누르기 번거로울 때 켜두면 흐름이 끊기지 않음&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl+R&lt;/code&gt; 은 출력 모드를 전환해 마지막 응답이나 도구 결과를 더 자세히 펼쳐 보여줌&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Shift+Enter&lt;/code&gt; 는 줄바꿈 입력용인데, 멀티라인 프롬프트를 쓸 때 보통은 이 키 하나로 충분함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;한 줄 요약&lt;/h2&gt;
&lt;p&gt;손이 가장 자주 가는 키는 결국 &lt;code&gt;Ctrl+U&lt;/code&gt;(앞쪽 삭제)와 &lt;code&gt;Ctrl+W&lt;/code&gt;(단어 삭제) 두 개로 압축됨&lt;/p&gt;
&lt;p&gt;여기에 &lt;code&gt;/clear&lt;/code&gt;·&lt;code&gt;@파일&lt;/code&gt;·&lt;code&gt;!명령&lt;/code&gt; 정도만 보통은 같이 쓰는 편이고, 나머지는 필요할 때 그때그때 익히면 충분함&lt;/p&gt;
&lt;p&gt;키 하나 외워서 백스페이스 연타가 사라지는 게 가장 직접적인 체감 포인트라는 게 솔직한 생각임&lt;/p&gt;</description>
      <category>AI코딩</category>
      <category>claudecode</category>
      <category>CLI</category>
      <category>개발도구</category>
      <category>개발자단축키</category>
      <category>생산성</category>
      <category>클로드코드</category>
      <category>터미널단축키</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/84</guid>
      <comments>https://all-new-dochi.tistory.com/84#entry84comment</comments>
      <pubDate>Thu, 14 May 2026 16:37:50 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT Claude Gemini 비교, 작업별로 어떤 AI를 골라야 할까-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/83</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FgRId/dJMcaaywxtl/exi7FkHKkjwPsMNspeacqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FgRId/dJMcaaywxtl/exi7FkHKkjwPsMNspeacqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FgRId/dJMcaaywxtl/exi7FkHKkjwPsMNspeacqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgRId%2FdJMcaaywxtl%2Fexi7FkHKkjwPsMNspeacqK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;누가 가장 좋은지 묻는 사람이 늘었음&lt;/h2&gt;
&lt;p&gt;ChatGPT·Claude·Gemini 셋 중 어느 AI를 결제해야 하느냐는 질문이 정말 자주 보임&lt;/p&gt;
&lt;p&gt;세 모델이 모두 충분히 잘 만들어진 단계라, 진짜 답은 &amp;quot;본인이 어떤 작업을 가장 자주 하느냐&amp;quot;에 달려 있음&lt;/p&gt;
&lt;p&gt;이 글은 누가 1등이라는 식의 단정이 아니라, 작업 유형별로 어느 모델이 강점을 보인다고 공개적으로 평가되는지 정리한 글임&lt;/p&gt;
&lt;p&gt;직접 같은 프롬프트를 던져보면 모델마다 결이 분명히 갈리니, 본인 작업과 매칭해 보면 결정이 한층 빨라진다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;ChatGPT의 강점&lt;/h2&gt;
&lt;p&gt;OpenAI ChatGPT는 가장 먼저 대중화된 만큼 생태계가 가장 넓음&lt;/p&gt;
&lt;p&gt;DALL·E 이미지 생성, 코드 인터프리터, 음성 대화, GPTs 사용자 정의 봇 등을 한 인터페이스에서 호출할 수 있다는 점이 흔히 알려진 강점임&lt;/p&gt;
&lt;p&gt;특히 사용자 GPTs 봇이 가장 많이 누적되어 있어, 잡다한 작업을 한 곳에서 처리하려는 사람에게 무난한 선택지로 평가됨&lt;/p&gt;
&lt;p&gt;체감상 진입 장벽이 낮고, 처음 AI를 쓰는 사람이 가장 먼저 결제하는 모델이기도 함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;Claude의 강점&lt;/h2&gt;
&lt;p&gt;Anthropic Claude는 긴 컨텍스트 처리와 글쓰기 품질로 자주 추천되는 모델임&lt;/p&gt;
&lt;p&gt;공식 발표 기준 Opus 계열은 약 20만 토큰 수준의 컨텍스트 윈도우를 지원하는데, 이는 일반 문서 수십 페이지를 한 번에 다룰 수 있는 분량임&lt;/p&gt;
&lt;p&gt;써보면 답변 톤이 차분하고 과장이 적어, 비즈니스 문서나 보고서 초안 작업에 잘 맞는다는 평이 많음&lt;/p&gt;
&lt;p&gt;코드 영역에서도 평가가 좋은 편이며, 특히 기존 코드를 이해하고 다듬는 리팩토링 작업에서 강점을 보임&lt;/p&gt;
&lt;p&gt;다만 자체 이미지 생성 기능이 없어, 그래픽이 필요한 작업에서는 ChatGPT나 Gemini를 보조로 쓰는 흐름이 일반적임&lt;/p&gt;
&lt;p&gt;글쓰기·문서 비중이 큰 사용자에게는 가장 자주 메인으로 선택되는 모델이기도 함&lt;/p&gt;
&lt;p&gt;Projects 기능을 활용하면 관련 문서를 묶어두고 길게 이어 작업할 수 있어, 회의록이나 보고서 흐름과 잘 맞음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;Gemini의 강점&lt;/h2&gt;
&lt;p&gt;Google Gemini는 구글 생태계 결합이 가장 두드러진 모델임&lt;/p&gt;
&lt;p&gt;Gmail, Docs, Drive, YouTube 같은 서비스 안에서 그대로 호출할 수 있어, 이미 구글 워크스페이스를 쓰는 사람에게는 별도 도구를 띄울 필요가 없다는 점이 강점임&lt;/p&gt;
&lt;p&gt;특히 영상·이미지 이해 영역에서는 세 모델 중 가장 안정적이라는 평이 자주 보이네.&lt;/p&gt;
&lt;p&gt;YouTube 영상 요약, 이미지 분석, 멀티모달 작업에서 Gemini를 먼저 시도해 보는 사람이 많음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;작업별 강점 매칭&lt;/h2&gt;
&lt;p&gt;같은 프롬프트를 세 모델에 던졌을 때 일반적으로 잘 나온다고 평가되는 영역을 정리하면 다음과 같음&lt;/p&gt;
&lt;table&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;Claude&lt;/td&gt;
&lt;td&gt;차분한 톤, 긴 컨텍스트 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 리팩토링&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;기존 맥락 유지력이 강점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;새 코드 작성&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;GPTs 활용 시 생산성 ↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이미지 생성&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;DALL·E 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;영상·이미지 분석&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;멀티모달 정확도 평가가 좋음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구글 워크스페이스 자동화&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Gmail·Docs 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다목적 잡일&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;생태계가 가장 넓음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;이 표는 어디까지나 일반적인 평가를 정리한 것이고, 실제 만족도는 본인이 같은 작업을 던져봤을 때 갈리는 부분이 있음&lt;/p&gt;
&lt;p&gt;체감상 모델별 차이는 단순한 작업일수록 줄고, 복잡한 작업일수록 분명해진다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;가격대 (공식가 기준)&lt;/h2&gt;
&lt;p&gt;세 모델 모두 무료 티어가 있지만, 실제 업무용으로 쓰려면 유료 플랜이 사실상 필수임&lt;/p&gt;
&lt;p&gt;공식 발표 기준 개인용 유료 플랜은 셋 다 월 약 $20 안팎의 비슷한 가격대에 형성되어 있더라.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT Plus: 공식가 기준 월 약 $20&lt;/li&gt;
&lt;li&gt;Claude Pro: 공식가 기준 월 약 $20&lt;/li&gt;
&lt;li&gt;Gemini Advanced: Google One AI Premium 묶음으로 공식가 기준 월 약 $20 (저장공간 2TB 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;가격대가 거의 같으니, 비용보다는 본인 작업 패턴에 맞는 모델 선택이 더 큰 변수임&lt;/p&gt;
&lt;p&gt;구독 시점의 환율·프로모션에 따라 실 결제 금액은 달라질 수 있으니, 가입 직전 공식 페이지에서 확인해 보는 게 안전함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;조합 활용 팁&lt;/h2&gt;
&lt;p&gt;세 곳을 동시에 결제하기보다 본인 작업 비중이 큰 한두 개를 중심으로 잡고, 나머지는 무료 티어로 보완하는 방식이 가장 합리적임&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;그래서 어떤 모델을 골라야 할까&lt;/h2&gt;
&lt;p&gt;글쓰기·문서·코드 리팩토링 비중이 크면 Claude가 첫 후보로 자주 거론됨&lt;/p&gt;
&lt;p&gt;이미지 생성, GPTs 활용, 다양한 잡일을 한 곳에서 처리하려면 ChatGPT가 무난한 선택임&lt;/p&gt;
&lt;p&gt;이미 구글 워크스페이스에 의존도가 높거나 영상·이미지 분석이 잦다면 Gemini가 가성비 면에서 가장 매력적이네.&lt;/p&gt;
&lt;p&gt;한 달씩 무료 티어로 같은 작업을 던져 보면 본인과 결이 맞는 모델이 빠르게 드러나니, 결제 전 체험을 권함&lt;/p&gt;</description>
      <category>AI도구</category>
      <category>ai비교</category>
      <category>AI추천</category>
      <category>ChatGPT</category>
      <category>claude</category>
      <category>claudeopus</category>
      <category>gemini</category>
      <category>생성형AI</category>
      <category>인공지능</category>
      <category>챗봇</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/83</guid>
      <comments>https://all-new-dochi.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 13 May 2026 01:43:52 +0900</pubDate>
    </item>
    <item>
      <title>한국 보안 관련주 한눈에 보기(정보보안과 물리보안 정리)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTomZN/dJMcabc4mCj/zE16fQVQzJyGO0zzysvFlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTomZN/dJMcabc4mCj/zE16fQVQzJyGO0zzysvFlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTomZN/dJMcabc4mCj/zE16fQVQzJyGO0zzysvFlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTomZN%2FdJMcabc4mCj%2FzE16fQVQzJyGO0zzysvFlk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;보안 산업 개요&lt;/h2&gt;
&lt;p&gt;사이버 위협 증가와 디지털 전환 가속으로 보안 수요가 꾸준히 늘어나는 분야임&lt;/p&gt;
&lt;p&gt;국내 보안 시장은 크게 정보보안과 물리보안으로 나뉘며, 두 영역 모두 매년 한 자릿수 후반에서 두 자릿수 성장률을 기록하고 있음&lt;/p&gt;
&lt;p&gt;특히 공공기관 망분리 의무화, 개인정보보호법 강화, AI 기반 위협 대응 수요가 늘어나면서 산업 전반의 모멘텀이 형성되고 있음&lt;/p&gt;
&lt;p&gt;한국인터넷진흥원(KISA) 자료에 따르면 국내 정보보호 산업 매출은 매년 우상향 곡선을 그리고 있으며, 2024년 기준 시장 규모가 16조 원을 넘어선 것으로 추정됨&lt;/p&gt;
&lt;p&gt;이러한 구조적 성장 흐름 덕분에 보안 관련주는 단기 테마뿐 아니라 중장기 포트폴리오 관점에서도 검토할 가치가 있음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;정보보안 대표 종목&lt;/h2&gt;
&lt;p&gt;정보보안 분야는 백신, 방화벽, 망분리, 데이터 암호화 같은 소프트웨어 솔루션을 다루는 기업이 중심임&lt;/p&gt;
&lt;p&gt;국내 대표 종목으로는 백신 시장 1위 안랩(053800), 네트워크 보안 강자 윈스(136540), 인증·암호화 전문 라온시큐어(042510), 문서 보안 강자 파수(150900)가 있음&lt;/p&gt;
&lt;p&gt;이 외에도 시큐브(131090), 이글루(067920), SGA솔루션즈(184230) 같은 중견 기업이 공공과 금융 시장을 중심으로 안정적 매출을 확보하고 있음&lt;/p&gt;
&lt;p&gt;정보보안 종목의 공통된 특징은 라이선스와 유지보수 매출 비중이 높아 한 번 도입되면 교체 비용이 크다는 점임&lt;/p&gt;
&lt;p&gt;이런 락인(lock-in) 효과 덕분에 한 번 레퍼런스를 확보한 기업은 꾸준한 갱신 매출을 기대할 수 있음&lt;/p&gt;
&lt;p&gt;다만 4분기에 매출이 집중되는 계절성이 강해, 분기 실적만 보고 판단하면 왜곡이 생길 수 있다는 점은 유의해야 함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;물리보안 대표 종목&lt;/h2&gt;
&lt;p&gt;물리보안은 무인경비, CCTV, 출입통제, 영상관제 등 하드웨어와 운영 서비스가 결합된 사업 모델임&lt;/p&gt;
&lt;p&gt;국내에서는 에스원(012750)이 시장 1위로 압도적 점유율을 보유하고 있으며, KT텔레캅과 ADT캡스(SK쉴더스 자회사)가 그 뒤를 잇는 구조임&lt;/p&gt;
&lt;p&gt;에스원은 삼성그룹 계열사로서 안정적인 캡티브 매출과 부동산 임대 수익까지 확보하고 있어 배당주 성격도 강함&lt;/p&gt;
&lt;p&gt;물리보안 종목은 구독형 매출 비중이 높아 경기 변동에 비교적 둔감하고, 안정적인 현금 흐름이 큰 강점임&lt;/p&gt;
&lt;p&gt;또한 인구 고령화와 1인 가구 증가에 따른 홈 시큐리티 수요 확대도 장기 성장 동력으로 작용함&lt;/p&gt;
&lt;p&gt;다만 신규 가입자 증가율이 둔화되는 시점이 오면 성장주 프리미엄이 빠질 수 있으므로, ARPU(가입자당 매출)와 해지율 흐름을 함께 봐야 함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;최근 성장 동력&lt;/h2&gt;
&lt;p&gt;최근 가장 주목할 변화는 AI와 보안의 결합임&lt;/p&gt;
&lt;p&gt;생성형 AI 확산으로 새로운 위협 벡터가 등장하면서 AI 보안, 데이터 유출 방지(DLP), 제로 트러스트(Zero Trust) 솔루션 수요가 빠르게 늘어남&lt;/p&gt;
&lt;p&gt;정부 차원의 사이버 보안 예산 확대, 금융권 정보보호 최고책임자(CISO) 의무 강화, 양자내성암호(PQC) 도입 논의도 중장기 모멘텀으로 작용하는 중임&lt;/p&gt;
&lt;p&gt;추가로 방산과 보안의 경계가 모호해지는 흐름 속에서 사이버전 대응 솔루션을 보유한 기업이 재평가받는 분위기임&lt;/p&gt;
&lt;p&gt;대형 보안 사고가 발생할 때마다 관련주가 단기 급등하는 패턴은 여전히 유효하지만, 단기 급등 후 되돌림이 빠르다는 점은 늘 염두에 둘 필요가 있음&lt;/p&gt;
&lt;p&gt;따라서 이슈성 매수보다는 산업 구조 변화에 맞춰 실적이 받쳐주는 종목을 선별하는 접근이 더 안전함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;투자 시 체크포인트&lt;/h2&gt;
&lt;p&gt;보안주는 테마성으로 단기 급등하는 경우가 많아, 펀더멘털을 함께 확인해야 함&lt;/p&gt;
&lt;p&gt;다음 항목을 점검하면 옥석을 가리는 데 도움이 됨&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;매출 구성: 공공·금융 비중과 민간 비중의 균형&lt;/li&gt;
&lt;li&gt;영업이익률: 라이선스·구독 기반의 고마진 구조 여부&lt;/li&gt;
&lt;li&gt;R&amp;amp;D 투자: 매출 대비 연구개발비 비율과 특허 보유 현황&lt;/li&gt;
&lt;li&gt;신사업: AI 보안, 클라우드 보안, 제로 트러스트 등 확장 영역&lt;/li&gt;
&lt;li&gt;레퍼런스: 공공기관·금융권 도입 사례 누적 정도&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;또한 보안 사고 이슈가 발생했을 때 단기 급등하는 종목보다, 꾸준한 매출 성장과 신규 솔루션 출시가 이어지는 기업을 포트폴리오 중심에 두는 편이 안전함&lt;/p&gt;
&lt;p&gt;특히 적자 지속 기업이 테마만으로 단기간 급등하는 경우는 변동성이 매우 크므로, 비중 조절과 분할 매매 원칙을 지키는 것이 중요함&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;한국 보안 산업은 규제 강화와 기술 발전이 맞물려 구조적 성장 국면에 진입한 상태임&lt;/p&gt;
&lt;p&gt;정보보안과 물리보안 양쪽 모두 각기 다른 강점을 지니고 있으므로, 본인의 투자 성향에 맞춰 분산 접근하는 전략이 유효함&lt;/p&gt;
&lt;p&gt;성장성을 우선한다면 AI 보안과 클라우드 보안 영역에서 두각을 나타내는 정보보안 종목을, 안정성을 우선한다면 구독형 매출 비중이 높은 물리보안 종목을 중심에 두는 편이 합리적임&lt;/p&gt;
&lt;p&gt;본 글은 정보 제공 목적으로 작성된 자료이며, 실제 투자는 본인의 판단과 책임 아래 신중히 결정할 것을 권장함&lt;/p&gt;</description>
      <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://all-new-dochi.tistory.com/82</guid>
      <comments>https://all-new-dochi.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 12 May 2026 16:42:48 +0900</pubDate>
    </item>
    <item>
      <title>GitLab Geo 핵심 가이드(분산 배포와 재해 복구 구조 이해)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7icPm/dJMcagZIgUR/0DeLlhJ24U4Ko4fgnb43C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7icPm/dJMcagZIgUR/0DeLlhJ24U4Ko4fgnb43C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7icPm/dJMcagZIgUR/0DeLlhJ24U4Ko4fgnb43C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7icPm%2FdJMcagZIgUR%2F0DeLlhJ24U4Ko4fgnb43C1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;GitLab Geo 개요&lt;/h2&gt;
&lt;p&gt;GitLab Geo는 GitLab 인스턴스를 전 세계 여러 데이터센터에 분산 배포할 수 있게 해주는 엔터프라이즈 기능임.&lt;/p&gt;
&lt;p&gt;글로벌 팀 환경에서 원격 저장소 접근 시 발생하는 레이턴시 문제를 줄이고, 주 사이트 장애 시 보조 사이트로 빠르게 전환해 서비스 연속성을 확보할 수 있음.&lt;/p&gt;
&lt;p&gt;GitLab Premium 이상 플랜에서 사용 가능하며, 주 사이트(Primary Site)와 하나 이상의 보조 사이트(Secondary Site)로 구성됨.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;주요 기능과 동작 원리&lt;/h2&gt;
&lt;p&gt;GitLab Geo는 주 사이트에서 발생하는 모든 변경 사항을 보조 사이트로 비동기 복제하는 방식으로 동작함.&lt;/p&gt;
&lt;p&gt;Git 저장소, LFS 오브젝트, CI/CD 아티팩트, 컨테이너 레지스트리 이미지 등 다양한 데이터 유형을 복제 대상으로 지원함.&lt;/p&gt;
&lt;p&gt;보조 사이트는 기본적으로 읽기 전용(Read-only)으로 운영되며, 사용자는 가까운 보조 사이트에서 Git 클론·풀 작업을 수행해 다운로드 속도를 크게 높일 수 있음.&lt;/p&gt;
&lt;p&gt;복제 상태는 GitLab 관리자 패널의 Geo 대시보드에서 실시간으로 확인할 수 있으며, 데이터 유형별 동기화 비율과 오류 현황도 함께 제공됨.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;구성 요소 및 아키텍처&lt;/h2&gt;
&lt;p&gt;GitLab Geo는 PostgreSQL 스트리밍 복제(Streaming Replication)를 통해 데이터베이스를 동기화하며, 파일·오브젝트는 별도 백그라운드 워커가 처리함.&lt;/p&gt;
&lt;p&gt;주 사이트에서 변경이 발생하면 Geo Log Cursor가 이벤트를 감지하고, Geo Tracking Database가 복제 작업 큐를 관리하는 구조임.&lt;/p&gt;
&lt;p&gt;핵심 구성 요소를 정리하면 아래와 같음:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary Site&lt;/strong&gt;: 모든 쓰기 작업이 이루어지는 주 인스턴스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary Site&lt;/strong&gt;: 읽기 및 복제본 역할을 수행하는 보조 인스턴스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geo Tracking Database&lt;/strong&gt;: 복제 상태를 추적하는 별도 PostgreSQL DB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geo Log Cursor&lt;/strong&gt;: 주 사이트 이벤트 스트림을 감시하는 서비스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geo Proxy&lt;/strong&gt;: 보조 사이트의 쓰기 요청을 주 사이트로 전달하는 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;각 보조 사이트는 독립된 GitLab 인스턴스로 운영되며, 별도의 도메인과 SSL 인증서가 필요함.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;설정 방법 기본 흐름&lt;/h2&gt;
&lt;p&gt;GitLab Geo 구성은 주 사이트 설정 → 보조 사이트 설치 → 데이터베이스 복제 연결 → Geo 활성화 순서로 진행됨.&lt;/p&gt;
&lt;p&gt;주 사이트 &lt;code&gt;gitlab.rb&lt;/code&gt;에 노드명을 지정하고 &lt;code&gt;gitlab-ctl reconfigure&lt;/code&gt;를 실행하는 것이 첫 번째 단계임.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;# /etc/gitlab/gitlab.rb (Primary)
gitlab_rails[&amp;#39;geo_node_name&amp;#39;] = &amp;#39;primary-site&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이후 관리자 패널 → &lt;strong&gt;Geo → Sites → Add site&lt;/strong&gt;에서 주 사이트를 등록한 뒤, 보조 사이트 데이터베이스 복제를 설정함.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 보조 사이트에서 실행 — 주 DB로부터 스트리밍 복제 초기화
gitlab-ctl geo replicate-db \
  --host=&amp;lt;primary-db-host&amp;gt; \
  --slot-name=&amp;lt;replication-slot&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;보조 사이트 &lt;code&gt;gitlab.rb&lt;/code&gt;에도 노드명을 추가하고, 관리자 패널에서 Primary URL과 연결 키를 입력하면 복제가 자동으로 시작됨.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;# /etc/gitlab/gitlab.rb (Secondary)
gitlab_rails[&amp;#39;geo_node_name&amp;#39;] = &amp;#39;secondary-site&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설정 완료 후 Geo 대시보드에서 &lt;strong&gt;Replication Details&lt;/strong&gt; 탭을 통해 각 데이터 유형별 동기화 진행률을 확인할 수 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;활용 시나리오&lt;/h2&gt;
&lt;p&gt;GitLab Geo가 가장 효과적인 시나리오는 글로벌 분산 개발 팀 환경임.&lt;/p&gt;
&lt;p&gt;미국에 주 사이트를 두고 유럽·아시아에 보조 사이트를 배치하면, 각 지역 개발자가 가까운 서버에서 클론·풀 작업을 수행해 수십 배 빠른 다운로드 속도를 경험할 수 있음.&lt;/p&gt;
&lt;p&gt;재해 복구(DR) 관점에서도 핵심 솔루션으로 활용됨.&lt;/p&gt;
&lt;p&gt;주 사이트가 장애가 발생했을 때 보조 사이트를 새로운 주 사이트로 승격(Promotion)시켜 서비스 중단 시간을 최소화할 수 있음.&lt;/p&gt;
&lt;p&gt;CI/CD 파이프라인 아티팩트와 컨테이너 이미지도 복제 대상에 포함되므로, 지역 가까운 보조 사이트에서 이미지를 풀받으면 빌드 속도도 개선됨.&lt;/p&gt;
&lt;p&gt;규제 준수(Compliance) 목적으로 특정 데이터를 특정 지역 서버에만 저장해야 하는 경우에도 Geo 구성을 활용할 수 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;제한 사항 및 주의점&lt;/h2&gt;
&lt;p&gt;GitLab Geo의 복제는 비동기 방식이기 때문에 주 사이트와 보조 사이트 간 데이터 지연(Replication Lag)이 발생할 수 있음.&lt;/p&gt;
&lt;p&gt;최신 커밋이 보조 사이트에 즉시 반영되지 않으므로, 방금 푸시한 변경 사항을 보조 사이트에서 바로 확인하려는 경우 주의가 필요함.&lt;/p&gt;
&lt;p&gt;모든 데이터 유형이 복제되는 것은 아니며, GitLab 버전에 따라 지원 범위가 다르므로 공식 문서의 호환성 매트릭스를 반드시 확인해야 함.&lt;/p&gt;
&lt;p&gt;Failover(장애 조치) 과정은 완전 자동화가 아니며, 관리자가 수동으로 보조 사이트를 승격하는 절차가 필요함.&lt;/p&gt;
&lt;p&gt;GitLab.com 관리형 서비스에서는 Geo를 사용자가 직접 구성할 수 없고, Self-managed 환경에서만 설정 가능함.&lt;/p&gt;
&lt;p&gt;네트워크 지연이 높은 환경에서 보조 사이트 쓰기 프록시를 사용하면 응답 속도에 영향을 줄 수 있으므로 네트워크 품질을 사전에 평가하는 것이 중요함.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마무리 및 요약&lt;/h2&gt;
&lt;p&gt;GitLab Geo는 글로벌 팀의 생산성과 서비스 안정성을 동시에 향상시킬 수 있는 강력한 엔터프라이즈 기능임.&lt;/p&gt;
&lt;p&gt;설정 복잡도가 높은 편이지만, GitLab 공식 문서와 Geo 대시보드를 충분히 활용하면 운영 부담을 줄일 수 있음.&lt;/p&gt;
&lt;p&gt;분산 팀 환경이나 체계적인 재해 복구 구성이 필요한 조직이라면, GitLab Geo 도입을 적극적으로 검토해볼 만한 가치가 있음.&lt;/p&gt;</description>
      <category>ci/cd</category>
      <category>DevOps</category>
      <category>DR</category>
      <category>gitlab</category>
      <category>GitLabGeo</category>
      <category>GitLab설정</category>
      <category>고가용성</category>
      <category>분산배포</category>
      <category>소프트웨어개발</category>
      <category>재해복구</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/81</guid>
      <comments>https://all-new-dochi.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 8 May 2026 17:08:38 +0900</pubDate>
    </item>
    <item>
      <title>코틀린 코루틴 핵심 정리(개념부터 예제까지)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CceCt/dJMcajoybNf/SSoQXT1iM9vmktsuG8sjkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CceCt/dJMcajoybNf/SSoQXT1iM9vmktsuG8sjkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CceCt/dJMcajoybNf/SSoQXT1iM9vmktsuG8sjkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCceCt%2FdJMcajoybNf%2FSSoQXT1iM9vmktsuG8sjkK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;코루틴 개요&lt;/h2&gt;
&lt;p&gt;코틀린 코루틴(Coroutine)은 비동기 코드를 마치 동기 코드처럼 순차적으로 작성할 수 있게 해주는 도구임&lt;/p&gt;
&lt;p&gt;기존 안드로이드 개발에서는 AsyncTask나 RxJava로 비동기 처리를 해왔지만, 콜백이 중첩되면서 코드가 복잡해지는 문제가 있었음&lt;/p&gt;
&lt;p&gt;코루틴을 사용하면 네트워크 요청, DB 조회 등 시간이 걸리는 작업을 간결하고 읽기 쉬운 코드로 처리할 수 있음&lt;/p&gt;
&lt;p&gt;구글은 2019년 이후 안드로이드 공식 문서에서 AsyncTask 대신 코루틴 사용을 권장하고 있으며, 현재 대부분의 신규 안드로이드 프로젝트에서 코루틴이 기본으로 사용됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;핵심 개념 정리&lt;/h2&gt;
&lt;p&gt;코루틴을 이해하려면 세 가지 핵심 개념을 먼저 파악해야 함&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CoroutineScope&lt;/strong&gt;는 코루틴이 실행되는 범위를 정의하며, 스코프가 종료되면 그 안의 코루틴도 함께 취소됨&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dispatcher&lt;/strong&gt;는 코루틴이 어떤 스레드에서 실행될지를 결정하는 역할을 함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dispatchers.Main&lt;/code&gt;: UI 스레드에서 실행 — 화면 갱신, 뷰 업데이트에 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dispatchers.IO&lt;/code&gt;: 파일 읽기, 네트워크, DB 등 I/O 작업에 최적화&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dispatchers.Default&lt;/code&gt;: CPU 연산이 많은 작업(정렬, 파싱 등)에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;launch&lt;/strong&gt;와 &lt;strong&gt;async&lt;/strong&gt;는 코루틴을 시작하는 두 가지 방법임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;launch&lt;/code&gt;는 결과값을 반환하지 않는 코루틴을 시작하고, &lt;code&gt;async&lt;/code&gt;는 &lt;code&gt;Deferred&lt;/code&gt; 객체를 통해 결과값을 받을 수 있음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;기본 예제&lt;/h2&gt;
&lt;p&gt;가장 간단한 코루틴 예제부터 시작함&lt;/p&gt;
&lt;p&gt;아래 코드는 &lt;code&gt;runBlocking&lt;/code&gt; 내에서 코루틴을 실행하는 기본 형태이며, 입문 단계에서 동작 원리를 파악하기에 적합함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println(&amp;quot;1초 후 실행&amp;quot;)
    }
    println(&amp;quot;즉시 실행&amp;quot;)
    // 출력: &amp;quot;즉시 실행&amp;quot; → 1초 후 &amp;quot;1초 후 실행&amp;quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;delay()&lt;/code&gt;는 Thread.sleep()과 달리 스레드를 블로킹하지 않고 코루틴만 일시 중단함&lt;/p&gt;
&lt;p&gt;이 차이가 코루틴의 핵심 장점이며, 하나의 스레드에서 수천 개의 코루틴을 동시에 실행할 수 있는 이유임&lt;/p&gt;
&lt;p&gt;여러 코루틴을 병렬로 실행하고 모두 완료될 때까지 기다리려면 &lt;code&gt;launch&lt;/code&gt;를 여러 개 사용한 뒤 &lt;code&gt;joinAll()&lt;/code&gt;을 호출함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;fun main() = runBlocking {
    val job1 = launch { delay(1000L); println(&amp;quot;작업1 완료&amp;quot;) }
    val job2 = launch { delay(500L); println(&amp;quot;작업2 완료&amp;quot;) }
    joinAll(job1, job2)
    println(&amp;quot;모든 작업 완료&amp;quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;async와 Deferred 활용&lt;/h2&gt;
&lt;p&gt;결과값이 필요한 비동기 작업에는 &lt;code&gt;async&lt;/code&gt;를 사용함&lt;/p&gt;
&lt;p&gt;&lt;code&gt;async&lt;/code&gt;는 &lt;code&gt;Deferred&amp;lt;T&amp;gt;&lt;/code&gt; 타입을 반환하며, &lt;code&gt;await()&lt;/code&gt;를 호출하는 시점에 결과값을 받아옴&lt;/p&gt;
&lt;p&gt;아래 예제는 두 API 호출을 동시에 실행해 응답 시간을 절반으로 줄이는 패턴임&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;suspend fun fetchUserName(): String {
    delay(1000L) // 실제 API 호출로 교체
    return &amp;quot;김철수&amp;quot;
}

suspend fun fetchUserScore(): Int {
    delay(1000L)
    return 98
}

fun main() = runBlocking {
    val nameDeferred = async { fetchUserName() }
    val scoreDeferred = async { fetchUserScore() }

    // 두 작업이 병렬 실행 → 총 소요 시간 약 1초 (순차 실행 시 2초)
    val name = nameDeferred.await()
    val score = scoreDeferred.await()

    println(&amp;quot;$name 님의 점수: $score&amp;quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;순차 실행이었다면 2초가 걸렸을 작업을 병렬 처리로 약 1초 만에 완료할 수 있음&lt;/p&gt;
&lt;p&gt;실제 프로젝트에서 여러 API를 동시에 호출해야 할 때 이 패턴이 자주 사용됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;안드로이드 ViewModel 활용 예제&lt;/h2&gt;
&lt;p&gt;안드로이드 실무에서는 &lt;code&gt;viewModelScope&lt;/code&gt;를 이용해 코루틴을 관리하는 것이 표준 패턴임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;viewModelScope&lt;/code&gt;를 사용하면 ViewModel이 소멸될 때 코루틴이 자동으로 취소되어 메모리 누수를 방지할 수 있음&lt;/p&gt;
&lt;p&gt;아래 예제는 Retrofit 등의 네트워크 라이브러리 호출을 코루틴으로 처리하는 일반적인 구조임&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;class MainViewModel : ViewModel() {

    private val _uiState = MutableLiveData&amp;lt;String&amp;gt;()
    val uiState: LiveData&amp;lt;String&amp;gt; = _uiState

    fun loadUserData() {
        viewModelScope.launch {
            _uiState.value = &amp;quot;로딩 중...&amp;quot;

            val result = withContext(Dispatchers.IO) {
                // 네트워크 요청 또는 DB 조회 (여기서는 예시)
                fetchDataFromServer()
            }

            // withContext 완료 후 Main 스레드에서 자동 실행
            _uiState.value = result
        }
    }

    private suspend fun fetchDataFromServer(): String {
        delay(2000L) // 실제 Retrofit suspend fun으로 교체
        return &amp;quot;서버에서 가져온 사용자 데이터&amp;quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;withContext(Dispatchers.IO)&lt;/code&gt;는 해당 블록만 IO 스레드에서 실행하고, 블록이 끝나면 원래 스코프(Main)로 자동 복귀함&lt;/p&gt;
&lt;p&gt;이 덕분에 스레드 전환 코드를 별도로 작성하지 않아도 되며, 코드 흐름이 직관적으로 유지됨&lt;/p&gt;
&lt;p&gt;Fragment나 Activity에서는 &lt;code&gt;lifecycleScope&lt;/code&gt;를 사용하는 방식도 있으나, 화면 회전 등 구성 변경 시 작업이 취소될 수 있으므로 ViewModel + viewModelScope 조합이 더 안정적임&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;예외 처리와 취소&lt;/h2&gt;
&lt;p&gt;코루틴에서 예외 처리는 일반 코드와 동일하게 &lt;code&gt;try-catch&lt;/code&gt;로 처리함&lt;/p&gt;
&lt;p&gt;단, &lt;code&gt;CancellationException&lt;/code&gt;은 코루틴 취소 시 자동으로 발생하는 예외로, catch 블록에서 잡지 않는 것이 원칙임&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;fun loadData() {
    viewModelScope.launch {
        try {
            val result = withContext(Dispatchers.IO) {
                riskyNetworkCall() // IOException 등 발생 가능
            }
            _uiState.value = result
        } catch (e: IOException) {
            _uiState.value = &amp;quot;네트워크 오류. 다시 시도해주세요.&amp;quot;
        }
        // CancellationException은 catch하지 않음
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CoroutineExceptionHandler&lt;/code&gt;를 사용하면 스코프 전체에 공통 예외 처리기를 등록할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val handler = CoroutineExceptionHandler { _, exception -&amp;gt;
    Log.e(&amp;quot;ViewModel&amp;quot;, &amp;quot;Unhandled exception: ${exception.message}&amp;quot;)
}

viewModelScope.launch(handler) {
    // 예외 처리가 필요한 코루틴 작업
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코루틴 취소는 &lt;code&gt;Job.cancel()&lt;/code&gt;로 명시적으로 처리하거나, &lt;code&gt;viewModelScope&lt;/code&gt;처럼 라이프사이클과 연동된 스코프에서 자동으로 처리됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;핵심 요약&lt;/h2&gt;
&lt;p&gt;코틀린 코루틴은 비동기 코드를 순차적으로 작성할 수 있게 해주는 안드로이드 개발의 핵심 도구임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;launch&lt;/code&gt;는 반환값 없는 코루틴, &lt;code&gt;async&lt;/code&gt;는 반환값 있는 코루틴에 사용하며, 안드로이드에서는 &lt;code&gt;viewModelScope&lt;/code&gt;와 함께 사용하는 것이 권장됨&lt;/p&gt;
&lt;p&gt;&lt;code&gt;withContext(Dispatchers.IO)&lt;/code&gt;로 I/O 작업을 분리하고, 결과는 &lt;code&gt;Dispatchers.Main&lt;/code&gt;에서 처리하는 패턴이 가장 자주 쓰이는 기본 구조임&lt;/p&gt;
&lt;p&gt;코루틴을 처음 접한다면 &lt;code&gt;launch + delay&lt;/code&gt; 기본 예제부터 시작해, &lt;code&gt;viewModelScope + withContext(Dispatchers.IO)&lt;/code&gt; 패턴으로 단계적으로 확장하는 것이 효과적임&lt;/p&gt;
&lt;p&gt;안드로이드 개발에서 코루틴은 이제 선택이 아닌 필수 기술이므로, 이번 예제들을 직접 실행해보며 익숙해지는 것을 권장함&lt;/p&gt;</description>
      <category>Android</category>
      <category>coroutine</category>
      <category>Kotlin</category>
      <category>ViewModel</category>
      <category>viewModelScope</category>
      <category>비동기처리</category>
      <category>안드로이드</category>
      <category>안드로이드개발</category>
      <category>코루틴</category>
      <category>코틀린</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/80</guid>
      <comments>https://all-new-dochi.tistory.com/80#entry80comment</comments>
      <pubDate>Fri, 8 May 2026 17:00:04 +0900</pubDate>
    </item>
    <item>
      <title>AWS boto3 핵심 가이드(설치부터 S3&amp;middot;EC2 제어까지)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5ie4q/dJMcajox6cQ/MZNeJDgIrdiCwDF98cH91k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5ie4q/dJMcajox6cQ/MZNeJDgIrdiCwDF98cH91k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5ie4q/dJMcajox6cQ/MZNeJDgIrdiCwDF98cH91k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5ie4q%2FdJMcajox6cQ%2FMZNeJDgIrdiCwDF98cH91k%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;boto3 개요&lt;/h2&gt;
&lt;p&gt;boto3는 파이썬에서 AWS 서비스를 프로그래밍 방식으로 제어할 수 있는 공식 SDK임&lt;/p&gt;
&lt;p&gt;S3 파일 업로드, EC2 인스턴스 시작·중지, Lambda 호출 등 AWS의 거의 모든 서비스를 파이썬 코드로 자동화할 수 있음&lt;/p&gt;
&lt;p&gt;수동으로 AWS 콘솔에서 반복 작업하던 일을 boto3로 스크립트화하면 시간을 대폭 절약하고 실수를 줄일 수 있음&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;설치 및 환경 설정&lt;/h2&gt;
&lt;p&gt;boto3는 pip으로 간단히 설치할 수 있음&lt;/p&gt;
&lt;p&gt;가상환경 활성화 후 설치하면 프로젝트 의존성을 깔끔하게 관리할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 가상환경 생성 및 활성화 (선택사항이지만 권장)
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# boto3 설치
pip install boto3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치 후 &lt;code&gt;import boto3&lt;/code&gt;가 오류 없이 실행되면 준비 완료임&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;AWS 인증 구성&lt;/h2&gt;
&lt;p&gt;boto3는 여러 가지 인증 방식을 지원하며, 가장 일반적인 방법은 AWS CLI 자격 증명 파일을 사용하는 것임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aws configure&lt;/code&gt; 명령어로 Access Key, Secret Key, 리전을 설정하면 boto3가 자동으로 인식함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws configure
# AWS Access Key ID: &amp;lt;your-access-key&amp;gt;
# AWS Secret Access Key: &amp;lt;your-secret-key&amp;gt;
# Default region name: ap-northeast-2
# Default output format: json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드 내에서 자격 증명을 하드코딩하는 방식은 보안 위험이 크므로 반드시 피해야 함&lt;/p&gt;
&lt;p&gt;EC2·Lambda 같은 AWS 환경에서 실행할 때는 IAM Role을 인스턴스에 부여하는 방식이 가장 안전하고 권장됨&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;S3 파일 업로드·다운로드&lt;/h2&gt;
&lt;p&gt;S3는 boto3에서 가장 많이 사용되는 서비스 중 하나임&lt;/p&gt;
&lt;p&gt;&lt;code&gt;boto3.client(&amp;#39;s3&amp;#39;)&lt;/code&gt;로 클라이언트를 생성한 뒤 파일을 업로드·다운로드하거나 버킷 내 객체 목록을 조회할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import boto3

s3 = boto3.client(&amp;#39;s3&amp;#39;, region_name=&amp;#39;ap-northeast-2&amp;#39;)

# 파일 업로드
s3.upload_file(&amp;#39;local_file.txt&amp;#39;, &amp;#39;my-bucket&amp;#39;, &amp;#39;remote/path/file.txt&amp;#39;)

# 파일 다운로드
s3.download_file(&amp;#39;my-bucket&amp;#39;, &amp;#39;remote/path/file.txt&amp;#39;, &amp;#39;downloaded.txt&amp;#39;)

# 버킷 내 파일 목록 조회
response = s3.list_objects_v2(Bucket=&amp;#39;my-bucket&amp;#39;, Prefix=&amp;#39;remote/&amp;#39;)
for obj in response.get(&amp;#39;Contents&amp;#39;, []):
    print(obj[&amp;#39;Key&amp;#39;], obj[&amp;#39;Size&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;list_objects_v2&lt;/code&gt;는 최대 1000개까지만 반환하므로 파일이 많은 버킷에서는 &lt;code&gt;paginator&lt;/code&gt;를 사용해야 한다는 점에 주의해야 함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 1000개 이상 파일이 있을 때 — paginator 사용
paginator = s3.get_paginator(&amp;#39;list_objects_v2&amp;#39;)
for page in paginator.paginate(Bucket=&amp;#39;my-bucket&amp;#39;):
    for obj in page.get(&amp;#39;Contents&amp;#39;, []):
        print(obj[&amp;#39;Key&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;EC2 인스턴스 제어&lt;/h2&gt;
&lt;p&gt;boto3로 EC2 인스턴스를 시작·중지하고 상태를 조회하는 작업을 자동화할 수 있음&lt;/p&gt;
&lt;p&gt;특정 태그가 붙은 인스턴스를 필터링해서 일괄 제어하는 패턴이 실무에서 자주 사용됨&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import boto3

ec2 = boto3.client(&amp;#39;ec2&amp;#39;, region_name=&amp;#39;ap-northeast-2&amp;#39;)

# 태그 기준으로 인스턴스 목록 조회
response = ec2.describe_instances(
    Filters=[{&amp;#39;Name&amp;#39;: &amp;#39;tag:Environment&amp;#39;, &amp;#39;Values&amp;#39;: [&amp;#39;production&amp;#39;]}]
)

for reservation in response[&amp;#39;Reservations&amp;#39;]:
    for instance in reservation[&amp;#39;Instances&amp;#39;]:
        instance_id = instance[&amp;#39;InstanceId&amp;#39;]
        state = instance[&amp;#39;State&amp;#39;][&amp;#39;Name&amp;#39;]
        print(f&amp;quot;{instance_id}: {state}&amp;quot;)

# 인스턴스 중지
ec2.stop_instances(InstanceIds=[&amp;#39;i-0abc1234def56789&amp;#39;])

# 인스턴스 시작
ec2.start_instances(InstanceIds=[&amp;#39;i-0abc1234def56789&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;정기적인 인스턴스 스케줄링(예: 업무 시간 외 자동 중지)을 구현할 때 이 패턴이 핵심임&lt;/p&gt;
&lt;p&gt;중지·시작 후 인스턴스가 완전히 특정 상태에 도달할 때까지 대기해야 하는 경우 &lt;code&gt;waiter&lt;/code&gt;를 활용하면 폴링 코드를 직접 작성하지 않아도 됨&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 인스턴스가 완전히 중지될 때까지 대기
waiter = ec2.get_waiter(&amp;#39;instance_stopped&amp;#39;)
waiter.wait(InstanceIds=[&amp;#39;i-0abc1234def56789&amp;#39;])
print(&amp;quot;인스턴스 중지 완료&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;client vs resource 인터페이스 비교&lt;/h2&gt;
&lt;p&gt;boto3에는 &lt;code&gt;client&lt;/code&gt;와 &lt;code&gt;resource&lt;/code&gt; 두 가지 인터페이스가 있음&lt;/p&gt;
&lt;p&gt;&lt;code&gt;client&lt;/code&gt;는 AWS API를 그대로 노출하며 모든 서비스를 지원하고, &lt;code&gt;resource&lt;/code&gt;는 객체지향 방식으로 더 직관적인 코드를 작성할 수 있게 해줌&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import boto3

# client 방식 — 저수준 API, 모든 서비스 지원
s3_client = boto3.client(&amp;#39;s3&amp;#39;)
response = s3_client.list_buckets()
for bucket in response[&amp;#39;Buckets&amp;#39;]:
    print(bucket[&amp;#39;Name&amp;#39;])

# resource 방식 — 객체지향 인터페이스 (S3, EC2 등 일부 서비스만 지원)
s3_resource = boto3.resource(&amp;#39;s3&amp;#39;)
bucket = s3_resource.Bucket(&amp;#39;my-bucket&amp;#39;)
for obj in bucket.objects.all():
    print(obj.key)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;멀티 계정·멀티 리전 작업이 필요한 경우 &lt;code&gt;boto3.Session()&lt;/code&gt;을 사용하면 자격 증명을 독립적으로 관리할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 멀티 리전 또는 멀티 계정 작업 시 세션 활용
session = boto3.Session(
    profile_name=&amp;#39;my-aws-profile&amp;#39;,  # ~/.aws/credentials의 프로파일명
    region_name=&amp;#39;us-east-1&amp;#39;
)
s3 = session.client(&amp;#39;s3&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;오류 처리와 예외 관리&lt;/h2&gt;
&lt;p&gt;boto3에서 발생하는 오류는 &lt;code&gt;botocore.exceptions.ClientError&lt;/code&gt;를 통해 처리할 수 있음&lt;/p&gt;
&lt;p&gt;AWS API 호출은 네트워크 문제나 서비스 한도 초과(ThrottlingException)로 실패할 수 있어 예외 처리가 필수임&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import boto3
from botocore.exceptions import ClientError, NoCredentialsError

s3 = boto3.client(&amp;#39;s3&amp;#39;)

try:
    # 파일 존재 여부 확인
    s3.head_object(Bucket=&amp;#39;my-bucket&amp;#39;, Key=&amp;#39;target_file.txt&amp;#39;)
    print(&amp;quot;파일이 존재함&amp;quot;)
except ClientError as e:
    error_code = e.response[&amp;#39;Error&amp;#39;][&amp;#39;Code&amp;#39;]
    if error_code == &amp;#39;404&amp;#39;:
        print(&amp;quot;파일이 존재하지 않음&amp;quot;)
    elif error_code == &amp;#39;403&amp;#39;:
        print(&amp;quot;접근 권한이 없음&amp;quot;)
    else:
        raise
except NoCredentialsError:
    print(&amp;quot;AWS 자격 증명이 설정되지 않음&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;boto3는 기본적으로 일부 오류(503, ThrottlingException 등)에 대해 자동 재시도를 수행하며, &lt;code&gt;Config&lt;/code&gt; 객체로 재시도 횟수와 방식을 커스터마이징할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from botocore.config import Config

# 재시도 횟수와 모드 설정
config = Config(retries={&amp;#39;max_attempts&amp;#39;: 5, &amp;#39;mode&amp;#39;: &amp;#39;adaptive&amp;#39;})
s3 = boto3.client(&amp;#39;s3&amp;#39;, config=config)&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;boto3는 AWS 자동화의 핵심 도구로, 기본 개념만 익히면 S3·EC2·Lambda 등 다양한 서비스를 파이썬 코드로 제어할 수 있음&lt;/p&gt;
&lt;p&gt;실무에서는 환경 변수나 IAM Role을 통한 안전한 인증 구성, ClientError 기반 예외 처리, paginator를 활용한 대량 데이터 처리가 중요한 세 가지 기둥임&lt;/p&gt;
&lt;p&gt;더 복잡한 시나리오(대용량 파일 멀티파트 업로드, 이벤트 기반 자동화, Step Functions 연동)로 발전시키려면 &lt;code&gt;transfer manager&lt;/code&gt;와 &lt;code&gt;waiter&lt;/code&gt;, 그리고 AWS Lambda와의 boto3 조합을 다음 단계로 학습하는 것을 권장함&lt;/p&gt;</description>
      <category>AWS</category>
      <category>AWSSDK</category>
      <category>AWS입문</category>
      <category>boto3</category>
      <category>EC2</category>
      <category>s3</category>
      <category>클라우드자동화</category>
      <category>파이썬</category>
      <category>파이썬자동화</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/79</guid>
      <comments>https://all-new-dochi.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 8 May 2026 15:59:10 +0900</pubDate>
    </item>
    <item>
      <title>탱장연 밈 한눈에 보기(마우가 픽률 상승까지)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/78</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKJHwj/dJMcagrSEx3/wIH3FasB73mzxkAyukdkBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKJHwj/dJMcagrSEx3/wIH3FasB73mzxkAyukdkBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKJHwj/dJMcagrSEx3/wIH3FasB73mzxkAyukdkBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKJHwj%2FdJMcagrSEx3%2FwIH3FasB73mzxkAyukdkBk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;탱장연 개요&lt;/h2&gt;
&lt;p&gt;탱장연은 오버워치 커뮤니티에서 2026년 4월경부터 빠르게 퍼진 인터넷 밈임.&lt;/p&gt;
&lt;p&gt;이름은 탱커(Tank)와 &amp;#39;장연&amp;#39;이라는 단어를 합성한 것으로, 탱커 포지션이 처한 억울한 현실을 유쾌하게 표현한 것임.&lt;/p&gt;
&lt;p&gt;오버워치는 구조적으로 탱커 수요가 항상 부족한 편이어서, 탱커를 주로 플레이하는 유저들의 공감대가 크게 형성된 배경에서 탄생한 밈임.&lt;/p&gt;
&lt;p&gt;탱커 포지션은 팀의 방패 역할을 하며 최전선에서 싸워야 하는 만큼, 잘못되었을 때 책임을 혼자 떠안는 경우가 많아 늘 힘든 포지션으로 여겨져 왔음.&lt;/p&gt;
&lt;p&gt;탱장연 밈은 이런 현실을 비관적으로 표현하는 것이 아니라 웃음으로 승화시켰기 때문에 더 빠르게 확산된 것으로 분석됨.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;밈 탄생 배경&lt;/h2&gt;
&lt;p&gt;오버워치의 역할군 시스템에서 탱커는 딜러·힐러에 비해 매칭 대기 시간이 짧지만, 그만큼 책임이 크고 커뮤니티에서 비난을 받기 쉬운 포지션임.&lt;/p&gt;
&lt;p&gt;탱커가 잘못되면 팀 전멸로 이어지는 경우가 많아 게임 결과에 대한 책임을 혼자 짊어지는 분위기가 오래 이어져 왔음.&lt;/p&gt;
&lt;p&gt;딜러와 힐러 유저들은 탱커의 움직임 하나하나에 예민하게 반응하고, 팀이 지면 가장 먼저 탱커 탓을 하는 문화가 커뮤니티에 만연해 있었음.&lt;/p&gt;
&lt;p&gt;이런 현실을 자조적이고 유쾌하게 풀어낸 짤방과 글들이 연속해서 등장하면서 &amp;#39;탱장연&amp;#39;이라는 하나의 밈 카테고리로 굳어지게 됨.&lt;/p&gt;
&lt;p&gt;특히 탱커를 오래 플레이한 유저일수록 공감도가 높아, 커뮤니티 내에서 빠르게 공유되고 재생산된 특징이 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마우가와 &amp;quot;알아&amp;quot; 대사&lt;/h2&gt;
&lt;p&gt;탱장연 밈의 핵심 캐릭터는 탱커 영웅 마우가(Mauga)임.&lt;/p&gt;
&lt;p&gt;마우가는 적진으로 거침없이 돌진하면서도 특유의 유쾌하고 낙천적인 성격을 가진 캐릭터로, 억울한 상황에서도 그냥 &amp;quot;알아&amp;quot;라고 받아치는 이미지가 탱장연 밈과 딱 맞아떨어졌음.&lt;/p&gt;
&lt;p&gt;&amp;quot;알아&amp;quot;라는 대사는 탱장연 밈의 상징어로 자리 잡았고, 온갖 억울하거나 불리한 상황을 그냥 묵묵히 수용하는 장면을 연출할 때 활용됨.&lt;/p&gt;
&lt;p&gt;마우가 특유의 체형과 표정, 그리고 돌진하는 포즈가 시각적으로 강렬한 인상을 남겨 밈용 이미지로 적극 활용되고 있음.&lt;/p&gt;
&lt;p&gt;이후 마우가뿐만 아니라 게임 내에서 불리한 위치에 있는 다른 캐릭터들도 이 포맷을 활용하는 방식으로 밈이 확장되었음.&lt;/p&gt;
&lt;p&gt;꼭 탱커 캐릭터가 아니더라도 시스템상 피해를 보거나 인식이 좋지 않은 캐릭터라면 탱장연 포맷으로 재해석되는 사례가 늘고 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;픽률 상승과 선순환 구조&lt;/h2&gt;
&lt;p&gt;탱장연 밈이 유행하면서 실제 게임 내 탱커 픽률, 특히 마우가의 픽률이 눈에 띄게 상승하는 현상이 나타남.&lt;/p&gt;
&lt;p&gt;밈에 공감한 유저들이 &amp;quot;한 번 탱커를 해보자&amp;quot;는 분위기로 탱커 포지션을 선택하게 되었고, 그 중심에 마우가가 있었음.&lt;/p&gt;
&lt;p&gt;탱커 수가 늘어나자 딜러·힐러의 매칭 대기 시간이 줄어들고, 커뮤니티에서 탱커를 향한 무조건적인 비난도 어느 정도 누그러지는 선순환이 발생함.&lt;/p&gt;
&lt;p&gt;실제로 마우가를 상대하기 꺼린 팀들이 밴(금지 픽)으로 막으려는 시도까지 나올 만큼, 픽률과 승률 모두 상승한 것으로 알려짐.&lt;/p&gt;
&lt;p&gt;게임 내 구조적 문제를 패치가 아닌 커뮤니티 문화가 스스로 해결한 드문 사례로 평가받고 있음.&lt;/p&gt;
&lt;p&gt;마우가의 픽률 상승은 단순한 버프나 메타 변화 때문이 아니라, 밈이라는 문화 현상이 플레이어 행동에 직접 영향을 미친 결과라는 점에서 더욱 주목받고 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;커뮤니티 반응&lt;/h2&gt;
&lt;p&gt;탱장연 밈은 디시인사이드 오버워치 갤러리, 루리웹, 에펨코리아 등 주요 게임 커뮤니티에서 동시에 화제가 됨.&lt;/p&gt;
&lt;p&gt;일부 유저들은 탱장연 명칭 자체나 밈이 과도하게 소비된다는 의견을 내기도 했지만, 전반적으로는 탱커 유저들의 고충을 재미있게 환기시켰다는 긍정적인 반응이 더 많음.&lt;/p&gt;
&lt;p&gt;탱장연 밈을 계기로 딜러·힐러 유저들이 탱커의 어려움을 새롭게 인식하게 되었다는 반응도 다수 발견됨.&lt;/p&gt;
&lt;p&gt;탱장연 밈이 실제 게임 문화와 픽률 변화로 이어진 사례는, 인터넷 밈이 게임 생태계에 실질적인 영향을 미친 드문 케이스로 평가받고 있음.&lt;/p&gt;
&lt;p&gt;유튜브와 트위치 등 스트리밍 플랫폼에서도 탱장연 관련 콘텐츠가 꾸준히 소비되며 밈의 수명이 길게 이어지고 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;탱장연은 단순한 웃음거리를 넘어, 오버워치 탱커 부족 문제를 커뮤니티 스스로 해소한 이례적인 현상임.&lt;/p&gt;
&lt;p&gt;마우가라는 캐릭터가 밈의 중심에 서면서 픽률 상승과 게임 내 선순환까지 이어진 점은 주목할 만한 흐름임.&lt;/p&gt;
&lt;p&gt;인터넷 밈이 단순한 유행에 그치지 않고 실제 플레이어 행동과 게임 생태계를 변화시킬 수 있다는 것을 탱장연이 잘 보여주고 있음.&lt;/p&gt;
&lt;p&gt;오버워치를 즐긴다면 탱커 포지션에 한 번쯤 도전해보는 것도 좋은 경험이 될 것이고, 마우가와 함께 &amp;quot;알아&amp;quot;를 외치며 적진으로 돌진해보는 것을 추천함.&lt;/p&gt;</description>
      <category>Mauga</category>
      <category>게임커뮤니티</category>
      <category>마우가</category>
      <category>오버워치</category>
      <category>오버워치2</category>
      <category>오버워치밈</category>
      <category>탱장연</category>
      <category>탱커</category>
      <category>픽률</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/78</guid>
      <comments>https://all-new-dochi.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 7 May 2026 16:45:52 +0900</pubDate>
    </item>
    <item>
      <title>심볼릭 링크로 AI 스킬 공용화하기(Claude Code&amp;middot;Codex&amp;middot;Copilot 경로 정리)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/77</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4ZQoe/dJMcafNjTCS/qGyiICgr3C4FEjTykqyHk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4ZQoe/dJMcafNjTCS/qGyiICgr3C4FEjTykqyHk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4ZQoe/dJMcafNjTCS/qGyiICgr3C4FEjTykqyHk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4ZQoe%2FdJMcafNjTCS%2FqGyiICgr3C4FEjTykqyHk1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;스킬 공용화가 필요한 이유&lt;/h2&gt;
&lt;p&gt;AI 코딩 도구를 여러 개 사용하다 보면 동일한 스킬 파일을 각 도구 경로에 따로 복사해서 관리하게 됨.&lt;/p&gt;
&lt;p&gt;내용을 수정할 때마다 Claude Code, Codex, Copilot 각각의 경로에 들어가 파일을 업데이트해야 하는 번거로움이 생김.&lt;/p&gt;
&lt;p&gt;심볼릭 링크(Symbolic Link)를 활용하면 원본 파일 하나를 여러 경로에서 동시에 참조할 수 있어 유지보수가 훨씬 쉬워짐.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;각 도구별 스킬 파일 위치&lt;/h2&gt;
&lt;p&gt;도구마다 스킬 파일을 읽어오는 경로가 다르기 때문에 먼저 각 경로를 정확히 파악하는 것이 중요함.&lt;/p&gt;
&lt;table&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;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Codex&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.agents/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.agents/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;VS Code settings.json&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/prompts/&amp;lt;name&amp;gt;.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Claude Code와 Codex는 둘 다 &lt;code&gt;SKILL.md&lt;/code&gt; 파일 기반이라 공용화에 가장 적합한 조합임.&lt;/p&gt;
&lt;p&gt;Copilot은 &lt;code&gt;.prompt.md&lt;/code&gt; 형식을 쓰고 프론트매터 구조가 달라서 별도 관리하는 편이 현실적임.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;심볼릭 링크 개념&lt;/h2&gt;
&lt;p&gt;심볼릭 링크는 특정 파일이나 디렉토리를 가리키는 포인터 역할을 하는 특수 파일임.&lt;/p&gt;
&lt;p&gt;원본 파일을 수정하면 링크를 통해 접근하는 모든 경로에서 변경 내용이 즉시 반영됨.&lt;/p&gt;
&lt;p&gt;macOS와 Linux에서는 &lt;code&gt;ln -s &amp;lt;원본&amp;gt; &amp;lt;링크경로&amp;gt;&lt;/code&gt; 명령으로 간단하게 생성할 수 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;공용 스킬 디렉토리 구조 설계&lt;/h2&gt;
&lt;p&gt;원본 스킬은 한 곳에 모아두고 각 도구의 경로에서 링크를 생성하는 방식으로 구성함.&lt;/p&gt;
&lt;p&gt;아래처럼 &lt;code&gt;~/.shared-skills/&lt;/code&gt; 디렉토리를 기준 저장소로 사용하는 것을 권장함.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.shared-skills/
├── tistory-poster/
│   └── SKILL.md
├── git-helper/
│   └── SKILL.md
└── code-reviewer/
    └── SKILL.md&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 구조에서 각 도구의 스킬 경로는 &lt;code&gt;~/.shared-skills/&lt;/code&gt; 하위 디렉토리를 가리키는 링크로 구성됨.&lt;/p&gt;
&lt;p&gt;원본 디렉토리는 별도 git 저장소로 관리하면 버전 이력까지 일원화할 수 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;도구별 링크 생성 예시&lt;/h2&gt;
&lt;p&gt;공용 디렉토리를 만든 뒤 각 도구의 경로에 심볼릭 링크를 생성함.&lt;/p&gt;
&lt;p&gt;아래 명령어를 순서대로 실행하면 세 도구에서 동일한 스킬 파일을 참조할 수 있음.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 공용 디렉토리 생성
mkdir -p ~/.shared-skills/tistory-poster

# 원본 SKILL.md 작성 (한 번만)
cat &amp;gt; ~/.shared-skills/tistory-poster/SKILL.md &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
---
name: tistory-poster
description: 티스토리 포스팅 자동화 스킬
---
# 티스토리 자동 포스팅 스킬 내용...
EOF

# Claude Code 전역 링크
mkdir -p ~/.claude/skills
ln -s ~/.shared-skills/tistory-poster ~/.claude/skills/tistory-poster

# Codex 전역 링크
mkdir -p ~/.agents/skills
ln -s ~/.shared-skills/tistory-poster ~/.agents/skills/tistory-poster

# 프로젝트별 링크 (해당 프로젝트 루트에서 실행)
mkdir -p .claude/skills
ln -s ~/.shared-skills/tistory-poster .claude/skills/tistory-poster&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;링크가 올바르게 생성됐는지 &lt;code&gt;ls -la ~/.claude/skills/&lt;/code&gt; 명령으로 확인할 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; 화살표가 원본 경로를 가리키면 정상적으로 연결된 것임.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;링크 상태 확인 및 관리&lt;/h2&gt;
&lt;p&gt;링크 전체 목록을 한눈에 확인하려면 아래 명령을 사용함.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Claude Code 스킬 링크 확인
ls -la ~/.claude/skills/

# Codex 스킬 링크 확인
ls -la ~/.agents/skills/

# 깨진 링크 탐색 (원본이 삭제된 경우)
find ~/.claude/skills -type l ! -exec test -e {} \; -print&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원본 파일을 삭제하거나 경로를 변경하면 링크가 깨지므로 원본 이동 시에는 링크도 함께 갱신해야 함.&lt;/p&gt;
&lt;p&gt;링크를 삭제할 때는 &lt;code&gt;rm&lt;/code&gt; 명령을 사용하며, 원본에는 영향을 주지 않음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;주의사항 정리&lt;/h2&gt;
&lt;p&gt;SKILL.md 내부에서 상대 경로로 다른 파일을 참조할 경우 링크 소스 기준인지 원본 기준인지 동작이 도구마다 다를 수 있음.&lt;/p&gt;
&lt;p&gt;심볼릭 링크 자체는 git이 추적하지만 링크가 가리키는 &lt;code&gt;~/.shared-skills/&lt;/code&gt; 원본 디렉토리는 별도 저장소로 관리해야 팀 공유가 가능함.&lt;/p&gt;
&lt;p&gt;Claude Code와 Codex는 &lt;code&gt;SKILL.md&lt;/code&gt; 파일 형식이 비슷하지만 프론트매터 키가 다를 수 있어 각 도구의 최신 문서를 확인하고 공통 필드만 사용하는 것을 권장함.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;요약&lt;/h2&gt;
&lt;p&gt;심볼릭 링크를 활용하면 스킬 파일을 한 곳에서 관리하면서 여러 AI 도구에 동시에 적용할 수 있음.&lt;/p&gt;
&lt;p&gt;특히 Claude Code와 Codex 조합은 동일한 &lt;code&gt;SKILL.md&lt;/code&gt; 포맷을 공유하므로 파일 수정 없이 링크만으로 공용화가 가능함.&lt;/p&gt;
&lt;p&gt;원본 디렉토리를 git으로 버전 관리하면 스킬 이력까지 체계적으로 관리할 수 있으니 적극 활용해 보길 권장함.&lt;/p&gt;</description>
      <category>ai개발도구</category>
      <category>claudecode</category>
      <category>codex</category>
      <category>copilot</category>
      <category>개발환경</category>
      <category>맥개발</category>
      <category>스킬공용화</category>
      <category>심볼릭링크</category>
      <category>터미널</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/77</guid>
      <comments>https://all-new-dochi.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 7 May 2026 16:27:50 +0900</pubDate>
    </item>
    <item>
      <title>Mermaid 다이어그램 한눈에 보기(플로우차트부터 시퀀스까지)-고슴도치 군단</title>
      <link>https://all-new-dochi.tistory.com/76</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJ1FD/dJMcahdeY3J/yrKnvsM0JweoJSfY8WVYu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJ1FD/dJMcahdeY3J/yrKnvsM0JweoJSfY8WVYu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJ1FD/dJMcahdeY3J/yrKnvsM0JweoJSfY8WVYu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJ1FD%2FdJMcahdeY3J%2FyrKnvsM0JweoJSfY8WVYu1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Mermaid 개요&lt;/h2&gt;
&lt;p&gt;Mermaid는 텍스트 기반으로 다이어그램을 그릴 수 있는 오픈소스 도구임.&lt;/p&gt;
&lt;p&gt;코드처럼 작성한 텍스트가 자동으로 시각적인 다이어그램으로 변환되어, 별도의 그래픽 툴 없이도 플로우차트·시퀀스 다이어그램·ER 다이어그램 등을 만들 수 있음.&lt;/p&gt;
&lt;p&gt;Markdown과 궁합이 좋아 GitHub README, GitLab, Notion, Obsidian 등 다양한 플랫폼에서 기본 지원하고 있음.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;플로우차트 기본 문법&lt;/h2&gt;
&lt;p&gt;Mermaid에서 가장 많이 사용하는 다이어그램 유형은 플로우차트(flowchart)임.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;flowchart TD&lt;/code&gt; 또는 &lt;code&gt;graph TD&lt;/code&gt;로 시작하며, TD는 Top-Down(위에서 아래), LR은 Left-Right(왼쪽에서 오른쪽) 방향을 의미함.&lt;/p&gt;
&lt;p&gt;노드 모양은 &lt;code&gt;[]&lt;/code&gt;(사각형), &lt;code&gt;()&lt;/code&gt;(둥근 사각형), &lt;code&gt;{}&lt;/code&gt;(마름모) 등으로 구분하며, 화살표로 흐름을 연결함.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TD
    A[시작] --&amp;gt; B{조건 확인}
    B -- Yes --&amp;gt; C[실행]
    B -- No --&amp;gt; D[종료]
    C --&amp;gt; D&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;시퀀스 다이어그램 작성법&lt;/h2&gt;
&lt;p&gt;시퀀스 다이어그램은 여러 객체 간의 메시지 흐름을 시간 순서대로 표현할 때 사용함.&lt;/p&gt;
&lt;p&gt;API 호출 흐름이나 서비스 간 통신 과정을 설명할 때 매우 유용하며, &lt;code&gt;sequenceDiagram&lt;/code&gt; 키워드로 시작함.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;participant&lt;/code&gt;로 참여자를 정의하고, &lt;code&gt;-&amp;gt;&amp;gt;&lt;/code&gt; 는 실선 화살표, &lt;code&gt;--&amp;gt;&amp;gt;&lt;/code&gt; 는 점선 화살표로 응답을 표현하는 방식임.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;sequenceDiagram
    participant C as 클라이언트
    participant S as 서버
    participant DB as 데이터베이스

    C-&amp;gt;&amp;gt;S: 로그인 요청
    S-&amp;gt;&amp;gt;DB: 사용자 조회
    DB--&amp;gt;&amp;gt;S: 결과 반환
    S--&amp;gt;&amp;gt;C: JWT 토큰 발급&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;클래스 다이어그램&lt;/h2&gt;
&lt;p&gt;클래스 다이어그램은 객체지향 설계에서 클래스 구조와 관계를 표현하는 데 사용함.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;classDiagram&lt;/code&gt; 키워드로 시작하며, 상속(&lt;code&gt;&amp;lt;|--&lt;/code&gt;), 구성(&lt;code&gt;*--&lt;/code&gt;), 연관(&lt;code&gt;--&amp;gt;&lt;/code&gt;) 등 다양한 관계를 표현할 수 있음.&lt;/p&gt;
&lt;p&gt;코드 리뷰나 아키텍처 문서에 활용하면 팀 커뮤니케이션과 온보딩에 큰 도움이 됨.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;classDiagram
    Animal &amp;lt;|-- Dog
    Animal &amp;lt;|-- Cat
    class Animal {
        +String name
        +speak()
    }
    class Dog {
        +fetch()
    }
    class Cat {
        +purr()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;Gantt 차트 및 기타 다이어그램&lt;/h2&gt;
&lt;p&gt;Mermaid는 플로우차트와 시퀀스 외에도 Gantt 차트, Pie 차트, ER 다이어그램, Git 그래프 등 다양한 유형을 지원함.&lt;/p&gt;
&lt;p&gt;Gantt 차트는 프로젝트 일정을 시각화할 때 사용하며, &lt;code&gt;gantt&lt;/code&gt; 키워드로 시작하고 날짜 형식과 섹션을 지정해 항목별 기간을 한눈에 보여줌.&lt;/p&gt;
&lt;p&gt;특히 GitHub에서는 별도 플러그인 없이 마크다운 코드 블록에 &lt;code&gt;```mermaid&lt;/code&gt;를 지정하면 자동 렌더링이 되어 문서에 바로 삽입할 수 있음.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;gantt
    title 프로젝트 일정
    dateFormat  YYYY-MM-DD
    section 기획
    요구사항 분석    :a1, 2024-01-01, 7d
    section 개발
    백엔드 개발      :a2, after a1, 14d
    프론트엔드 개발  :a3, after a1, 14d&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;주요 사용 환경&lt;/h2&gt;
&lt;p&gt;Mermaid는 다양한 환경에서 기본 지원하거나 플러그인으로 쉽게 연동이 가능함.&lt;/p&gt;
&lt;p&gt;GitHub, GitLab 등 주요 Git 플랫폼에서 README에 바로 렌더링되며, VS Code에서는 Mermaid Preview 확장을 통해 실시간 미리보기가 가능함.&lt;/p&gt;
&lt;p&gt;공식 라이브 에디터(mermaid.live)에서는 별도 설치 없이 브라우저에서 바로 작성하고 PNG/SVG로 내보낼 수 있어 처음 입문하기에 최적임.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;Mermaid는 코드 작성에 익숙한 개발자라면 빠르게 익힐 수 있는 다이어그램 도구임.&lt;/p&gt;
&lt;p&gt;텍스트 기반이라 Git으로 버전 관리가 가능하고, 다양한 플랫폼에서 지원하므로 문서화 작업 효율을 크게 높일 수 있음.&lt;/p&gt;
&lt;p&gt;플로우차트부터 시작해서 시퀀스, 클래스, Gantt 차트 순으로 익혀나가면 대부분의 개발 문서 시각화 요구사항을 커버할 수 있음.&lt;/p&gt;</description>
      <category>github</category>
      <category>Mermaid</category>
      <category>개발도구</category>
      <category>다이어그램</category>
      <category>마크다운</category>
      <category>문서화</category>
      <category>시퀀스다이어그램</category>
      <category>플로우차트</category>
      <author>근현대 고슴도치</author>
      <guid isPermaLink="true">https://all-new-dochi.tistory.com/76</guid>
      <comments>https://all-new-dochi.tistory.com/76#entry76comment</comments>
      <pubDate>Wed, 6 May 2026 12:54:42 +0900</pubDate>
    </item>
  </channel>
</rss>