본문 바로가기

Copilot

GitHub Copilot 완전가이드 3편 — Ask/Edit/Agent 모드 실전, Coding Agent로 이슈→PR 자동화, copilot-instructions.md

반응형

 

1편에서 셋업했고, 2편에서 크레딧 구조를 파악했습니다. 이제 실제로 Copilot을 어떻게 쓰는지 — 채팅 3가지 모드, GitHub 이슈를 PR로 자동 완성하는 Coding Agent, 그리고 내 프로젝트에 맞게 AI를 튜닝하는 방법까지 다 씁니다. 그대로 따라하면 됩니다.


핵심 요약

→ Chat 모드 3가지: Ask(질문) / Edit(파일 수정) / Agent(자율 실행) — 드롭다운 하나로 전환
→ Ask: 코드 건드리지 않고 설명, 제안만 → 크레딧 소비 가장 적음
→ Edit: 선택한 파일들 직접 수정 → 멀티파일 리팩토링에 최적
→ Agent: 계획 → 파일 수정 → 터미널 명령 → 에러 확인 → 반복 → 자율 실행
Coding Agent (Cloud Agent): GitHub 이슈 할당 → 백그라운드에서 PR 자동 생성
copilot-instructions.md: .github/ 폴더에 두면 모든 채팅에 적용되는 프로젝트 규칙
→ 슬래시 명령어: /explain, /fix, /tests, /docs — 긴 프롬프트 없이 바로 실행
→ @ 컨텍스트: #file, #codebase, #selection — 원하는 범위 정확히 지정
→ Agent 모드는 모든 유료 플랜에서 사용 가능 (Free는 제한)
→ Coding Agent는 샌드박스 VM에서 실행 — 실수로 main 브랜치 건드릴 걱정 없음


실전 1 — Chat 패널 열고 모드 전환하는 법

Chat 패널 여는 방법

방법 A: Ctrl+Alt+I (Windows/Linux) / Ctrl+Cmd+I (Mac)
방법 B: VS Code 좌측 사이드바 → 말풍선 아이콘(Copilot Chat) 클릭
방법 C: 상태바 Copilot 아이콘 클릭 → "Open Chat"

모드 드롭다운 위치

Chat 패널 하단 입력창 왼쪽에 드롭다운 있음
기본값: Ask
클릭하면: Ask / Edit / Agent 선택 가능

실전 2 — Ask 모드: 코드 건드리지 않고 답 받기

언제 써야 하나

✅ Ask 모드가 맞는 경우:
- "이 코드가 뭐 하는 건지 설명해줘"
- "이 에러 왜 나는 거야"
- "이 함수 개선할 방법 있어?"
- 코드를 직접 수정하기 전에 방향 잡고 싶을 때

❌ Ask 모드로 하면 안 되는 경우:
- "이 파일 전체 리팩토링해줘" → Edit 쓰기
- "테스트 파일 만들고 실행해봐" → Agent 쓰기

슬래시 명령어로 빠르게 실행

채팅창에 / 치면 사용 가능한 명령어 목록 나옵니다:

명령어 동작 크레딧

/explain 선택 코드 설명 낮음
/fix 버그 찾아서 수정 제안 낮음
/tests 단위 테스트 생성 중간
/docs 문서 주석 생성 낮음
/new 새 프로젝트 파일 스캐폴딩 중간

실전 예시 1: 코드 설명

# 이런 코드가 있다고 할 때
def process_data(items):
    return {k: v for d in items for k, v in d.items() 
            if not k.startswith('_')}

코드 드래그 선택 → Chat 창에 입력:

/explain

Copilot 응답:

이 함수는 딕셔너리 리스트를 받아서 하나의 딕셔너리로 병합합니다.
- items: 딕셔너리들의 리스트
- 각 딕셔너리의 키-값 쌍을 순회하며 새 딕셔너리에 추가
- '_'로 시작하는 키는 제외 (프라이빗 필드 필터링)
- 중복 키가 있으면 마지막 값이 유지됩니다

실전 예시 2: 에러 설명

터미널에서 에러 났을 때, 에러 메시지 복붙 후:

TypeError: 'NoneType' object is not subscriptable
  File "app.py", line 47, in get_user
    return user['id']

이 에러 왜 나는 거야? 어디 고쳐야 해?

Copilot 응답:

user 변수가 None인 상태에서 ['id']로 접근하려 해서 생긴 에러입니다.
get_user() 함수가 아무것도 반환하지 않거나 None을 반환하고 있습니다.

수정 방법:
def get_user(user_id):
    user = db.find(user_id)
    if user is None:
        return None  # 또는 raise ValueError(f"User {user_id} not found")
    return user['id']

# 컨텍스트로 파일/범위 지정

질문할 때 어떤 코드를 기준으로 얘기하는지 정확히 알려줄 수 있습니다:

#file:utils.py 에서 parse_date 함수가 UTC 기준인지 로컬 시간 기준인지 확인해줘
#codebase 전체에서 deprecated된 API 쓰는 곳 있어?
(코드 선택 후) #selection 이 부분 성능 병목이 될 수 있어?

실전 3 — Edit 모드: 파일 직접 수정

언제 써야 하나

✅ Edit 모드가 맞는 경우:
- 특정 파일(들) 수정이 목표일 때
- 멀티파일 리팩토링
- "이 파일에서 모든 var를 const/let으로 바꿔줘"
- Ask에서 방향 잡고 → Edit으로 실제 적용할 때

Edit 모드 실전 흐름

Step 1. 드롭다운 → Edit 선택

Step 2. 수정할 파일을 Working Set에 추가

채팅창 위의 "Add files..." 클릭
또는 파일 탐색기에서 파일 우클릭 → "Add to Copilot Edit"
또는 입력창에 #file:파일명 입력

Step 3. 원하는 작업 입력

예시 1: 단순 변환
var 키워드를 전부 const 또는 let으로 바꿔줘.
재할당되는 변수는 let, 아니면 const.

예시 2: 기능 추가
user.js에 이메일 유효성 검사 함수 추가해줘.
RFC 5322 표준 따르고, 테스트 케이스도 같이 작성해줘.

예시 3: 멀티파일 리팩토링
api/users.js와 api/products.js에서 
중복된 에러 핸들링 코드를 utils/errorHandler.js로 추출해줘.

Step 4. 변경사항 검토 후 수락/거절

파일별로 diff 표시됨 (초록=추가, 빨강=삭제)
→ "Accept" 클릭: 변경 적용
→ "Discard" 클릭: 변경 취소
→ 부분 수락: 원하는 청크만 Accept/Discard

실전 4 — Agent 모드: AI가 스스로 계획하고 실행

언제 써야 하나

✅ Agent 모드가 맞는 경우:
- "로그인 기능 전체 만들어줘" (어떤 파일 건드릴지 AI가 판단)
- 코드 짜고 → 테스트 돌리고 → 에러 고치는 사이클
- 어떤 파일을 수정해야 할지 내가 모를 때
- 터미널 명령까지 자동으로 실행해야 할 때

❌ Agent 모드 안 써도 되는 경우:
- 파일 1~2개만 수정하면 됨 → Edit 더 빠름
- 간단한 질문 → Ask 충분
(Agent는 크레딧 소비가 제일 많음)

Agent 모드 실전: Express API 만들기

Step 1. 빈 폴더를 VS Code로 열기

mkdir my-api && cd my-api
code .

Step 2. Chat → Agent 모드 선택

Step 3. 프롬프트 입력:

Node.js Express로 간단한 TODO API 만들어줘.

요구사항:
- GET /todos - 전체 목록 조회
- POST /todos - 새 항목 추가
- DELETE /todos/:id - 항목 삭제
- 데이터는 메모리 배열로 저장 (DB 없이)
- 포트 3000

파일 구조, package.json, 실행 방법도 같이 만들어줘.

Agent가 하는 일 (자동으로):

1. 계획 수립
   "package.json, index.js, routes/todos.js 생성하겠습니다"

2. 파일 생성
   ✓ package.json 생성
   ✓ index.js 생성  
   ✓ routes/todos.js 생성

3. 터미널 명령 실행 (승인 필요)
   "npm install 실행할까요?" → Run 클릭

4. 실행 확인
   "npm start 실행해서 동작 확인할까요?" → Run 클릭

5. 에러 발생 시 자동 수정
   에러 메시지 읽고 → 원인 파악 → 수정 → 재실행

중간에 방향 수정하기

Agent가 실행 중에도 프롬프트 추가 입력 가능:

(Agent 실행 중)
나: 잠깐, 에러 응답 형식을 { error: "메시지" } 형태로 통일해줘
→ Agent가 현재 작업에 반영해서 계속 진행

터미널 명령 승인/거절

Agent가 터미널 명령 실행할 때마다 확인창 나옵니다:

Copilot wants to run:
  npm install express

[Run] [Don't run]

위험한 명령(rm, DROP TABLE 등)은 반드시 확인하고 클릭하세요.


실전 5 — Coding Agent: GitHub 이슈 → PR 자동 생성

VS Code 안 Agent 모드와 다릅니다. GitHub.com 위에서 클라우드 VM이 백그라운드로 실행하고 PR을 만들어줍니다. 내 컴퓨터와 무관하게 돌아갑니다.

언제 쓰나

✅ Coding Agent 최적:
- "#123 이슈 처리해줘" 하고 다른 일 하고 싶을 때
- 중저난이도 작업 (버그 수정, 테스트 추가, 문서화)
- 팀 프로젝트에서 이슈 백로그 소화할 때

❌ Coding Agent 부적합:
- 아키텍처 설계 같은 복잡한 판단
- 외부 서비스 연동 (샌드박스라 제한적)
- 실시간 인터랙션 필요한 작업

방법 A: GitHub 이슈에서 직접 할당

Step 1. github.com → 레포지토리 → Issues 탭

Step 2. 이슈 만들기 (또는 기존 이슈 열기)
        제목: "로그인 실패 시 에러 메시지가 너무 모호함"
        내용: 
        현재: "오류가 발생했습니다"
        원하는 것: 이메일/비밀번호 오류를 구분해서 표시
        파일 위치: src/auth/login.js

Step 3. 이슈 우측 "Assignees" 클릭
        → "Copilot" 검색 → 선택
        
Step 4. Copilot이 👀 이모지 반응 추가 = 작업 시작 신호

Step 5. 잠시 후 Pull Requests 탭 → 새 PR 자동 생성됨
        Draft PR에 변경사항 커밋됨

방법 B: Chat에서 바로 요청

VS Code Chat 창에서:

@github 이 레포에서 TODO 주석 달린 곳 전부 찾아서
각각 이슈 만들고 구현해서 PR 열어줘

또는:

@github Open a pull request to add input validation 
to the registration form in src/components/Register.jsx

PR 생성 후 할 일

Step 1. Pull Requests 탭 → Copilot이 만든 PR 클릭

Step 2. "Files changed" 탭에서 코드 리뷰
        → 문제 있으면 PR 댓글에 피드백 남기기:
        "@copilot 여기에 null 체크 추가해줘"
        → Copilot이 추가 커밋으로 수정

Step 3. 만족하면 → "Merge pull request" 클릭

보안 보장 구조

Copilot이 만든 PR:
→ copilot/* 브랜치에만 작성 가능 (main 직접 수정 불가)
→ CI/CD는 사람이 Approve 후에만 실행
→ 기존 branch protection rules 그대로 적용
→ 작업 내용 전체 로그 공개 (투명성)

실전 6 — copilot-instructions.md: 내 프로젝트에 맞게 AI 튜닝

한번 설정해두면 그 레포에서 모든 Chat/Agent에 자동 적용됩니다. 매번 "TypeScript 써줘", "ESLint 규칙 지켜줘" 반복 안 해도 됩니다.

파일 만들기

# 프로젝트 루트에서
mkdir -p .github
touch .github/copilot-instructions.md

기본 구조 예시 (React + TypeScript 프로젝트)

# 프로젝트 Copilot 가이드

## 기술 스택
- React 19, TypeScript 5.5 (strict mode)
- Vite, TanStack Query, Tailwind CSS
- Vitest + React Testing Library

## 코딩 규칙

### TypeScript
- 모든 함수에 반환 타입 명시
- `any` 타입 사용 금지, `unknown` 사용
- interface보다 type 우선 사용

### React
- 함수형 컴포넌트만 사용 (클래스 컴포넌트 금지)
- Props는 별도 type으로 정의
- 상태는 useState, 전역은 Zustand 사용

### 네이밍
- 컴포넌트: PascalCase (UserProfile)
- 함수/변수: camelCase (getUserData)
- 상수: UPPER_SNAKE_CASE (MAX_RETRY_COUNT)
- 파일: kebab-case (user-profile.tsx)

## 에러 처리
- async 함수에는 반드시 try/catch 적용
- 에러 메시지는 한국어로 작성
- console.log 대신 logger 유틸 사용

## 테스트
- 새 컴포넌트 만들 때 테스트 파일 함께 생성
- 파일명: *.test.tsx
- describe/it 구조 사용

설정 확인 방법

VS Code Chat 창에서 아무 질문이나 보내기
→ 응답 하단 "References" 펼치기
→ "copilot-instructions.md" 파일이 보이면 적용된 것

경로별 다른 규칙 적용 (.instructions.md)

API 폴더와 UI 폴더에 다른 규칙이 필요하다면:

# API 전용 규칙
touch .github/api.instructions.md
---
applyTo: "src/api/**/*"
---

# API 개발 규칙
- RESTful 네이밍 규칙 준수
- 모든 엔드포인트에 입력값 유효성 검사
- HTTP 상태 코드 정확히 사용 (200/201/400/401/404/500)
- async/await + try/catch 필수
- 응답 형식: { data: ..., error: null } 또는 { data: null, error: "메시지" }
# 테스트 파일 전용 규칙
touch .github/tests.instructions.md
---
applyTo: "**/*.test.ts,**/*.spec.ts"
---

# 테스트 작성 규칙
- Arrange/Act/Assert 패턴 사용
- 테스트 설명은 한국어로 작성
- mock은 최소화, 실제 로직 테스트 우선
- 각 it() 블록은 하나의 동작만 검증

좋은 instructions.md 작성 팁

✅ 좋은 규칙 (구체적):
"모든 API 함수는 try/catch로 감싸고
 catch 블록에서 logger.error(error) 호출할 것"

❌ 나쁜 규칙 (추상적):
"좋은 에러 처리를 사용할 것"

✅ 예시 포함:
"날짜는 ISO 8601 형식으로 저장:
 예: 2026-06-01T12:00:00Z"

❌ 예시 없음:
"날짜 형식을 통일할 것"

실전 7 — 자주 쓰는 실전 프롬프트 모음

바로 복붙해서 쓸 수 있는 프롬프트들입니다.

코드 리뷰 요청

(파일 선택 후 Ask 모드)
이 코드 리뷰해줘. 다음 관점에서 봐줘:
1. 버그 가능성
2. 성능 문제
3. 가독성 개선 여지
4. 테스트 빠진 케이스

테스트 코드 생성

(함수 선택 후)
/tests

추가로 이런 케이스들도 포함해줘:
- 빈 입력값
- null/undefined
- 경계값 (최대/최소)
- 에러 케이스

레거시 코드 현대화

(파일 Working Set에 추가, Edit 모드)
이 파일을 현대적인 JavaScript로 업데이트해줘:
- var → const/let
- 콜백 → async/await
- 프로토타입 패턴 → 클래스 또는 함수형
- 변경 시 기존 동작 유지

버그 수정 (에러 로그 포함)

(관련 파일 Working Set에 추가, Agent 모드)
아래 에러가 발생합니다. 원인 찾아서 수정해줘.

에러:
[에러 메시지 전체 붙여넣기]

재현 방법:
1. /api/users 엔드포인트 호출
2. email 필드 없이 요청 전송

새 기능 추가

(Agent 모드)
기존 users API에 페이지네이션 추가해줘.

요구사항:
- GET /users?page=1&limit=10
- 응답: { data: [...], total: 100, page: 1, totalPages: 10 }
- 기존 GET /users 엔드포인트와 하위 호환 유지
- 테스트도 업데이트해줘

마무리

기능 쓰는 상황 크레딧 소비

인라인 Tab 그냥 코드 치다가 무료
Ask 설명, 방향 파악 낮음
Edit 파일 수정, 리팩토링 중간
Agent 복잡한 전체 작업 높음
Coding Agent 이슈→PR 자동화 높음
copilot-instructions 한번 세팅 없음

처음엔 Ask → Edit 순서로 익히고, Agent는 어느 정도 감 잡힌 다음에 쓰는 게 좋습니다. Ask로 방향 잡고 Edit으로 실행하는 패턴이 크레딧 대비 효율이 제일 좋습니다.

4편에서는 비용 폭탄 실제 사례를 해부하고 — Pro $10으로 최대한 오래 버티는 전략, 모델 라우팅, $0 초과 지출 완전 차단 방법을 씁니다.


관련 글

 

반응형