<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Project Jo</title>
    <link>https://projectjo.tistory.com/</link>
    <description>Project Jo 의 개인 블로그</description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 20:28:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Project Jo</managingEditor>
    <image>
      <title>Project Jo</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2468B348561F2ED502</url>
      <link>https://projectjo.tistory.com</link>
    </image>
    <item>
      <title>Mac에서 Docker를 이용한 n8n 설치 가이드</title>
      <link>https://projectjo.tistory.com/entry/Mac%EC%97%90%EC%84%9C-Docker%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-n8n-%EC%84%A4%EC%B9%98-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Mac에서 Docker Compose를 사용하여 n8n 워크플로우 자동화 도구를 설치하고 실행하는 완벽한 가이드입니다. ffmpeg가 포함된 커스텀 이미지를 사용합니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;사전 요구사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;Homebrew 설치&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;Docker Desktop for Mac 설치 또는 Colima 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. Docker 환경 설정&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;방법 1: Colima 사용 (권장)&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Colima는 경량화된 Docker 런타임으로 Docker Desktop의 대안입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Colima 설치
brew install colima

# Lima 및 추가 게스트 에이전트 설치
brew install lima lima-additional-guestagents

# Colima 시작 (x86_64 아키텍처, 메모리 4GB, CPU 4코어)
colima start --arch x86_64 --memory 4 --cpu 4

# Colima 시작 (aarch64(ARM64) 아키텍처, 메모리 4GB, CPU 4코어)
colima start --arch aarch64 --memory 4 --cpu 4

# Colima 상태 확인
colima status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Lima&amp;nbsp;업그레이드:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 설치되어 있는 경우 최신 버전으로 업그레이드:&lt;/p&gt;
&lt;pre id=&quot;code_1765242842662&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew upgrade lima lima-additional-guestagents&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;방법 2: Docker Desktop 사용&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop을 사용하는 경우 이 단계를 건너뛰고 다음 섹션으로 진행하세요.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. Docker Compose 플러그인 설정&lt;/h2&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# docker-compose 설치
brew install docker-compose

# Docker CLI 플러그인 디렉토리 생성
mkdir -p ~/.docker/cli-plugins

# 심볼릭 링크 생성
ln -s /opt/homebrew/bin/docker-compose ~/.docker/cli-plugins/docker-compose

# 버전 확인
docker compose version&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 프로젝트 디렉토리 생성&lt;/h2&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# n8n 디렉토리 생성 및 이동
mkdir -p ~/Documents/Docker/n8n
cd ~/Documents/Docker/n8n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디렉토리 구조:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765242876782&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n8n/
├── docker-compose.yml
├── Dockerfile
├── data/ # n8n 데이터 저장소
└── files/ # 파일 저장소&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 설정 파일 생성&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Dockerfile&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;FROM n8nio/n8n:latest

USER root
RUN apk update &amp;amp;&amp;amp; apk add --no-cache ffmpeg

# Run as root to avoid permission issues with Docker on Mac
# This is acceptable for local development&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;docker-compose.yml&lt;/h3&gt;
&lt;pre class=&quot;haml&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;services:
  n8n:
    build: .
    container_name: n8n
    ports:
      - &quot;5678:5678&quot;
    environment:
      - TZ=Asia/Seoul
      - GENERIC_TIMEZONE=Asia/Seoul
      - N8N_ENCRYPTION_KEY=MY_SUPER_KEY_123
      - N8N_USER_FOLDER=/data
    volumes:
      - ./data:/data
      - ./files:/files&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환경 변수:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TZ,&amp;nbsp;GENERIC_TIMEZONE:&amp;nbsp;타임존&amp;nbsp;설정&amp;nbsp;(Asia/Seoul)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;N8N_ENCRYPTION_KEY:&amp;nbsp;데이터&amp;nbsp;암호화&amp;nbsp;키&amp;nbsp;(보안을&amp;nbsp;위해&amp;nbsp;변경&amp;nbsp;권장)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;N8N_USER_FOLDER:&amp;nbsp;n8n&amp;nbsp;데이터&amp;nbsp;저장&amp;nbsp;경로&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. n8n 실행&lt;/h2&gt;
&lt;pre class=&quot;haskell&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 데이터 디렉토리 생성 및 권한 설정
mkdir -p ./data ./files
chmod -R 777 ./data ./files

# Docker 이미지 빌드 및 컨테이너 시작
docker compose up -d --build&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;6. 실행 확인&lt;/h2&gt;
&lt;pre class=&quot;nginx&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 로그 확인
docker logs -f n8n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성공 메시지:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765242971106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n8n ready on ::, port 5678
Editor is now accessible via:
http://localhost:5678&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #d4edda; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;nginx&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 컨테이너 상태 확인
docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7. n8n 접속&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;브라우저에서 접속:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;http://localhost:5678&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;초기 접속 시 관리자 계정을 생성합니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;8. 주요 관리 명령어&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너 중지&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너 시작&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너 재시작&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;docker compose restart&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;로그 확인&lt;/h3&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 실시간 로그
docker logs -f n8n

# 최근 로그 100줄
docker logs --tail 100 n8n&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너 상태 확인&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;9. 업데이트&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 최신 n8n 이미지 다운로드 및 재빌드
docker compose pull
docker compose up -d --build&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;10. 데이터 백업 및 복원&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 날짜가 포함된 백업 파일 생성
tar -czf n8n-backup-$(date +%Y%m%d).tar.gz ./data&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;복원&lt;/h3&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 컨테이너 중지
docker compose down

# 백업 파일 압축 해제
tar -xzf n8n-backup-YYYYMMDD.tar.gz

# 컨테이너 재시작
docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;11. 완전 초기화&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;# 컨테이너 및 볼륨 삭제
docker compose down -v

# 캐시 정리
docker system prune -f

# 데이터 디렉토리 재생성
rm -rf ./data ./files
mkdir -p ./data ./files
chmod -R 777 ./data ./files

# 재시작
docker compose up -d --build&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;12. 보안 권장사항&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;암호화 키 변경&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;docker-compose.yml에서 강력한 랜덤 키로 변경:&lt;/p&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;- N8N_ENCRYPTION_KEY=your-strong-random-key-here&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #764ba2; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;랜덤 키 생성 방법&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #2d2d2d; color: #f8f8f2; text-align: start;&quot;&gt;&lt;code&gt;openssl rand -base64 32&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #ffffff; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #ffffff;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** 빠른 시작 요약 **&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #000000; color: #f8f8f2;&quot;&gt;&lt;code&gt;# 1. Colima 설치 및 시작 (선택사항)
brew install colima lima lima-additional-guestagents
colima start --arch x86_64 --memory 4 --cpu 4

# 2. 프로젝트 디렉토리 생성
mkdir -p ~/Documents/Docker/n8n &amp;amp;&amp;amp; cd ~/Documents/Docker/n8n

# 3. Dockerfile 생성
cat &amp;gt; Dockerfile &amp;lt;&amp;lt; 'EOF'
FROM n8nio/n8n:latest

USER root
RUN apk update &amp;amp;&amp;amp; apk add --no-cache ffmpeg

# Run as root to avoid permission issues with Docker on Mac
# This is acceptable for local development
EOF

# 4. docker-compose.yml 생성
cat &amp;gt; docker-compose.yml &amp;lt;&amp;lt; 'EOF'
services:
  n8n:
    build: .
    container_name: n8n
    ports:
      - &quot;5678:5678&quot;
    environment:
      - TZ=Asia/Seoul
      - GENERIC_TIMEZONE=Asia/Seoul
      - N8N_ENCRYPTION_KEY=MY_SUPER_KEY_123
      - N8N_USER_FOLDER=/data
    volumes:
      - ./data:/data
      - ./files:/files
EOF

# 5. 실행
mkdir -p ./data ./files
chmod -R 777 ./data ./files
docker compose up -d --build

# 6. 접속
echo &quot;n8n이 실행되었습니다: http://localhost:5678&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #667eea; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;참고사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;b&gt;데이터 저장:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 워크플로우와 설정은&lt;span&gt;&amp;nbsp;&lt;/span&gt;./data&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉토리에 저장됩니다&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;b&gt;파일 저장:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;워크플로우에서 생성된 파일은&lt;span&gt;&amp;nbsp;&lt;/span&gt;./files&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉토리에 저장됩니다&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;b&gt;포트 변경:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;5678 포트를 변경하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;docker-compose.yml의&lt;span&gt;&amp;nbsp;&lt;/span&gt;ports&lt;span&gt;&amp;nbsp;&lt;/span&gt;섹션을 수정하세요&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;b&gt;로컬 개발용:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 설정은 로컬 개발 환경에 최적화되어 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cgETzZ/dJMcahpo3T5/WHNTrtcamYlZlLxCsKV1Z0/n8n-installation-guide.html?attach=1&amp;amp;knm=tfile.html&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;n8n-installation-guide.html&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CLI</category>
      <category>colima</category>
      <category>docker</category>
      <category>lima</category>
      <category>MAC</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/81</guid>
      <comments>https://projectjo.tistory.com/entry/Mac%EC%97%90%EC%84%9C-Docker%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-n8n-%EC%84%A4%EC%B9%98-%EA%B0%80%EC%9D%B4%EB%93%9C#entry81comment</comments>
      <pubDate>Tue, 9 Dec 2025 10:18:32 +0900</pubDate>
    </item>
    <item>
      <title>코드 리뷰 자동화: LLM을 활용한 접근</title>
      <link>https://projectjo.tistory.com/entry/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0-LLM%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%B3%B4%EC%9E%90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;도입 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 조직에서 머지 리퀘스트(Merge Request)가 쏟아져 들어올 때, 코드 리뷰의 부담은 눈덩이처럼 불어난다. 모든 요청을 꼼꼼히 확인하려면 많은 시간이 소요되고, 반대로 대충 넘어가자니 잠재적인 오류나 보안 문제가 걱정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이 과정을 누군가 대신 도와줄 수 있다면 얼마나 좋을까?&amp;rdquo;라는 고민이 반복되던 시점에, 우리는 떠올렸다. 바로 &lt;b&gt;AI 기반 코드 리뷰&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;그림1.png&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;1815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXG1eC/btsQ05BYqqO/m4gXvp32GK5AdUo2hVVcdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXG1eC/btsQ05BYqqO/m4gXvp32GK5AdUo2hVVcdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXG1eC/btsQ05BYqqO/m4gXvp32GK5AdUo2hVVcdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXG1eC%2FbtsQ05BYqqO%2Fm4gXvp32GK5AdUo2hVVcdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;277&quot; height=&quot;323&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;1815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;아키텍처 및 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 ChatGPT와 같은 LLM(Language Model)을 열어 직접 붙여 넣고 결과를 확인하는 방식은 반복적이고 비효율적이다. 실제 개발 프로세스에 적용하려면 자동화가 필수적이다.&lt;/p&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;534&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 &lt;b&gt;CI/CD 파이프라인과 LLM을 연동한 자동화 시나리오&lt;/b&gt;를 설계할 수 있다.&lt;br /&gt;흐름: Merge Request &amp;rarr; Pipeline Trigger &amp;rarr; Worker &amp;rarr; LLM 요청 &amp;rarr; 자동 리뷰 결과 생성&lt;/p&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;534&quot; data-ke-size=&quot;size16&quot;&gt;이 아키텍처를 기반으로 하면, 코드 리뷰 과정에서 LLM을 보조 리뷰어로 활용하는 것이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;3648&quot; data-origin-height=&quot;1482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V5eVC/btsQ0ACeJ5U/gIWVT4fbp16ATiSH0EQLhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V5eVC/btsQ0ACeJ5U/gIWVT4fbp16ATiSH0EQLhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V5eVC/btsQ0ACeJ5U/gIWVT4fbp16ATiSH0EQLhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV5eVC%2FbtsQ0ACeJ5U%2FgIWVT4fbp16ATiSH0EQLhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;3648&quot; height=&quot;1482&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;3648&quot; data-origin-height=&quot;1482&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;AI 코드 리뷰 접근 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코드 리뷰를 효과적으로 적용하기 위해 다음과 같은 원칙을 정립했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 열할 부여&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 일반적으로 자유롭게 답변을 생성하기 때문에, 리뷰 단계에서는 명확한 **역할(Role)**을 먼저 지정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1759366943064&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;당신은 엄격하고 꼼꼼하며 타협하지 않는 코드 검토자이며, 정보를 절대 조작하지 않습니다. 만약 불확실하다면, 그 불확실성과 결정을 내리기 위해 필요한 추가 증거를 명확하게 제시하십시오.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 리뷰 기준 정립&lt;/h4&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 data-end=&quot;988&quot; data-start=&quot;976&quot;&gt;출력 언어 통일&lt;/li&gt;
&lt;li data-end=&quot;1004&quot; data-start=&quot;989&quot;&gt;사전 조건 검사 여부&lt;/li&gt;
&lt;li data-end=&quot;1019&quot; data-start=&quot;1005&quot;&gt;런타임 오류 가능성&lt;/li&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;1020&quot;&gt;성능 최적화 포인트&lt;/li&gt;
&lt;li data-end=&quot;1048&quot; data-start=&quot;1035&quot;&gt;보안 취약점 탐지&lt;/li&gt;
&lt;li data-end=&quot;1064&quot; data-start=&quot;1049&quot;&gt;사실성(환각) 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1759367049388&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 출력 언어
한국어로만 응답합니다.

2. 사전 조건 검사
각 함수/메서드가 제대로 작동하는 데 필요한 모든 사전 조건을 갖추고 있는지 확인합니다.

3. 런타임 오류 검사
런타임 오류 또는 불안정한 동작을 유발할 수 있는 코드를 식별합니다.

4. 최적화
패치에서 최적화 가능성을 정확히 파악하십시오.

5. 보안 문제
코드가 취약한 모듈을 사용하거나 보안 취약점을 유발하는지 확인하십시오.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 응답 형식 고정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리뷰 결과가 일관되지 않으면 활용하기 어렵다. 따라서 &lt;b&gt;포맷을 고정&lt;/b&gt;해 리뷰 결과를 규칙적으로 제공하도록 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1759367215326&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;요약: 핵심 리스크와 권장 조치(3~5줄).
세부 점검 결과 (각 항목은 아래 구조를 따름)
범주: Pre-Condition / Runtime Error / Optimization / Security
심각도: Critical / High / Medium / Low
신뢰도: High / Medium / Low
위치: 파일/라인 또는 관련 코드 인용
문제 설명(왜 문제인지)
영향(실행/보안/성능/유지보수성)
수정 제안(코드 스니펫 포함)
개선된 코드 예시: 필요한 부분만 최소한으로 제시.
추가 권장 사항: 테스트 케이스, 로그/모니터링, 문서화 제안.
리포트:
탐지된 이슈 총 개수
각 범주별 이슈 건수 요약
주요 이슈들을 간단히 다시 점검 및 요약&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 결과&lt;/h4&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;942&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cteKKu/btsQ1sRmM0r/ADWGsOrqXCw7L7T0ML5kh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cteKKu/btsQ1sRmM0r/ADWGsOrqXCw7L7T0ML5kh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cteKKu/btsQ1sRmM0r/ADWGsOrqXCw7L7T0ML5kh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcteKKu%2FbtsQ1sRmM0r%2FADWGsOrqXCw7L7T0ML5kh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;942&quot; height=&quot;1344&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Next Step&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 기반 코드 리뷰는 시작 단계일 뿐이다. 다음과 같은 고도화를 통해 더욱 실질적인 가치를 창출할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 인라인 코멘트 자동화&lt;br /&gt;리뷰 결과를 단순 텍스트로 제공하는 것을 넘어, 실제 코드 라인에 직접 코멘트를 삽입해 개발자가 빠르게 확인할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 코드 가이드 적용&lt;br /&gt;사내 코드 스타일 가이드와 연동해, 일관성 있는 코드 품질을 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 시큐어코드 가이드 적용&lt;br /&gt;최근 중요성이 높아지고 있는 보안 영역을 고려하여, 시큐어코드 가이드라인을 기반으로 보안 검증을 자동화한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, LLM을 코드 리뷰 프로세스에 도입하면 &lt;b&gt;생산성 향상, 품질 보증, 보안 강화&lt;/b&gt;라는 세 마리 토끼를 잡을 수 있다. 앞으로의 과제는 이 과정을 개발 환경에 자연스럽게 녹여내고, 조직의 코드 품질 문화를 한 단계 끌어올리는 것이다.&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/80</guid>
      <comments>https://projectjo.tistory.com/entry/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0-LLM%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%B3%B4%EC%9E%90#entry80comment</comments>
      <pubDate>Thu, 2 Oct 2025 10:13:57 +0900</pubDate>
    </item>
    <item>
      <title>WSL (Windows Subsystem for Linux)</title>
      <link>https://projectjo.tistory.com/entry/WSL-Windows-Subsystem-for-Linux</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발 환경을 위해 MAC 에서 작업하는 경우 Docker 를 이용해 리눅스를 개발하면 된다.&lt;br /&gt;하지만 윈도우에서 개발하기에는 지금까지 VirtualBox 에 리눅스를 올려 작업하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 정전으로 인해 vbox 파일이 깨지며 조금더 안정적인 방법을 찾아보던중 WSL 의 존제를 알게 되었다.&lt;br /&gt;WSL + VS Code 를 이용한 개발 환경 구축에 흥미를 느꼈고, 진행한 내용을 여기에 정리한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-20 오후 5.01.17.png&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r63J8/btsN4anopew/1DFpK7FekhUumgBweinNrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r63J8/btsN4anopew/1DFpK7FekhUumgBweinNrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r63J8/btsN4anopew/1DFpK7FekhUumgBweinNrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr63J8%2FbtsN4anopew%2F1DFpK7FekhUumgBweinNrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;789&quot; height=&quot;531&quot; data-filename=&quot;스크린샷 2025-05-20 오후 5.01.17.png&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;531&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 data-ke-size=&quot;size16&quot;&gt;Microsoft Store 에서 WSL 을 설치 한다. (이전에는 Windows PowerShell에서 wsl --install를 입력 했지만 이제는 딸깍! 한번!)&lt;/p&gt;
&lt;figure id=&quot;og_1747962701173&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;Windows Subsystem for Linux - Microsoft Apps&quot; data-og-description=&quot;Windows Subsystem for Linux lets developers run a GNU/Linux environment -- including most command-line tools, utilities, and applications -- directly on Windows, unmodified, without the overhead of a traditional virtual machine or dualboot setup.&quot; data-og-host=&quot;apps.microsoft.com&quot; data-og-source-url=&quot;https://apps.microsoft.com/detail/9p9tqf7mrm4r?hl=ko-KR&amp;amp;gl=KR&quot; data-og-url=&quot;https://apps.microsoft.com/detail/9p9tqf7mrm4r?gl=KR&amp;amp;hl=ko-KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bpgYRS/hyYU6VnUBa/QroH3eK4491D9cpkZcdU0K/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/sYZJh/hyYVfrgycT/1Bmly9l7xv07KQFnJGBiM0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9p9tqf7mrm4r?hl=ko-KR&amp;amp;gl=KR&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://apps.microsoft.com/detail/9p9tqf7mrm4r?hl=ko-KR&amp;amp;gl=KR&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bpgYRS/hyYU6VnUBa/QroH3eK4491D9cpkZcdU0K/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/sYZJh/hyYVfrgycT/1Bmly9l7xv07KQFnJGBiM0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;Windows Subsystem for Linux - Microsoft Apps&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Windows Subsystem for Linux lets developers run a GNU/Linux environment -- including most command-line tools, utilities, and applications -- directly on Windows, unmodified, without the overhead of a traditional virtual machine or dualboot setup.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;apps.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 설치 했지만 동작하지 않는 경우가 종종 있는 PC 를 보았다.&lt;br /&gt;문제가 있는경우 Windows PowerShell 을 관리자 권한으로 실행하고 wsl --install 을 입력해 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. OS 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 Microsoft Store 에서 Ubuntu 를 검색해서 다운로드 한다. (딸깍!)&lt;/p&gt;
&lt;figure id=&quot;og_1747963162384&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;Ubuntu - Windows에서 무료 다운로드 및 설치 | Microsoft Store&quot; data-og-description=&quot;Install a complete Ubuntu terminal environment in minutes with Windows Subsystem for Linux (WSL). Develop cross-platform applications, improve your data science or web development workflows and manage IT infrastructure without leaving Windows. Key features&quot; data-og-host=&quot;apps.microsoft.com&quot; data-og-source-url=&quot;https://apps.microsoft.com/detail/9pdxgncfsczv&quot; data-og-url=&quot;https://apps.microsoft.com/detail/9pdxgncfsczv?hl=ko-KR&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bppIqN/hyYWShyF9m/KtiHLSnELZkCuXZUXkezhK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/c3oTcL/hyYW16Dfjv/ood9zeYGlqgktm1q0E1rtk/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225&quot;&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9pdxgncfsczv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://apps.microsoft.com/detail/9pdxgncfsczv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bppIqN/hyYWShyF9m/KtiHLSnELZkCuXZUXkezhK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/c3oTcL/hyYW16Dfjv/ood9zeYGlqgktm1q0E1rtk/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225');&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;Ubuntu - Windows에서 무료 다운로드 및 설치 | Microsoft Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Install a complete Ubuntu terminal environment in minutes with Windows Subsystem for Linux (WSL). Develop cross-platform applications, improve your data science or web development workflows and manage IT infrastructure without leaving Windows. Key features&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;apps.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 Ubuntu 를 실행한다.... 끝...!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-23 오전 10.27.11.png&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYdhK0/btsN91vS41W/EqQNkkaqiqnQ3JKKK7Azbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYdhK0/btsN91vS41W/EqQNkkaqiqnQ3JKKK7Azbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYdhK0/btsN91vS41W/EqQNkkaqiqnQ3JKKK7Azbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYdhK0%2FbtsN91vS41W%2FEqQNkkaqiqnQ3JKKK7Azbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1114&quot; height=&quot;627&quot; data-filename=&quot;스크린샷 2025-05-23 오전 10.27.11.png&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;627&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;4. Rocky OS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rocky OS 는 Microsoft Store 에서 제공하지 않는다. 이럴때는 명령어를 통해 직접 이미지를 넣어주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1747964805025&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# wsl --import &amp;lt;machine-name&amp;gt; &amp;lt;path-to-vm-dir&amp;gt; &amp;lt;path-to/rocky-9-image.tar.xz&amp;gt; --version 2
wsl --import RockyLinux9 RockyLinux9 .\Downloads\Rocky-9-Container-Base.latest.x86_64.tar.xz --version 2&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;/p&gt;
&lt;figure id=&quot;og_1747963902218&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;Rocky Linux를 WSL 또는 WSL2로 가져오기 - Documentation&quot; data-og-description=&quot;wsl wsl2 상호 운용성 윈도우Rocky Linux를 WSL로 가져오기필요 사항Windows Subsystem for Linux 기능이 활성화되어 있어야 합니다. 이를 위해서 다음 중 하나의 방법을 사용할 수 있습니다.매우 최근에 Microso&quot; data-og-host=&quot;docs.rockylinux.org&quot; data-og-source-url=&quot;https://docs.rockylinux.org/ko/guides/interoperability/import_rocky_to_wsl/&quot; data-og-url=&quot;https://docs.rockylinux.org/ko/guides/interoperability/import_rocky_to_wsl/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.rockylinux.org/ko/guides/interoperability/import_rocky_to_wsl/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.rockylinux.org/ko/guides/interoperability/import_rocky_to_wsl/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Rocky Linux를 WSL 또는 WSL2로 가져오기 - Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;wsl wsl2 상호 운용성 윈도우Rocky Linux를 WSL로 가져오기필요 사항Windows Subsystem for Linux 기능이 활성화되어 있어야 합니다. 이를 위해서 다음 중 하나의 방법을 사용할 수 있습니다.매우 최근에 Microso&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.rockylinux.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 메뉴를 눌러 설치된 RockyLinux9 를 실행한다. (딸깍!)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-23 오전 10.49.58.png&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPI37/btsN7UrJ5rL/kB5HqTcYfCxAKj9aMyUNYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPI37/btsN7UrJ5rL/kB5HqTcYfCxAKj9aMyUNYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPI37/btsN7UrJ5rL/kB5HqTcYfCxAKj9aMyUNYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPI37%2FbtsN7UrJ5rL%2FkB5HqTcYfCxAKj9aMyUNYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1114&quot; height=&quot;631&quot; data-filename=&quot;스크린샷 2025-05-23 오전 10.49.58.png&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;631&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;5. systemctl&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL 로 구성된 Linux 시스템은 기본적으로 systemd 명령의 사용이 꺼져있다.&lt;br /&gt;&quot;vi /etc/wsl.conf&quot; 로 파일을 열고 다음줄을 추가하여 systemd에 사용되는 init를 변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1748221469146&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[boot]
systemd=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell에서 명령 wsl.exe --shutdown 를 이용해 사용하여 모든 WSL 인스턴스를 다시 시작한다.&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;6. VS Code 연동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장앱 에서 Remote Development 을 검색하여 설치해준다. (이후 Docker 나 기타 접속 확장을 위해)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-26 오전 10.11.58.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzVKYR/btsObIw6mLr/H5Qxo57ixtV7cueDNJFPj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzVKYR/btsObIw6mLr/H5Qxo57ixtV7cueDNJFPj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzVKYR/btsObIw6mLr/H5Qxo57ixtV7cueDNJFPj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzVKYR%2FbtsObIw6mLr%2FH5Qxo57ixtV7cueDNJFPj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1606&quot; height=&quot;458&quot; data-filename=&quot;스크린샷 2025-05-26 오전 10.11.58.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격 탐색기 에서 설치된 WSL 을 눌러 접속하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-23 오전 11.04.06.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xgnA7/btsN81pGYCB/pFhiH5ZqkpKXTCESeXZkGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xgnA7/btsN81pGYCB/pFhiH5ZqkpKXTCESeXZkGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xgnA7/btsN81pGYCB/pFhiH5ZqkpKXTCESeXZkGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxgnA7%2FbtsN81pGYCB%2FpFhiH5ZqkpKXTCESeXZkGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;760&quot; data-filename=&quot;스크린샷 2025-05-23 오전 11.04.06.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;760&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;7. 패키지 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL 에 설치된 OS 는 정말 최소한 구동만 가능한 OS 이다.&lt;br /&gt;내가 사용해야 하는 Rocky 서버는 GUI 설치 화면에서 Minimal Install -&amp;gt; Standard, Development Tools 을 선택 해서 설치하기에 추가적인 패키지 설치가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 명령어로 설치하고, 권한이 없는경우 앞에 sudo 를 추가해 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1748308542933&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dnf groupinstall &quot;Server&quot; --allowerasing
dnf groupinstall &quot;Development Tools&quot; --allowerasing&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;8. 포트 포워딩&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL 환경은 외부 환경에서 접속이 되지 않는다.&lt;br /&gt;SSH 나 웹을 외부에서 접근하려면 포트 포워딩을 해줘야 하는데, VSCode 에 있는 포트 포워딩은 Private 으로 내부 PC 에서만 사용하기에 적용이 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;다음 코드를 ports_wsl.ps1 라는 이름으로 적용하고, PowerShell 을 관리자 권한으로 실행 후 스크립트를 동작 시킨다.&lt;br /&gt;(PC 를 재부팅하면 WSL 의 IP 주소가 바뀌기 때문에, 재부팅 후 항상 코드를 실행해 주자.)&lt;/p&gt;
&lt;pre id=&quot;code_1748308801449&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# WSL 2에서 IP 주소 가져오기
$remoteport = bash.exe -c &quot;ifconfig eth0 | grep 'inet '&quot;
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo &quot;The Script Exited, the ip address of WSL 2 
cannot be found&quot;;
  exit;
}

#[Ports]
#전달하려는 모든 포트를 쉼표로 구분하여 입력하세요.
$ports=@(80, 443, 22);


#[Static ip]
#특정 주소를 수신하려면 IP 구성의 주소를 변경할 수 있습니다.
$addr='0.0.0.0';
$ports_a = $ports -join &quot;,&quot;;


#방화벽 예외 규칙 제거
iex &quot;Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' &quot;;

#인바운드 및 아웃바운드 규칙에 대한 예외 규칙 추가
iex &quot;New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP&quot;;
iex &quot;New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP&quot;;

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex &quot;netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr&quot;;
  iex &quot;netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport&quot;;
}

#포트 포워딩 설정 정보를 확인
Invoke-Expression &quot;netsh interface portproxy show v4tov4&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행중 &quot;이 시스템에서 스크립트를 실행할 수 없으므로 C:wsl_port.ps1 파일을 로드할 수 없습니다&quot; 에러가 발생하면 다음 명령어를 실행후 다시 시도한다.&lt;/p&gt;
&lt;pre id=&quot;code_1748309965373&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Developer</category>
      <category>Rocky</category>
      <category>ubuntu</category>
      <category>Windows Subsystem for Linux</category>
      <category>wsl</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/79</guid>
      <comments>https://projectjo.tistory.com/entry/WSL-Windows-Subsystem-for-Linux#entry79comment</comments>
      <pubDate>Tue, 20 May 2025 17:05:37 +0900</pubDate>
    </item>
    <item>
      <title>파인 튜닝(Fine-tuning) + 양자화(Quantization) #3</title>
      <link>https://projectjo.tistory.com/entry/%ED%8C%8C%EC%9D%B8-%ED%8A%9C%EB%8B%9DFine-tuning-%EC%96%91%EC%9E%90%ED%99%94Quantization-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글 코랩을 이용한 파인 튜닝 코드를 작성하다 보면 다들 된다는 내용이 나는 되지 않는걸 확인할수 있다.&lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. colab&amp;nbsp;환경에서&amp;nbsp;필요한&amp;nbsp;라이브러리&amp;nbsp;설치&lt;/h3&gt;
&lt;pre id=&quot;code_1747615133243&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title colab 환경에서 필요한 라이브러리 설치
!pip install -q transformers datasets peft accelerate bitsandbytes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 허깅페이스&amp;nbsp;로그인&lt;/h3&gt;
&lt;pre id=&quot;code_1747615162122&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 허깅페이스 로그인
from huggingface_hub import notebook_login
notebook_login()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 데이터&amp;nbsp;준비&amp;nbsp;(전채를&amp;nbsp;학습하는&amp;nbsp;코드)&lt;/h3&gt;
&lt;pre id=&quot;code_1747615272748&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 데이터 준비 (전채를 학습하는 코드)
from datasets import Dataset
import requests

# 텍스트 다운로드
url = &quot;https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt&quot;
text = requests.get(url).text

# 문단 단위로 쪼개기 (대사 기준)
lines = text.strip().split(&quot;\n&quot;)
dialogues = [line.strip() for line in lines if line.strip() != &quot;&quot;]

# Hugging Face Dataset 생성
dataset = Dataset.from_dict({&quot;text&quot;: dialogues})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 데이터&amp;nbsp;준비&amp;nbsp;(1000&amp;nbsp;라인만&amp;nbsp;학습하는&amp;nbsp;코드)&lt;/h3&gt;
&lt;pre id=&quot;code_1747615297359&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 데이터 준비 (1000 라인만 학습하는 코드)
from datasets import Dataset
import requests

# Shakespeare 텍스트 다운로드
url = &quot;https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt&quot;
text = requests.get(url).text

# 줄 단위로 분리하고 처음 1000줄만 사용
lines = text.strip().split(&quot;\n&quot;)
limited_lines = lines[:1000]  # 처음 1000줄만 사용

# 전처리: 빈 줄 제거 및 좌우 공백 제거
clean_lines = [line.strip() for line in limited_lines if line.strip() != &quot;&quot;]

# 데이터셋으로 변환
dataset = Dataset.from_dict({&quot;text&quot;: clean_lines})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 토크나이저&amp;nbsp;로딩&amp;nbsp;및&amp;nbsp;전처리&lt;/h3&gt;
&lt;pre id=&quot;code_1747615322859&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 토크나이저 로딩 및 전처리
from transformers import AutoTokenizer

model_id = &quot;meta-llama/Llama-3.2-1B&quot;
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token

def tokenize(example):
    return tokenizer(example[&quot;text&quot;], truncation=True, padding=&quot;max_length&quot;, max_length=256)

tokenized_dataset = dataset.map(tokenize, batched=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 모델&amp;nbsp;준비&amp;nbsp;(LoRA&amp;nbsp;적용)&lt;/h3&gt;
&lt;pre id=&quot;code_1747615346159&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 모델 준비 (LoRA 적용)
from transformers import AutoModelForCausalLM
from peft import get_peft_model, LoraConfig, TaskType

base_model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map=&quot;auto&quot;,  # Colab GPU 사용
    torch_dtype=&quot;auto&quot;
)

# LoRA 구성
peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,
    lora_alpha=16,
    lora_dropout=0.1,
    bias=&quot;none&quot;
)

model = get_peft_model(base_model, peft_config)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. Trainer를&amp;nbsp;이용한&amp;nbsp;파인튜닝&lt;/h3&gt;
&lt;pre id=&quot;code_1747615372077&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title Trainer를 이용한 파인튜닝
from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling

training_args = TrainingArguments(
    output_dir=&quot;./llama-shakespeare&quot;,
    per_device_train_batch_size=4,
    num_train_epochs=3,
    logging_steps=10,
    save_steps=100,
    save_total_limit=1,
    report_to=&quot;none&quot;,
    fp16=True  # mixed precision
)

data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer, mlm=False
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
    data_collator=data_collator
)

trainer.train()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 테스트 (대사 스타일로 생성해보기)&lt;/h3&gt;
&lt;pre id=&quot;code_1747615408364&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#@title 테스트: 대사 스타일로 생성해보기
prompt = &quot;First Citizen:\n&quot;
inputs = tokenizer(prompt, return_tensors=&quot;pt&quot;).to(&quot;cuda&quot;)

generated_ids = model.generate(
    inputs.input_ids,
    attention_mask=inputs.attention_mask,
    pad_token_id=tokenizer.eos_token_id,
    max_new_tokens=100,
    do_sample=True,
    top_p=0.8,
    top_k=50,
    temperature=1.0,
    repetition_penalty=1.2,
    no_repeat_ngram_size=2
)

print(&quot;--------&quot;)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
print(&quot;--------&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <category>COLAB</category>
      <category>Fine Tuning</category>
      <category>Quantization</category>
      <category>양자화</category>
      <category>파인튜닝</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/78</guid>
      <comments>https://projectjo.tistory.com/entry/%ED%8C%8C%EC%9D%B8-%ED%8A%9C%EB%8B%9DFine-tuning-%EC%96%91%EC%9E%90%ED%99%94Quantization-3#entry78comment</comments>
      <pubDate>Mon, 19 May 2025 09:45:47 +0900</pubDate>
    </item>
    <item>
      <title>Translation API 소개</title>
      <link>https://projectjo.tistory.com/entry/Translation-API-%EC%86%8C%EA%B0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;작년 WWDC 에서 Apple Intelligence 에 너무 집중해서 그런지 좋은 API 의 발표를 못본것 같다.&lt;br /&gt;최근 Create ML APP 을 보면서 이것저것 보다보니 번역 API 가 오픈된 사실을 알았다.&lt;br /&gt;구글의 번역 API 를 사용하지 않고 과금에 걱정 없이 사용할수 있는것 같아 정리 한다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=MuIFhbHNmqA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/DRG3P/hyYRnuHaq8/QpK4GkHEViuwOeSYI0h7Ck/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cjSyGF/hyYPsqaA1n/bXzc5g2Y5KyES5KtO9eCrK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;WWDC24: Meet the Translation API | Apple&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/MuIFhbHNmqA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Translation API 소개&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/iOS</category>
      <category>IOS</category>
      <category>iPadOS</category>
      <category>MacOS</category>
      <category>Translation API</category>
      <category>WWDC24</category>
      <category>번역</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/77</guid>
      <comments>https://projectjo.tistory.com/entry/Translation-API-%EC%86%8C%EA%B0%9C#entry77comment</comments>
      <pubDate>Fri, 9 May 2025 17:33:41 +0900</pubDate>
    </item>
    <item>
      <title>파인 튜닝(Fine-tuning) + 양자화(Quantization) #2</title>
      <link>https://projectjo.tistory.com/entry/%ED%8C%8C%EC%9D%B8-%ED%8A%9C%EB%8B%9DFine-tuning-%EC%96%91%EC%9E%90%ED%99%94Quantization-2</link>
      <description>&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;FineTuning: 메모리 부족으로 llama3.1 8B 를 실행할수 없어서 포기&lt;/li&gt;
&lt;li&gt;Persona: 사전 지식이 많아지면 llama3.1 8B 의 프롬프트 갯수를 초과할수 있는 단점이 있어 포기&lt;/li&gt;
&lt;li&gt;LangChain: 정확도가 떨어지며 속도가 몹시 느려서 포기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Apple 의 메일에서 &quot;머신 러닝 튜토리얼 시작하기&quot; 라는 링크가 보여 클릭해 보니 Xcode 의 Create ML 앱 영상 몇개를 보다보니 WWDC 에서 &quot;Apple GPU에서 머신 러닝 및 AI 모델 학습시키기&quot; 영상이 있는것이 아닌가!!&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=CbmTFTsbyPI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/b8MM9R/hyYTag1yat/ac7SfwvgCie8rRv0ZPolFk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/eLHmq/hyYRlXUwh4/bCvhdaioteSb00Xt7Xk6IK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;WWDC24: Train your machine learning and AI models on Apple GPUs | Apple&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CbmTFTsbyPI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Apple GPU에서 머신 러닝 및 AI 모델 학습시키기&lt;/figcaption&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;영상에 나오는 코드를 작성해서 빌드를 진행 했을때 메모리가 부족해서 에러가 발생 하였다.&lt;br /&gt;모델을 가장 가벼운 'meta-llama/Llama-3.2-1B' 를 진행 했을때도 마찬가지로 메모리가 부족해서 에러가 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 내용을 검색해 보았을때 2가지 이유가 가장 유력해 보인다.&lt;br /&gt;- 아무리 가벼운 모델도 파인튜닝시 메모리를 더 필요로 한다.&lt;br /&gt;- Apple Metal 을 이용한 튜닝에 문제가 있어 메모리를 많이 사용할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아래는 영상에 나오는 코드를 작성한 내용이고,&lt;span&gt; 결국 파인튜닝은 구글 코랩으로 넘어가도록 하겠다....&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747613737792&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기본 라이브러리 임포트: PyTorch와 난수 고정
import torch
import random

# 항상 같은 결과를 얻기 위해 난수 시드 고정
random.seed(24)
torch.manual_seed(24)


# Hugging Face에서 LLaMA 모델과 토크나이저 불러오기
from transformers import LlamaTokenizer, LlamaForCausalLM

# 사용할 사전 학습된 LLaMA 모델 경로 지정
model_ptth = 'openlm-research/open_llama_3b_v2'

# 토크나이저 로드 (오타 수정 필요: legacy=True &amp;rarr; legacy로 고쳐야 함)
tokenizer = LlamaTokenizer.from_pretrained(model_ptth, legacy=True)

# 모델 로드 (오타 수정 필요: 'pretarined' &amp;rarr; 'pretrained')
base_model = LlamaForCausalLM.from_pretrained(model_ptth)


# PEFT(파라미터 효율적 미세조정) 설정: LoRA 사용
from peft import LoraConfig, PeftModel

# LoRA 설정 정의: 적은 수의 학습 가능한 파라미터로 파인튜닝
lora_config = LoraConfig(
    r=16,                 # LoRA 랭크: 병목 크기
    lora_alpha=32,       # 스케일링 인자
    lora_dropout=0.05,   # 드롭아웃 확률
    bias=&quot;none&quot;,         # 기존 모델의 bias는 업데이트하지 않음
    task_type=&quot;CAUSAL_LM&quot;  # 언어 모델링 task임을 지정
)

# 원래 모델에 LoRA 설정 적용 (모델을 어댑터로 감쌈)
model = PeftModel(base_model, lora_config, adapter_name=&quot;Shakespeare&quot;)


# Mac에서 Metal을 사용하는 장치(MPS)로 모델 이동
device = torch.device(&quot;mps&quot;)
model.to(device)


# 학습 데이터가 없으면 다운로드 받아 저장
import os
import requests

file_name = &quot;shakespeare.txt&quot;
url = &quot;https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt&quot;

# 파일이 없다면 인터넷에서 Shakespeare 텍스트 데이터를 다운로드
if not os.path.isfile(file_name):
    data = requests.get(url)
    with open(file_name, &quot;w&quot;) as f:
        f.write(data.text)


# 텍스트 데이터를 토크나이즈하여 학습 데이터셋 생성
from transformers import TextDataset

# 파일을 읽고 128개 토큰 단위로 분할, 처음 256개 블록만 학습에 사용 (학습 속도 테스트용)
train_dataset = TextDataset(tokenizer=tokenizer, file_path=file_name, block_size=128)[:256]


# 학습 설정 정의
from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(
    output_dir=&quot;output&quot;,                 # 학습 결과 저장 폴더
    overwrite_output_dir=True,          # 기존 폴더 덮어쓰기 허용
    num_train_epochs=10,                # 학습 epoch 수
    per_device_train_batch_size=32,     # 배치 크기
    evaluation_strategy=&quot;no&quot;,           # 검증 생략 (간단한 파인튜닝일 경우 생략 가능)
)


# 텍스트 생성 모델을 위한 데이터 정리 도구 정의
from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer,
    mlm=False,  # MLM(Masked Language Model)이 아니라, 다음 단어 예측을 위한 Causal LM
)


# Trainer 클래스를 통해 학습 실행
trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=train_dataset,
)

# 모델 파인튜닝 실행
trainer.train()


# 학습된 모델을 이용해 텍스트 생성 함수 정의
def gennerate_response(prompt_text, model, tokenizer, max_length=30, num_return_sequences=1):
    # 입력 텍스트를 토크나이즈하고, MPS 장치로 이동
    input_ids = tokenizer.encode(prompt_text, return_tensors=&quot;pt&quot;).to(&quot;mps&quot;)

    # 모델을 사용해 텍스트 생성
    output_sequences = model.generate(
        input_ids=input_ids,
        max_length=max_length,              # 최대 생성 길이
        num_return_sequences=num_return_sequences,  # 몇 개의 결과 생성할지
        no_repeat_ngram_size=2              # 같은 n-gram 반복 방지
    )

    # 생성된 결과들을 디코딩하여 리스트에 저장
    responses = []
    for response_id in output_sequences:
        response = tokenizer.decode(response_id, skip_special_tokens=True)
        responses.append(response)

    return responses


# 생성 테스트: 입력 문장을 주고 생성 결과 출력
prompt_text = &quot;Uneasy lies the head that wears a crown.&quot;
responses = gennerate_response(prompt_text, model, tokenizer)
for response in responses:
    print(response)


# 학습한 LoRA 어댑터를 병합한 후 모델 저장
save_path = &quot;merged_fine_tuned_openllama2_3b_shakespeare&quot;

# 토크나이저 저장
tokenizer.save_pretrained(save_path)

# LoRA를 병합하여 최종 모델 생성
merged_model = model.merge_and_unload()

# 최종 모델 저장
merged_model.save_pretrained(save_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <category>AI</category>
      <category>ai 모델 학습시키기</category>
      <category>apple gpu</category>
      <category>Fine Tuning</category>
      <category>Quantization</category>
      <category>WWDC</category>
      <category>양자화</category>
      <category>파인튜닝</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/76</guid>
      <comments>https://projectjo.tistory.com/entry/%ED%8C%8C%EC%9D%B8-%ED%8A%9C%EB%8B%9DFine-tuning-%EC%96%91%EC%9E%90%ED%99%94Quantization-2#entry76comment</comments>
      <pubDate>Fri, 9 May 2025 14:37:19 +0900</pubDate>
    </item>
    <item>
      <title>VS Code Vibe Coding (Claude)</title>
      <link>https://projectjo.tistory.com/entry/VS-Code-Vibe-Coding-Claude</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 + MCP 를 통해 인터넷 검색 권한과 파일 접근 권한을 주고, 바이브 코딩(?) 으로 웹사이트 구축에 성공하였다.&lt;br /&gt;마무리 하고 보니 뭔가 야매 같기도 하고, 코드 편집기도 안쓰니 폼도 안나고...&lt;br /&gt;VS Code 에 Claude 를 넣어 진정한 바이브 코딩을 완성해 보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. VS Code 설치&lt;/h3&gt;
&lt;figure id=&quot;og_1746689683982&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;Download Visual Studio Code - Mac, Linux, Windows&quot; data-og-description=&quot;Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/download&quot; data-og-url=&quot;https://code.visualstudio.com/Download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cm9gnc/hyYRl4t0jO/R5ufujNLyDVvcrtJKlIe31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cm9gnc/hyYRl4t0jO/R5ufujNLyDVvcrtJKlIe31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Download Visual Studio Code - Mac, Linux, Windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Copilot 확장 설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.35.43.png&quot; data-origin-width=&quot;1942&quot; data-origin-height=&quot;1055&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2b1G5/btsNOUkditS/OKcZdBZLIa7S4gYWRfRYBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2b1G5/btsNOUkditS/OKcZdBZLIa7S4gYWRfRYBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2b1G5/btsNOUkditS/OKcZdBZLIa7S4gYWRfRYBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2b1G5%2FbtsNOUkditS%2FOKcZdBZLIa7S4gYWRfRYBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1942&quot; height=&quot;1055&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.35.43.png&quot; data-origin-width=&quot;1942&quot; data-origin-height=&quot;1055&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 괴롭히기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만들어둔 웹 서버 폴더를 열고, 코파일럿에서 &quot;편집 모드&quot; 선택, 모델은 &quot;Claude 3.5 Sonnet&quot; 을 선택한다.&lt;br /&gt;#codebase 를 먼저 입력하고 원하는 내용을 요청한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;#codebase&lt;br /&gt;&lt;br /&gt;지금 열려있는 프로젝트는 도커를 이용한 웹서비스 이다.&lt;br /&gt;최종 목표는 다음 기능이 포함된 웹사이트를 구축하는 것이다.&lt;br /&gt;&lt;br /&gt;1. 회원 가입, 로그인, 탈퇴&lt;br /&gt;2. 개시판을 통한 글쓰기, 수정, 삭제&lt;br /&gt;3. 개시판의 글에 대한 덧글 쓰기, 수정, 삭제&lt;br /&gt;4. 개시판은 모든 사용자가 쓰기 권한이 있는 자유 개시판 n개, 특정 사용자만 쓰기 권한이 있는 게시판 n개&lt;br /&gt;&lt;br /&gt;지금까지 개발된 내용을 확인하고, http://localhost/ 로 접속했을때 표시되는 화면에 회원가입 페이지 링크를 추가해줘.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.42.39.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwyIrS/btsNNS8BOfV/XGHYO6daypQ79sqX8E3RAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwyIrS/btsNNS8BOfV/XGHYO6daypQ79sqX8E3RAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwyIrS/btsNNS8BOfV/XGHYO6daypQ79sqX8E3RAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwyIrS%2FbtsNNS8BOfV%2FXGHYO6daypQ79sqX8E3RAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;541&quot; height=&quot;711&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.42.39.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;711&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 MCP 를 공부하고 권한을 주고 뭐고 열심히 했는데... 한방에 모든것이 해결 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코파일럿의 과금 정책이 있고, 거기에 클로드 사용량에 따른 과금은 또 어떻게 되는지 아직은 잘 파악되지 않았다.&lt;br /&gt;일단 모두 무료로 사용하고 있기에 다음 순서대로 이용하면 무료로도 어느정도의 사이트 개발이 가능해 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VS Code + Copilot + Claude&lt;br /&gt;- Claude + MCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 지금까지 공부하고 내용을 배운것에 만족하며, 바이브 코딩을 마치려 한다.&lt;br /&gt;괴롭히고 괴롭혀서 좋은 테스트 사이트가 완성되면 공유해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;5. 목차&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 92px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;1.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/%ED%81%B4%EB%A1%9C%EB%93%9CClaude-MCP&quot;&gt;클로드(Claude) MCP&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/MCPModel-Context-Protocol&quot;&gt;MCP(Model Context Protocol)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/Claude-Vibe-Coding-1&quot;&gt;Claude Vibe Coding&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://projectjo.tistory.com/entry/VS-Code-Vibe-Coding-Claude&quot;&gt;VS Code Vibe Coding (Claude)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <category>Claude</category>
      <category>Copilot</category>
      <category>vibe coding</category>
      <category>vscode</category>
      <category>바이브코딩</category>
      <category>코파일럿</category>
      <category>클로드</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/75</guid>
      <comments>https://projectjo.tistory.com/entry/VS-Code-Vibe-Coding-Claude#entry75comment</comments>
      <pubDate>Thu, 8 May 2025 16:50:25 +0900</pubDate>
    </item>
    <item>
      <title>Claude Vibe Coding</title>
      <link>https://projectjo.tistory.com/entry/Claude-Vibe-Coding-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 정리를 통해 MCP 를 통해 웹 검색도 가능하게 했고, 파일 시스템에 접근도 가능하게 만들었다.&lt;br /&gt;이제 클로드 AI 를 통한 바이브 코딩의 준비는 모두 마쳤다고 생각 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 개시판 웹 사이트를 만들어 바이브 코딩을 테스트해보자.&lt;br /&gt;조금 오버스팩이 될수도 있지만, 지금 개발중인 컴퓨터의 환경에 최대한 영향을 주지 않는 방향이 필요하기에 Docker 도 사용해 본다. (처음 사용해본다...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Docker Desktop 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별한것 없다... 홈페이지에 들어가서 설치를 진행해준다...&lt;/p&gt;
&lt;figure id=&quot;og_1746602764548&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;Docker: Accelerated Container Application Development&quot; data-og-description=&quot;Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com&quot; data-og-url=&quot;https://www.docker.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f7VeG/hyYMUtOMgy/lNkagwLQ6ESG40zkJyeKUk/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/n4ExT/hyYMTuUvMP/nY53CvWpJrnMnabI5GN9j0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580&quot;&gt;&lt;a href=&quot;https://www.docker.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f7VeG/hyYMUtOMgy/lNkagwLQ6ESG40zkJyeKUk/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/n4ExT/hyYMTuUvMP/nY53CvWpJrnMnabI5GN9j0/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580');&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;Docker: Accelerated Container Application Development&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-07 오후 4.31.21.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I1T40/btsNLZGsgtO/i0ZmNAYc1j2XR8uDQJUwx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I1T40/btsNLZGsgtO/i0ZmNAYc1j2XR8uDQJUwx1/img.png&quot; data-alt=&quot;Doccker Desktop 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I1T40/btsNLZGsgtO/i0ZmNAYc1j2XR8uDQJUwx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1T40%2FbtsNLZGsgtO%2Fi0ZmNAYc1j2XR8uDQJUwx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1276&quot; height=&quot;721&quot; data-filename=&quot;스크린샷 2025-05-07 오후 4.31.21.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Doccker Desktop 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 클로드 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색과 파일 시스템 접근 MCP 를 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1746686736852&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;g-search&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;g-search-mcp&quot;]
    },
    &quot;filesystem&quot;: {
          &quot;command&quot;: &quot;npx&quot;,
          &quot;args&quot;: [
            &quot;-y&quot;,
            &quot;@modelcontextprotocol/server-filesystem&quot;,
            &quot;/Volumes/Jiran External Disk/MyWeb&quot;]
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 클로드 괴롭히기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들고자 하는 홈페이지 기능을 다음과 같이 요청하고 권한 허용 허용 허용 허용 을 눌러준다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;이&amp;nbsp;채팅은&amp;nbsp;웹사이트를&amp;nbsp;만드는&amp;nbsp;바이브&amp;nbsp;코딩을&amp;nbsp;위한&amp;nbsp;채팅이다.&lt;br /&gt;&amp;ldquo;/Volumes/Jiran External Disk/MyWeb&amp;ldquo; 를 루트 폴더로 한다.&lt;br /&gt;&lt;br /&gt;최종 목표는 다음 기능이 포함된 웹사이트를 구축하는 것이다.&lt;br /&gt;1. 회원 가입, 로그인, 탈퇴&lt;br /&gt;2. 개시판을 통한 글쓰기, 수정, 삭제&lt;br /&gt;3. 개시판의 글에 대한 덧글 쓰기, 수정, 삭제&lt;br /&gt;4. 개시판은 모든 사용자가 쓰기 권한이 있는 자유 개시판 n개, 특정 사용자만 쓰기 권한이 있는 게시판 n개&lt;br /&gt;&lt;br /&gt;해당 웹사이트는 Docker 의 컨테이너에서 동작해야 한다.&lt;br /&gt;따라서 가장먼저 Docker 를 실행하기 위한 docker-compose.yml 을 작성한다.&lt;br /&gt;조건은 다음과 같다.&lt;br /&gt;&lt;br /&gt;1. OS 는 rockylinux 9.3 이다.&lt;br /&gt;2. 최신 트랜드에 맞게 기본 구성을 맞춰줘.&lt;br /&gt;&lt;br /&gt;docker-compose.yml 작성이 마무리 되면 docker-compose.yml 를 이용해서 docker 를 실행 하는 방법도 알려줘.&lt;br /&gt;단, docker desktop 을 통한 GUI 방식으로 알려줘.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 혼자서 뭘 계속 만든다.&lt;br /&gt;잠시 기다리면 다음과 같은 말을 쓰면서 도커를 실행해 보라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.05.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJjDY/btsNP6YlG1a/CzSlNrKoNscCA6ed9SExNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJjDY/btsNP6YlG1a/CzSlNrKoNscCA6ed9SExNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJjDY/btsNP6YlG1a/CzSlNrKoNscCA6ed9SExNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJjDY%2FbtsNP6YlG1a%2FCzSlNrKoNscCA6ed9SExNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;419&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.05.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.26.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhp6hE/btsNOh0VXN7/EZD3yBgtSvn99htmyJDIu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhp6hE/btsNOh0VXN7/EZD3yBgtSvn99htmyJDIu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhp6hE/btsNOh0VXN7/EZD3yBgtSvn99htmyJDIu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhp6hE%2FbtsNOh0VXN7%2FEZD3yBgtSvn99htmyJDIu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;695&quot; height=&quot;568&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.26.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.39.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYll8/btsNQqbc1Gz/toL294nqRGzKekaaXVdkp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYll8/btsNQqbc1Gz/toL294nqRGzKekaaXVdkp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYll8/btsNQqbc1Gz/toL294nqRGzKekaaXVdkp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYll8%2FbtsNQqbc1Gz%2FtoL294nqRGzKekaaXVdkp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;722&quot; height=&quot;466&quot; data-filename=&quot;스크린샷 2025-05-08 오후 3.51.39.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 클로드를 믿고 Docker Desktop 에서 실행해 보면 에러가 난다. 다시 괴롭히러 가자. (에러 스크린샷은 찍지 못했다.)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;나&lt;br /&gt;myapp_backend, myapp_frontend 는 실행되지 않았다.&lt;br /&gt;myapp_phppgadmin 은 경고가 표시 되었다. (phppgadmin The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested)&lt;br /&gt;&lt;br /&gt;클로드&lt;br /&gt;플랫폼&amp;nbsp;호환성&amp;nbsp;문제가&amp;nbsp;발생했네요.&amp;nbsp;Apple&amp;nbsp;Silicon(M1/M2)&amp;nbsp;Mac을&amp;nbsp;사용하고&amp;nbsp;계시는&amp;nbsp;것&amp;nbsp;같습니다.&amp;nbsp;Docker&amp;nbsp;구성을&amp;nbsp;수정하여&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;해결해&amp;nbsp;보겠습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대답을 하고는 다시 이것저것 만지작 거린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.16.47.png&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLDhN/btsNPDPKTMx/wV57bjSm8mKf1GrZiPdTd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLDhN/btsNPDPKTMx/wV57bjSm8mKf1GrZiPdTd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLDhN/btsNPDPKTMx/wV57bjSm8mKf1GrZiPdTd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLDhN%2FbtsNPDPKTMx%2FwV57bjSm8mKf1GrZiPdTd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;688&quot; height=&quot;304&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.16.47.png&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.00.png&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02XCL/btsNOgnvkIf/sKg8GsWu7Vm89ebUVFdaXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02XCL/btsNOgnvkIf/sKg8GsWu7Vm89ebUVFdaXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02XCL/btsNOgnvkIf/sKg8GsWu7Vm89ebUVFdaXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02XCL%2FbtsNOgnvkIf%2FsKg8GsWu7Vm89ebUVFdaXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;703&quot; height=&quot;629&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.00.png&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.14.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdXpFz/btsNNQixjm7/MrFnwjKeIKmjx1ZX0CPWwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdXpFz/btsNNQixjm7/MrFnwjKeIKmjx1ZX0CPWwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdXpFz/btsNNQixjm7/MrFnwjKeIKmjx1ZX0CPWwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdXpFz%2FbtsNNQixjm7%2FMrFnwjKeIKmjx1ZX0CPWwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;522&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.14.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.26.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bll65k/btsNOg16TRA/JNcdDGqv5f8yUbd7qYk5uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bll65k/btsNOg16TRA/JNcdDGqv5f8yUbd7qYk5uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bll65k/btsNOg16TRA/JNcdDGqv5f8yUbd7qYk5uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbll65k%2FbtsNOg16TRA%2FJNcdDGqv5f8yUbd7qYk5uK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;733&quot; height=&quot;584&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.17.26.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;584&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;스크린샷 2025-05-08 오후 4.19.40.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eTjtWE/btsNP9Ox570/MDk6fGEVn6PKuTypy8W6nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eTjtWE/btsNP9Ox570/MDk6fGEVn6PKuTypy8W6nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eTjtWE/btsNP9Ox570/MDk6fGEVn6PKuTypy8W6nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeTjtWE%2FbtsNP9Ox570%2FMDk6fGEVn6PKuTypy8W6nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1597&quot; height=&quot;974&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.19.40.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.21.07.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCQ1Ea/btsNONMrzhu/t7mXoFPA5L1IMaEsCYhnoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCQ1Ea/btsNONMrzhu/t7mXoFPA5L1IMaEsCYhnoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCQ1Ea/btsNONMrzhu/t7mXoFPA5L1IMaEsCYhnoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCQ1Ea%2FbtsNONMrzhu%2Ft7mXoFPA5L1IMaEsCYhnoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;914&quot; height=&quot;435&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.21.07.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;435&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;스크린샷 2025-05-08 오후 4.28.17.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ta18T/btsNNDKyf4D/w9WywmUKr53Uoxykxw9Kn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ta18T/btsNNDKyf4D/w9WywmUKr53Uoxykxw9Kn1/img.png&quot; data-alt=&quot;새 채팅창을 만들어 대화를 이어가면 된다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ta18T/btsNNDKyf4D/w9WywmUKr53Uoxykxw9Kn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fta18T%2FbtsNNDKyf4D%2Fw9WywmUKr53Uoxykxw9Kn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;735&quot; height=&quot;44&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.28.17.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새 채팅창을 만들어 대화를 이어가면 된다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.28.22.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbNrTo/btsNPgUUnuS/cKikqO4Vugem3I8SAST3WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbNrTo/btsNPgUUnuS/cKikqO4Vugem3I8SAST3WK/img.png&quot; data-alt=&quot;무료 사용량을 다 썼다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbNrTo/btsNPgUUnuS/cKikqO4Vugem3I8SAST3WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbNrTo%2FbtsNPgUUnuS%2FcKikqO4Vugem3I8SAST3WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;743&quot; height=&quot;55&quot; data-filename=&quot;스크린샷 2025-05-08 오후 4.28.22.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무료 사용량을 다 썼다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별한 컴파일러 없이 파일 구조만으로 가능한 웹의 경우 바이브 코딩이 몹시 쉽게 가능해 보인다.&lt;br /&gt;최신 기술로 만들어 달라고 해서 구성을 전혀 모르겠지만, 채팅으로 디버깅하며 수정이 가능해 간단한 샘플 프로젝트 정도는 가능해 보인다.&lt;br /&gt;클로드 MCP 를 사용했기에 특별한 과금은 하지 않아도 되고 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅 허용양이나, 코드를 보면서 같이 진행 하기에는 조금 귀찮기도 하고...&lt;br /&gt;조금만 쓰면 사용량이 소진되었다고 투덜거리며 나중에 하라고 하고...&lt;br /&gt;어째든 된다!!!! 편하다!!! ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;5. 목차&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 92px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;1.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/%ED%81%B4%EB%A1%9C%EB%93%9CClaude-MCP&quot;&gt;클로드(Claude) MCP&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/MCPModel-Context-Protocol&quot;&gt;MCP(Model Context Protocol)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/Claude-Vibe-Coding-1&quot;&gt;Claude Vibe Coding&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://projectjo.tistory.com/entry/VS-Code-Vibe-Coding-Claude&quot;&gt;VS Code Vibe Coding (Claude)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <category>Claude</category>
      <category>MCP</category>
      <category>vibe coding</category>
      <category>바이브 코딩</category>
      <category>클로드</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/74</guid>
      <comments>https://projectjo.tistory.com/entry/Claude-Vibe-Coding-1#entry74comment</comments>
      <pubDate>Wed, 7 May 2025 17:11:55 +0900</pubDate>
    </item>
    <item>
      <title>Xcode 용량 확보</title>
      <link>https://projectjo.tistory.com/entry/Xcode-%EC%9A%A9%EB%9F%89-%ED%99%95%EB%B3%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Xcode 용량 확보 필요성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode 를 이용해 프로젝트를 진행 하다보면 용량을 야금야금 먹어 가면서 캐시 파일이 많이 쌓여 PC 사용시 용량이 부족한 경우가 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수동 삭제 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;설정 &amp;gt; 일반 &amp;gt; 저장 공간 &amp;gt; 개발자&quot; 에 들어가면 캐시 파일을 삭제 할수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-07 오전 10.49.15.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzZnaT/btsNLzNYRhp/OM9EfUNBbT336YYsfqHEwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzZnaT/btsNLzNYRhp/OM9EfUNBbT336YYsfqHEwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzZnaT/btsNLzNYRhp/OM9EfUNBbT336YYsfqHEwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzZnaT%2FbtsNLzNYRhp%2FOM9EfUNBbT336YYsfqHEwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;470&quot; height=&quot;392&quot; data-filename=&quot;스크린샷 2025-05-07 오전 10.49.15.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 외부 저장 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 용량이 부족할때마다 이걸 삭제 하면서 다른 개발을 진행 하기에는 불편함이 있어 캐시 파일을 외장 하드로 설정 하도록 했다.&lt;br /&gt;&quot;Xcode &amp;gt; Settings &amp;gt; Locations&quot; 에 보면 Derived Data 와 Archives 가 있다.&lt;br /&gt;2개의 경로를 외장하드 경로로 옮겨주면 캐시 파일과 아카이브 파일은 이제 외장하드에 쌓이게 되어 사용하면서 용량이 늘어나는 일이 없어진다.&lt;br /&gt;(원본 Derived Data = /Users/name/Library/Developer/Xcode/DerivedData, Archives = /Users/name/Library/Developer/Xcode/Archives)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_스크린샷 2025-05-07 오전 10.55.28.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wOnHK/btsNNidekTq/iYkDpESFKfKXOdKend0qxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wOnHK/btsNNidekTq/iYkDpESFKfKXOdKend0qxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wOnHK/btsNNidekTq/iYkDpESFKfKXOdKend0qxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwOnHK%2FbtsNNidekTq%2FiYkDpESFKfKXOdKend0qxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;835&quot; height=&quot;552&quot; data-filename=&quot;edited_edited_스크린샷 2025-05-07 오전 10.55.28.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 저장 방법으로 진행 했을때 용량 확보에는 문제 없음을 확인 했으나 조금 사용해 보니 외장 하드에 쓰고 지우는 시간이 걸려 빌드 및 디버깅 시간이 증가 하였다.&lt;br /&gt;PC 를 살때 RAM 도 중요하지만 용량도 고려대상에 넣어야 할것 같다.... (돈만 있으면...... ㅠ)&lt;/p&gt;</description>
      <category>Developer</category>
      <category>Archives</category>
      <category>derived data</category>
      <category>Xcode</category>
      <category>아카이브</category>
      <category>용량</category>
      <category>캐시</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/73</guid>
      <comments>https://projectjo.tistory.com/entry/Xcode-%EC%9A%A9%EB%9F%89-%ED%99%95%EB%B3%B4#entry73comment</comments>
      <pubDate>Wed, 7 May 2025 10:56:53 +0900</pubDate>
    </item>
    <item>
      <title>MCP(Model Context Protocol)</title>
      <link>https://projectjo.tistory.com/entry/MCPModel-Context-Protocol</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 바이브 코딩을 진행하기 위해 MCP 라는 방법을 소개하고 테스트해 보았다.&lt;br /&gt;아직 Xcode 와 정확히 호환이 되지 않아 잠시 잊고 있었는데, 돌연 좋은 생각이 나서 정리해 보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 란?&lt;br /&gt;AI 모델과 통합된 컨텍스트 상호작용 표준을 구축하기 위한 것!&lt;br /&gt;즉, 웹 검색이 가능한 것 처럼 사용자의 정보를 AI 모델이 가져가 정리하고 검색하고 요약하고 등등등 을 할수 있다는 이야기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 나는 어떤것이 가능한가?&lt;br /&gt;특정 제품에 대한 AI 나, 개인화 비서 같은 기능을 꼭 파인튜닝이나 페르소나를 통해 넣을 필요가 없을수도 있다.&lt;br /&gt;웹 검색을 하듯 AI 가 필요한 정보를 바로바로 제공해 준다면 문제 없이 비슷한 기능을 할수 있을것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개인화 비서&lt;br /&gt;구글의 캘린더, 메일, 연락처 등의 정보를 AI 가 접근할수 있게 MCP 를 만들어 제공하면 Google Gemini 처럼 동작할수 있지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제품 전문가&lt;br /&gt;제품 가이드 문서를 접근할수 있는 MCP 를 만들어 제공하면 오류 코드나 사용법을 AI에게 물어보고 쉽게 가이드를 받을수 있지 않을까?&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 전문가를 만들기 위해서 문서에 접근이 필요하다면 지금도 있는 파일 접근 MCP 를 이용해 가능할것 같은 생각이 들었다.&lt;br /&gt;따라서 다음과 같이 진행하며 확인해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. MCP 서버 설정&lt;/h3&gt;
&lt;figure id=&quot;og_1745889424342&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;servers/src/filesystem at main &amp;middot; modelcontextprotocol/servers&quot; data-og-description=&quot;Model Context Protocol Servers. Contribute to modelcontextprotocol/servers development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem&quot; data-og-url=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dkjkZJ/hyYIfLgtB3/kfBMnqpTaZr8VKQNxNewk1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/co4XRo/hyYIhvzd4a/CLqMFh9137XJzRBewudFfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dkjkZJ/hyYIfLgtB3/kfBMnqpTaZr8VKQNxNewk1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/co4XRo/hyYIhvzd4a/CLqMFh9137XJzRBewudFfk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;servers/src/filesystem at main &amp;middot; modelcontextprotocol/servers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Model Context Protocol Servers. Contribute to modelcontextprotocol/servers development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Claude &amp;gt; 설정 &amp;gt; 개발자 &amp;gt; 설정 편집 을 선택해서 claude_desktop_config.json 파일을 열고 아래의 스크립트를 넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1745889793018&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;filesystem&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [
        &quot;-y&quot;,
        &quot;@modelcontextprotocol/server-filesystem&quot;,
        &quot;/Users/dongsukjo/Desktop/manual&quot;
      ]
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Claude 앱을 완전히 종료하고 다시 실행하면 망치 아이콘이 설정된걸 확인할수 있다.&lt;br /&gt;이제 질문을 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 질문 시간&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LG 건조기 사용 방법 가이드 문서를 다운받아 폴더에 넣고 질문을 진행해 본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-29 오전 10.36.27.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rMeyM/btsND0qMoY7/OxkFp64GqPILfwvugXNL41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rMeyM/btsND0qMoY7/OxkFp64GqPILfwvugXNL41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rMeyM/btsND0qMoY7/OxkFp64GqPILfwvugXNL41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMeyM%2FbtsND0qMoY7%2FOxkFp64GqPILfwvugXNL41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;748&quot; height=&quot;705&quot; data-filename=&quot;스크린샷 2025-04-29 오전 10.36.27.png&quot; data-origin-width=&quot;748&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;PDF 를 읽을수 없네.... 몇 가지 MCP 를 찾아 봤지만 마음에 들지는 않는다...&lt;br /&gt;여기서는 소개만 하고 나는 텍스트 파일로 변환해서 테스트해 보겠다. (소개는 제일 아래에)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-29 오전 10.57.35.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPuIoi/btsNCxwlV7C/dMTzqNwtazsH125DgMVFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPuIoi/btsNCxwlV7C/dMTzqNwtazsH125DgMVFkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPuIoi/btsNCxwlV7C/dMTzqNwtazsH125DgMVFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPuIoi%2FbtsNCxwlV7C%2FdMTzqNwtazsH125DgMVFkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;739&quot; height=&quot;574&quot; data-filename=&quot;스크린샷 2025-04-29 오전 10.57.35.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;574&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;&amp;nbsp;&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;예상한 대로 동작은 잘 하는것 같지만 TXT 파일이 너무 크면 에러가 발생 하는것 같다.&lt;br /&gt;이 또한 파일을 읽고 해당 내용을 AI 에 모두 보내서 찾아 내는것 같다. 페르소나를 설정해 대답을 받는것과 같이 너무 많은 정보는 해당 방법으로는 좀 어려울것 같다.&lt;br /&gt;개인형 비서도 동일한 이유로 너무 많은 정보를 사용하게 되면 어려울것 같고, 얼마나 정보를 잘 정리해서 AI 에게 전달해 주느냐가 중요한것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. PDF MCP 조사 공유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Desktop Commander MCP 를 설치하면 내 컴퓨터를 마음대로 할수 있는것 같다.&lt;br /&gt;추가 필요한 설치도 알아서 하고 뭐... 척척 해낸다고 하는데 너무 권한이 큰것 같은데...?&lt;/p&gt;
&lt;figure id=&quot;og_1745891073062&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - wonderwhy-er/DesktopCommanderMCP: This is MCP server for Claude that gives it terminal control, file system search and &quot; data-og-description=&quot;This is MCP server for Claude that gives it terminal control, file system search and diff file editing capabilities - wonderwhy-er/DesktopCommanderMCP&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/wonderwhy-er/DesktopCommanderMCP&quot; data-og-url=&quot;https://github.com/wonderwhy-er/DesktopCommanderMCP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGXgvq/hyYL94qVgK/81RvqGE6GkXijYx4Jn6k0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_150_1049_219,https://scrap.kakaocdn.net/dn/glKDj/hyYJAWpD05/15fjhWJFJ12LFTk66hMj00/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_150_1049_219&quot;&gt;&lt;a href=&quot;https://github.com/wonderwhy-er/DesktopCommanderMCP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/wonderwhy-er/DesktopCommanderMCP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGXgvq/hyYL94qVgK/81RvqGE6GkXijYx4Jn6k0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_150_1049_219,https://scrap.kakaocdn.net/dn/glKDj/hyYJAWpD05/15fjhWJFJ12LFTk66hMj00/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_150_1049_219');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - wonderwhy-er/DesktopCommanderMCP: This is MCP server for Claude that gives it terminal control, file system search and&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This is MCP server for Claude that gives it terminal control, file system search and diff file editing capabilities - wonderwhy-er/DesktopCommanderMCP&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1745891158101&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;MCP로 PDF 요약, 이미지 추출, 옵시디언 전송, 오디오 파일 생성을 한 번에&quot; data-og-description=&quot;소개 개발자의 대부이자 GOAT인  테디노트님이 [AI 시대 생존 전략] 주제로 오프라인 강의를 했었는데. 아쉽게 당일 참석을 못했었습니다. 하지만 강의 자료를 PDF로 남겨주셨습니다. MCP를 활용해 P&quot; data-og-host=&quot;www.gpters.org&quot; data-og-source-url=&quot;https://www.gpters.org/nocode/post/pdf-summary-image-extraction-BzCMxxv4kD7ZK3o&quot; data-og-url=&quot;https://www.gpters.org/nocode/post/pdf-summary-image-extraction-BzCMxxv4kD7ZK3o&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/M58mz/hyYL6Nn7YZ/Q4yATf3bPapp53GrzNgmh1/img.jpg?width=1000&amp;amp;height=1250&amp;amp;face=0_0_1000_1250,https://scrap.kakaocdn.net/dn/fb4wt/hyYM2wXUN9/kTYBV5XxCegKi8FdbGpRO1/img.jpg?width=1000&amp;amp;height=1250&amp;amp;face=0_0_1000_1250,https://scrap.kakaocdn.net/dn/bXBIW6/hyYMaWzoOW/fbvKxxpSewU14EhFB8JxT1/img.jpg?width=1920&amp;amp;height=2400&amp;amp;face=0_0_1920_2400&quot;&gt;&lt;a href=&quot;https://www.gpters.org/nocode/post/pdf-summary-image-extraction-BzCMxxv4kD7ZK3o&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.gpters.org/nocode/post/pdf-summary-image-extraction-BzCMxxv4kD7ZK3o&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/M58mz/hyYL6Nn7YZ/Q4yATf3bPapp53GrzNgmh1/img.jpg?width=1000&amp;amp;height=1250&amp;amp;face=0_0_1000_1250,https://scrap.kakaocdn.net/dn/fb4wt/hyYM2wXUN9/kTYBV5XxCegKi8FdbGpRO1/img.jpg?width=1000&amp;amp;height=1250&amp;amp;face=0_0_1000_1250,https://scrap.kakaocdn.net/dn/bXBIW6/hyYMaWzoOW/fbvKxxpSewU14EhFB8JxT1/img.jpg?width=1920&amp;amp;height=2400&amp;amp;face=0_0_1920_2400');&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;MCP로 PDF 요약, 이미지 추출, 옵시디언 전송, 오디오 파일 생성을 한 번에&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소개 개발자의 대부이자 GOAT인  테디노트님이 [AI 시대 생존 전략] 주제로 오프라인 강의를 했었는데. 아쉽게 당일 참석을 못했었습니다. 하지만 강의 자료를 PDF로 남겨주셨습니다. MCP를 활용해 P&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.gpters.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커로 서비스를 올리고 뭐 하는것 같은데... PDF 읽으려고 도커까지는 좀...&lt;/p&gt;
&lt;figure id=&quot;og_1745891182434&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - trafflux/pdf-reader-mcp&quot; data-og-description=&quot;Contribute to trafflux/pdf-reader-mcp development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/trafflux/pdf-reader-mcp&quot; data-og-url=&quot;https://github.com/trafflux/pdf-reader-mcp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4dWgs/hyYIfEw951/BKof3gRLAtyeMQUT8SPOqK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bXWIag/hyYMimMDYH/lqg4dCw3CpvuWw4a8n69ak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/trafflux/pdf-reader-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/trafflux/pdf-reader-mcp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4dWgs/hyYIfEw951/BKof3gRLAtyeMQUT8SPOqK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bXWIag/hyYMimMDYH/lqg4dCw3CpvuWw4a8n69ak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - trafflux/pdf-reader-mcp&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to trafflux/pdf-reader-mcp development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;5. 목차&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 92px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;1.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/%ED%81%B4%EB%A1%9C%EB%93%9CClaude-MCP&quot;&gt;클로드(Claude) MCP&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/MCPModel-Context-Protocol&quot;&gt;MCP(Model Context Protocol)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://projectjo.tistory.com/entry/Claude-Vibe-Coding-1&quot;&gt;Claude Vibe Coding&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://projectjo.tistory.com/entry/VS-Code-Vibe-Coding-Claude&quot;&gt;VS Code Vibe Coding (Claude)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Developer/LLM</category>
      <category>Claude</category>
      <category>LLM</category>
      <category>MCP</category>
      <category>클로드</category>
      <author>Project Jo</author>
      <guid isPermaLink="true">https://projectjo.tistory.com/72</guid>
      <comments>https://projectjo.tistory.com/entry/MCPModel-Context-Protocol#entry72comment</comments>
      <pubDate>Tue, 29 Apr 2025 11:03:05 +0900</pubDate>
    </item>
  </channel>
</rss>