
저사양 MacBook으로 구축하는 로컬 LLM × VSCode 코딩 환경
요약
저사양 MacBook 환경에서 Cline, Ollama, Context7 MCP를 조합하여 보안이 강화된 로컬 LLM 코딩 환경을 구축하는 방법을 소개합니다. 최신 문서를 참조할 수 있는 MCP를 활용하여 모델의 지식 한계를 보완하는 것이 핵심입니다.
핵심 포인트
- Cline, Ollama, Context7 MCP를 활용한 로컬 에이전트 환경 구성
- MCP를 통해 최신 라이브러리 문서를 주입하여 할루시네이션 방지
- Apple Silicon의 유니파이드 메모리를 활용한 Ollama 실행
- 유지보수가 종료된 Continue.dev 대신 Cline 사용 권장
- 이것을 구축하여 동작은 하고 있으며, 구축에는 성공했다.
- 다만, 조정이 필요한 상태.
즉, 안 됨!! 사용할 수 없음!!!
-
구축을 해보고 싶은 분이라면 시도해 보는 것도 좋을지도.
-
현장 개발 제안을 위해 시험 삼아 만들어 봄
-
Ollama나 Cline, MCP 등 들어본 적은 있지만 처음 접함
-
로컬 LLM (Local LLM) 이므로 클로즈드 (Closed) 환경에서 동작함
-
최신 문서 확인을 위해 인터넷 연결은 하지만, 코드는 전송되지 않는 점이 훌륭함.
구성: Cline + Ollama + Context7 MCP (2026년 7월 시점의 정보)
- VSCode 내에서 채팅, 파일 편집, 신규 파일 추가가 가능 (Claude on VSCode에 상응하는 경험)
- 모델은 로컬 LLM (Local LLM) (저사양 MacBook에서 동작)
- 라이브러리의 버전에 일치하는 최신 문서를 참조하여 작업 (오래된 학습 데이터에 의존하지 않음) - 탭 보완 (Tab Completion)은 불필요 (GitHub Copilot이 담당)
| 컴포넌트 | 역할 | 선정 이유 |
|---|---|---|
| Cline (VSCode 확장) | 채팅 / 멀티 파일 편집 / 신규 생성 / 터미널 실행 | 2026년 중반 시점에서 가장 활발하게 유지보수되고 있는 로컬 LLM 대응 에이전트. 탭 보완 기능이 없기 때문에 Copilot과 경합하지 않음 |
| Ollama | 로컬 LLM (Local LLM) 실행 기반 | 싱글 바이너리로 관리가 쉬움. Apple Silicon의 유니파이드 메모리 (Unified Memory)와 궁합이 좋음 |
| Context7 MCP | 버전 일치 문서 주입 | 「Next.js 15의 작성법을 물었는데 Pages Router 시대의 코드가 반환되는」 문제를 해결. 프롬프트에 최신 공식 문서를 포함 |
주의: Continue.dev는 선택하지 않음. 2026년 6월에 Cursor에 인수되어 v2.0.0을 마지막으로 리포지토리(Repository)가 read-only (유지보수 종료) 상태가 됨. 동작은 하지만 향후 업데이트가 없으므로, 신규 구축이라면 Cline을 권장.
- macOS (Apple Silicon 권장. Intel도 가능하지만 느림)
- VSCode 최신 버전
- Homebrew
- Node.js 18 이상 (Context7 MCP 실행에 필요)
# Node.js가 미도입된 경우
brew install node
node -v # v18 이상인지 확인
brew install ollama
또는 GUI 버전을 https://ollama.com/download 에서 설치.
Homebrew (CLI) 버전: ollama serve를 터미널에서 실행해 두거나, brew services start ollama로 상주화
GUI (.app) 버전: 메뉴 바 앱이 서버를 자동 관리함. GUI 버전 사용 시 ollama serve를 수동 실행하면 포트 경합이 발생하므로 주의
| 커맨드 | 동작 |
|---|---|
brew services start ollama | 시작 + 로그인 시 자동 시작 등록 (상주화) |
brew services stop ollama | 정지 + 자동 시작 등록도 해제 |
brew services restart ollama | 재시작 (설정 변경 후나 동작이 이상할 때) |
brew services run ollama | 이번에만 시작 (자동 시작은 등록하지 않음) |
brew services kill ollama | 이번에만 정지 (자동 시작 등록은 유지) |
brew services list | 모든 서비스의 가동 상황 확인 (started라면 가동 중) |
brew services info ollama | ollama의 상세 상태 확인 |
평소 사용은 start / stop 두 가지만 있으면 충분함. "오늘만 쓰고 싶다 / 오늘만 멈추고 싶다" 할 때 run / kill을 사용하면 자동 시작 설정을 건드리지 않아도 됨.
동작 확인:
curl http://localhost:11434
# "Ollama is running"이 반환되면 OK
저사양 단말에서는 RAM 용량이 최대 제약 사항. Apple Silicon은 RAM이 GPU와 공유(유니파이드 메모리)되므로, RAM별 기준은 다음과 같음.
모델 확인은 이쪽
| 탑재 RAM | 권장 모델 | Q4 양자화 시 사용 메모리 | 비고 |
|---|---|---|---|
| 8GB | qwen2.5-coder:3b | 약 2GB | 품질은 타협 필요. 단일 파일의 작은 작업용 |
| 16GB | qwen2.5-coder:7b | 약 4.5GB | 저사양 기기에서 밸런스가 가장 좋음. 우선 이것부터 |
| 24GB 이상 | qwen2.5-coder:14b 등 | 약 9GB~ | 품질 향상. 에이전트 작업의 성공률이 올라감 |
# 16GB 기기 권장 (다운로드 약 4.7GB)
ollama pull qwen2.5-coder:7b
# 동작 테스트
...
Ollama의 기본 컨텍스트(Context)는 약 2K~4K 토큰뿐이라, Cline과 같은 에이전트는 몇 번의 도구 호출(Tool Call)만으로 즉시 한계에 도달하여 무한 루프나 무응답 실패를 일으킵니다. 거의 모든 사용자가 빠지는 함정이므로 반드시 설정해야 합니다.
Modelfile을 작성하여 컨텍스트를 확장한 커스텀 모델을 등록합니다:
mkdir -p ~/ollama-models && cd ~/ollama-models
cat > Modelfile.qwen-cline << 'EOF'
FROM qwen2.5-coder:7b
...
- 에이전트 작업에는 16K(16384)가 하한선 기준 - 컨텍스트를 늘릴수록 KV 캐시(KV Cache)가 RAM을 점유하므로, 8GB 기기에서는 8192로 억제하는 등 조정 필요
- 메모리 부족으로 스왑(Swap)이 빈번하게 발생할 경우
num_ctx를 낮추거나 더 작은 모델로 변경
KV = Key-Value. LLM이 추론 중에 사용하는 "읽은 내용의 작업 메모"를 의미합니다. LLM은 1토큰을 생성할 때마다 과거의 전체 문맥을 참조하는데, 매번 처음부터 다시 계산하면 극도로 느려지기 때문에, 한 번 계산한 각 토큰의 중간 결과(Key와 Value 벡터)를 메모리에 저장해 재사용합니다. 이것이 KV 캐시(KV Cache)입니다.
메모리 소비 구조는 다음과 같습니다:
| 항목 | 성질 |
|---|---|
| 모델 본체 | 고정비 (7B Q4 기준 약 4.5GB) |
| KV 캐시 | 변동비. num_ctx에 비례하여 증가 (16K 설정 시 수 GB 규모가 될 수도 있음) |
즉 "num_ctx를 늘리는 것 = 책상을 넓힐수록 책상 자체가 방(RAM)을 압박하는 것"과 같습니다. 합계가 RAM을 초과하면 스왑이 발생하여 급격히 느려지므로, num_ctx는 RAM 용량을 고려하여 결정해야 합니다.
- VSCode 확장 기능 마켓플레이스에서 **"Cline"**을 검색하여 설치 - 사이드바의 Cline 아이콘을 클릭
3-1. 다음과 같이 설정:
- API Provider:
Ollama - Base URL:
http://localhost:11434(기본값 그대로 유지해도 OK) - Model Context Window: 16384 (
num_ctx로 설정한 값으로 반드시 변경) - Model:
qwen2.5-coder-cline(Step 3에서 만든 커스텀 모델을 선택할 것. 원래의qwen2.5-coder:7b를 선택하면 컨텍스트 확장이 적용되지 않음)
3-2. Cline을 열고 bring my own API key를 선택

3-3. 스크린샷의 설정으로 변경
*Model Context Window는 반드시 방금 설정한 num_ctx 값으로 설정하십시오.

이제 채팅, 여러 파일 편집, 신규 파일 추가, 터미널 명령어 실행(각 단계 승인제)이 로컬 LLM으로 동작합니다.
Cline은 탭 완성(Tab Completion) 기능 자체를 가지고 있지 않기 때문에, Copilot의 완성 기능과 전혀 충돌하지 않습니다. 별도 설정 없이 그대로 공존할 수 있습니다.
- 인라인 완성(Inline Completion) → Copilot
- 채팅 / 설계 상담 / 멀티 파일 편집 / 리팩토링 → Cline (로컬 LLM)
이 부분이 "오래된 문서가 아닌 버전이 일치하는 정보로 작업하기" 위한 핵심 부분입니다.
Context7은 질문에 따라 라이브러리의 최신 버전 및 버전이 지정된 문서와 코드 예시를 가져와 LLM의 컨텍스트에 주입하는 MCP 서버입니다. "Next.js 14의 middleware 작성법은?"과 같이 버전을 명시하면, 해당 버전에 대응하는 문서가 자동으로 매칭됩니다.
- Cline 패널 열기
- 햄버거 메뉴(☰) →
MCP Servers 섹션 - Marketplace 탭에서
Context7 검색 -
Install 클릭
MCP Servers → Edit Configuration 에서 아래 내용 추가:
{
"mcpServers": {
"context7": {
...
API 키 없이도 기본 기능은 작동합니다. Rate Limit (속도 제한)을 높이고 싶다면 https://context7.com/dashboard 에서 무료 API 키를 발급받아, args에 "--api-key", "YOUR_API_KEY"를 추가하세요.
매번 "use context7"이라고 쓰는 것은 번거로우므로, 프로젝트 루트에 .clinerules 파일을 만들어 자동으로 발동되게 합니다:
# .clinerules
외부 라이브러리나 프레임워크에 관한 코드 생성·설정 절차·API 문서가
필요한 경우에는, 반드시 Context7 MCP 도구(resolve-library-id → get-library-docs)를
...
package.json을 확인해서, 이 프로젝트의 Next.js 버전에 맞는
Server Actions 구현 방식으로 폼 전송을 만들어줘. use context7
Cline이 resolve-library-id로 라이브러리 ID를 해결 → get-library-docs로 해당 버전의 문서를 가져옴 → 그것을 근거로 코드를 작성하는 흐름이 됩니다.
토큰 절약 주의사항: Context7의 1회 문서 가져오기는 기본적으로 5,000 토큰을 컨텍스트 (Context)에 올립니다. 저사양 기기에서는 컨텍스트가 귀중하므로, 변화가 빠른 라이브러리(Next.js, Tailwind v4 등)로 범위를 좁혀 사용하고, 안정적인 API(lodash 등)에서는 발동시키지 않는 운영 방식이 현실적입니다.
curl http://localhost:11434
→ Ollama 응답 있음 - Cline에서 채팅: "이 프로젝트의 구성을 설명해줘" → 파일을 읽고 답변함
-
편집 작업: "utils.ts에 kebab-case 변환 함수를 추가해줘" → Diff (차이점)가 제시되며, 승인 시 반영됨
-
신규 생성: "Button 컴포넌트를 components/ 폴더에 새로 만들어줘" → 파일이 생성됨
-
Context7: "Tailwind CSS v4의 theme 설정 방법을 알려줘. use context7" → MCP 도구 호출이 실행되어, v4 방식(CSS-first 설정)으로 답변함
-
Copilot의 탭 보완(Tab Completion)이 기존처럼 작동함
태스크는 작게 나누세요. 8~16GB 기기의 7B 모델에서는 여러 파일에 걸친 대규모 에이전트 (Agent) 태스크는 정확도가 떨어집니다. "이 파일에 유효성 검사를 추가하고 테스트도 업데이트해줘" 정도의 단일 또는 소수 파일 태스크가 적정 사이즈입니다. -
에이전트의 폭주는 모델 사이즈가 원인인 경우가 많습니다. 편집이 엉뚱한 방향으로 흐를 경우, 도구의 문제라기보다 모델이 너무 작을 가능성이 높습니다. 태스크를 분할하거나, 중요한 작업만 Claude Code와 같은 클라우드 LLM으로 전환하세요 (Cline은 프로바이더를 태스크마다 Ollama ⇔ Anthropic으로 전환 가능합니다). -
메모리 압박 시: ollama ps로 상주 모델을 확인하고, OLLAMA_KEEP_ALIVE=5m (기본값) 설정으로 자동 언로드 (Unload)에 맡기세요. Premiere Pro와 같은 무거운 앱과의 동시 사용은 피하는 것이 좋습니다. -
속도가 느릴 경우: num_ctx를 낮추거나, 3B 모델로 내리거나, 다른 앱을 닫아 메모리를 확보하세요.
| 증상 | 원인 및 대처 |
|---|---|
| Cline이 도중에 무한 루프/침묵함 | num_ctx 미설정이 9할. Step 3의 커스텀 모델을 사용 중인지 확인 |
| ... | .clinerules 설정을 확인하거나, 프롬프트 끝에 명시적으로 use context7을 붙임 |
| npx 실행 시 MCP가 시작되지 않음 | Node.js 18 이상인지 확인. 안 된다면 bunx로 교체하면 해결되는 경우가 많음 |
| 응답이 극도로 느림 | Activity Monitor에서 스왑 (Swap) 확인. 모델 사이즈나 num_ctx를 낮춤 |
| 명령어 | 동작 |
|---|---|
ollama pull <model> | 모델 다운로드 (예: ollama pull qwen2.5-coder:7b) |
ollama list | 설치된 모델 목록 표시 (크기 및 업데이트 날짜 포함) |
ollama show <model> | 모델 상세 정보 표시 (파라parameter 수, 컨텍스트 길이 (Context Length), 양자화 (Quantization), Modelfile 내용) |
ollama pull <model> (재실행) | 모델 업데이트 (새 버전이 있는 경우 차분 다운로드) |
| 명령어 | 동작 |
|---|---|
ollama run <model> | 터미널에서 대화 시작 (다운로드되지 않은 경우 자동으로 pull 후 실행) |
ollama run <model> "질문문" | 원샷 (One-shot) 실행 (대화 모드로 진입하지 않고 1회만 답변) |
/bye | 대화 모드 종료 (대화 중 입력) |
/clear | 대화 문맥 (Context) 리셋 (대화 중 입력) |
| 명령어 | 동작 |
|---|---|
ollama ps | 현재 메모리에 로드된 모델과 사용량, 남은 상주 시간 표시 |
ollama stop <model> | 로드 중인 모델을 즉시 메모리에서 언로드 (Unload) |
curl http://localhost:11434 | 서버 생존 확인 ("Ollama is running"이 반환되면 정상) |
| 명령어 | 동작 |
|---|---|
ollama create <이름> -f <Modelfile> | Modelfile로부터 커스텀 모델 생성 (num_ctx 변경 등) |
ollama cp <원본> <새이름> | 모델 복제 |
ollama rm <model> | 모델 삭제 (디스크에서 삭제. 커스텀 모델의 원본 모델은 남겨둘 필요가 있음) |
- 모델의 실체는
~/.ollama/models/에 저장된다. 디스크 사용량은du -sh ~/.ollama/models로 확인 가능 - 로드된 모델은 기본적으로 최종 사용 5분 후 자동으로 언로드된다 (
OLLAMA_KEEP_ALIVE로 변경 가능). 즉시 메모리를 비우고 싶을 때는ollama stop사용 - 서버 자체의 기동/정지는 Step 1의
brew services명령어 목록을 참조
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기