HRKLAMP 서버 Git 버전관리 세팅 가이드

결국 오늘 하루종일 업데이트 한 내용이 문제 생겨서 되돌리려고 해보니 너무 오래된 백업파일을 들고옴. git으로 관리 필요.

왜 필요한가?

현재 봇 코드 관리 방식의 문제:

  • .bak, .bak2, .bak3, .corrupted_날짜 등 수동 백업 파일 난립
  • 어떤 변경이 언제 왜 이루어졌는지 추적 불가
  • 패치 스크립트(patch_bot.pyemergency_fix.pysafe_patch_v2.py 등)가 연쇄적으로 쌓임
  • 인코딩 깨짐 등 문제 발생 시 정확한 복원 지점 특정 어려움

Git을 도입하면:

  • 모든 변경이력 자동 기록 (누가, 언제, 무엇을, 왜)
  • 문제 발생 시 git revert 한 줄로 원복
  • .bak 파일 불필요 → 폴더 깨끗해짐

1단계: 서버에서 Git 초기화 (5분)

# SSH 접속
ssh -i "키파일경로" bitnami@13.125.177.27

# thinktank 폴더로 이동
cd /home/bitnami/thinktank

# Git 초기화
git init

# 사용자 정보 설정 (커밋 기록에 남음)
git config user.name "hyungrok"
git config user.email "e@hyungrok.com"

2단계: .gitignore 만들기

불필요한 파일이 추적되지 않도록 설정:

cat > .gitignore << 'EOF'
# Python
__pycache__/
*.pyc

# 로그
*.log

# 백업 (더 이상 필요없음)
*.bak
*.bak2
*.bak3
*.corrupted_*

# 패치 스크립트 (1회성)
patch_*.py
*_fix*.py
deploy_*.py
repatch_*.py
safe_patch*.py

# 환경 파일
.env
EOF

3단계: 첫 커밋

# 핵심 파일만 추가
git add telegram_intake_bot.py
git add restart_bot.sh
git add workspace_sync.py
git add weekly_report.py
git add .gitignore

# 첫 커밋
git commit -m "초기 커밋: 봇 v2.2 + CRM title 기능"

4단계: GitHub 원격 저장소 연결 (선택)

GitHub에 비공개 저장소를 만들면 코드가 클라우드에도 백업됩니다.

# GitHub에서 Private 저장소 생성 후:
git remote add origin https://github.com/본인계정/thinktank-bot.git
git branch -M main
git push -u origin main

GitHub 토큰이 필요합니다. Settings > Developer settings > Personal access tokens에서 생성.


일상 사용법

코드 수정 후 저장

# 변경사항 확인
git diff

# 저장 (커밋)
git add telegram_intake_bot.py
git commit -m "CRM: project_folder 필드 추가"

문제 발생 시 되돌리기

# 직전 커밋으로 되돌리기 (가장 많이 쓸 명령어)
git checkout telegram_intake_bot.py

# 특정 커밋으로 되돌리기
git log --oneline          # 커밋 목록 확인
git checkout abc1234 -- telegram_intake_bot.py   # 해당 시점으로 복원

변경 이력 보기

# 최근 커밋 목록
git log --oneline -10

# 특정 파일의 변경 이력
git log --oneline telegram_intake_bot.py

# 두 시점 비교
git diff abc1234 def5678 -- telegram_intake_bot.py

주요 명령어 요약

상황 명령어
변경사항 확인 git status / git diff
변경 저장 git add 파일명 && git commit -m "설명"
되돌리기 (파일 하나) git checkout -- 파일명
이력 보기 git log --oneline -10
원격 백업 git push

참고: 기존 백업 파일 정리

Git 세팅 완료 후 기존 .bak*, .corrupted_*, patch_*.py 등은 삭제해도 안전합니다. (Git에 첫 커밋이 들어간 후에 정리하세요)

# 예시: 구 백업 파일 정리
mkdir -p /home/bitnami/thinktank/_old_backups
mv *.bak* *.corrupted_* patch_*.py *_fix*.py deploy_*.py safe_patch*.py _old_backups/
Posted in mm

옵시디언 노트를 AI에게 학습시키는 법 — Claude Code로 나만의 JARVIS 만들기

최근 모든 형태의 파일을 마크다운(Markdown)으로 통일해 주는 Microsoft MarkItDown 사용법을 소개한 적이 있습니다. 만약 이렇게 변환한 마크다운 폴더(Vault)를 단순히 자료 보관용으로만 둔다면 가장 중요한 절반을 놓치고 있는 것입니다.

Obsidian과 Claude가 하나의 Vault를 공유할 때 생기는 진짜 시너지

단순히 "옵시디언 뷰어로 자료를 편하게 보고, 필요할 때 클로드한테 파일을 하나씩 올려준다"는 병렬적인 사용 방식을 넘어, 두 시스템이 마크다운 파일 시스템(Vault)을 시스템 단위에서 완전히 공유할 때 폭발하는 시너지는 다음과 같습니다.

1. Claude가 ‘나의 뇌 구조(맥락)’를 통째로 읽고 답변합니다 생짜 원본 PDF나 엑셀을 브라우저 클로드에 올려주면, AI는 그 문서 내용 하나만 단편적으로 이해하고 뻔한 대답만 늘어놓습니다. 하지만 MarkItDown으로 문서들을 마크다운 변환 후 옵시디언에 넣고, 내가 노트 아래에 [[관련 프로젝트]]나 짧은 코멘트를 덧붙였다고 가정해 보겠습니다. 이후 Claude에게 이 Vault 폴더 전체를 연결해 주면, Claude는 단순 문서를 넘어 “이 실장님이 이 문서를 어떤 프로젝트와 연결 지어 고민하고 있는지” 그 맥락과 관계망까지 통째로 파악해서 훨씬 수준 높고 개인화된 기획안을 도출해냅니다.

2. 복사/붙여넣기가 사라진 완벽한 양방향 업무 흐름 (Closed-loop)

  • 기존 방식: 원본 문서 열기 ➡️ 웹 브라우저 띄워 Claude에 파일 업로드 ➡️ 요약 질문 ➡️ 답변 복사 ➡️ 옵시디언 열기 ➡️ 붙여넣고 마크다운 서식으로 재수정…
  • 시너지 방식:
    1. MarkItDown이 들어오는 모든 자료를 마크다운 텍스트로 통일해 폴더(Vault)에 저장합니다.
    2. 에디터 터미널이나 Claude Code 등 폴더를 열 수 있는 로컬 AI 기반 도구를 열고 "오늘 추가된 회의록과 기존 프로젝트 기획안을 종합해 요약 문서를 만들어줘"라고 지시합니다.
    3. AI가 파일들을 분석하고, 지정한 폴더 안에 직접 새로운 .md 파일을 생성하거나 알아서 내용을 수정해 줍니다.
    4. 이후 옵시디언 창을 열어 보기만 하면, 방금 AI가 작성한 문서가 마크다운 서식(표, 헤딩 등)까지 완벽히 깨진 곳 없이 즉시 뷰어에 나타납니다.

3. 언제든 AI를 갈아탈 수 있는 영원한 데이터 주권 노션이나 에버노트는 그 프로그램이 제공하는 AI만 강제로 써야 하고, 내 마음대로 데이터를 통째로 꺼내 다른 다양한 최신 AI에게 먹이기가 구조적으로 매우 힘듭니다. 반면 내 컴퓨터에 Vault 하나를 튼튼하게 구축해두면 이야기가 달라집니다. 옵시디언은 영구적이고 안전한 지식 저장소 및 뷰어로만 남고, Claude(또는 챗GPT 등 어떤 AI든)는 내 저장소의 텍스트 풀을 처리해주는 지능적인 외주 직원으로 역할이 완벽히 분담됩니다. 내일 당장 더 똑똑한 새 AI 모델이 세상에 나오면, 그냥 그 모델에 내 Vault 폴더 경로만 연결해 주면 그만입니다.

결론적으로 토니 스타크의 JARVIS처럼, 나의 관심사와 업무 히스토리를 데이터 레벨에서 통째로 파악하고 있는 단 하나뿐인 맞춤형 지식 파이프라인(AI 비서)을 구축하는 방법을 아래에 단계별로 소개합니다.


주요 특징 (Key Features)

① Obsidian — 텍스트 파일로 이루어진 개인 지식 데이터베이스

Obsidian은 노트 앱이다. 하지만 결정적인 차이가 있다. 모든 노트가 내 컴퓨터에 .md 텍스트 파일로 저장된다. 클라우드에 종속되지 않고, 구독료가 파일을 볼모로 잡지 않는다. 그리고 텍스트 파일이기 때문에 어떤 프로그램도 읽을 수 있다 — AI 포함.

항목 내용
저장 방식 로컬 .md 마크다운 파일
클라우드 의존 없음 (옵션으로 동기화 가능)
파일 이동성 어떤 텍스트 편집기에서도 열림
AI 연동 가능성 ✅ 폴더 경로만 알면 AI가 직접 읽기 가능

② Claude Code — 브라우저 Claude와 완전히 다른 도구

Claude Code는 Anthropic이 만든 터미널 기반 AI 도구다. 브라우저 Claude와 결정적으로 다른 점 하나: 내 로컬 파일을 직접 읽고 수정한다.

브라우저 Claude는 새 탭을 열 때마다 나를 처음 만난 사람처럼 대한다. Claude Code는 Obsidian vault 폴더를 직접 가리키면 수백 개의 파일을 읽고, 내 글쓰기 패턴과 연구 맥락을 파악한 상태로 답변한다.

③ 연결의 마법 — 내 지식이 AI의 컨텍스트가 된다

두 도구를 연결하면 질문의 성격이 달라진다.

일반 AI 질문 Obsidian + Claude Code 질문
“AI 에이전트가 뭐야?” “내가 기록한 AI 에이전트 관련 메모 전체를 읽고 핵심만 정리해줘”
“보고서 초안 써줘” “내 문체와 논리 구조를 그대로 따라서 이번 달 보고서 초안 만들어줘”
“시장 트렌드 알려줘” “내가 6개월간 기록한 시장 분석 노트에서 반복 등장하는 키워드를 추출해줘”

AI가 인터넷에서 답하는 게 아니라 나의 기록에서 답한다.

④ 활용 범위 — 검색 이상의 작업이 가능하다

  • 수백 개 노트에서 특정 주제 요약
  • 오래된 메모와 최근 메모의 아이디어 연결
  • 내 글쓰기 패턴으로 새 초안 생성
  • 연구 공백 지점 파악 (“이 주제에서 내가 다루지 않은 부분은?”)
  • 커스텀 대시보드 및 자동 요약 브리핑 생성

설치 (Installation)

⚠️ 사전 조건 2가지

  1. Claude Code 구독: claude.ai/code에서 설치 (npm install -g @anthropic-ai/claude-code 또는 공식 설치 페이지 참고)
  2. Obsidian 설치: obsidian.md에서 무료 다운로드. 이미 쓰고 있다면 건너뜀.

Step 1. Claude Code 설치

💡 초보자 가이드: ‘터미널’이란 컴퓨터에 명령어를 직접 입력하는 검은 화면이다. Windows는 시작 → PowerShell 또는 cmd, Mac은 Spotlight → Terminal로 열 수 있다. VS Code를 쓴다면 내부 터미널(Ctrl + `)을 쓰는 게 더 편하다.

# npm이 설치되어 있다면 (Node.js 설치 필요)
npm install -g @anthropic-ai/claude-code

# 설치 확인
claude --version

Step 2. Obsidian vault 폴더로 이동 후 Claude Code 실행

💡 초보자 가이드: cd는 "Change Directory"의 약자로 폴더를 이동하는 명령어다. Obsidian에서 설정 → 파일 및 링크 → Vault 위치를 확인하면 내 노트 폴더 경로를 알 수 있다.

# 내 Obsidian vault 폴더로 이동 (경로는 본인 폴더로 변경)
cd "C:/Users/내이름/Documents/MyVault"

# Claude Code 실행
claude

터미널에 claude> 프롬프트가 뜨면 준비 완료다. 이제 이 위치에서 내린 모든 명령은 내 vault 폴더 전체를 컨텍스트로 사용한다.


사용 (Usage)

기본 — 노트 요약 및 검색

💡 초보자 가이드: Claude Code에서는 프롬프트에 질문을 입력하면 된다. 마치 카카오톡 대화창처럼 텍스트를 입력하고 Enter를 누르면 된다. AI가 vault 폴더 안의 파일들을 직접 열어서 읽는다.

# vault 전체에서 특정 주제 요약
"올해 내가 기록한 AI 관련 메모를 모두 읽고 핵심 주제 3가지로 정리해줘"

# 특정 파일 분석
"meeting-notes 폴더에 있는 회의록들을 읽고 Action Item만 추출해줘"

# 키워드 연결
"'프로젝트 파이낸싱'이 언급된 메모를 모두 찾아서 공통 패턴을 알려줘"

아이디어 연결 — 오래된 메모와 최근 메모 잇기

"3개월 이상 된 리서치 노트와 최근 노트를 비교해서
 같은 주제를 다른 방식으로 다룬 경우가 있으면 연결해줘"

"내가 아직 다루지 않은 리서치 공백 지점을 찾아줘"

글쓰기 초안 — 내 문체로 새 문서 생성

가장 강력한 활용법이다. 기존 노트를 학습한 Claude가 내 문체와 논리 구조를 반영한 초안을 생성한다.

"지난 6개월간 내가 작성한 시장 분석 노트를 기반으로
 이번 분기 보고서 초안을 내 문체 그대로 써줘"

"내 블로그 글 스타일을 분석하고,
 [주제]에 대해 같은 톤으로 초안을 작성해줘"

💡 실사용 결과: 기존에 3시간 이상 걸리던 관련 메모 취합·정리·초안 작성 과정이 5분 내로 단축됐다. 노트가 쌓일수록 AI의 분석 정확도도 올라간다.

노트 자동 생성 — Claude가 직접 파일 만들기

"오늘 회의 내용을 바탕으로 YYYY-MM-DD-회의명.md 파일을
 Obsidian 표준 frontmatter와 함께 생성해줘"

"이번 주 리서치 내용을 요약해서 weekly-summary 폴더에 저장해줘"

유의할 점 (Things to Watch Out For)

1. 이미지와 PDF 내부 텍스트는 읽지 못한다

Claude Code는 .md 텍스트 파일을 완벽하게 읽는다. 하지만 노트 안에 첨부된 이미지 속 텍스트나, PDF 파일 내부 내용은 건너뛰는 경우가 많다. 이미지나 PDF의 내용을 AI가 참조하게 하려면 별도 텍스트 변환 작업이 필요하다.

# PDF → Markdown 변환이 필요하다면 MarkItDown 활용
pip install 'markitdown[pdf]'
markitdown 파일.pdf -o 파일.md

2. 복잡한 폴더 구조와 모호한 파일명은 오류를 유발한다

폴더 구조가 지나치게 깊거나 파일명이 메모1.md, untitled.md 같이 모호하면 Claude가 엉뚱한 파일을 참조하거나 찾지 못할 수 있다.

나쁜 예 좋은 예
메모1.md 2026-03-25-PF사업-검토.md
untitled.md crawl4ai-리서치.md
temp/new/draft/ (3단계 이상 중첩) 리서치/AI도구/ (2단계 이내)

파일명에 핵심 키워드를 포함하는 것이 정확도를 높이는 가장 빠른 방법이다.

3. Claude Code는 파일을 수정·삭제할 수 있다

이것이 브라우저 Claude와의 핵심 차이이자 주의사항이다. Claude Code는 실제로 내 파일을 수정하거나 새 파일을 만든다. 처음 사용할 때는 반드시 수정 전 확인을 요청하는 습관을 들이자.

# 명령어에 확인 조건 추가
"파일을 수정하기 전에 어떤 변경을 할지 먼저 알려줘"

4. vault 크기가 클수록 처리 시간이 늘어난다

수천 개의 파일이 있는 vault에서 전체 검색을 요청하면 응답 시간이 길어진다. 폴더를 특정하는 방식으로 범위를 좁히면 빠르다.

# 전체 검색 (느림)
"모든 메모에서 AI 관련 내용 찾아줘"

# 범위 지정 (빠름)
"리서치/AI 폴더 안에서만 검색해줘"

정리 (Summary)

항목 내용
핵심 조합 Obsidian (로컬 .md vault) + Claude Code (터미널 AI 도구)
차별점 AI가 내 축적된 지식을 컨텍스트로 사용 — 매번 설명 불필요
설치 난이도 낮음 — 터미널에서 cd [vault경로]claude 실행이 전부
가장 강력한 활용 내 문체·논리 구조로 초안 생성 (3시간 → 5분)
지원 파일 형식 .md 텍스트 완벽 지원 / 이미지·PDF 내부 텍스트는 미지원
주의사항 파일명 키워드 포함 필수 / 파일 수정 전 확인 요청 권장
효과 노트가 쌓일수록 AI 정확도 증가 — 데이터가 곧 자산

Obsidian vault에 노트가 쌓여 있을수록 이 조합의 위력은 커진다. vault가 연료고 Claude Code가 엔진이다. 브라우저 AI를 검색 엔진처럼 쓰는 단계에서 벗어나, 내 지식을 증폭시키는 도구로 AI를 쓰고 싶다면 지금 바로 시작할 수 있다.

Claude Code 공식 문서: https://docs.anthropic.com/claude-code Obsidian 공식 사이트: https://obsidian.md

Claude Code 45가지 팁 총정리 — 초급부터 고급까지 핵심만

Claude Code를 쓰다 보면 ‘이걸 진작 알았으면’ 하는 순간이 생긴다. ykdojo가 GitHub에 공개한 45개 팁에서 좋은 팁들을 알아보자.


기초 설정 (Basic Setup)

① 상태줄 커스터마이징 (Tip 0) 처음 설정하고 나면 다시 끄기 싫어진다. 하단에 현재 모델명, git 브랜치, 미커밋 파일 수, 토큰 잔량 바가 떠있으면 작업 중 상황 파악이 훨씬 빠르다.

# 설정 스크립트 한 번에 적용 (아래 Tip 45 스크립트로 자동 포함)
bash <(curl -s https://raw.githubusercontent.com/ykdojo/claude-code-tips/main/scripts/setup.sh)

직접 설정하려면 scripts/README.md를 참고.

② 필수 슬래시 명령어 (Tip 1) 이것만 외워도 절반은 한다. 처음엔 다 알 필요 없고 /usage/compact 두 개부터 시작하면 된다.

명령어 기능
/usage 토큰·요청 한도 시각적 확인
/compact 컨텍스트 요약 압축
/clear 대화 초기화
/mcp MCP 서버 관리
/stats 사용 통계 그래프

③ 터미널 별칭 설정 (Tip 7) 별거 아닌 것 같아도 하루에 수십 번 치는 명령어를 한 글자로 줄이면 체감이 꽤 다르다.

alias c='claude'          # Claude Code 실행
alias ch='claude --chrome' # 브라우저 연동 모드
alias co='code .'         # VS Code 열기

컨텍스트 관리 (Context Management)

④ 컨텍스트는 신선할수록 좋다 (Tip 5) 대화가 길어지면 Claude도 지친다. 새 주제를 꺼낼 때는 새 대화를 열자. 원문 표현이 딱 맞다 — “컨텍스트는 우유와 같다, 신선하고 압축될수록 좋다.”

/compact로 선제 압축 (Tip 8) Claude가 알아서 압축하기를 기다리지 말고 먼저 /compact를 치자. /handoff로 지금까지 한 일을 요약해두면 새 대화에서도 맥락 없이 이어서 작업할 수 있다.

⑥ 대화 포크 및 반클론 (Tip 23) 작업이 두 갈래로 나뉠 것 같으면 /fork로 대화를 분기해두면 된다. 컨텍스트가 85%를 넘으면 자동으로 /half-clone이 실행되도록 훅을 걸어두는 방법도 있다.


생산성 극대화 (Productivity)

⑦ 음성 입력 활용 (Tip 2) 말이 손보다 빠를 때가 많다. SuperWhisper나 MacWhisper 같은 로컬 전사 도구를 연결하면 긴 지시도 말로 쭉 뱉으면 된다. 이어폰으로 쓰면 카페에서도 조용히 쓸 수 있다.

⑧ 터미널 탭으로 멀티태스킹 (Tip 14) 한 탭에서 Claude가 처리하는 동안 다른 탭에서 다음 작업을 넘겨주는 식으로 쓰면 된다. 3~4개 탭을 오른쪽에서 새로 열고 왼쪽부터 순서대로 확인하는 캐스케이드 방식이 잘 맞는다.

⑨ 백그라운드 실행 (Tip 36) 빌드나 CI처럼 오래 걸리는 작업은 Ctrl+B로 백그라운드로 보내두고 다른 일을 하면 된다. 서브에이전트 여러 개를 동시에 띄워 코드베이스를 병렬로 분석하는 것도 가능하다.


코드 품질 관리 (Code Quality)

⑩ 큰 문제는 잘게 쪼개라 (Tip 3) 복잡한 작업을 한 번에 던지면 Claude도 헤맨다. 그냥 "이걸 작은 문제 여러 개로 쪼개줘"라고 말하는 것만으로도 결과가 달라진다.

⑪ 테스트 작성과 TDD (Tip 34) Claude에게 테스트도 같이 짜게 하면 코드 품질이 올라간다. TDD로 접근하면 더 좋다 — 실패 테스트 먼저 작성하고 커밋, 그다음에 코드 구현. 단, Claude가 테스트를 항상 true를 반환하는 식으로 눈속임하는 경우가 있으니 확인은 필수다.

⑫ 코드가 복잡해졌다면 단순화 요청 (Tip 40) Claude는 시키지도 않은 걸 건드리거나 코드를 괜히 복잡하게 만드는 버릇이 있다. “이 코드 단순화해줘”, "이 줄 왜 이렇게 했어?"라고 물어보면 된다. 줄 하나하나 이해하면서 가면 오히려 코드를 더 빨리 파악하게 된다.


고급 활용 (Advanced Techniques)

⑬ 시스템 프롬프트 토큰 절감 (Tip 15) Claude Code는 기본적으로 매 대화마다 약 19k 토큰짜리 시스템 프롬프트를 쓴다. 패치를 적용하면 9k까지 줄일 수 있다. 절반이다. ~/.claude/settings.json에서 자동 업데이트도 꺼야 패치가 유지된다.

// ~/.claude/settings.json 에 추가
{
  "env": {
    "DISABLE_AUTOUPDATER": "1",
    "ENABLE_TOOL_SEARCH": "true"
  }
}

ENABLE_TOOL_SEARCH는 MCP 도구를 필요할 때만 로드하는 옵션. 둘 다 켜두는 게 좋다.

⑭ Git Worktrees로 병렬 브랜치 작업 (Tip 16) 브랜치를 왔다갔다하면서 작업하는 게 번거롭다면 git worktrees를 써보자. 브랜치마다 별도 디렉터리를 두고 동시에 작업할 수 있다. 터미널 탭 멀티태스킹과 합치면 꽤 강력하다.

# feature 브랜치를 ../my-feature 디렉터리에 따로 열기
git worktree add ../my-feature feature-branch

# 또는 Claude에게 직접 맡겨도 됨
# "git worktree로 feature-branch 새 디렉터리에 열어줘"

⑮ 위험한 작업은 컨테이너에서 (Tip 21) --dangerously-skip-permissions는 컨테이너 안에서만 쓰는 게 맞다. 매번 승인 없이 Claude가 알아서 처리하게 하고 싶을 때 컨테이너를 샌드박스로 쓰면 된다. 로컬 Claude가 원격 컨테이너 안의 Claude를 tmux로 조종하는 구조도 가능하다.

# Docker 컨테이너 안에서 Claude 실행
docker run -it --rm \
  -v $(pwd):/workspace \
  -w /workspace \
  node:20 bash -c "npm install -g @anthropic-ai/claude-code && claude --dangerously-skip-permissions"

CLAUDE.md와 워크플로우 (Configuration)

⑯ CLAUDE.md는 단순하게 유지 (Tip 30) 처음에는 그냥 비워두는 게 맞다. 같은 말을 Claude에게 두 번 이상 하게 되는 순간이 생기면 그때 추가하면 된다. 주기적으로 훑어보면서 더 이상 맞지 않는 내용은 지워야 한다.

⑰ Gemini CLI를 보조로 활용 (Tip 11) Claude가 못 들어가는 사이트가 있으면 Gemini CLI를 대신 쓰게 하면 된다. 스킬로 등록해두면 Claude가 상황 보고 알아서 Gemini로 넘긴다.

# Gemini CLI 설치 (npm)
npm install -g @google/gemini-cli

# dx 플러그인의 reddit-fetch 스킬이 이 방식을 자동으로 처리

⑱ GitHub CLI로 PR 자동화 (Tip 4) git 작업은 Claude한테 넘겨도 된다. gh CLI로 드래프트 PR을 먼저 만들고 직접 검토한 다음 최종 올리는 흐름이 안전하다.


보안 및 안전 (Security)

⑲ 승인된 명령어 주기적 감사 (Tip 33) Claude에게 한 번 승인해준 명령어들을 그냥 두는 경우가 많다. cc-safe를 돌리면 sudo, rm -rf처럼 위험한 명령어가 등록돼 있는지 바로 확인할 수 있다.

npx cc-safe  # 설치 없이 바로 실행

추천 플러그인 및 설정 스크립트 (Recommended Setup)

⑳ dx 플러그인 설치 (Tip 44) 앞에서 계속 언급된 기능들이 여기 다 들어있다. 설치해두면 /dx:gha로 CI 실패 원인을 바로 찾고, /dx:handoff로 대화 인수인계 문서를 자동으로 만들 수 있다.

claude plugin install dx@ykdojo
명령어 기능
/dx:gha GitHub Actions 실패 자동 분석
/dx:handoff 컨텍스트 인수인계 문서 생성
/dx:clone 대화 분기
/dx:half-clone 컨텍스트 절반 축소
/dx:reddit-fetch Reddit 콘텐츠 수집
/dx:review-claudemd CLAUDE.md 개선 제안

㉑ 원클릭 전체 설정 스크립트 (Tip 45) 지금까지 언급한 설정들을 스크립트 하나로 한 번에 처리할 수 있다. 각 항목을 골라서 적용할 수 있으니 필요한 것만 설치하면 된다.

bash <(curl -s https://raw.githubusercontent.com/ykdojo/claude-code-tips/main/scripts/setup.sh)

dx 플러그인, cc-safe, 상태줄, 자동 업데이트 비활성화, MCP 지연 로딩, 셸 별칭이 순서대로 물어보면서 설치된다.


핵심 철학 (Key Philosophy)

“Claude Code를 잘 쓰는 가장 좋은 방법은, 직접 많이 쓰는 것이다.” (Tip 22)

결국 이 45개 팁도 많이 써보면서 나온 것들이다. 처음부터 다 적용하려 하지 말고, 지금 당장 불편한 것 하나씩 해결하는 식으로 쌓아가면 된다.

  • 복잡한 문제는 쪼개서 단계적으로 (Tip 3)
  • 컨텍스트는 짧고 신선하게 (Tip 5)
  • 반복하는 작업은 자동화 (Tip 41)
  • 깊이 파고들 때와 가볍게 쓸 때를 구분 (Tip 32)
  • Claude Code는 코딩 도구가 아니라 디지털 작업 전반의 범용 인터페이스 (Tip 31)

원본: https://github.com/ykdojo/claude-code-tips (45 Claude Code Tips: From Basics to Advanced)

PDF·PPT·Excel을 Markdown으로 바꾸는 무료 오픈소스 MarkItDown 사용법

Microsoft AutoGen 팀이 만든 오픈소스 Python 라이브러리다. PDF, Word, Excel, PowerPoint, 이미지, 오디오, YouTube URL까지 거의 모든 파일 형식을 Markdown으로 변환해준다. LLM은 Markdown을 가장 잘 이해하기 때문에, RAG 파이프라인이나 AI 분석 전처리 단계에서 바로 쓸 수 있다.


주요 특징 (Key Features)

① 압도적으로 다양한 지원 형식

분류 지원 형식
문서 PDF, Word(.docx), PowerPoint(.pptx), Excel(.xlsx/.xls)
미디어 이미지(EXIF + OCR), 오디오(음성 전사)
HTML, YouTube URL(자막 추출)
텍스트 기반 CSV, JSON, XML
기타 ZIP, EPUB, Outlook 메시지

② 무료 오픈소스 (Microsoft 개발) Apache 2.0 라이선스. 상업적 사용 가능. Microsoft AutoGen 팀이 직접 관리.

③ CLI와 Python API 모두 지원 터미널 명령어 한 줄로도 실행 가능하고, Python 코드에 import해서 자동화 파이프라인으로도 활용 가능.

④ LLM 연동 기본 내장 GPT-4o 같은 비전 모델을 연결하면 이미지 속 텍스트까지 설명해서 Markdown으로 추출.

⑤ 필요한 형식만 골라 설치 가능 PDF만 쓴다면 PDF 의존성만, Excel만 쓴다면 Excel 의존성만 설치. 전체 설치보다 가볍게 활용 가능.


설치 (Installation) — 터미널에서 한 번만

> ⚠️ Python 3.10 이상 필요. python --version으로 먼저 확인하자.

전체 설치 (추천 — 모든 형식 지원)

pip install 'markitdown[all]'

형식별 선택 설치 (가볍게 쓰고 싶을 때)

# PDF만
pip install 'markitdown[pdf]'

# Word + PowerPoint + Excel
pip install 'markitdown[docx, pptx, xlsx]'

선택 가능한 옵션 전체 목록:

옵션 설명
[pdf] PDF 변환
[docx] Word 문서
[pptx] PowerPoint
[xlsx] Excel
[xls] 구형 Excel
[outlook] Outlook 이메일
[audio-transcription] 오디오 음성 전사
[youtube-transcription] YouTube 자막 추출
[az-doc-intel] Azure Document Intelligence 연동
[all] 위 전체 포함

사용 (Usage)

CLI — 터미널에서 바로 실행

> 💡 초보자 가이드: 별도 코드 파일 없이 터미널(Windows는 PowerShell 또는 CMD, Mac은 Terminal)에서 명령어만 입력하면 바로 실행된다. VS Code의 내부 터미널(Ctrl + `)을 써도 된다.

# 기본 변환 (결과를 터미널에 출력)
markitdown 파일.pdf

# 결과를 md 파일로 저장
markitdown 파일.pdf -o 결과.md

# 파이프로 연결해서 사용
cat 파일.pdf | markitdown

Python API

> 💡 초보자 가이드: VS Code 또는 Positron을 설치하고, 새 파일을 .ipynb 확장자로 만들면 Jupyter Notebook 환경이 열린다. 셀에 아래 코드를 붙여넣고 Shift + Enter로 실행하면 된다. pip 설치도 VS Code 내부 터미널(Ctrl + `)에서 그대로 실행 가능하다.

기본 사용

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("파일.pdf")
print(result.text_content)   # 변환된 Markdown 출력

여러 파일 일괄 변환

from markitdown import MarkItDown

md = MarkItDown()
for 파일 in ["문서1.pdf", "발표.pptx", "데이터.xlsx"]:
    result = md.convert(파일)
    with open(파일 + ".md", "w", encoding="utf-8") as f:
        f.write(result.text_content)

LLM 연동 — 이미지 속 텍스트까지 추출

이미지 파일을 변환할 때 GPT-4o 같은 비전 모델을 연결하면, 이미지 안의 내용을 AI가 설명해서 Markdown으로 뽑아준다.

from markitdown import MarkItDown
from openai import OpenAI

client = OpenAI()
md = MarkItDown(
    llm_client=client,
    llm_model="gpt-4o"
)
result = md.convert("이미지.jpg")
print(result.text_content)

Docker — 환경 설치 없이 실행

Python 환경 구성이 어렵다면 Docker로 바로 실행할 수 있다.

docker build -t markitdown:latest .
docker run --rm -i markitdown:latest  결과.md

유의할 점 (Things to Watch Out For)

1. Python 3.10 미만은 동작하지 않는다 설치 전 반드시 버전 확인. python --version으로 체크하자.

2. v0.1.0부터 설치 방식이 바뀌었다 이전 버전(pip install markitdown)으로 설치했다면 의존성이 빠져 있을 수 있다. pip install 'markitdown[all]'로 재설치하자.

3. convert_stream()은 반드시 바이너리로 열어야 한다 open("파일.pdf", "r")이 아니라 open("파일.pdf", "rb")처럼 바이너리 모드로 열어야 한다.

# 잘못된 방법
with open("파일.pdf", "r") as f:
    result = md.convert_stream(f)   # 오류 발생

# 올바른 방법
with open("파일.pdf", "rb") as f:
    result = md.convert_stream(f)

4. LLM 이미지 설명은 API 비용이 발생한다 llm_client를 연결하면 GPT-4o API를 호출하므로 OpenAI 과금이 생긴다. 이미지가 많은 PDF는 비용에 주의하자.

5. OCR은 기본 포함이 아니다 스캔 PDF나 이미지 내 텍스트 추출이 필요하다면 별도 플러그인 설치가 필요하다.

pip install markitdown-ocr

정리 (Summary)

항목 내용
개발사 Microsoft (AutoGen 팀)
라이선스 Apache 2.0 (상업적 사용 가능)
지원 언어 Python 3.10+
지원 형식 PDF, Word, PPT, Excel, 이미지, 오디오, YouTube, HTML 등
주요 출력 Markdown
강점 형식 다양성, CLI 지원, LLM 연동, 선택적 설치
주의 Python 3.10+, 바이너리 모드 필수, LLM 연동 시 API 비용

PDF 하나만 변환하는 게 아니라 여러 형식의 파일을 LLM에 넣어야 하는 상황이라면 MarkItDown이 가장 편한 선택이다. CLI로 바로 쓸 수 있어서 코딩을 몰라도 터미널만 열면 시작할 수 있다.

GitHub: https://github.com/microsoft/markitdown

PDF 파싱 오픈소스 끝판왕 — OpenDataLoader PDF로 PDF를 Markdown·JSON 변환하는 법

AI 서비스를 만들거나 RAG 파이프라인을 구축할 때 PDF 처리를 마크다운으로할 수 있는 방법이다. OpenDataLoader PDF는 이 문제를 오픈소스로 해결한 라이브러리다.


이게 왜 좋은가 (Why It’s Worth Using)

① 벤치마크 1위 200개 실제 PDF 대상 테스트에서 전체 정확도 0.90으로 1위를 기록했다. 특히 표 추출 정확도는 0.93으로, Docling(0.89) 등 경쟁 도구보다 높다.

② GPU 없이 로컬 실행 가능 기본 모드는 로컬에서 페이지당 0.05초로 동작한다. 복잡한 페이지만 AI 백엔드로 라우팅하는 하이브리드 모드도 지원한다. 비용 없이 시작할 수 있다.

③ AI에 바로 넣을 수 있는 출력

  • Markdown — LLM 컨텍스트, RAG 청킹용
  • JSON — 요소마다 바운딩 박스 + 의미 유형 포함
  • HTML — 웹 표시용
  • LangChain 통합도 기본 지원

④ 80개 이상 언어 OCR + 수식 인식 스캔 PDF도 처리하고, LaTeX 수식 변환, 워터마크 필터링, 프롬프트 인젝션 공격 차단 필터도 내장되어 있다.

⑤ Apache 2.0 라이선스 상업적 사용 가능. Python, Node.js, Java 모두 지원한다.


설치 및 기본 사용법 (Installation & Basic Usage)

설치 (Install) — 터미널에서 한 번만

언어 명령어 패키지
Python pip install opendataloader-pdf PyPI
Node.js npm install @opendataloader/pdf npm
Java Maven Central 의존성 추가 (아래 참고) Maven Central

Java — Java 11 이상 필요

<dependency>
  <groupId>org.opendataloader</groupId>
  <artifactId>opendataloader-pdf-core</artifactId>
  <version>최신버전 확인 후 입력</version>
</dependency>

사용 (Usage) — 코드에서 import 후 호출

Python

💡 초보자 가이드: 코딩 환경이 없다면 VS Code 또는 Positron을 설치하자. 설치 후 새 파일을 만들 때 확장자를 .ipynb로 지정하면 Jupyter Notebook 환경이 열린다. 셀 단위로 코드를 작성하고 Shift + Enter로 실행하면 된다. 터미널에서의 pip 설치도 VS Code / Positron 내부 터미널(Ctrl + `` “`)에서 그대로 실행 가능하다.

from opendataloader_pdf import convert

result = convert("파일.pdf")
print(result.markdown)   # Markdown 출력
print(result.json)       # JSON 출력 (바운딩 박스 포함)

Node.js

💡 초보자 가이드: Node.js가 없다면 nodejs.org에서 LTS 버전을 설치한다. 이후 VS Code에서 작업 폴더를 열고, 내부 터미널에서 npm install로 패키지를 설치한다. 코드는 .ts 또는 .js 파일을 만들어 붙여넣은 뒤 터미널에서 node 파일명.js로 실행하면 된다. TypeScript(.ts)를 쓴다면 ts-node 패키지도 함께 설치해야 한다(npm install -g ts-node).

import { convert } from '@opendataloader/pdf';

await convert(['file1.pdf', 'folder/'], {
  outputDir: 'output/',
  format: 'markdown,json'
});

유의할 점 (Things to Watch Out For)

1. PDF 전용 Word, Excel, PowerPoint는 지원하지 않는다. PDF로 변환 후 사용해야 한다.

2. 호출마다 JVM 프로세스가 생성 convert()를 파일 하나씩 반복 호출하면 느려진다. 배치로 묶어서 처리하는 것이 좋다.

3. 하이브리드 모드는 인터넷 연결 필요 로컬 모드만 쓰면 완전 오프라인 가능하지만, 정확도는 하이브리드 대비 낮다. 민감한 문서는 로컬 모드를 선택하자.

4. 접근성(Tagged PDF) 자동 생성은 아직 PDF/UA 변환은 엔터프라이즈 옵션이고, 완전 오픈소스 자동 태깅은 2026년 Q2 예정이다.


정리 (Summary)

항목 내용
라이선스 Apache 2.0 (상업적 사용 가능)
지원 언어 Python, Node.js, Java
주요 출력 Markdown, JSON, HTML
강점 표 추출 정확도, 로컬 실행, 바운딩 박스
주의 PDF 전용, 배치 처리 권장, 하이브리드 모드는 유료 API 사용

PDF를 LLM에 넣어야 하는 상황이라면 일단 써볼 만한 도구다. 로컬 무료 모드만으로도 충분한 수준의 추출 품질이 나온다.

GitHub: https://github.com/opendataloader-project/opendataloader-pdf

코딩 없이 부동산 데이터 분석: R 바이브 코딩 완전 가이드 (국토부 실거래가 실습)

바이브 코딩 & R 데이터 분석 강의 주요내용

1. 강의 핵심 3줄 요약

  1. 바이브 코딩 = 자연어(한국어)로 AI에게 명령 → AI가 코드 작성 → 단계별 확인·수정 반복
  2. 도구 스택: R + Positron IDE + GitHub Copilot (무료 or 교육 할인)
  3. 실습 흐름: 국토부 부동산 실거래가 Excel 다운 → 데이터 전처리 → 통계 → 시각화

2. 왜 이 도구들인가?

GitHub Copilot을 쓰는 이유

  • 가격: Claude Code, Cursor 등은 종량제(많이 쓸수록 비용↑), Copilot은 정액제 월 10달러
  • 멀티모델 지원: Claude, GPT, Gemini 등 모델을 자유롭게 선택 가능
  • 코드 특화 학습: 전 세계 개발자 코드를 학습 → 코드 품질·효율성이 높음
  • 전 세계 개발자 설문(StackOverflow)에서 업무용 AI 도구 1위 (ChatGPT는 개인용에 치우침)

Positron IDE를 쓰는 이유

  • R Studio를 만든 Posit 재단이 개발 (VS Code 기반)
  • R 사용자를 위한 기본값 세팅 내장 (단축키, 변수창 등)
  • 오른쪽 변수창: 현재 작업 중인 변수를 실시간 확인 (VS Code에는 없음)
  • Jupyter Notebook 지원 → Python·R·Julia 혼용 가능
  • 코드 → HTML → PDF 내보내기 가능

3. 초보자 단계별 설치 가이드

STEP 1. R 설치

  • 다운로드: CRAN R Project 공식 사이트
  • 최신 버전: R 4.5.3 (버전 앞자리가 3이면 반드시 업데이트)
  • Windows/macOS 각각 맞는 버전 다운로드 후 설치
  • 설치 시 "동의합니다"만 계속 클릭하면 OK

⚠️ R이 없으면 오늘 바이브 코딩 불가. 반드시 먼저 설치.

STEP 2. Positron IDE 설치

  • 다운로드: Positron 공식 페이지 접속
  • 다운로드 버튼 클릭 → Pre-download 체크박스 해제 → 다운로드 목록 활성화
  • Windows: System Level 설치 파일 선택 (위에 있는 것)
  • Mac: M1/M2/M3 → ARM 64, 인텔 Mac → Intel 버전 선택
  • 설치 순서: R 먼저 → Positron 나중에

STEP 3. GitHub 계정 가입

  1. github.com 접속 → 회원가입
  2. 교육기관 이메일(.ac.kr 또는 .edu) 사용 권장 → 교육 할인 가능
  3. 가입 시 본인 인증 퍼즐 통과 필요:
    • 비주얼 퍼즐: 왼쪽 그림과 가장 비슷한 그림 10개 중 선택
    • 오디오 퍼즐: 3개 소리 중 다른 동물 소리 찾기 (10번 반복) — 오디오가 더 쉬움

STEP 4. GitHub Copilot 활성화

  1. GitHub 로그인 → 오른쪽 상단 프로필 클릭
  2. Copilot Settings 선택
  3. “Copilot을 무료로 사용하시겠습니까?” 클릭 → 첫 달 Pro 무료 제공
  4. 이후 무료 플랜으로 전환 (토큰 제한·속도 차이 있지만 사용 가능)

교육 할인(2년 무료): Settings → Billing → Education Benefit → Start Application → 영문 재학/재직증명서 업로드 → 1~2일 후 승인 메일

STEP 5. Positron에 Copilot 연결

  1. Positron 실행 → 왼쪽 패널에서 안경 쓴 로봇 아이콘 클릭
  2. Enable Positron Assistant 클릭
  3. 팝업의 체크박스 2개 체크
  4. Sign in to Provider → GitHub Copilot (OAuth) 선택 → Sign in 클릭
  5. 8자리 코드 자동 복사됨 → Copy & Continue → 웹브라우저 자동 열림
  6. GitHub 로그인 → 8자리 코드 붙여넣기(Ctrl+V) → Continue → Authorize
  7. Positron으로 돌아와서 Reload 클릭
  8. 채팅창에 AI 모델 선택 드롭다운 표시되면 완료 (기본값: GPT-4o mini)

4. 바이브 코딩 개념

바이브 코딩이란?

  • 자연어 대화로 AI에게 코드를 시키는 방식 (2025년 2월 Andrej Karpathy가 정의)
  • 핵심: Low Code, High Impact — 코드를 직접 치는 것이 아니라 의도(Intent)를 전달
  • AI 오타 없음, 실수 줄어듦, 에러 발생 시 설명도 요청 가능

비유: 아이언맨의 토니 스타크가 자비스에게 "이거 빨간색 금색으로 바꿔줘"라고 하는 것처럼

논문·데이터 분석에서의 바이브 코딩 주의점

  • 한 번에 2,000줄짜리 코드를 뽑지 말 것 → 중간 어디서 잘못됐는지 모름
  • Step by Step: 단계별로 코드를 확인하며 진행
  • 중간 결과물 기록 필수 (논문 재현성 때문에)
  • Jupyter Notebook 활용 이유: AI에게 뭘 요구했는지 기록 + 단계별 확인 가능

5. 꼭 외워야 할 R 단축키 3가지

단축키 기능 비고
Alt + - 변수 저장 (<-) Mac: Option + -
Ctrl + Shift + M 파이프 오퍼레이터 (%>%) Mac: Cmd + Shift + M
Shift + Enter 코드 실행 현재 셀 실행

이 3가지만 알면 오늘 강의의 90% 완료


6. 바이브 코딩 실습 방법 (주석 기반)

방법: 채팅창 대신 주석으로 명령

# tidyverse 패키지 설치
install.packages("tidyverse")   # AI가 자동 완성

# tidyverse 패키지 불러오기
library(tidyverse)              # 탭 키로 추천 수락

# mtcars 예제 데이터 불러오기
data(mtcars)

동작 원리:

  1. 코드 창에 # 으로 한국어 주석 입력
  2. AI(Copilot)가 반투명 글씨로 코드 추천
  3. Tab 키로 수락, Enter 후 다음 줄 추천 수락
  4. Shift + Enter로 실행
  5. 에러 발생 시 → Fix 버튼 클릭 or 로봇 창에 에러 복사해서 질문

교수님 팁: “저는 알 코드 하나도 안 쳤고요, 다 주석 주석 주석만 했습니다”


7. 파이프 오퍼레이터 (%>%) 개념

왜 쓰나?

코드 가독성을 높이기 위해 — 괄호 안에서 바깥쪽으로 읽는 대신, 왼쪽에서 오른쪽으로 순서대로 읽을 수 있게 함

비교 예시

# 파이프 없이 (괄호 중첩 — 안에서 바깥으로 읽어야 함)
round(log(sum(1:10)))

# 파이프 사용 (왼쪽에서 오른쪽으로 순서대로 읽힘)
1:10 %>% sum() %>% log() %>% round()
  • 두 코드의 결과는 동일 (값: 4)
  • 파이프가 있으면 “1부터 10까지 합산 → 로그 → 반올림” 순서가 직관적

8. 부동산 데이터 분석 실습 흐름

STEP 1. 데이터 다운로드

  1. 국토부 실거래가 사이트 접속 (rt.molit.go.kr)
  2. 아파트 매매 실거래가 → 조건별 자료 제공
  3. 기간: 원하는 연도 설정 (예: 2024년 1월~12월)
  4. 시도: 서울시 선택 → 엑셀 다운로드
  5. 다운받은 파일을 작업 폴더에 저장

STEP 2. Positron 작업 폴더 설정

  1. Positron 실행 → Open Folder 클릭
  2. 새 폴더 생성 후 선택
  3. New NotebookR Notebook 선택
  4. Ctrl + S로 저장 (파일명 예: 260314_realestate.ipynb)

STEP 3. 패키지 로드 및 파일 읽기

# tidyverse 패키지 불러오기
library(tidyverse)

# readxl 패키지 이용해서 파일 불러오기 (상위 12줄 스킵)
library(readxl)
df <- read_excel("파일명.xlsx", skip = 12)

국토부 실거래가 파일은 상단에 주석 12줄이 자동 삽입됨 → skip = 12 필수

STEP 4. 데이터 확인 및 전처리

# df 변수명 확인
names(df)

# 변수명 일괄 변경 (영문 약어 + 한글 포함)
df <- df %>% rename(
  sgg = `시군구`,
  area_m2 = `전용면적(㎡)`,
  price = `거래금액(만원)`,
  contract_ym = `계약년월`,
  apt_name = `단지명`,
  floor = `층`
  # ... 나머지 변수도 동일하게
)

# 자료형 변환 (문자형 → 숫자형, 쉼표 제거)
df <- df %>%
  mutate(
    area_m2 = as.numeric(area_m2),
    price = as.numeric(gsub(",", "", price))
  )

# 평당 가격 변수 생성 (1평 = 3.3㎡)
df <- df %>%
  mutate(price_per_pyeong = price / (area_m2 / 3.3))

# 주소 분리 (시군구 → 시, 구, 동 분리)
df <- df %>%
  separate(sgg, into = c("si", "sgg", "dong"), sep = " ")

STEP 5. 기초 통계

# 시군구별 거래건수, 평균가격, 평균면적 통계
df_summary <- df %>%
  group_by(sgg) %>%
  summarise(
    count = n(),
    mean_price = mean(price, na.rm = TRUE),
    mean_area = mean(area_m2, na.rm = TRUE)
  ) %>%
  arrange(desc(mean_price))  # 가격 높은 순 정렬

STEP 6. 시각화

# 전용면적 vs 가격 산점도 (시군구별 색깔 구분)
ggplot(df, aes(x = area_m2, y = price, color = sgg)) +
  geom_point(alpha = 0.5) +
  labs(x = "전용면적(㎡)", y = "거래금액(만원)") +
  theme_minimal()

# 막대그래프 (시군구별 거래건수)
ggplot(df_summary, aes(x = reorder(sgg, count), y = count)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  theme_minimal()

9. 에러 처리 방법

상황 대처법
코드 에러 발생 에러 메시지 옆 Fix 버튼 클릭 → AI가 자동 수정
AI 추천이 안 맞을 때 로봇 채팅창에 에러 복사 후 “왜 오류가 났어?” 질문
복잡한 변환이 필요할 때 ChatGPT에 붙여넣어 변환 요청 → 결과를 Positron에 복사
자동완성이 안 뜰 때 주석을 조금 더 구체적으로 작성

10. 결과물 저장 방법

Ctrl + Shift + K  →  Preview 모드 (HTML 미리보기)
Ctrl + S          →  .ipynb 파일로 저장
HTML로 내보내기   →  웹브라우저에서 열기 → 인쇄 → PDF 저장

11. 핵심 패키지 정리

패키지 용도
tidyverse 데이터 분석 통합 패키지 (dplyr, ggplot2 등 포함)
readxl 엑셀 파일 불러오기
writexl 엑셀 파일로 내보내기
ggplot2 데이터 시각화 (tidyverse 포함)
dplyr 데이터 전처리 (tidyverse 포함)

12. 교수님 핵심 조언

“R code를 외우는 데 시간을 허비하지 마세요. 통계 이론이나 더 가치 있는 지식을 쌓으세요. 한국어로 명령만 할 줄 알면 AI가 나머지를 해줍니다.”

  • 코드를 한 번에 다 돌리지 말고 스텝 바이 스텝으로 확인
  • 결과물은 항상 노트북에 기록으로 남길 것 (논문 재현성)
  • Copilot은 쓸수록 내 코딩 패턴을 학습 → 시간이 지날수록 더 정확해짐
  • 로봇 채팅창의 @DF 기능: 현재 데이터를 참조해서 분석 추천 가능
Posted in mm

록실장으로 업무 효율을 높이는 방법

🏗️ 록실장 사용설명서

수주 사업본부 AI 비서 완전 정복 가이드

📌 목차

  1. 록실장이 뭔가요?
  2. 어떻게 말을 걸면 되나요?
  3. 스킬이란 무엇인가요?
  4. 스킬별 사용법
  5. 슬래시 커맨드 사용법
  6. 이런 상황엔 이렇게 쓰세요
  7. 자주 묻는 질문 (FAQ)

1. 록실장이 뭔가요?

록실장은 부동산회사 수주본부 전용으로 설정된 AI 비서입니다.

> 💡 쉽게 말하면: 카카오톡에서 메시지 보내듯이, 업무 요청을 자연스럽게 말하면 알아서 처리해주는 AI 직원입니다.

할 수 있는 것들:

  • 회의록 자동 정리 및 파일명 변경
  • 오늘 할 일·마감 업무 정리
  • 프로젝트 현황 브리핑
  • 이메일 초안 작성
  • 미팅 일정 예약
  • 팀 현황 보고
  • 주간 업무 로그 작성

2. 어떻게 말을 걸면 되나요?

Claude Code 채팅창에 한국어로 자연스럽게 입력하면 됩니다.

✅ 이렇게 하세요

"오늘 할 일 정리해줘"
"AAA 프로젝트 요즘 어떻게 됐어?"
"이번 주 한 일 정리해줘"
"OOO한테 보낼 메일 써줘"
❌ 이렇게 안 해도 됩니다

명령어를 외울 필요 없음
정확한 단어를 맞출 필요 없음
영어로 쓸 필요 없음

> 💡 핵심 원칙: 팀 동료에게 말하듯이 편하게 요청하면 됩니다.


3. 스킬이란 무엇인가요?

스킬은 록실장이 특정 업무를 처리하는 방법이 정해진 프로그램입니다.

사용자 요청 → 록실장이 스킬 판단 → 스킬 실행 → 결과 제공

마치 회사 직원에게 "주간 보고 써줘"라고 하면, 그 직원이 알아서 정해진 양식에 맞게 작성하는 것과 같습니다.

스킬의 종류:

  • AI 에이전트 스킬: 자연어로 호출 (8종)
  • 슬래시 커맨드: /로 시작하는 직접 명령 (6종)

4. 스킬별 사용법

📋 my-tasks — 오늘 할 일 확인

무엇을 해주나요? 오늘 해야 할 업무, 마감 임박 항목, 진행 중인 프로젝트 KPI를 한눈에 정리해줍니다.

이렇게 말하세요:

"내 할 일 보여줘"
"오늘 뭐 해야 해?"
"마감 임박 업무 알려줘"
"KPI 현황 보여줘"

결과 예시:

📋 오늘의 할 일 — 2026-03-20

🔴 긴급 (오늘/3일 이내 마감)
- [ ] AAA 심의 자료 — 마감: 03-21

🟡 진행 중
- [ ] BBB TF 계약서 검토 — 담당: OOO

🔵 이번 주 예정
- [ ] 주간보고 작성 — 금요일

📓 log-interviewer — 주간 업무 로그 작성

무엇을 해주나요? AI가 질문을 던져서 이번 주 한 일을 물어보고, 자동으로 주간 로그 파일을 만들어 줍니다.

이렇게 말하세요:

"이번 주 로그 작성해줘"
"이번 주 한 일 정리해줘"
"주간 보고 준비해줘"
"이번 주 마무리해줘"

진행 방식:

록실장: "이번 주 가장 비중이 컸던 업무가 뭐였나요?"
나:     "AAA 심의 준비랑 BBB 계약 검토요"

록실장: "완전히 마무리된 업무가 있나요?"
나:     "BBB 1차 협의는 끝났어요"

록실장: "다음 주에 집중할 업무 3가지만 꼽아주세요"
나:     "심의 대응, 수주회의 준비, 팀 공유"
         ↓
     [주간 로그 파일 자동 생성]

📊 project-tracker — 프로젝트 현황 추적

무엇을 해주나요? 수주 진행 중인 프로젝트들의 최근 변동사항과 현황을 정리해줍니다.

이렇게 말하세요:

"프로젝트 현황 보고해줘"
"AAA 요즘 어떻게 됐어?"
"수주진행 사업지 현황 알려줘"
"BBB 이번 주 변경사항 있어?"

결과 예시:

📊 프로젝트 현황 브리핑 — 2026-03-20

| 프로젝트       | 단계     | 담당   | 이번 주 변동 | 이슈 |
|--------------|--------|------|-----------|-----|
| AAA    | 사업성심의 | OOO | 5건        | ⚠️  |
| BBB | TF     | OOO | 3건        | —   |

👥 team-briefing — 팀 전체 현황

무엇을 해주나요? 팀원 9명의 담당 프로젝트와 주간 활동을 집계하여 팀장용 브리핑을 만들어줍니다.

이렇게 말하세요:

"팀 현황 보고해줘"
"팀 브리핑"
"우리 팀 KPI 어때?"
"팀원별 담당 현황 보여줘"

결과 예시:

👥 팀 현황 브리핑

| 팀원   | 담당 프로젝트      | 현재 단계  |
|------|----------------|---------|
| OOO | AAA센터      | 사업성심의  |
| ㅁㅁㅁ | BBB레지던스   | TF      |
| WWW | 공공CCC    | 입찰 준비  |
...

📧 email-sender — 이메일 초안 작성

무엇을 해주나요? 업무 이메일 초안을 DLC 비즈니스 형식으로 작성하고, Gmail 임시보관함에 저장합니다.

이렇게 말하세요:

"이메일 작성해줘"
"OOO한테 A PJ 심의 관련 메일 써줘"
"시행사에 계약 관련 메일 초안 만들어줘"
"인허가 담당자한테 미팅 확인 메일 써줘"

진행 방식:

1. 록실장이 수신자·목적·내용 확인
2. 초안 화면에 출력
3. 수정 요청 가능
4. 확인 완료 → Gmail 임시보관함 자동 저장
5. Gmail에서 첨부파일 추가 후 발송

> ⚠️ 주의: 발송은 본인이 Gmail에서 직접 합니다. 록실장은 초안만 저장합니다.


📅 meeting-scheduler — 미팅 일정 예약

무엇을 해주나요? 참석자들의 빈 시간을 자동으로 찾아 Google Calendar에 일정을 등록하고, Teams 초대 메시지 초안을 만들어줍니다.

이렇게 말하세요:

"미팅 잡아줘"
"다음 주에 BBB TF 회의 잡아줘"
"OOO, ㅁㅁㅁ이랑 내주 오전에 회의 예약해줘"
"내 빈 시간 확인해줘"

진행 방식:

1. 회의 목적·참석자·희망 날짜 확인
2. 참석자 공통 빈 시간 3개 제안
3. 시간 선택 → Google Calendar 자동 등록
4. Teams 초대 메시지 초안 출력

🔄 meeting-refiner — 회의록 정제 (기존 스킬)

무엇을 해주나요? 날것의 회의 메모를 비즈니스 형식으로 다듬고, 표준 파일명으로 자동 변경합니다.

이렇게 말하세요:

"회의록 정제해줘"
"회의 메모 다듬어줘"
"미팅 메모 정제하고 이름 바꿔줘"

전/후 예시:

[정제 전]
오늘 AAA 미팅함. 시청에서 부지 협의 필요하다함.
다음주까지 검토해달라함.

[정제 후]
## 주요 협의 내용
- 시청 부지 협의 필요 (확인 요망)

## Action Items
- [ ] 부지 협의안 검토 — 마감: 2026-03-27 @담당자

📈 daily-delta — 전일 변경사항 추적 (기존 스킬)

무엇을 해주나요? 어제 변경된 프로젝트 파일과 수신 이메일을 분석하여 일일 업무 보고서를 만들어줍니다.

이렇게 말하세요:

"전일 변경사항 알려줘"
"어제 뭐 바뀌었어?"
"오늘 아침 브리핑해줘"
"모닝브리핑"

5. 슬래시 커맨드 사용법

채팅창에 /를 입력하면 바로 실행됩니다.

커맨드 기능 입력 예시
/task-assign 팀원 업무 지시서 /task-assign 입력 후 내용 작성
/report-write DLC 표준 보고서 /report-write 입력 후 주제 입력
/teams-message Teams 메시지 초안 /teams-message 입력 후 내용 설명
/outlook-email Outlook 이메일 초안 /outlook-email 입력 후 내용 설명
/doc-create 표준 문서 생성 /doc-create 입력 후 문서 종류 설명
/meeting-minutes 회의록 작성 /meeting-minutes 입력 후 내용 입력

사용 예시:

/task-assign
→ "OOO / AAA 심의 자료 보완 / 03-25 / PPT 1식"

6. 이런 상황엔 이렇게 쓰세요

🌅 월요일 아침

"오늘 할 일 보여줘"
"이번 주 뭐 챙겨야 해?"

📅 회의 전

"[프로젝트명] 최근 현황 정리해줘"
"[참석자]랑 오후에 회의 잡아줘"

📝 회의 후

"방금 회의 메모 정제해줘" (메모 붙여넣기 후)
"회의록 이름 바꿔줘"

📧 메일 작성

"[수신자]한테 [내용] 관련 메일 초안 써줘"

📊 금요일 주간 마무리

"이번 주 한 일 정리해줘"
"주간 로그 작성해줘"
"팀 현황 브리핑해줘"

🚨 급할 때

"[프로젝트명] 지금 어떤 상황이야?"
"오늘 마감 업무 뭐 있어?"

7. 자주 묻는 질문

Q. 정확한 스킬 이름을 몰라도 되나요? > 네. “회의록 정리해줘”, "오늘 일정 알려줘"처럼 자연스럽게 말하면 알아서 찾아서 실행합니다.

Q. 실수로 잘못 요청하면 어떻게 되나요? > 파일 생성·저장 전에 항상 확인을 요청합니다. "아니야, 취소해줘"라고 하면 중단됩니다.

Q. 결과가 마음에 안 들면? > “다시 써줘”, “좀 더 간결하게”, “공식적인 톤으로 바꿔줘” 등으로 수정 요청하면 됩니다.

Q. 이메일을 록실장이 직접 보내나요? > 아닙니다. Gmail 임시보관함에 초안만 저장합니다. 발송은 본인이 직접 합니다.

Q. 팀원도 록실장을 쓸 수 있나요? > 현재는 팀장(록) 계정으로만 설정되어 있습니다. 팀원 확장은 별도 설정이 필요합니다.

Q. 록실장이 틀린 정보를 말하면? > "그건 틀렸어, [올바른 정보]야"라고 정정해주세요. 중요한 결정은 반드시 직접 확인하세요.


🗂️ 관련 파일 위치

파일 위치
스킬 파일들 _DL_Rok\.agent\skills\[스킬명]\SKILL.md
팀 정보 _DL_Rok\.context\team-info.md
프로젝트 현황 _DL_Rok\.context\project-status.md
주간 로그 2026DL\Today\YYYY-WXX-weekly.md
일일 보고서 2026DL\Today\YYYY-MM-DD-daily.md
세션 메모 memory.md

> 💬 문의: 사용 중 막히는 부분이 있으면 그냥 록실장에게 “이거 어떻게 써?” 라고 물어보세요.


작성: 록실장 | 2026-03-20 | v1.0

Posted in mm

최신 AI로 투자 콘텐츠 자동화하기

콘텐츠 자동화 파이프라인 구축 가이드

전체 아키텍처 개요

[Cron/스케줄러] → [매크로 수집 봇] → [Discord 알림]
        ↓
[인턴 에이전트] → 주제 정렬 & 중복 제거
        ↓
[트레이더 에이전트] → 투자 추천 → [Discord 전송]
        ↓
[Claude API] → 번역 → [Notion 업로드]
        ↓
[사용자] → 10개 내외 자료 선택
        ↓
[ElevenLabs API] → TTS 생성
[이미지 합성] → 칠판 배경 합성
        ↓
[JSON 저장] → 작업 데이터 관리
        ↓
[Python 숏츠 생성] → 이미지 + TTS + 번역 → 영상
        ↓
[사용자 승인] → YouTube 업로드
        ↓
[Playwright] → 텔레그램, 네이버블로그, 링크드인, 페이스북, X 자동 게시

Phase 1. 인프라 세팅

1-1. 서버 환경

항목 권장 사양
서버 AWS EC2 (t3.medium 이상) 또는 개인 서버
OS Ubuntu 22.04 LTS
Python 3.11+
Node.js 18+ (Playwright용)
스케줄러 Cron (Linux) 또는 APScheduler (Python)
DB SQLite (경량) 또는 PostgreSQL

1-2. 필수 계정 & API 키

서비스 용도 비용
Discord Bot 알림 & 결과 전송 무료
Claude API (Anthropic) 번역 & AI 에이전트 종량제
ElevenLabs API TTS 음성 생성 무료 티어 + 유료
Notion API 데이터 업로드 & 관리 무료
YouTube Data API 영상 업로드 무료
Telegram Bot API 텔레그램 포스팅 무료
Naver Blog API 블로그 포스팅 무료 (또는 Playwright)

1-3. 프로젝트 폴더 구조

content-pipeline/
├── config/
│   ├── .env                  # API 키, 토큰
│   └── settings.yaml         # 스케줄, 채널ID 등 설정
├── collectors/
│   ├── macro_collector.py    # 매크로 데이터 수집
│   └── sources.yaml          # 수집 소스 목록
├── agents/
│   ├── intern_agent.py       # 주제 정렬 & 중복 제거
│   └── trader_agent.py       # 투자 추천 분석
├── translators/
│   └── claude_translator.py  # Claude API 번역
├── media/
│   ├── tts_generator.py      # ElevenLabs TTS
│   ├── image_composer.py     # 칠판 배경 이미지 합성
│   └── shorts_maker.py       # 숏츠 영상 생성
├── publishers/
│   ├── youtube_uploader.py   # YouTube 업로드
│   ├── discord_bot.py        # Discord 알림
│   ├── notion_uploader.py    # Notion 업로드
│   └── social_poster.py      # Playwright 멀티플랫폼 게시
├── data/
│   ├── raw/                  # 수집 원본
│   ├── processed/            # 정렬·중복제거 후
│   ├── selected/             # 사용자 선택분
│   └── output.json           # 최종 작업 데이터
├── assets/
│   ├── chalkboard_bg.png     # 칠판 배경 이미지
│   └── fonts/                # 폰트 파일
├── scheduler.py              # 메인 스케줄러
├── requirements.txt
└── README.md

Phase 2. 단계별 구현

Step 1. 매크로 자료 수집 (매일 오후 정해진 시간)

역할: 정해진 소스에서 매크로/금융 데이터를 자동 수집

# scheduler.py — APScheduler 예시
from apscheduler.schedulers.blocking import BlockingScheduler

scheduler = BlockingScheduler()

@scheduler.scheduled_job('cron', hour=14, minute=0)  # 매일 오후 2시
def run_pipeline():
    collect_data()      # Step 1
    notify_discord()    # Step 2
    sort_and_dedup()    # Step 3
    analyze_trading()   # Step 4
    translate_upload()  # Step 5
    # Step 6~12는 사용자 입력 대기

scheduler.start()

수집 소스 예시:

  • RSS 피드 (Bloomberg, Reuters 등)
  • 웹 스크래핑 (Selenium/Playwright)
  • API (금융 데이터 API, 뉴스 API)

필요 라이브러리:

feedparser        # RSS 파싱
requests          # HTTP 요청
beautifulsoup4    # HTML 파싱
playwright        # 동적 페이지 스크래핑

Step 2. Discord 알림 — “업무 시작”

역할: 파이프라인 시작을 Discord 채널에 알림

# discord_bot.py
import discord
from discord import Webhook
import aiohttp

WEBHOOK_URL = "https://discord.com/api/webhooks/YOUR_WEBHOOK"

async def notify_start(collected_count: int):
    async with aiohttp.ClientSession() as session:
        webhook = Webhook.from_url(WEBHOOK_URL, session=session)
        embed = discord.Embed(
            title="📡 매크로 수집 완료",
            description=f"총 {collected_count}건의 자료를 수집했습니다.\n인턴 에이전트가 정리를 시작합니다.",
            color=0x00ff00
        )
        await webhook.send(embed=embed)

Tip: Discord Bot 대신 Webhook을 사용하면 더 간단합니다.


Step 3. 인턴 에이전트 — 주제 정렬 & 중복 제거

역할: Claude API를 활용하여 수집된 자료를 주제별 분류하고, 유사 콘텐츠 제거

# intern_agent.py
import anthropic

client = anthropic.Anthropic(api_key="YOUR_KEY")

def sort_and_deduplicate(articles: list[dict]) -> list[dict]:
    prompt = f"""
    다음 {len(articles)}개의 매크로 자료를 분석해주세요:
    
    1. 주제별로 분류 (예: 금리, 환율, 원자재, 주식, 부동산 등)
    2. 내용이 유사한 자료는 가장 정보량이 많은 것만 남기고 제거
    3. 각 자료에 중요도 점수(1~10) 부여
    
    자료 목록:
    {json.dumps(articles, ensure_ascii=False)}
    
    JSON 형식으로 반환해주세요.
    """
    
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=4096,
        messages=[{"role": "user", "content": prompt}]
    )
    return json.loads(response.content[0].text)

Step 4. 트레이더 에이전트 — 투자 추천 → Discord 전송

역할: 정리된 자료를 바탕으로 투자 인사이트를 생성하고 Discord에 전송

# trader_agent.py
def generate_trading_insight(sorted_articles: list[dict]) -> str:
    prompt = f"""
    당신은 전문 매크로 트레이더입니다.
    아래 정리된 매크로 자료를 바탕으로:
    
    1. 현재 시장 상황 요약 (3줄)
    2. 주목할 섹터/자산 TOP 3
    3. 각 추천에 대한 근거
    4. 리스크 요인
    
    자료: {json.dumps(sorted_articles, ensure_ascii=False)}
    """
    
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

# Discord로 전송
async def send_trading_insight(insight: str):
    embed = discord.Embed(
        title="📊 트레이더 에이전트 분석",
        description=insight,
        color=0xffd700
    )
    await webhook.send(embed=embed)

Step 5. Claude API 번역 → Notion 업로드

역할: 영문 자료를 한국어로 번역하고 Notion 데이터베이스에 업로드

# claude_translator.py
def translate_article(article: dict) -> dict:
    prompt = f"""
    아래 영문 기사를 자연스러운 한국어로 번역해주세요.
    전문 용어는 원문을 괄호에 병기합니다.
    
    제목: {article['title']}
    본문: {article['content']}
    """
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=4096,
        messages=[{"role": "user", "content": prompt}]
    )
    article['translated'] = response.content[0].text
    return article

# notion_uploader.py
from notion_client import Client

notion = Client(auth="YOUR_NOTION_TOKEN")
DATABASE_ID = "YOUR_DATABASE_ID"

def upload_to_notion(article: dict):
    notion.pages.create(
        parent={"database_id": DATABASE_ID},
        properties={
            "제목": {"title": [{"text": {"content": article['title_kr']}}]},
            "카테고리": {"select": {"name": article['category']}},
            "중요도": {"number": article['importance']},
            "날짜": {"date": {"start": article['date']}},
            "상태": {"select": {"name": "대기"}}
        },
        children=[
            {"paragraph": {"rich_text": [{"text": {"content": article['translated']}}]}}
        ]
    )

Step 6. 사용자 자료 선택 (수동)

역할: Notion 또는 Discord에서 10개 내외 자료를 선택

구현 옵션:

방식 장점 단점
Notion 체크박스 직관적, 모바일 가능 Notion API 폴링 필요
Discord 리액션 빠름, 알림 UI 제한적
웹 대시보드 커스텀 UI 추가 개발 필요
# Notion 기반 선택 감지 예시
def get_selected_articles() -> list[dict]:
    results = notion.databases.query(
        database_id=DATABASE_ID,
        filter={"property": "상태", "select": {"equals": "선택됨"}}
    )
    return [parse_page(page) for page in results['results']]

Step 7. ElevenLabs TTS 변환

역할: 선택된 자료의 번역문을 음성으로 변환

# tts_generator.py
from elevenlabs import ElevenLabs

client = ElevenLabs(api_key="YOUR_KEY")

def generate_tts(text: str, output_path: str, voice_id: str = "YOUR_VOICE_ID"):
    audio = client.text_to_speech.convert(
        voice_id=voice_id,
        text=text,
        model_id="eleven_multilingual_v2",
        output_format="mp3_44100_128"
    )
    
    with open(output_path, "wb") as f:
        for chunk in audio:
            f.write(chunk)
    
    return output_path

음성 설정 팁:

  • eleven_multilingual_v2 모델 → 한국어 지원
  • Voice Cloning으로 본인 목소리 사용 가능
  • Stability: 0.5, Similarity: 0.75 기본 권장

Step 8. 이미지 칠판 배경 합성

역할: 핵심 내용을 칠판 스타일 이미지로 합성

# image_composer.py
from PIL import Image, ImageDraw, ImageFont

def compose_chalkboard_image(
    title: str,
    key_points: list[str],
    bg_path: str = "assets/chalkboard_bg.png",
    output_path: str = "output.png"
):
    bg = Image.open(bg_path).resize((1080, 1920))  # 숏츠 세로 비율
    draw = ImageDraw.Draw(bg)
    
    # 폰트 설정 (분필 느낌)
    title_font = ImageFont.truetype("assets/fonts/chalk_font.ttf", 60)
    body_font = ImageFont.truetype("assets/fonts/chalk_font.ttf", 40)
    
    # 제목
    draw.text((540, 200), title, font=title_font, fill="white", anchor="mt")
    
    # 핵심 포인트
    y = 400
    for i, point in enumerate(key_points):
        draw.text((100, y), f"✦ {point}", font=body_font, fill="#E8E8E8")
        y += 80
    
    bg.save(output_path)
    return output_path

Step 9. JSON 저장

역할: 모든 작업 데이터를 JSON으로 저장하여 숏츠 생성에 활용

# data/output.json 구조
{
    "date": "2026-03-15",
    "articles": [
        {
            "id": 1,
            "title_en": "Fed Holds Rates Steady",
            "title_kr": "연준, 금리 동결 결정",
            "category": "금리",
            "summary_kr": "연준이 3월 FOMC에서...",
            "translated_full": "...",
            "importance": 9,
            "tts_path": "data/selected/01_tts.mp3",
            "image_path": "data/selected/01_chalkboard.png",
            "duration_seconds": 45
        }
    ],
    "trading_insight": "...",
    "total_duration": 540
}

Step 10. Python 숏츠 생성

역할: 이미지 + TTS + 자막을 조합하여 YouTube Shorts 영상 생성

# shorts_maker.py
from moviepy.editor import (
    ImageClip, AudioFileClip, TextClip, 
    CompositeVideoClip, concatenate_videoclips
)

def create_shorts(data_json: str, output_path: str = "output_shorts.mp4"):
    with open(data_json) as f:
        data = json.load(f)
    
    clips = []
    for article in data['articles']:
        # 이미지 클립
        audio = AudioFileClip(article['tts_path'])
        image = ImageClip(article['image_path']).set_duration(audio.duration)
        
        # 자막 추가
        subtitle = TextClip(
            article['summary_kr'],
            fontsize=30, color='white', bg_color='rgba(0,0,0,0.7)',
            size=(1000, None), method='caption'
        ).set_position(('center', 1600)).set_duration(audio.duration)
        
        # 합성
        clip = CompositeVideoClip([image, subtitle]).set_audio(audio)
        clips.append(clip)
    
    # 인트로/아웃트로 추가 가능
    final = concatenate_videoclips(clips, method="compose")
    final.write_videofile(
        output_path,
        fps=30,
        codec='libx264',
        audio_codec='aac'
    )
    return output_path

필요 라이브러리:

moviepy          # 영상 편집
Pillow           # 이미지 처리
ffmpeg           # 코덱 (시스템 설치 필요)

Step 11. 사용자 승인 → YouTube 업로드

역할: Discord에서 [승인] 버튼 클릭 시 YouTube에 업로드

# Discord 버튼 인터랙션
class ApprovalView(discord.ui.View):
    @discord.ui.button(label="✅ 승인", style=discord.ButtonStyle.green)
    async def approve(self, interaction, button):
        await interaction.response.send_message("📤 업로드를 시작합니다...")
        upload_to_youtube(shorts_path)
        await interaction.followup.send("✅ YouTube 업로드 완료!")
    
    @discord.ui.button(label="❌ 반려", style=discord.ButtonStyle.red)
    async def reject(self, interaction, button):
        await interaction.response.send_message("🔄 수정이 필요합니다. 피드백을 입력해주세요.")

# YouTube 업로드
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials

def upload_to_youtube(video_path: str, title: str, description: str):
    creds = Credentials.from_authorized_user_file('config/youtube_token.json')
    youtube = build('youtube', 'v3', credentials=creds)
    
    request = youtube.videos().insert(
        part="snippet,status",
        body={
            "snippet": {
                "title": title,
                "description": description,
                "tags": ["매크로", "경제", "투자"],
                "categoryId": "22"  # People & Blogs
            },
            "status": {
                "privacyStatus": "public",
                "selfDeclaredMadeForKids": False
            }
        },
        media_body=video_path
    )
    response = request.execute()
    return response['id']

Step 12. Playwright 멀티 플랫폼 자동 게시

역할: 숏츠 업로드 후 텍스트 버전을 여러 플랫폼에 자동 게시

# social_poster.py
from playwright.async_api import async_playwright

class SocialPoster:
    async def post_all(self, content: dict):
        async with async_playwright() as p:
            browser = await p.chromium.launch(headless=True)
            
            await self.post_telegram(browser, content)
            await self.post_naver_blog(browser, content)
            await self.post_linkedin(browser, content)
            await self.post_facebook(browser, content)
            await self.post_x(browser, content)
            
            await browser.close()
    
    async def post_telegram(self, browser, content):
        # Telegram Bot API 사용 (Playwright 불필요)
        import httpx
        BOT_TOKEN = "YOUR_BOT_TOKEN"
        CHAT_ID = "YOUR_CHAT_ID"
        url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
        await httpx.AsyncClient().post(url, json={
            "chat_id": CHAT_ID,
            "text": content['text'],
            "parse_mode": "Markdown"
        })
    
    async def post_naver_blog(self, browser, content):
        page = await browser.new_page()
        await page.goto("https://blog.naver.com")
        # 로그인 → 글쓰기 → 내용 입력 → 발행
        # (세부 셀렉터는 네이버 블로그 UI에 맞게 조정 필요)
        await page.close()
    
    async def post_linkedin(self, browser, content):
        page = await browser.new_page()
        await page.goto("https://www.linkedin.com")
        # 로그인 → 게시물 작성 → 발행
        await page.close()
    
    async def post_facebook(self, browser, content):
        page = await browser.new_page()
        await page.goto("https://www.facebook.com")
        # 로그인 → 게시물 작성 → 발행
        await page.close()
    
    async def post_x(self, browser, content):
        page = await browser.new_page()
        await page.goto("https://x.com")
        # 로그인 → 트윗 작성 → 발행
        await page.close()

⚠️ 주의: Playwright 기반 SNS 자동 게시는 각 플랫폼의 이용약관에 따라 계정 제한 리스크가 있습니다. 가능하면 공식 API를 우선 사용하세요.


Phase 3. 추가 자동화 (🟥 확장)

유튜브 영상 기반 주제 추천

# topic_recommender.py
def recommend_topics_from_youtube(channel_id: str):
    """기존 유튜브 영상을 분석하여 새로운 주제를 추천"""
    # 1. YouTube API로 채널 영상 목록 가져오기
    # 2. 영상 제목/설명/태그 수집
    # 3. Claude API로 트렌드 분석 & 새 주제 추천
    
    prompt = f"""
    다음은 유튜브 채널의 최근 영상 목록입니다:
    {video_list}
    
    1. 어떤 주제가 조회수가 높았는지 분석
    2. 아직 다루지 않은 관련 주제 5개 추천
    3. 현재 트렌드와 연결되는 주제 3개 추천
    """
    return claude_response

전체 스케줄 관리

# config/settings.yaml
schedules:
  macro_collection:
    time: "14:00"
    timezone: "Asia/Seoul"
    enabled: true
  
  topic_recommendation:
    time: "09:00"
    frequency: "weekly"  # 매주 월요일
    enabled: true
  
  analytics_report:
    time: "10:00"
    frequency: "weekly"  # 매주 월요일
    enabled: true
  
  channel_performance:
    time: "08:00"
    frequency: "daily"
    enabled: false

기술 스택 요약

카테고리 기술 용도
언어 Python 3.11+ 전체 파이프라인
스케줄링 APScheduler / Cron 정시 실행
AI Claude API (Anthropic) 번역, 분류, 분석, 추천
TTS ElevenLabs API 음성 생성
영상 MoviePy + FFmpeg 숏츠 제작
이미지 Pillow 칠판 배경 합성
알림 Discord.py / Webhook 상태 알림 & 승인
데이터 Notion API 자료 관리
자동화 Playwright SNS 자동 게시
업로드 YouTube Data API v3 영상 업로드
서버 AWS EC2 24시간 운영

필요 패키지 (requirements.txt)

# AI & NLP
anthropic>=0.40.0
elevenlabs>=1.0.0

# 데이터 수집
feedparser
requests
beautifulsoup4

# 영상 & 이미지
moviepy>=2.0.0
Pillow>=10.0.0

# 자동화
playwright
apscheduler>=3.10.0

# Discord
discord.py>=2.3.0
aiohttp

# Notion
notion-client>=2.0.0

# YouTube
google-api-python-client
google-auth-oauthlib

# SNS
httpx

# 유틸
python-dotenv
pyyaml

구현 순서 (권장)

한 번에 전체를 만들지 말고, 아래 순서로 하나씩 완성하세요.

Phase 1 — MVP (1~2주)
├── ① 매크로 수집 봇 (collectors/)
├── ② Discord 알림 (publishers/discord_bot.py)
├── ③ 인턴 에이전트 (agents/intern_agent.py)
└── ④ Notion 업로드 (publishers/notion_uploader.py)

Phase 2 — 콘텐츠 생성 (2~3주)
├── ⑤ Claude 번역 (translators/)
├── ⑥ TTS 생성 (media/tts_generator.py)
├── ⑦ 이미지 합성 (media/image_composer.py)
└── ⑧ 숏츠 생성 (media/shorts_maker.py)

Phase 3 — 배포 자동화 (1~2주)
├── ⑨ YouTube 업로드 (publishers/youtube_uploader.py)
├── ⑩ 승인 워크플로우 (Discord 버튼)
└── ⑪ 멀티플랫폼 게시 (publishers/social_poster.py)

Phase 4 — 고도화 (지속)
├── ⑫ 유튜브 분석 & 주제 추천
├── ⑬ 성과 대시보드
└── ⑭ A/B 테스트 (썸네일, 제목 등)

주의사항

[!CAUTION]

  • API 비용 관리: Claude API, ElevenLabs는 종량제입니다. 일일 사용량 상한을 설정하세요.
  • SNS 자동화 리스크: Playwright 기반 자동 게시는 계정 정지 리스크가 있습니다. 공식 API 우선 사용을 권장합니다.
  • 환경변수 보안: .env 파일은 절대 Git에 커밋하지 마세요. .gitignore에 반드시 추가하세요.
  • 영상 저작권: 수집한 자료의 출처를 반드시 명시하고, 저작권 문제가 없는 콘텐츠만 사용하세요.

참고글 :

https://www.facebook.com/leebisu/posts/pfbid02aaWe3TUXSUe2eY4WYdvbkpGgvWVTFJkwaEHkTKDtZnYaWZyoGRcQFs52cRfYUbufl

Posted in mm

AWS Lightsail로 서버 구축하고 도메인 연결하는 방법

AWS Lightsail 기반 서버 구축, 도메인 연동 및 HTTPS 보안 인증서 적용 방법입니다.


1. AWS Lightsail 인스턴스(서버) 개설

AWS Lightsail은 올인원 패키지로, 저렴하고 간편하게 가상 프라이빗 서버(VPS)를 구축할 수 있는 서비스입니다.

  • 인스턴스 생성 과정
    1. AWS Lightsail 콘솔에서 [인스턴스 생성] 클릭
    2. 플랫폼 선택: Linux/Unix
    3. 블루프린트 선택: LAMP (PHP 8) 또는 WordPress 등 목적에 맞게 선택
    4. 요금 플랜 선택 (필요한 스펙에 따라 선택, 최초 가입자의 경우 일부 요금제 3개월 무료 지원 가능)
    5. 인스턴스 이름 지정 후 [인스턴스 생성] 완료
  • 고정 IP 생성 및 할당 (필수)
    • 기본 할당되는 동적 퍼블릭 IP는 인스턴스 재시작 시 변경됩니다.
    • [네트워킹] – [고정 IP 생성] 옵션을 통해 고정 IP를 발급받고 생성한 인스턴스에 할당합니다.

2. 도메인 등록 및 서버 IP 연결

기억하기 어려운 IP 주소(예: 15.164.x.x) 대신 사용할 고유한 도메인 이름을 등록하고 서버와 연결합니다.

  • 도메인 구매 및 등록
    • spaceship.com, AWS Route 53 등 기관을 통해 사용할 도메인 이름(예: Url.com) 검색 및 구매
  • Lightsail DNS 영역 생성
    1. Lightsail 콘솔의 [도메인 및 DNS] 탭에서 [DNS 영역 생성]
    2. 구매한 도메인 이름 입력
    3. 할당받은 Lightsail의 이름 서버(NS) 목록(예: ns-xxx.awsdns-xx.com 등 4개) 확인
  • 네임서버 업데이트 설정
    • 도메인 구입처 설정 메뉴로 이동하여 DNS 네임서버를 위에 확인한 Lightsail 이름 서버들로 변경 (전파에 약간의 시간 소요됨)
  • 도메인 할당 (서버 연결)
    • [도메인 및 DNS] – 해당 도메인 영역 설정에서 발급해둔 **‘고정 IP’**와 **‘도메인’**을 매핑 연결(A 레코드 추가 등).
    • (필요 시) www.도메인을 루트 도메인으로 보내기 위해 CNAME 레코드 등 추가 설정.

3. HTTPS 인증서 설치 및 배포

Lightsail 내장 툴(bncert-tool)을 사용하여 Let’s Encrypt 기반의 무료 SSL/TLS 보안 인증서를 설치합니다. HTTP 접속 시 자동으로 시작 페이지가 안전한 HTTPS로 암호화 되도록 설정합니다.

  • SSH 터미널 접속
    • Lightsail 콘솔에서 해당 인스턴스의 [ >_ (SSH를 사용하여 연결) ] 버튼 클릭하여 웹 브라우저 기반 SSH 접속
  • 인증서 설치 스크립트 실행
    • 콘솔 창에 아래 명령어를 입력합니다.
      $ sudo /opt/bitnami/bncert-tool
      
  • 인증서 발급 위자드 설정 단계
    1. Domain list: 도메인 목록 입력 (예: url.net www.url.net 띄어쓰기로 구분)
    2. Enable HTTP to HTTPS redirection [Y/n]: Y (http 접속 시 https로 강제 이동)
    3. Enable non-www to www redirection / Enable www to non-www: 원하는 URL 통합 방향에 따라 Y 또는 N 선택
    4. 설정되는 변경 사항(자동 갱신 크론탭 등록, 리다이렉션 반영 등)에 대한 승인 Y
    5. 관리자 이메일 주소 입력 및 Let’s Encrypt 사용자 동의 Y 완료
  • 최종 접속 확인
    • 웹 브라우저에서 https://자신의도메인 으로 접속하여, 주소창 옆 자물쇠 모양(연결이 안전합니다)이 정상적으로 뜨는지 확인합니다.
Posted in mm

온톨로지 가이드

온톨로지 (Ontology) 상세 가이드

1. 온톨로지란?

온톨로지는 특정 도메인의 개념(Entity), 속성(Property), 관계(Relation)를 형식적으로 정의한 지식 모델입니다.

핵심 구성요소 4가지

  • 클래스(Class): 개념의 카테고리 (예: “건물”, “임차인”, “계약”)
  • 인스턴스(Instance): 실제 데이터 (예: “강남 A빌딩”, “㈜B회사”)
  • 속성(Property): 개체의 특성 (예: 면적, 임대료, 계약기간)
  • 관계(Relation): 개체 간 연결 (예: “A빌딩 → 임대계약 → B회사”)

일반 DB와의 차이는, 온톨로지는 데이터의 ’의미’와 ’맥락’까지 구조화한다는 점입니다. RDB는 테이블 간 JOIN으로 관계를 표현하지만, 온톨로지는 “왜 연결되는지”까지 정의합니다.


2. 부동산 업무 적용 가능성

적용 시나리오

  • 자산 관리: 건물 → 층 → 호실 → 임차인 → 계약 → 매출의 계층적 관계를 하나의 지식 그래프로 통합
  • 투자 의사결정: 지역, 용도, 수익률, 공실률, 인구데이터 등 멀티 도메인 데이터를 연결해 크로스 분석
  • 실사(Due Diligence): 법적 권리관계(소유권, 근저당, 전세권 등)를 관계 그래프로 시각화
  • 팀 리포팅 자동화: 자동화 시스템의 데이터 백본으로 활용

ROI 관점

데이터가 10개 도메인 이상, 팀원 5명 이상이 같은 데이터를 다르게 해석하는 상황이라면 온톨로지 도입 가치가 높습니다. 반대로 단일 도메인, 소규모 데이터라면 잘 설계된 RDB로 충분합니다.


3. 구축 방법 (실용적 단계)

Step 1: 경량 접근 (즉시 시작 가능)

도구 용도 난이도
Notion / Google Sheets 개념-관계 매핑 초안 작성 ★☆☆
draw.io / Miro 관계도 시각화 ★☆☆
Neo4j (그래프 DB) 실제 지식 그래프 구축 ★★☆

이 단계에서는 도메인 전문가(본인)가 직접 개념과 관계를 정의하는 것이 핵심입니다.

Step 2: 본격 구축

도구 용도 난이도
Protégé (스탠포드 개발, 무료) OWL 온톨로지 편집기 ★★☆
Neo4j + Cypher 그래프 DB로 쿼리 가능한 온톨로지 ★★★
Knowledge Graph (GCP/AWS) 클라우드 기반 대규모 온톨로지 ★★★

Step 3: AI 연동

온톨로지 + LLM 조합이 최근 트렌드입니다:

  • 온톨로지가 구조화된 지식(팩트)을 제공
  • LLM이 *자연어 인터페이스*를 제공
  • 예: “강남구 오피스 중 공실률 5% 이하이면서 수익률 4% 이상인 건물?” → 온톨로지 기반 정확한 답변

4. 현실적 추천 로드맵

단계 기간 행동
1단계 12주 본인 업무 도메인의 핵심 개념 3050개를 스프레드시트에 정리, 관계 정의
2단계 24주 Neo4j Community Edition(무료)으로 그래프 DB 구축, 샘플 데이터 입력
3단계 12개월 팀 리포팅 자동화 시스템과 연동, API로 데이터 조회
4단계 3개월+ LLM 연동하여 자연어 질의 인터페이스 구축

핵심 조언

온톨로지 구축에서 가장 중요한 건 도구가 아니라 *도메인 모델링 품질*입니다. 부동산 현장 경험이 있는 본인이 직접 개념과 관계를 정의하는 것이 외부 개발자에게 맡기는 것보다 훨씬 정확한 결과를 만듭니다. 1단계를 충실히 하면 나머지는 기술적 구현의 문제입니다.

Posted in mm