<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dev_note417</title>
    <link>https://san2-dev.tistory.com/</link>
    <description>코딩 공부하는 초보 개발자입니다! 
잘 부탁드립니다!

연락 : sanjun0417@naver.com</description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 01:08:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>san2222</managingEditor>
    <image>
      <title>dev_note417</title>
      <url>https://tistory1.daumcdn.net/tistory/7560826/attach/2a0bd40945194330bcda3df6f6fad856</url>
      <link>https://san2-dev.tistory.com</link>
    </image>
    <item>
      <title>TypeScript 시작하기:tsconfig.json과 ts-node 이해하기</title>
      <link>https://san2-dev.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주로 온라인 에디터나 Vite를 통해 TypeScript를 사용했었다. 이번에는 TypeScript를 설치하고 실행 환경을 구성하면서 기본적인 설정과 사용 방법을 헷갈리지 않게 깔끔하게 정리하려고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;타입스크립트.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5r768/dJMcaglylQi/CkcmvRxPtwLKcmlPsImmz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5r768/dJMcaglylQi/CkcmvRxPtwLKcmlPsImmz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5r768/dJMcaglylQi/CkcmvRxPtwLKcmlPsImmz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5r768%2FdJMcaglylQi%2FCkcmvRxPtwLKcmlPsImmz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1536&quot; height=&quot;1024&quot; data-filename=&quot;타입스크립트.png&quot; data-origin-width=&quot;1536&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.npm으로 타입스크립트 컴파일러 등 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ldZd/dJMcafNNv25/hco86qzdiE0KzDyjGzwBx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ldZd/dJMcafNNv25/hco86qzdiE0KzDyjGzwBx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ldZd/dJMcafNNv25/hco86qzdiE0KzDyjGzwBx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ldZd%2FdJMcafNNv25%2Fhco86qzdiE0KzDyjGzwBx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1535&quot; height=&quot;811&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm init으로 노드 js패키지를 초기화하고 타입스크립트가 node.js의 전역객체, 모듈의 타입 등을 알기 위해 @types/node를 설치합니다. ts-node는 ts파일을 바로 실행해 주는 도구로 tsc를 통해 ts파일을 js파일로 컴파일할 필요 없이 바로 실행해 주는 도구이다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;npm init
npm i @types/node
npm i typescript -g
npm i ts-node -g&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 통해 타입스크립트 컴파일러가 잘 설치되었는지 버전을 확인한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;tsc -v&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.tsconfig 생성과 설정방법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXTbJQ/dJMcah5TPpW/nggIsAKV8uQNRRHvjp1b11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXTbJQ/dJMcah5TPpW/nggIsAKV8uQNRRHvjp1b11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXTbJQ/dJMcah5TPpW/nggIsAKV8uQNRRHvjp1b11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXTbJQ%2FdJMcah5TPpW%2FnggIsAKV8uQNRRHvjp1b11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1496&quot; height=&quot;754&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력하면 타입스크립트 관련 설정에 대한 tsconfig.json이 생긴다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;npx tsc --init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src폴더를 만들어주고 ts파일을 작성해 준 뒤 아래 적힌 명령어를 실행하면 ts파일이 js파일로 컴파일된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(src폴더 말고 본인이 원하는 폴더구조, 그냥 상단에 ts파일을 두거나 해도 된다.)&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;tsc src/index.ts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위에 tsc명령어를 통해 타입스크립트를 자바스크립트로 컴파일하여 사용할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tsc를 하고 나면 해당경로에 js파일이 생긴 것을 볼 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1. include&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tsconfig관련 설정에 대해 정리하려고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1781521649353&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;include&quot;: [&quot;src&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;include는 프로젝트 특정 폴더 경로에 ts파일을 컴파일할 거라고 설정해 주는 부분으로 &lt;b&gt;&quot;include&quot;:[&quot;src&quot;]&lt;/b&gt; 작성하면 src안에 있는 ts파일을 한 번에 컴파일할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;tsc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;include를 사용해서 컴파일해야 하는 범위를 정해주었기 때문에 tsc만 입력해도 컴파일이 된다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-2. compilerOptions&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compilerOptions는 TypeScript 컴파일러(tsc)의 동작 방식을 설정하는 옵션들을 모아놓는 객체이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-target&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;target은 TypeScript 코드를 컴파일할 때 출력할 JavaScript의 ECMAScript 버전을 지정하는 옵션이다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es2025&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;const add = (a: number, b: number) =&amp;gt; a + b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;target이 오래된 버전이라면 최신 문법을 하위 버전 문법으로 변환할 수 있고,&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;target&quot;: &quot;es5&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화살표 함수가 일반 함수로 변환된다.&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;var add = function (a, b) {
  return a + b;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 최신 버전인:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;target&quot;: &quot;es2025&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용하면 최신 문법을 거의 그대로 유지한 채 출력한다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const add = (a, b) =&amp;gt; a + b;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-module&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;module&lt;/code&gt;은 TypeScript가 &lt;code&gt;import&lt;/code&gt;와 &lt;code&gt;export&lt;/code&gt;를 어떤 모듈 시스템 형식으로 출력할지 결정하는 옵션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js를 사용하다 보면 아래와 같이 &lt;code&gt;import/export&lt;/code&gt; 또는 &lt;code&gt;require&lt;/code&gt; 문법을 사용하는 코드를 볼 수 있는데, 이러한 모듈 시스템을 TypeScript가 어떤 형식으로 변환할지 설정하는 역할을 한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import { add } from &quot;./math.js&quot;;
const { add } = require(&quot;./math&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;code&gt;module&lt;/code&gt;을 &lt;code&gt;&quot;esnext&quot;&lt;/code&gt;로 설정하면 TypeScript는 컴파일 결과를 최신 ES Module(ESM) 형식으로 출력한다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;module&quot;: &quot;esnext&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 &lt;b&gt;TypeScript 코드&lt;/b&gt;가 있다고 가정해 보자.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import { add } from &quot;./math.js&quot;;

export const result = add(1, 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 후에도 import와 export 문법이 그대로 유지된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import { add } from &quot;./math.js&quot;;

export const result = add(1, 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 module을 &lt;code&gt;&quot;commonjs&quot;&lt;/code&gt;로 설정하면 CommonJS 형식으로 변환된다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;module&quot;: &quot;commonjs&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 &lt;b&gt;TypeScript 코드는&lt;/b&gt; 다음과 같은 JavaScript 코드로 출력된다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;const { add } = require(&quot;./math&quot;);

exports.result = add(1, 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 module 옵션은 TypeScript 코드의 모듈을 어떤 JavaScript 모듈 시스템 형식으로 출력할지 결정하는 설정이라고 이해하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-rootDir, outDir&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rootDir과 outDir은 &lt;b&gt;TypeScript 프로젝트의 소스 코드와 컴파일 결과물을 관리&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;rootDir : 컴파일 시 폴더 구조를 유지할 기준 경로&lt;/li&gt;
&lt;li&gt;outDir : 컴파일된 JavaScript 파일이 저장될 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 프로젝트 구조가 있다고 가정해 보자.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;src
├─ index.ts
└─ utils
   └─ math.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고&lt;b&gt; tsconfig.json&lt;/b&gt;에 아래와 같이 설정한다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;rootDir&quot;: &quot;src&quot;,
    &quot;outDir&quot;: &quot;dist&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript는&lt;b&gt; rootDir로 지정된 src 폴더&lt;/b&gt;를 기준으로 디렉터리 구조를 분석한 뒤, &lt;b&gt;컴파일된 결과물을 outDir로 지정된 dist 폴더&lt;/b&gt;에 출력한다. 컴파일이 완료되면 src폴더구조와 동일하게 아래와 같은 구조가 생성된다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;dist
├─ index.js
└─ utils
   └─ math.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 결과를 보면 src 내부의 폴더 구조가 그대로 유지된 채 TypeScript 파일만 JavaScript 파일로 변환되어 출력된 것을 확인할 수 있다. 따라서&lt;b&gt; rootDir은 단순히 소스 코드가 위치한 폴더를 의미하는 것이 아니라, 컴파일 과정에서 폴더 구조를 유지할 기준 경로를 지정하는 역할을 한다. 그리고 outDir은 이렇게 생성된 컴파일 결과물을 저장할 위치를 지정한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 src 폴더에 TypeScript 소스 코드를 작성하고, dist 폴더에 컴파일된 JavaScript 파일을 출력하는 구조를 사용한다. 이를 통해 원본 소스 코드와 빌드 결과물을 명확하게 분리하여 관리할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-strict&lt;/h3&gt;
&lt;pre id=&quot;code_1781521415586&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;compilerOptions&quot;: {
    &quot;strict&quot;: true
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strict는 타입스크립트의 &lt;b&gt;엄격한 타입 검사 모드&lt;/b&gt;를 활성화하는 옵션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 타입 안정성을 높이기 위해 대부분 strict: true를&lt;/b&gt; 사용하는 편이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-moduleDetection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트는 전역 스코프를 보기 때문에 같은 경로에 있는 ts파일에 동일한 변수명이 있다거나 하면 같은 스크립트로 처리되면서 전역 변수 충돌이 발생할 수 있다. 그래서 moduleDetection을 사용하여 모듈로 판단할지 스크립트로 판단할지 결정하는 옵션이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781521980949&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;moduleDetection&quot;: &quot;force&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; moduleDetection을 force로 설정하면 모듈로 인식하여&lt;/b&gt; 각 파일이 독립적인 스코프를 가지기 때문에 변수명이 동일하여 충돌되는 문제를 방지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.ts-node사용법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ts-node.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qGNMq/dJMcaf7ZwBf/QlK4VsYJCclvkZdDpjFsn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qGNMq/dJMcaf7ZwBf/QlK4VsYJCclvkZdDpjFsn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qGNMq/dJMcaf7ZwBf/QlK4VsYJCclvkZdDpjFsn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqGNMq%2FdJMcaf7ZwBf%2FQlK4VsYJCclvkZdDpjFsn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1536&quot; height=&quot;1024&quot; data-filename=&quot;ts-node.png&quot; data-origin-width=&quot;1536&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;&lt;span&gt;위에서 살펴본 것처럼 TypeScript 파일을 실행하려면 일반적으로 &lt;/span&gt;&lt;span&gt;tsc&lt;/span&gt;&lt;span&gt; 명령어를 사용하여 JavaScript 파일로 컴파일한 뒤, Node.js로 실행해야 한다. 하지만 매번 컴파일 과정을 거치는 것은 개발 중에 다소 번거로울 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이때 &lt;/span&gt;&lt;b&gt;&lt;span&gt;ts-node&lt;/span&gt;&lt;/b&gt;&lt;span&gt;를 사용하면 &lt;b&gt;TypeScript 파일을 별도의 컴파일 과정 없이 직접 실행할 수 있어서&lt;/b&gt; 편리하며 내부적으로 변환되어 실행되기 때문에 프로젝트에 tsc와 다르게 js파일이 안 생긴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781522540408&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ts-node src/index.ts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 명령어대로 ts-node 적고 경로 작성해 주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1781522762711&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;ts-node&quot;: {
    &quot;esm&quot;: true
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ts-node를 사용하기 전 마찬가지로 &lt;b&gt;tsconfig.json에 설정해야 되는 옵션이 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ts파일을 ES Module(ESM) 방식으로 실행하라는 옵션으로 위에서 설명한 module: &quot;esnext&quot;를 ts-node가 정상적으로 실행할 수 있게 해 준다. true로 해두면 현재 프로젝트를&lt;b&gt; ES Module 환경으로 실행하라고 알려주는 설정이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://san2-dev.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://san2-dev.tistory.com/12&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1781524573985&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. TypeScript 기초입문) 변수,함수,배열 사용하는 방법&quot; data-og-description=&quot;요즘 프론트엔드 강의를 보면 타입스크립트를 안 쓰는 곳이 거의 없을 지경이라고 할 정도로 많이 쓴다. Next.js 설치할 때 매번 타입스크립트 쓸 거냐는 말에 찔려 공부해서 정리할 겸 포스팅하&quot; data-og-host=&quot;san2-dev.tistory.com&quot; data-og-source-url=&quot;https://san2-dev.tistory.com/12&quot; data-og-url=&quot;https://san2-dev.tistory.com/12&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/deOqFK/dJMb81G6fhQ/BKkJYZt9b6oNINdbOG69Ek/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdg73B/dJMb9fZD2Ir/8B09KKfVsdljP2bswrg3Bk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/JBzPD/dJMb8XkogA1/oQqkZc13B997cArMjLKeNk/img.png?width=1907&amp;amp;height=724&amp;amp;face=0_0_1907_724&quot;&gt;&lt;a href=&quot;https://san2-dev.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://san2-dev.tistory.com/12&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/deOqFK/dJMb81G6fhQ/BKkJYZt9b6oNINdbOG69Ek/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdg73B/dJMb9fZD2Ir/8B09KKfVsdljP2bswrg3Bk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/JBzPD/dJMb8XkogA1/oQqkZc13B997cArMjLKeNk/img.png?width=1907&amp;amp;height=724&amp;amp;face=0_0_1907_724');&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. TypeScript 기초입문) 변수,함수,배열 사용하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요즘 프론트엔드 강의를 보면 타입스크립트를 안 쓰는 곳이 거의 없을 지경이라고 할 정도로 많이 쓴다. Next.js 설치할 때 매번 타입스크립트 쓸 거냐는 말에 찔려 공부해서 정리할 겸 포스팅하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;san2-dev.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>typescript</category>
      <category>ts-node</category>
      <category>tsconfig.json</category>
      <category>타입스크립트설치</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/46</guid>
      <comments>https://san2-dev.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 15 Jun 2026 20:56:24 +0900</pubDate>
    </item>
    <item>
      <title>Google I/O 2026 정리: Antigravity CLI 설치와 Gemini Omni, AI Search 변화</title>
      <link>https://san2-dev.tistory.com/45</link>
      <description>&lt;p data-end=&quot;291&quot; data-start=&quot;148&quot; data-ke-size=&quot;size16&quot;&gt;구글&amp;nbsp;I/O는&amp;nbsp;구글이&amp;nbsp;매년&amp;nbsp;개발자와&amp;nbsp;IT&amp;nbsp;업계에&amp;nbsp;앞으로의&amp;nbsp;기술&amp;nbsp;방향을&amp;nbsp;공개하는&amp;nbsp;행사입니다.&amp;nbsp;2026년&amp;nbsp;핵심은&amp;nbsp;AI가&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;/p&gt;
&lt;h2 data-end=&quot;299&quot; data-start=&quot;260&quot; data-section-id=&quot;157xfrc&quot; data-ke-size=&quot;size26&quot;&gt;1. Google I/O 2026의 키워드는 에이전트형 AI입니다&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BF9WJ/dJMcaaem5k3/nRyrJrkGAUQEemF0HyqMS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BF9WJ/dJMcaaem5k3/nRyrJrkGAUQEemF0HyqMS1/img.png&quot; data-alt=&quot;출처:구글io&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BF9WJ/dJMcaaem5k3/nRyrJrkGAUQEemF0HyqMS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBF9WJ%2FdJMcaaem5k3%2FnRyrJrkGAUQEemF0HyqMS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1890&quot; height=&quot;804&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:구글io&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;398&quot; data-start=&quot;301&quot; data-ke-size=&quot;size16&quot;&gt;에이전트형 AI는 사용자의 요청을 듣고 다음 행동까지 이어가는 AI를 말합니다. 기존 챗봇이 &amp;ldquo;답변하는 상담원&amp;rdquo;이었다면, 에이전트는 &amp;ldquo;일을 나눠 처리하는 비서&amp;rdquo;에 가깝습니다.이번 발표는 Gemini 3.5 Flash, Antigravity 2.0, AI Search, Gemini Omni, Universal Cart가 따로 움직이는 기능이 아니라는 점이 중요합니다. &lt;b&gt;사용자가 여러 앱을 오가는 대신 AI가 검색하고, 만들고, 확인하고, 구매 흐름까지 도와주는 방향입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;567&quot; data-start=&quot;400&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;125&quot; data-start=&quot;75&quot; data-section-id=&quot;1xetnzp&quot; data-ke-size=&quot;size26&quot;&gt;2. Antigravity 2.0, AI 코딩 도구에서 개발 지휘실로 바뀌고 있습니다&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rump6/dJMcaciSYWi/JD7MkJs8R7zg7Zre9anh50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rump6/dJMcaciSYWi/JD7MkJs8R7zg7Zre9anh50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rump6/dJMcaciSYWi/JD7MkJs8R7zg7Zre9anh50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frump6%2FdJMcaciSYWi%2FJD7MkJs8R7zg7Zre9anh50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;764&quot; height=&quot;424&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;299&quot; data-start=&quot;127&quot; data-ke-size=&quot;size16&quot;&gt;Google I/O 2026에서 가장 눈에 들어온 발표는 &lt;b&gt;Antigravity 2.0&lt;/b&gt;이었습니다. 기존 Antigravity가 AI와 함께 코드를 수정하는 개발 도구에 가까웠다면, 2.0은 여러 AI 에이전트에게 작업을 나눠 맡기고 전체 흐름을 관리하는 쪽으로 확장됐다는 생각이 듭니다.&lt;/p&gt;
&lt;p data-end=&quot;299&quot; data-start=&quot;127&quot; data-ke-size=&quot;size16&quot;&gt;구글은 Antigravity 2.0을 독립형 데스크톱 앱으로 소개했습니다. 단순히 코드를 작성하는 화면이라기보다, 여러 에이전트가 어떤 일을 하고 있는지 확인하고 조율하는 중심 공간에 가까워진 것입니다. &lt;b&gt;구글 공식 발표에서도 여러 에이전트를 병렬로 실행하고, Dynamic Subagents와 예약 작업을 지원한다고 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;951&quot; data-start=&quot;908&quot; data-section-id=&quot;tax012&quot; data-ke-size=&quot;size26&quot;&gt;3. Antigravity CLI, 터미널에서도 AI 개발이 가능해집니다&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulQ1W/dJMcaiKaDip/UNL53oCWKbEuwyA8cYki81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulQ1W/dJMcaiKaDip/UNL53oCWKbEuwyA8cYki81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulQ1W/dJMcaiKaDip/UNL53oCWKbEuwyA8cYki81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FulQ1W%2FdJMcaiKaDip%2FUNL53oCWKbEuwyA8cYki81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;719&quot; height=&quot;431&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 안티그래비티를 사용할 때는 ide만 있어서 아쉬움이 있었는데&lt;b&gt; 이번에 Antigravity CLI버전이 나오며 Google Antigravity 2.0이 출시되었다고 합니다.&lt;/b&gt; 원래 지원하던 제미나이 cli는 서비스 종료 수순인것 같습니다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;CLI는 Command Line Interface의 줄임말로, 터미널에 명령어를 입력해 도구를 다루는 방식입니다. 이번 Antigravity CLI는 동시성제어에 좋은 go언어를 사용하였다고 합니다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size26&quot;&gt;4.윈도우에 Antigravity CLI를 설치해보자&lt;/h2&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/b5rr4F/dJMcada0e8W/LxhDiKHgN3KwFP9hdVhRQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5rr4F/dJMcada0e8W/LxhDiKHgN3KwFP9hdVhRQ0/img.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;732&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.9827%; margin-right: 10px;&quot; data-widthpercent=&quot;45.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5rr4F/dJMcada0e8W/LxhDiKHgN3KwFP9hdVhRQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5rr4F%2FdJMcada0e8W%2FLxhDiKHgN3KwFP9hdVhRQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;916&quot; height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBxXs4/dJMcabYEFGI/iBgQ94NUdYEpZBGvw8wis0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBxXs4/dJMcabYEFGI/iBgQ94NUdYEpZBGvw8wis0/img.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;546&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.8545%;&quot; data-widthpercent=&quot;54.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBxXs4/dJMcabYEFGI/iBgQ94NUdYEpZBGvw8wis0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBxXs4%2FdJMcabYEFGI%2FiBgQ94NUdYEpZBGvw8wis0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;818&quot; height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size16&quot;&gt;파워셀을 관리자 권한으로 실행해 주고 아래 명령어를 복붙 하여 실행시켜 줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1779716818020&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;irm https://antigravity.google/cli/install.ps1 | iex&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbydid/dJMcada0fpw/WIuqgv5ksxKUOw3JtJm4ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbydid/dJMcada0fpw/WIuqgv5ksxKUOw3JtJm4ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbydid/dJMcada0fpw/WIuqgv5ksxKUOw3JtJm4ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbydid%2FdJMcada0fpw%2FWIuqgv5ksxKUOw3JtJm4ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;988&quot; height=&quot;521&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size16&quot;&gt;cmd에 아래 명령어를 입력하여 설치를 확인해 주고 실행해 줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1779717171992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:: 설치 버전 확인
agy --version
:: 실행 및 로그인
agy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size16&quot;&gt;agy 명령어를 실행하면 로그인 방식을 고르고 &lt;b&gt;'If you aren't automatically redirected, paste the authorization code below:'&lt;/b&gt;이라고 뜬곳에 웹에서 로그인하고 나온 코드를 넣어주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2tg0H/dJMcahxM6J7/lfm6g6aksCh7ndhV9Ho7S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2tg0H/dJMcahxM6J7/lfm6g6aksCh7ndhV9Ho7S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2tg0H/dJMcahxM6J7/lfm6g6aksCh7ndhV9Ho7S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2tg0H%2FdJMcahxM6J7%2Flfm6g6aksCh7ndhV9Ho7S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1067&quot; height=&quot;490&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안티그래비티 cli에서 사용할 테마를 골라주면 &lt;b&gt;Antigravity CLI 사용 데이터 수집 동의 화면이 나오는데 &lt;/b&gt;나의 개발 코드나 프롬프트가 수집될 수도 있다는 뜻으로도 생각돼서 개인적으로는 비동의를 눌렀는데 문제없이 넘어가지더라고요.(개인판단에 맞게 선택)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3J2GV/dJMcajvAbGt/s2RRnw1sU4F6tUFvu6y7ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3J2GV/dJMcajvAbGt/s2RRnw1sU4F6tUFvu6y7ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3J2GV/dJMcajvAbGt/s2RRnw1sU4F6tUFvu6y7ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3J2GV%2FdJMcajvAbGt%2Fs2RRnw1sU4F6tUFvu6y7ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1090&quot; height=&quot;479&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테마, 사용데이터 수집동의를 넘어가면 이제 안티그래비티 cli를 사용할 수 있게 됩니다.!&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;1401&quot; data-start=&quot;1360&quot; data-section-id=&quot;12znjq1&quot; data-ke-size=&quot;size26&quot;&gt;5. Managed Agents, 서버 관리 부담을 줄이는 방향입니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1510&quot; data-start=&quot;1403&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Managed Agents in Gemini API도 중요한 발표입니다.&lt;/b&gt; 기존에는 AI가 코드를 실행하거나 도구를 쓰게 만들려면 서버, 실행 환경, 보안 설정을 개발자가 직접 챙겨야 했습니다.Managed Agents는 이런 작업 공간을 구글이 관리하는 방식에 가깝습니다. 개발자는 API를 통해 준비된 에이전트를 호출하고, AI가 안전한 환경에서 작업하도록 만들 수 있습니다. 앞으로는 &amp;ldquo;AI를 어디서 실행할지&amp;rdquo;보다 &amp;ldquo;AI에게 어떤 일을 맡길지&amp;rdquo;가 더 중요해질 수 있습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1710&quot; data-start=&quot;1673&quot; data-section-id=&quot;k2qgcu&quot; data-ke-size=&quot;size26&quot;&gt;6. Gemini Omni, 영상 편집도 말로 하는 시대입니다&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sMBtb/dJMcadWpVx5/Jo6OJwBFh7lWpTTHsIKxok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sMBtb/dJMcadWpVx5/Jo6OJwBFh7lWpTTHsIKxok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sMBtb/dJMcadWpVx5/Jo6OJwBFh7lWpTTHsIKxok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsMBtb%2FdJMcadWpVx5%2FJo6OJwBFh7lWpTTHsIKxok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1913&quot; height=&quot;893&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;223&quot; data-start=&quot;132&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemini Omni는 텍스트, 이미지, 오디오, 영상까지 함께 이해하는 멀티모달 AI입니다.&lt;/b&gt; 여러 종류의 자료를 한 번에 보고 이해하는 AI라고 생각하면 됩니다. 개인적으로 이번 발표에서 Gemini Omni가 꽤 눈에 들어왔습니다. 최근 OpenAI의 Sora 웹&amp;middot;앱 서비스가 종료됐고, API도 종료 예정이라고 안내되면서 AI 영상 생성 쪽 흐름이 다시 움직이는 느낌이 들었습니다. Sora가 업계 상단에 있던 서비스 중 하나였던 만큼, 이 변화가 작게 느껴지지는 않습니다. 특히 Gemini Omni는 영상을 새로 만드는 것뿐 아니라, 말로 편집하는 흐름이 인상적입니다. &amp;ldquo;배경을 바꿔줘&amp;rdquo;, &amp;ldquo;이 장면을 더 영화처럼 만들어줘&amp;rdquo;처럼 요청하면 영상 수정이 가능해지는 방향입니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;794&quot; data-start=&quot;667&quot; data-ke-size=&quot;size16&quot;&gt;영상제작을 업으로 하는 사람 입장에서는 꽤 현실적으로 와닿는 변화라고 생각합니다. &lt;b&gt;앞으로는 편집 프로그램을 잘 다루지 못해도, 아이디어만 있으면 짧은 영상 콘텐츠를 만드는 일이 훨씬 쉬워질 것 같습니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Antigravity2.0</category>
      <category>AntigravityCLI</category>
      <category>AntigravityCLI 윈도우에 설치</category>
      <category>Gemini Omni</category>
      <category>제미나이</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/45</guid>
      <comments>https://san2-dev.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 25 May 2026 23:15:58 +0900</pubDate>
    </item>
    <item>
      <title>컨텍스트 스위칭과 하네스 엔지니어링 차이와 개념 정리</title>
      <link>https://san2-dev.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ai를 사용하면서 개발을 하다 보면 새로운 개념들과 최신정보가 하루가 다르게 쏟아져 나옵니다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKTvan/dJMcadoeGWK/mc2WhOBUPm6Xm8L8VtPXL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKTvan/dJMcadoeGWK/mc2WhOBUPm6Xm8L8VtPXL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKTvan/dJMcadoeGWK/mc2WhOBUPm6Xm8L8VtPXL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKTvan%2FdJMcadoeGWK%2Fmc2WhOBUPm6Xm8L8VtPXL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1273&quot; height=&quot;717&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.ai를 통해 개발하다보면 자주 듣는 컨텍스트 스위칭&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmdDJX/dJMcafl5XYS/ovT00Q03N3VZwvId4HqRek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmdDJX/dJMcafl5XYS/ovT00Q03N3VZwvId4HqRek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmdDJX/dJMcafl5XYS/ovT00Q03N3VZwvId4HqRek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmdDJX%2FdJMcafl5XYS%2FovT00Q03N3VZwvId4HqRek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1672&quot; height=&quot;941&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ai가 처음나왔을때만 해도 프롬프트만 명확하고 구체적으로 작성하여 요청해야 ai가 실수 없이 답변을 준다 해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트를 어떻게 하면 잘 쓰는지에 대한 이야기가 많았습니다. &lt;b&gt;하지만 어느 순간부터 ai를 통해 다양한 작업을 장시간 해야 돼서 기본적인 프롬프트를 만으로는 부족해서 나온 게 컨텍스트 스위칭입니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.컨텍스트 스위칭 개념 정리&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 AI 도구를 활용해 개발하다 보면 생각보다 처리해야 할 일이 많습니다. 단순히 AI에게 코드를 생성해 달라고 요청하는 것으로 끝나는 것이 아니라, 생성된 코드가 실제 프로젝트 구조에 맞는지 검토하고, 관련 문서를 확인하고, 팀의 개발 규칙이나 코드 스타일과 맞는지도 살펴봐야 합니다. 경우에 따라서는 이전 대화 이력이나 작업 의도까지 다시 정리해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 개발자가 코드 작성, AI 답변 확인, 문서 검토, 테스트 실행, 프롬프트 수정 사이를 계속 오가며 작업 흐름을 다시 잡는 과정이 바로 AI 개발에서 말하는 컨텍스트 스위칭입니다. &lt;b&gt;쉽게 말해, 하던 작업의 문맥을 잠시 내려놓고 다른 문맥으로 전환했다가 다시 돌아오는 과정이라고 볼 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpTRiS/dJMcaiC5P9O/zBkknEb4ytmBEKYX7xzx9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpTRiS/dJMcaiC5P9O/zBkknEb4ytmBEKYX7xzx9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpTRiS/dJMcaiC5P9O/zBkknEb4ytmBEKYX7xzx9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpTRiS%2FdJMcaiC5P9O%2FzBkknEb4ytmBEKYX7xzx9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1361&quot; height=&quot;438&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Claude Code를 사용해 본 분들이라면 &lt;b&gt;CLAUDE.md 파일을 한 번쯤 접해보셨을 겁니다.&lt;/b&gt; 이 파일에는 프로젝트 규칙, 실행 명령어, 코드 스타일, 주의사항 등을 미리 정리해 둘 수 있습니다. 이렇게 작업에 필요한 정보를 구조화해 두면 AI에게 매번 같은 내용을 반복해서 설명하지 않아도 되고, 개발자 역시 작업 흐름을 다시 정리하는 시간을 줄일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 컨텍스트 스위칭을 줄이는 핵심은 AI가 참고해야 할 작업 문맥을 미리 정리해 두고, 개발자가 불필요하게 여러 정보 사이를 오가지 않도록 만드는 데 있습니다. AI를 잘 활용한다는 것은 단순히 좋은 답변을 얻는 것이 아니라, 개발 흐름이 끊기지 않도록 작업 환경과 문맥을 체계적으로 관리하는 것에 가깝습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 요즘 뜨는 하네스 엔지니어링이란?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brm92r/dJMcaiC5P9V/SpdqlZB5EQAuQROlswvslK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brm92r/dJMcaiC5P9V/SpdqlZB5EQAuQROlswvslK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brm92r/dJMcaiC5P9V/SpdqlZB5EQAuQROlswvslK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrm92r%2FdJMcaiC5P9V%2FSpdqlZB5EQAuQROlswvslK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;833&quot; height=&quot;490&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI도구를 잘 사용하더라도 인간의 입장에서 볼 때 부족하고 실수를 할 때가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 클린코드로 개발을 해야 된다, 파일용량 제한을 넘기지 말아야 된다, 폴더구조를 어떤 식으로 만들어라 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명확하고 디테일하게 말해줘도 응답 오는 게 올바르지 않을 때가 많으며&lt;b&gt; 이럴 때 인간의 개입이 많아지며 AI가 만들어내는 생산성에 비해 인간의 효율성은 차이가 나게 됩니다. &lt;/b&gt;즉 보통 AI한테 작업을 요청 보내고 구현된 코드를 보고 테스트하고 잘못된 거는 다시 요청하게 되는 순서가 반복될 텐데 이를 줄이고자 하는 게 하네스 엔지니어링입니다. 개발자의 불필요한 개입을 최소한으로 줄이고 AI가 올바른 코드를 만들어 낼 수 있는 환경을 말하는 것으로 harness 또한 한국어로 말에게 사용하는 안장, 마구, 제어장치를 의미하며 AI를 좀 더 체계적으로 제어하고 관리하기 위한 환경을 구축해 간다고 생각하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 하네스 엔지니어링 사용방법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2752&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/24fdl/dJMcadoeGWM/iXMqMLXaiD20Q0mlQp6PE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/24fdl/dJMcadoeGWM/iXMqMLXaiD20Q0mlQp6PE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/24fdl/dJMcadoeGWM/iXMqMLXaiD20Q0mlQp6PE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F24fdl%2FdJMcadoeGWM%2FiXMqMLXaiD20Q0mlQp6PE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2752&quot; height=&quot;1536&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2752&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스 엔지니어링은 개발에 도입하려면 생각보다 초기에 생각보다 많은 시간이 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능과 파트별로 로그를 남겨 관리한다거나 컨텍스트를 세분화해서 챕터별로 나눠 사용한다거나 CI/CD를 어떤 형식에 따라 관리할지 커밋과 머지는 어떤 형식에 따라 메시지를 쓰고 남길지 등 &lt;b&gt;워크플로우와 실행 환경을 구축하는데 시간이 많이 투여되자만 한번 만들어 놓으면 좋다고 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;008&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/axz_keditor/emoticon/friends1/large/008.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/axz_keditor/emoticon/friends1/large/008.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;용어가 좀 어려울 수도 있지만 결국에는 AI를 어떻게 잘 사용할지에 대한 이야기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료(더 궁금하시면 보시면 좋을 것 같아요!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/tech/harness-engineering-from-deep-insight/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://openai.com/ko-KR/index/harness-engineering/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크2&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI코딩</category>
      <category>Harness Engineering</category>
      <category>바이브코딩</category>
      <category>컨텍스트스위칭</category>
      <category>클로드코드</category>
      <category>하네스엔지니어링</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/44</guid>
      <comments>https://san2-dev.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 26 Apr 2026 11:28:30 +0900</pubDate>
    </item>
    <item>
      <title>깃허브 오픈소스에 기여하는 방법정리,Trending과 first-contributions 활용법</title>
      <link>https://san2-dev.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발자라면 한 번쯤은 큰 오픈소스에 참여해서 기여하고 싶다고 생각한 적이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 꾸준히 해서 여러 오픈소스에 기여하고 star수가 많은 거에도 참여하면 취업에도 도움 된다고 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;깃허브 오픈소스에 대한 기여 하려면 뭘 해야 되는지부터 고민한 뒤 정리한 글이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB6Udd/dJMcabXREEz/XunJmY1FGkkMa64ZUqKieK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB6Udd/dJMcabXREEz/XunJmY1FGkkMa64ZUqKieK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB6Udd/dJMcabXREEz/XunJmY1FGkkMa64ZUqKieK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB6Udd%2FdJMcabXREEz%2FXunJmY1FGkkMa64ZUqKieK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1536&quot; height=&quot;1024&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1536&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. 깃허브 사용법( Issues, Pull requests, Actions, Security)&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;1256&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QLzxi/dJMcahRiB3w/JncMHNOTFLOYvoMVSc28tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QLzxi/dJMcahRiB3w/JncMHNOTFLOYvoMVSc28tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QLzxi/dJMcahRiB3w/JncMHNOTFLOYvoMVSc28tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQLzxi%2FdJMcahRiB3w%2FJncMHNOTFLOYvoMVSc28tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1256&quot; height=&quot;655&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈소스 기여에 참여하려면 깃허브에 대한 기능을 어느 정도 알아야 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Issues&lt;/b&gt;:해당 프로젝트에 대한 문제, 버그, 개선사항, 질문등을 올리는 곳으로 어느 부분 수정이 필요한다거나 프로젝트에 이런 기능이 있으면 좋겠다던가를 올리는 곳이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pull requests&lt;/b&gt;:내가 코드를 고쳐서 프로젝트에 반영 요청을 하는 것으로 프로젝트 관리자가 내가 Pull requests 한 거를 검토하고 괜찮다고 판단하면 merge 하여 실제 프로젝트에 반영이 되면 오픈소스에 기여한 게 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Actions&lt;/b&gt;: GitHub의 자동화/CI/CD 기능으로 워크플로우를 설정해 두는 곳이다. 프로젝트에 push,pr,merge등의 이벤트가 발생하면 정해둔 절차에 따라 자동작업이 일어난다고 보면 된다.(ex:테스트 실행, 빌드, 배포 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Security&lt;/b&gt;:프로젝트의 보안 관련 영역으로 취약점 제보, 보안 업데이트 내역등에 대한 부분이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 오픈소스 기여할만한 프로젝트 찾는 방법(Github Trending)&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;1096&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LW0wM/dJMcahKyJPq/FRuZ7tTDzfklcPqKXf5AT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LW0wM/dJMcahKyJPq/FRuZ7tTDzfklcPqKXf5AT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LW0wM/dJMcahKyJPq/FRuZ7tTDzfklcPqKXf5AT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLW0wM%2FdJMcahKyJPq%2FFRuZ7tTDzfklcPqKXf5AT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;866&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브 트렌딩에 들어가면 요즘 인기 있는 레포지토리와 주목받는 개발자를 볼 수 있고 언어별로&amp;nbsp; 필터를 설정해서 볼 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 커다란 프로젝트가 많아 기여하는데 어렵지만 다른 인기 프로젝트를 구경할 수 있는 게 좋아서 넣었다.&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 쉽게 오픈소스 기여하는 방법 first-contributions&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; first-contributions라는 프로젝트를 추천한다.&lt;/b&gt; 초보자가 GitHub에서 오픈소스 기여 과정을 직접 연습해 볼 수 있도록 만들어진 저장소이다. 풀리퀘스트 해도 머지 안 해주는 거 아니냐 하실 텐데.. 심지어 프로젝트에 반영도 해준다고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 프로젝트에서는 보통 Contributors.md 파일에 자신의 이름 한 줄을 추가하는 방식으로 기여를 진행한다.&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;1741&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAyxe/dJMcadH57hO/CjC7XtPAaNnd8DAFjXPsRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAyxe/dJMcadH57hO/CjC7XtPAaNnd8DAFjXPsRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAyxe/dJMcadH57hO/CjC7XtPAaNnd8DAFjXPsRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAyxe%2FdJMcadH57hO%2FCjC7XtPAaNnd8DAFjXPsRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1741&quot; height=&quot;887&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1741&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 first-contributions는 어디까지나 &lt;b&gt;연습용 성격이 강한 프로젝트로 &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;실제 서비스의 버그를 고치거나 기능을 추가하는 본격적인 귀여와는 조금 차이가 있다. &lt;b&gt;오픈소스를 내 깃허브 저장소로 fork 하여 복제해 오고 로컬 컴퓨터로 clone 하고 작업해서 내 저장소에 commit, push로 반영하고 그걸 토대로 Pull Requset하는 형태인데 이거를 연습해 볼수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>github,git</category>
      <category>first-contributions</category>
      <category>github</category>
      <category>깃허브 사용법</category>
      <category>깃허브 오픈소스</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/43</guid>
      <comments>https://san2-dev.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 23 Mar 2026 16:04:41 +0900</pubDate>
    </item>
    <item>
      <title>조코딩 x OpenAI x Primer AI 해커톤 후기: 두쫀쿠 AI 챗봇 만들기</title>
      <link>https://san2-dev.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번 설날, 유튜브 쇼츠를 보다가 우연히 &lt;b&gt;조코딩 x OpenAI x Primer AI&lt;/b&gt;에서 주최한 온라인 해커톤 영상을 보게 되었다. 설날이라고 늘어져 있지만 말고 이참에 한번 나가봐야겠다 맘먹어 참가하게 되었다. 심지어 참가만 해도 &lt;b&gt;OpenAI 크레딧 100달러&lt;/b&gt;를 준다고 해서 참가의욕이 더 올랐다고 할까... 결론적으로 설날 3일 동안 프로젝트를 만들어서 제출했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1427&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JR4dZ/dJMcadOLWeT/vlCK2WIGbDdk7CIkhpEC70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JR4dZ/dJMcadOLWeT/vlCK2WIGbDdk7CIkhpEC70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JR4dZ/dJMcadOLWeT/vlCK2WIGbDdk7CIkhpEC70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJR4dZ%2FdJMcadOLWeT%2FvlCK2WIGbDdk7CIkhpEC70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1427&quot; height=&quot;921&quot; data-origin-width=&quot;1427&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 해커톤 주제와 내가 만든 것&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmDQli/dJMcacJa6mW/opoPOQbaKBimK4lyVVZnik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmDQli/dJMcacJa6mW/opoPOQbaKBimK4lyVVZnik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmDQli/dJMcacJa6mW/opoPOQbaKBimK4lyVVZnik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmDQli%2FdJMcacJa6mW%2FopoPOQbaKBimK4lyVVZnik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1363&quot; height=&quot;881&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 해커톤의 주제는 &lt;b&gt;OpenAI API를 활용해 실제 비즈니스 가치가 있는 서비스를 만드는 것으로&lt;/b&gt;&amp;nbsp;&lt;b&gt;NestJS와 LangChain&lt;/b&gt;을 활용해 RAG를 사용해서 챗봇을 설계하고, &lt;b&gt;AI 챗봇 MVP&lt;/b&gt;를 제작했다. 챗봇은 최근 유행하는 간식인 두쫀쿠에 대한 정보를 찾아 정리하여 챗봇이 판매처, 레시피, 상세 정보를 안내하는 기능을 제공했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 개발 과정&lt;/h3&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 LangChain을 강의에서 본 적이 있고, 써본 경험이 있어서 이번 프로젝트에서도 사용하게 됐다. 문서를 RAG용으로 청크 단위로 나누고 ChromaDB에 임베딩했는데, 생각보다 LLM이 내용을 제대로 읽지 못하는 경우가 있어서, &lt;b&gt;청크별로 정보 표시를 늘려서 해결&lt;/b&gt;했다. 아직 LLM 다루는 게 익숙하지 않아서 챗봇과 대화할 때 올바른 답변이 나오지 않는 경우가 종종 있었지만, 대부분은 원하는 답변과 거의 맞았다. 배포 후에는 카톡 로그인이 안 되는 문제도 있었다 보니.. 카톡로그인 구현하는 방법에 대해 정리해서 포스팅해야 되겠다고 느꼈다.(은근 카톡 디벨로퍼 ui에서 설정관련된 것도 생각보다 안 보였던 거 같기도 하고...)&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;완성된 챗봇은 사용자 질문에 따라 두쫀쿠 관련 정보를 rag문서를 토대로 LLM 기반 응답을 제공하는 구조였다. 설날 동안 단기간에 만들었지만 나름 최선을 다했다고 생각한다. 온라인 해커톤이라 평가진이 서비스는 직접 확인하지 않고, MVP 문서만 보고 선발하는 경우가 있어 조금 안타깝긴 했다. 그래도 이번 경험을 통해 &lt;b&gt;OpenAI API 연동, LangChain 프롬프트 체인 구성, RAG 기반 문서 검색, 벡터화&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;a href=&quot;https://dujjonku.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dujjonku.cloud/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773743178250&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;두쫀쿠 AI 채팅&quot; data-og-description=&quot;안녕하세요! 두쫀쿠 AI는 존맛탱이지만 실수할 수 있습니다. 채팅 입력 시 사용자의 정보를 수집할 수 있습니다.(악의적 요청 판단에만 사용)&quot; data-og-host=&quot;dujjonku.cloud&quot; data-og-source-url=&quot;https://dujjonku.cloud/&quot; data-og-url=&quot;https://dujjonku.cloud/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rGj5Y/dJMb9iIFZ7s/rS60SQTHlkc8OerWgOeulk/img.png?width=787&amp;amp;height=787&amp;amp;face=0_0_787_787&quot;&gt;&lt;a href=&quot;https://dujjonku.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dujjonku.cloud/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rGj5Y/dJMb9iIFZ7s/rS60SQTHlkc8OerWgOeulk/img.png?width=787&amp;amp;height=787&amp;amp;face=0_0_787_787');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;두쫀쿠 AI 채팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! 두쫀쿠 AI는 존맛탱이지만 실수할 수 있습니다. 채팅 입력 시 사용자의 정보를 수집할 수 있습니다.(악의적 요청 판단에만 사용)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dujjonku.cloud&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>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/42</guid>
      <comments>https://san2-dev.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 17 Mar 2026 19:26:32 +0900</pubDate>
    </item>
    <item>
      <title>NestJS 요청-응답 라이프사이클 정리: Controller, Provider, Module 역할</title>
      <link>https://san2-dev.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;nestjs에는 여러 과정을 지나 요청에 대한 로직을 처리하고 응답을 보내주게 되는데 아직 nestjs의 아키텍처에 대해 헷갈려서 정리하게 되었다.&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rf9y3/dJMcabXInhh/fYxSaAk9kABJqQblPtp7A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rf9y3/dJMcabXInhh/fYxSaAk9kABJqQblPtp7A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rf9y3/dJMcabXInhh/fYxSaAk9kABJqQblPtp7A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRf9y3%2FdJMcabXInhh%2FfYxSaAk9kABJqQblPtp7A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Controller란?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Controller는 클라이언트의 HTTP(get, post, put 등) 요청을 받아서 처리하는 엔드포인트로 요청받은 파라미터를 받고 서비스를 호출하며 결과를 반환하는 곳이다. 실질적인 db의 저장, 서비스의 비즈니스 로직은 Controller에 구현하는 게 아니라 Provider(Service)에 위임하게 된다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;//http://localhost:5500/api/get
@Controller('api')
export class ApiController {
&amp;nbsp;&amp;nbsp;constructor(private readonly apiService: ApiService) {}

&amp;nbsp;&amp;nbsp;@Get('get')
&amp;nbsp;&amp;nbsp;findAll() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this.apiService.findAll();
&amp;nbsp;&amp;nbsp;}

}&lt;/code&gt;&lt;/pre&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;//http://localhost:5500/api
@Controller()
export class ApiController {
&amp;nbsp;&amp;nbsp;constructor(private readonly apiService: ApiService) {}

&amp;nbsp;&amp;nbsp;@Get('api')
&amp;nbsp;&amp;nbsp;findAll() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this.apiService.findAll();
&amp;nbsp;&amp;nbsp;}

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;클래스에 @Controller 데코레이터를 붙여 사용하며 Controller안에 라우터 핸들러를 설계한다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.Provider란?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Provider는 NestJS에서 &lt;b&gt;실질적인 비즈니스 로직을 처리하는 부분으로 &lt;/b&gt;보통 서비스(Service) 클래스가 Provider에 해당하며, NestJS의 &lt;b&gt;의존성 주입(Dependency Injection, DI)&lt;/b&gt; 시스템에 의해 생성되고 관리된다.&lt;br&gt;DI는 필요한 객체를 내가 직접 만들지 않고 외부에서 constructor(생성자) 안에 넣어주는 패턴이다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;@Injectable()
export class UsersService {
&amp;nbsp;&amp;nbsp;findAll() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ['user1', 'user2'];
&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;@Injectable()을 붙인 클래스는 Nestjs의 IoC컨테이너가 주입가능한 객체 후보로 보고&amp;nbsp;&lt;b&gt;Injectable 붙은 클래스를 객체(인스턴스) 형태로 관리하게 된다. &lt;/b&gt;보통 Controller에 Provider(Service)를 주입해서 사용한다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.Module란?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Module은 기능 단위로 구성요소를 묶는 형태로 Controller, Provider, imports , exports를 관리하게 된다.&lt;br&gt;Module이 &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;Controller&lt;/span&gt;, Provider를 관리해 준다고 생각하면 되며 코드상에서 Controller,Provider등을 명시해 줘야 된다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModel } from './entities/users.entity';
@Module({
&amp;nbsp;&amp;nbsp;imports: [TypeOrmModule.forFeature([UsersModel])],
&amp;nbsp;&amp;nbsp;exports:[UsersService], 
&amp;nbsp;&amp;nbsp;controllers: [UsersController],
&amp;nbsp;&amp;nbsp;providers: [UsersService],
})
export class UsersModule {}&lt;/code&gt;&lt;/pre&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. NestJS CLI를 통한 Module, Controller, Provider 생성&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;NestJS에서 실질적인 요청 로직을 처리하는 모듈(Module), 컨트롤러(Controller), 프로바이더(Provider)는 CLI 명령어를 통해 쉽게 생성할 수 있다. CLI를 사용하면 생성된 컨트롤러와 프로바이더가 해당 모듈에 자동으로 등록된다. 모듈 또한 app.module.ts의 import에 등록해야 된다. 만약 명령어를 사용하지 않고 모듈,컨트롤러,프로바이더를 직접 생성하면 따로 등록을 직접 해줘야 돼서 번거롭다.&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br&gt;&lt;b&gt;-각각 하나씩 만드는 방식&lt;/b&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;nest g module users
nest g controller users
nest g service users&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-한 번에 만드는 방식&lt;/b&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djfR7V/dJMcafyZT7F/GxTR4YyKcDGZk7FHzKK2KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djfR7V/dJMcafyZT7F/GxTR4YyKcDGZk7FHzKK2KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djfR7V/dJMcafyZT7F/GxTR4YyKcDGZk7FHzKK2KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjfR7V%2FdJMcafyZT7F%2FGxTR4YyKcDGZk7FHzKK2KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;551&quot; height=&quot;121&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;nest g resource users&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;보통 모듈을 한번에 만드는 방식을 많이 쓴다고 합니다. CRUD API 전체 구조를 한 번에 생성하는 명령어라서 rest api, msa, graphql, socketio 등 선택하라고 하며 CRUD코드도 자동으로 생성할까? 라며 선택권을 준다.&lt;br&gt;-nestjs는 컨트롤러, 모듈, 프로바이더 말고도 가드, 인터셉터 등 공부해야 될 게 많다....!&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>nestjs</category>
      <category>nestjsController</category>
      <category>nestjs개발</category>
      <category>nest로직</category>
      <category>Provider</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/41</guid>
      <comments>https://san2-dev.tistory.com/41#entry41comment</comments>
      <pubDate>Thu, 12 Mar 2026 00:02:08 +0900</pubDate>
    </item>
    <item>
      <title>2026 정보처리기사 파이썬 공부 (클래스,상속,메서드,생성자)</title>
      <link>https://san2-dev.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정보처리기사 준비하면서 코딩문제 풀기 위해 파이썬 클래스 개념에 대해 정리한 글로 파이썬 비중이 많은 편은 아니지만 파이썬을 사용해 본 적이 있어 정리할 겸 썼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;thumbnail.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4d3Lq/dJMcagSarga/APMUs9volTk7PenIsuUFHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4d3Lq/dJMcagSarga/APMUs9volTk7PenIsuUFHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4d3Lq/dJMcagSarga/APMUs9volTk7PenIsuUFHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4d3Lq%2FdJMcagSarga%2FAPMUs9volTk7PenIsuUFHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1536&quot; height=&quot;1024&quot; data-filename=&quot;thumbnail.png&quot; data-origin-width=&quot;1536&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. 파이썬에서 클래스와 객체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 이 글을 볼수도 있으니 설명하자면 클래스는 설계도로 붕어빵 틀이라고 많이들 비유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체(=인스턴스)는 설계도로 만든 실제 물건을 뜻하며 예를 들어 붕어빵틀에 팥을 넣으면 팥붕어빵 슈를 넣으면 슈붕어빵이 되는 것처럼 인스턴스에 인자값에 무엇을 넣느냐에 따라 설계도에 맞춰 어떻게 될지 달라지기도 한다. &lt;b&gt;(객체, 인스턴스 동일한 표현)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class Dog:
    def __init__(self, name): #생성자
        self.name = name

    def say(self): #메서드
        print(f&quot;나는 {self.name}&quot;)

d1 = Dog(&quot;초코&quot;)
d2 = Dog(&quot;바둑이&quot;)

d1.say()  # 나는 초코
d2.say()  # 나는 바둑이&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 클래스의 이름과 동일한 게 생성자였는데 파이썬에서는 __init__이 생성자가 되는 거고 보통 멤버변수는 생성자안에서 정의하여 쓴다. d1.say()를 호출하면 self는 d1이 되고, d2.say()를 호출하면 self는 d2가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 this랑 같은 건데, 차이점은 &lt;b&gt;파이썬은 메서드 파라미터에 꼭 적어야 된다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.파이썬에서 상속&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# 부모 클래스
class Animal:
    def __init__(self):
        print('강아지')

    def speak(self):
        return &quot;...&quot;

# 자식 클래스 - 괄호 안에 부모를 넣으면 끝
class Dog(Animal): #부모 Animail클래스 자식Dog의 상속
    def __init__(self, name):
        super().__init__()   #super().__init__()을 써야 부모 생성자를 호출
        self.name = name
        print(self.name)

    def speak(self):        # 부모의 speak을 덮어씀 (오버라이딩)
        return &quot;멍멍!&quot;


d = Dog(&quot;초코&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속을 할때 따로 자바처럼 extends를 사용하지 않는다. 자식클래스의 파라미터에다가 부모클래스를 적으면 상속이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 상속에서 가장 중요한 게 있다면 자바와 다르게 &lt;b&gt;자식클래스의 생성자를 실행하기 전에 부모 클래스의 생성자를 가서 실행할 필요가 없다.(부모 생성자를 자동 호출 되는 게 아님)&lt;/b&gt; super().__init__() 을 명시해야만 부모 클래스의 생성자를 실행하러 가게 된다. 파이썬에서 오버로딩은 덮어써져서 마지막 거만 남게 되어 파이썬에서는 &lt;b&gt;오버로딩을 사용하지 않는다고&lt;/b&gt; 하며 상속관계의 클래스에서 &lt;b&gt;오버라이딩 된 메서드를 호출하는 건 자바와 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 클래스의 변수 차이&lt;/h2&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;class Food:
    count = 0        # 클래스 변수 - 모든 인스턴스가 공유 java의 static같은느낌

    def __init__(self, name):
        self.name = name
        print(self.name)
        Food.count += 1

f1 = Food(&quot;치킨&quot;)     # count = 1
f2 = Food(&quot;피자&quot;)     # count = 2
f3 = Food(&quot;햄버거&quot;)   # count = 3
print(f1.count)       # 3
print(f2.count)       # 3
print(f3.count)       # 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;self.name은 인스턴스 변수였다면 클래스 변수라는 게 있다. 생성자 밖에 변수를 지정하면 모든 인스턴스가 공유하게 되어 값이 계속 유지하게 된다. 자바에서 static과 같은 느낌이라고 보면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 특수 메서드(special method)란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 정보처리기사에 나올지는 모르겠지만 개인적으로 파이썬을 좋아하는 편이라 공부할 겸 더 정리하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특수 메서드라고도 하며 찾아보니 매직 메서드 (magic method) 또는 던더 메서드 (dunder method)라고도 하는 것 같습니다.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class Dog:
    def __init__(self, name):    # 객체 만들 때 자동
        self.name = name

    def __str__(self):           # print() 할 때 자동
        return self.name

    def __len__(self):           # len() 할 때 자동
        return len(self.name)

    def __eq__(self, other):     # == 비교할 때 자동
        return self.name == other.name

d = Dog(&quot;초코&quot;)
print(d)            # __str__ &amp;rarr; 초코
print(len(d))       # __len__ &amp;rarr; 2
print(d == Dog(&quot;초코&quot;))  # __eq__ &amp;rarr; True&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;예를 들어 print()를 쓰면 &lt;code&gt;__str-__&lt;/code&gt;이 자동으로 호출되고 len()을 쓰면 &lt;code&gt;__len__&lt;/code&gt;이 자동으로 호출되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 인스턴스를 호출하여 조건에 맞게 사용하면 특수메서드가 자동적으로 사용되게 된다.&lt;/p&gt;</description>
      <category>객체지향</category>
      <category>정보처리기사 파이썬</category>
      <category>파이썬상속</category>
      <category>파이썬클래스</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/40</guid>
      <comments>https://san2-dev.tistory.com/40#entry40comment</comments>
      <pubDate>Tue, 3 Mar 2026 01:09:42 +0900</pubDate>
    </item>
    <item>
      <title>Go Programming 시작하기!(go언어란 무엇인가?)</title>
      <link>https://san2-dev.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2009년에 google에서 공개한 오픈소스 프로그래밍 언어로 전설적인 엔지니어 3명(&lt;span&gt;&amp;nbsp;&lt;/span&gt;Rob Pike, Robert Griesemer, Ken Thompson)이 만들기 시작했으며 google내부에서 c++로 개발할 때 겪던 어려움을 해결하기 위해 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;b&gt; 처음부터 실무의 고통에서 출발한 언어다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLCMLC/dJMcaaRXbDm/YK0AaFx9zyWz5GcO33Xi7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLCMLC/dJMcaaRXbDm/YK0AaFx9zyWz5GcO33Xi7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLCMLC/dJMcaaRXbDm/YK0AaFx9zyWz5GcO33Xi7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLCMLC%2FdJMcaaRXbDm%2FYK0AaFx9zyWz5GcO33Xi7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1049&quot; height=&quot;436&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.Go언어에 대해 알아보자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go언어가 가장 유명한이유로&amp;nbsp;동시성(Concurrency)이 언어에 내장되어 있다는 점 이제 배우기 시작해서 깊게 알지는 못하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고루틴( 매우 가벼운 동시 실행 함수)를 사용하며 GC가 있어 메모리 자동관리가 된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스, 상속이 없는 게 특이한 것 같다. &lt;b&gt;구조체(struct), 인터페이스(interface)&lt;/b&gt; 사용하여 개발한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너/클라우드 쪽 인프라가&amp;nbsp; go로 많이 돌아간다고 하며 도커도 go언어로 개발되었다 함.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.Go언어 windows에 설치&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EACdf/dJMcagdyaR5/Vlp5XHlIQb85rSikEk7BHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EACdf/dJMcagdyaR5/Vlp5XHlIQb85rSikEk7BHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EACdf/dJMcagdyaR5/Vlp5XHlIQb85rSikEk7BHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEACdf%2FdJMcagdyaR5%2FVlp5XHlIQb85rSikEk7BHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1908&quot; height=&quot;705&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://go.dev/dl/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 사이트에 접속&lt;/a&gt;해서 운영체제 맞게 다운로드해 주고 아래 명령어로 버전확인(설치 은근 금방 됨)&lt;/p&gt;
&lt;pre id=&quot;code_1772206703999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;go version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXAchs/dJMcafFHtun/YwZxzbGWiIFLXoIHnkYi4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXAchs/dJMcafFHtun/YwZxzbGWiIFLXoIHnkYi4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXAchs/dJMcafFHtun/YwZxzbGWiIFLXoIHnkYi4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXAchs%2FdJMcafFHtun%2FYwZxzbGWiIFLXoIHnkYi4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;228&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode extension에서 해당 익스텐션 설치&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;3.go언어 실행 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go언어는 패키지(폴더) 기반의 실행구조를 가지며 파이썬과 같은 인터프리티 기반의 스크립트언어랑은 정반대이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c, java와 같은 컴파일 기반의 형태로 명확한 시작점(main 함수)을 기준으로 실행되는 방식이다.&lt;/p&gt;
&lt;pre id=&quot;code_1772289420460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;go mod init github.com/아이디/프로젝트명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go mod init 하고 뒤에 모듈명을 적게 되는데 보통 깃허브에 올릴 때 경로를 맞추려고 위에 처럼 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다른 파일에서 import 할 때 go.mod에 적힌 모듈 이름을 기준으로 import 하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA46Iq/dJMcabwwiKX/Szn2myiJJeFc6NrXhb2ULK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA46Iq/dJMcabwwiKX/Szn2myiJJeFc6NrXhb2ULK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA46Iq/dJMcabwwiKX/Szn2myiJJeFc6NrXhb2ULK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA46Iq%2FdJMcabwwiKX%2FSzn2myiJJeFc6NrXhb2ULK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1338&quot; height=&quot;394&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;func main()이 시작점이 되고 패키지 이름은 파일마다 따로가 아니라 &lt;b&gt;폴더 단위로 동일해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 실행하면 같은 패키지에 속한 모든 .go 파일을 컴파일 후 실행하게 됨(폴더 안에 go파일을 실행하는 명령어)&lt;/p&gt;
&lt;pre id=&quot;code_1772290107997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;go run .&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.build 하는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 안에 go언어를 작성하고 난 뒤에 해당 프로젝트 경로에서 아래와 같이 입력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 폴더(프로젝트) 명으로 exe파일이 만들기:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772290484200&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;go build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;exe파일명을 직접 지정 (app.exe로 이름 지정):&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772290581254&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;go build -o app.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>2026golang</category>
      <category>golang시작</category>
      <category>go언어</category>
      <category>동시성언어</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/39</guid>
      <comments>https://san2-dev.tistory.com/39#entry39comment</comments>
      <pubDate>Sat, 28 Feb 2026 23:50:40 +0900</pubDate>
    </item>
    <item>
      <title>깃허브에 팀원 초대해서 협업 하는방법(저장소에 이메일 알림 설정까지)</title>
      <link>https://san2-dev.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;평소에 혼자 개발하다가 이번에 친구랑 같이 개발하기로 해서 이참에 &lt;b&gt;GitHub에서 팀원(협력자)을 초대하는 방법과 이메일 알림 설정을 포스팅하려고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxo5T/dJMcac26KBH/QfrlfC24IWJkquGJmvUw7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxo5T/dJMcac26KBH/QfrlfC24IWJkquGJmvUw7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxo5T/dJMcac26KBH/QfrlfC24IWJkquGJmvUw7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkxo5T%2FdJMcac26KBH%2FQfrlfC24IWJkquGJmvUw7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1360&quot; height=&quot;768&quot; data-filename=&quot;image.jpg&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 깃허브에 팀원 초대&lt;/h2&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/cd4Asr/dJMcaf6COU7/8J9WSfxjK6s8kkKFBNUcCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd4Asr/dJMcaf6COU7/8J9WSfxjK6s8kkKFBNUcCK/img.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;905&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6131%; margin-right: 10px;&quot; data-widthpercent=&quot;50.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd4Asr/dJMcaf6COU7/8J9WSfxjK6s8kkKFBNUcCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd4Asr%2FdJMcaf6COU7%2F8J9WSfxjK6s8kkKFBNUcCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1896&quot; height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtuGkU/dJMcabQGiKs/JVv3VKB6WAiZQ7jaGu3Q6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtuGkU/dJMcabQGiKs/JVv3VKB6WAiZQ7jaGu3Q6k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;916&quot; data-filename=&quot;2.png&quot; style=&quot;width: 49.2241%;&quot; data-widthpercent=&quot;49.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtuGkU/dJMcabQGiKs/JVv3VKB6WAiZQ7jaGu3Q6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtuGkU%2FdJMcabQGiKs%2FJVv3VKB6WAiZQ7jaGu3Q6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1904&quot; height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 깃허브에 새로운 레포지터리를 생성하고 오른쪽 위에 톱니바퀴 아이콘 Settings를 클릭한다. Settings 페이지가 열리면 왼쪽 사이드바에서 Access 카테고리 안에 Collaborators를 바로 찾을 수 있다. Collaborators를 클릭하면 &lt;b&gt;Collaborators and teams 화면이 나타난다.&lt;/b&gt; Manage access에 add people를 클릭하여 팀원을 초대할 수 있다&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/n333G/dJMcaaYxLaf/zqJ60CKKYtPaAkJQz9sY4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n333G/dJMcaaYxLaf/zqJ60CKKYtPaAkJQz9sY4k/img.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;833&quot; data-filename=&quot;3.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.8552%; margin-right: 10px;&quot; data-widthpercent=&quot;50.44&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n333G/dJMcaaYxLaf/zqJ60CKKYtPaAkJQz9sY4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn333G%2FdJMcaaYxLaf%2FzqJ60CKKYtPaAkJQz9sY4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1884&quot; height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vt4tq/dJMcahDmdmW/5bjJZgJhhfMkpJHyGU8HMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vt4tq/dJMcahDmdmW/5bjJZgJhhfMkpJHyGU8HMk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;860&quot; data-filename=&quot;4.png&quot; style=&quot;width: 48.982%;&quot; data-widthpercent=&quot;49.56&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vt4tq/dJMcahDmdmW/5bjJZgJhhfMkpJHyGU8HMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVt4tq%2FdJMcahDmdmW%2F5bjJZgJhhfMkpJHyGU8HMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1911&quot; height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add people를 클릭하면 해당 프로젝트에 팀원을 초대할수 있다. 상대방의 &lt;b&gt;github username이나 email를 입력&lt;/b&gt;하면 위에 이미지 처럼 입력한 값에 맞혀 사용자가 나오고 팀원을 초대할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfkI1l/dJMcai94P7p/Dlm9aRA1GYhphXk3IW2uek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfkI1l/dJMcai94P7p/Dlm9aRA1GYhphXk3IW2uek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfkI1l/dJMcai94P7p/Dlm9aRA1GYhphXk3IW2uek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfkI1l%2FdJMcai94P7p%2FDlm9aRA1GYhphXk3IW2uek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1916&quot; height=&quot;926&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀원으로 초대 할 시 상대방이 깃허브에 입력한 이메일로 초대메일이 전송된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-16 193946-side.png&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sm5Fy/dJMcac26J6r/858RpxFUR6xxqBX4y2Zffk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sm5Fy/dJMcac26J6r/858RpxFUR6xxqBX4y2Zffk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sm5Fy/dJMcac26J6r/858RpxFUR6xxqBX4y2Zffk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSm5Fy%2FdJMcac26J6r%2F858RpxFUR6xxqBX4y2Zffk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;721&quot; height=&quot;500&quot; data-filename=&quot;스크린샷 2026-02-16 193946-side.png&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초대한 팀원의 이메일로는 이렇게 오며 &lt;b&gt;Accept invitation을 누르면 팀원초대가 완료된다.&lt;/b&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/ccy2yo/dJMcaioLt6w/tCDEBywDYd7LOHWhiEKtu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccy2yo/dJMcaioLt6w/tCDEBywDYd7LOHWhiEKtu1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;880&quot; data-filename=&quot;6.png&quot; style=&quot;width: 40.1182%; margin-right: 10px;&quot; data-widthpercent=&quot;40.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccy2yo/dJMcaioLt6w/tCDEBywDYd7LOHWhiEKtu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccy2yo%2FdJMcaioLt6w%2FtCDEBywDYd7LOHWhiEKtu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1906&quot; height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/quJQq/dJMcacvkbTU/M04wjdADa3klLNSSHxjM1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/quJQq/dJMcacvkbTU/M04wjdADa3klLNSSHxjM1K/img.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;288&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.7191%;&quot; data-widthpercent=&quot;59.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/quJQq/dJMcacvkbTU/M04wjdADa3klLNSSHxjM1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FquJQq%2FdJMcacvkbTU%2FM04wjdADa3klLNSSHxjM1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;913&quot; height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collaborators 들어가면 Pending Invite 상태로 보이면 아직 수락 안 한 상태인 거고 수락하게 되면 왼쪽과 같이 뜨게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초대 후 7일 안에 수락 안 하면 자동 만료되며 팀원이 많아지면 팀(Team) 만들어서 초대하는 게 편합니다. (Organization 계정 필요)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.깃허브 저장소에&amp;nbsp;이메일&amp;nbsp;알림&amp;nbsp;설정&lt;/h2&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/bSBp1c/dJMcahQUsqB/xvTYpAYYCRwy3SLYB8Hom0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSBp1c/dJMcahQUsqB/xvTYpAYYCRwy3SLYB8Hom0/img.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;898&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.9976%; margin-right: 10px;&quot; data-widthpercent=&quot;55.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSBp1c/dJMcahQUsqB/xvTYpAYYCRwy3SLYB8Hom0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSBp1c%2FdJMcahQUsqB%2FxvTYpAYYCRwy3SLYB8Hom0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1892&quot; height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWoW3F/dJMcafS6iFp/UToQ8yAGQhkvSwdC7kIv41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWoW3F/dJMcafS6iFp/UToQ8yAGQhkvSwdC7kIv41/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;808&quot; data-filename=&quot;스크린샷 2026-02-14 173926.png&quot; style=&quot;width: 43.8397%;&quot; data-widthpercent=&quot;44.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWoW3F/dJMcafS6iFp/UToQ8yAGQhkvSwdC7kIv41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWoW3F%2FdJMcafS6iFp%2FUToQ8yAGQhkvSwdC7kIv41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1357&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Email notifications에서 Address에 이메일을 적으면 깃허브에 push 될 때마다 이메일이 오게 된다.&lt;/p&gt;</description>
      <category>github,git</category>
      <category>깃허브관리</category>
      <category>깃허브이메일설정</category>
      <category>깃허브팀원초대</category>
      <category>깃허브푸쉬</category>
      <category>깃허브협업</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/38</guid>
      <comments>https://san2-dev.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 16 Feb 2026 21:07:42 +0900</pubDate>
    </item>
    <item>
      <title>2026 클로드 코드 최신 설치방법(powershell에서 irm 방법 사용)</title>
      <link>https://san2-dev.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 코드는 Anthropic에서 만든 터미널 기반의 코딩 에이전트로 비개발자도 좀만 공부하면 흔히 말하는 바이브 코딩툴로도 유명하다. ai가 프로젝트의 전체 구조를 분석하여 &lt;b&gt;리팩토링, 버그수정, 코드생성 등 다양한 작업을 수행한다.&lt;/b&gt; 보통 클로드 유료 요금제 플랜이 있어야 사용하기 편하지만 &lt;b&gt;다른 gemini, gpt, grok 등 다른 ai를 api로 연결하여 사용할 수 있으며&lt;/b&gt; 가격이 저렴한 ai를 api방식으로 연결하여 사용하면 가격적인 면에서 아낄 수도 있다. 클로드 코드 설치 하려면 기본적으로 git을 설치해야 되며 npm으로 설치 시 노드도 당연히 설치돼있어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;noname.png&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mXnxz/dJMcagxDk3D/iOOsSjk5Yr0j5qcAnGZNKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mXnxz/dJMcagxDk3D/iOOsSjk5Yr0j5qcAnGZNKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mXnxz/dJMcagxDk3D/iOOsSjk5Yr0j5qcAnGZNKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXnxz%2FdJMcagxDk3D%2FiOOsSjk5Yr0j5qcAnGZNKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;918&quot; height=&quot;617&quot; data-filename=&quot;noname.png&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. npm 말고 irm, curl로 설치하는 이유&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DcdUc/dJMcaibbrSU/01CCqXpTh6WKACr1gOoCl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DcdUc/dJMcaibbrSU/01CCqXpTh6WKACr1gOoCl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DcdUc/dJMcaibbrSU/01CCqXpTh6WKACr1gOoCl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDcdUc%2FdJMcaibbrSU%2F01CCqXpTh6WKACr1gOoCl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;710&quot; height=&quot;421&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 영상에서 npm으로 설치하지만 최근에 설치하려고 보니 더 이상 사용되지 않는다고 적혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 &lt;b&gt;npm의존성을 없애고 자동업데이트와 설치 안전성을 높이기 위해 npm으로 설치를 추천하지 않는 것 같다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 윈도우 powershell로 설치하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한으로 powershell을 실행한 뒤 아래 명령어를 입력해 줍니다&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;irm https://claude.ai/install.ps1 | iex&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfdmG/dJMcag5vlgU/zmrzyIM9D5BjPHC4s6KFV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfdmG/dJMcag5vlgU/zmrzyIM9D5BjPHC4s6KFV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfdmG/dJMcag5vlgU/zmrzyIM9D5BjPHC4s6KFV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfdmG%2FdJMcag5vlgU%2FzmrzyIM9D5BjPHC4s6KFV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;764&quot; height=&quot;632&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&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;환경변수를 아래와 같이 입력해&lt;/b&gt; 준다.(git이 설치된 경로에 bash.exe를 선택)&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;환경변수 이름 : CLAUDE_CODE_GIT_BASH_PATH
경로 : C:\Program Files\Git\bin\bash.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260210_181836074.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0axwQ/dJMb99ZCJ2M/tm3Qm9zgjT5gjrHz5DYKCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0axwQ/dJMb99ZCJ2M/tm3Qm9zgjT5gjrHz5DYKCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0axwQ/dJMb99ZCJ2M/tm3Qm9zgjT5gjrHz5DYKCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0axwQ%2FdJMb99ZCJ2M%2Ftm3Qm9zgjT5gjrHz5DYKCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;840&quot; height=&quot;780&quot; data-filename=&quot;KakaoTalk_20260210_181836074.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 클로드 코드 설치 후 실행&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGV48f/dJMcaiWvlNL/NvsmDguJo567s05n0BRxzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGV48f/dJMcaiWvlNL/NvsmDguJo567s05n0BRxzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGV48f/dJMcaiWvlNL/NvsmDguJo567s05n0BRxzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGV48f%2FdJMcaiWvlNL%2FNvsmDguJo567s05n0BRxzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1478&quot; height=&quot;801&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 코드를 실행할 프로젝트의 터미널을 열어서 &lt;code&gt;claude&lt;/code&gt; 라고 입력하면 welcome to claude code라고 나오며 터미널 스타일을 고르라고 나온다. 클로드 코드를 어떤 방식으로 로그인하여 사용할지에 대해 선택하라고 나온다. &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.Claude account with subscription &amp;middot; Pro, Max, Team, or Enterprise : 클로드의 유료 요금제(구독계정)를 사용하여 로그인&lt;/li&gt;
&lt;li&gt;2. Anthropic Console account &amp;middot; API usage billing : Anthropic Console에서 api의 형태로 클로드 코드를 사용하는 방법&lt;/li&gt;
&lt;li&gt;3. 3rd-party platform &amp;middot; Amazon Bedrock, Microsoft Foundry, or Vertex AI : Amazon, Microsoft, Google 같은 대기업의 클라우드 서비스를 통해 사용하는 것으로 회사에서 클라우드 서비스랑 같이 관리할 때 사용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DoICx/dJMcaaEdLpF/pQgzN1SfqCJPu53pfaDlA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DoICx/dJMcaaEdLpF/pQgzN1SfqCJPu53pfaDlA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DoICx/dJMcaaEdLpF/pQgzN1SfqCJPu53pfaDlA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDoICx%2FdJMcaaEdLpF%2FpQgzN1SfqCJPu53pfaDlA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;723&quot; height=&quot;318&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;claude&lt;/code&gt; 명령어를 실행하면 위에 내용이 뜨는데 이 프로젝트가 신뢰할 수 있는 프로젝트인지 확인했는지 물어본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 코드가 해당 폴더 안에 개발 물들을 수정, 실행 등 조작해도 되는지에 대한 보안 확인 경고로&lt;b&gt; yes를 누르면 이어서 진행된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTVMlt/dJMcajgM5E9/edlfiE1Jh2pUAbu0fhXRLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTVMlt/dJMcajgM5E9/edlfiE1Jh2pUAbu0fhXRLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTVMlt/dJMcajgM5E9/edlfiE1Jh2pUAbu0fhXRLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTVMlt%2FdJMcajgM5E9%2FedlfiE1Jh2pUAbu0fhXRLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;724&quot; height=&quot;226&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&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;a href=&quot;https://code.claude.com/docs/ko/setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;-클로드 코드 공식 설치 가이드 사이트&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>2026 클로드 코드 설치</category>
      <category>클로드 코드 curl</category>
      <category>클로드 코드 npm</category>
      <category>클로드 코드 설정</category>
      <author>san2222</author>
      <guid isPermaLink="true">https://san2-dev.tistory.com/37</guid>
      <comments>https://san2-dev.tistory.com/37#entry37comment</comments>
      <pubDate>Tue, 10 Feb 2026 19:28:09 +0900</pubDate>
    </item>
  </channel>
</rss>