Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Copilot Workspace: 이슈에서 시작하는 Copilot 네이티브 개발 환경

작년 GitHub Universe 콘퍼런스에서 키노트를 다 끝내고 One more thing..이라고 하며 살짝 공개했었는데 올해 4월 공식적으로 GitHub Copilot Workspace를 공개하면 테크니컬 프리뷰를 시작했다.(현재는 신청하고 허가받아야 사용할 수 있다.)

사용자 삽입 이미지

사용 권한은 바로 받았지만 요즘 코딩을 많이 못 하고 있기도 했고 개인적인 의도로 업무용 GitHub 계정과 개인 계정을 분리해서 쓰고 있는데 권한을 받은 것은 개인 계정 쪽이기 때문에 가장 써보기 좋은 업무에서 사용하지 못하는 제약도 있었던 터라 이제야 제대로 테스트를 해보게 되었다.

GitHub Copilot Workspace

작년 GitHub Universe에서 GitHub은 원래 Git을 기반으로 설립되었지만, 이제는 Copilot을 기반으로 다시 설립되었다며 Copilot 중심으로 한 개발자를 위한 AI 플랫폼이 될 것임을 선포했는데 그 연장선에 있는 기능이라고 할 수 있다.

GitHub Copilot Workspace가 무엇이냐고 한다면 우리가 보통 일을 할 때 테스크 중심으로 일을 시작하게 되는데(이슈, 티켓 등 뭐라고 부르던) GitHub Issues에 적은 내용을 바탕으로 워크스페이스에서 계획을 세우고 코드를 제안받은 뒤에 Pull Request까지 만들 수 있는 환경을 의미한다.

예시: 프로젝트 초기화하기

사용자 삽입 이미지

AI는 보통 다양한 사례에서 어느 정도 사용해 봐야 퀄리티에 대한 느낌을 알 수 있지만 동작 방식을 이해하기 위해 README.md만 있는 저장소를 새로 만들었다.

사용자 삽입 이미지

아무것도 없는 저장소이니 첫 작업부터 Copilot Workspace 기능을 사용하기 위해 프로젝트를 Next.js로 만들기 위해서 Next.js 프로젝트를 초기화하는 이슈를 만들었다. 가볍게 테스트해 보니 한국어로 써도 이해는 하는 거 같은데 아직 퀄리티를 정확히는 몰라서 일단 간단한 영어로 테스트했다. GitHub Issues 화면에서 나는 사용 권한을 얻었기 때문에 Open in Workspace 버튼이 있는 것을 볼 수 있다.

Open in Workspace 버튼을 누르면 아직 테크니컬 프리뷰로만 공개된 상태라 GitHub에서 다양한 실험을 진행하는 조직인 GitHub Next에서 관리되고 있기 때문에 copilot-workspace.githubnext.com 도메인으로 이동하고 Workspace용 새로운 세션이 생성된다.

사용자 삽입 이미지

Workspace는 이슈 기반으로 작업을 진행하기 위해서 Issue - Specification - Plan - Implementation 4가지 단계로 진행된다. Issue는 기존에 작성된 이슈의 내용을 분석하는 과정이고 이를 바탕으로 명세서(Specification)을 작성하고 명세에 따라 구체적인 계획을 세우고 그에 따라 실제 구현하는 과정을 거치게 된다.

사용자 삽입 이미지

위는 Copilot이 제시한 Specification이다. 현재 저장소의 상황이 Next.js 코드가 없고 README.md만 있다는 것을 파악하고 이를 기반으로 기본 Next.js 프로젝트 구조를 만들기 위해 어떤 파일을 만들어야 할지 명세를 제시한다.

사용자 삽입 이미지

이 명세서는 AI가 기본적으로 제공해 준 것이지만 사람이 수정할 수 있다. 아이템을 추가하거나 기존 내용을 변경해서 부족하다고 생각하는 부분을 채워 넣을 수 있다. Next.js를 아주 잘 알진 못하지만, 명세에 큰 문제는 없기 때문에 Generate plan 버튼을 누르면 다음 단계로 넘어간다.

사용자 삽입 이미지

명세를 기준으로 구체적인 계획을 만들어주었다. 계획에는 구체적인 파일을 명시하고 각 파일의 내용에 대한 설명이 포함되어 있다. 내용을 보면 꽤 구체적으로 계획을 잘 세워주었음을 알 수가 있고 각 파일에는 체크박스가 있어서 구현하지 않을 파일은 제외할 수 있다. Implement selected files 버튼을 눌러서 구현을 어떻게 하는지 살펴보자.

사용자 삽입 이미지

계획에 맞게 실제 파일을 생성하고 내용을 작성해 준다. 복잡한 기능이 아니라 그런지 잘 작성해 주었다.

사용자 삽입 이미지

package.json의 의존성에서 latest로 명시한 게 맘에 들지 않아서 구체적인 현재 최신 버전을 적어달라고 요청했다. 물론 왼쪽 메뉴에서 보듯이 이 파일들을 file explorer를 열어서 코드를 수정할 수 있는 모달이 뜨기 때문에 직접 수정하는 것도 가능하다.

사용자 삽입 이미지

인터넷에서 정보가 찾기는 어려운지 현재 최신 버전은 아니지만 테스트기도 해서 이대로 넘어가도록 하자.

사용자 삽입 이미지

이제 이 변경 사항으로 Pull Request를 만들 수 있는데 그 외에도 일단 Draft로 만들거나 아예 브랜치에 직접 푸시하는 것도 가능하다. 여기서는 Pull Request로 만들어 보자.

사용자 삽입 이미지

이번에도 사람이 한번 수정할 수 있도록 Pull Request의 제목과 내용을 AI가 알아서 채워준다.

사용자 삽입 이미지

그대로 생성하면 Pull Request를 등록해 주고 해당 Workspace 세션은 완료로 처리한다.

사용자 삽입 이미지

깔끔하게 변경 사항을 정리해서 관련 이슈까지 연결해 준 Pull Request를 올려준다.(이슈를 연결할 때 FixClose로 해주지 않아서 Pull Request를 닫을 때 자동으로 닫히지 않는 점은 아쉽다.) AI는 그대로 믿을 수 없으니 다운받아서 돌려보면 pages/_app.js에서 파일명은 JS이지만 코드는 TypeScript와 섞어놔서 제대로 동작하지 않는다.

import { AppProps } from 'next/app';

function MyApp({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />;
}

export default MyApp;

이 부분만 수정하면 잘 동작하는 것을 볼 수 있다.

사용자 삽입 이미지

물론 동작 문제가 생길 정도로 별 코드가 없긴 하다.

예시: .gitignore 추가하기

테스트라서 추가로 필요한 작업을 계속 Workspace를 이용해 보자.

사용자 삽입 이미지

프로젝트에서 node_modules.next 폴더가 git status 할 때 나와서 .gitignore를 추가하는 이슈를 만들었다.

사용자 삽입 이미지

이슈를 바탕으로 필요한 명세를 만들어 준다.

사용자 삽입 이미지

계획에서 이슈에 없던 로그파일이나 환경 변수 파일도 추가해 주었지만, 큰 상관은 없다.

사용자 삽입 이미지

간단한 파일이라 잘 만들어 주었다.

예시: 헬스 체크용 엔드포인트 추가하기

사용자 삽입 이미지

테스트를 좀 더 해보고자 간단한 헬스 체크용 API 엔드포인트를 추가하는 이슈를 만들었다.

사용자 삽입 이미지

이슈를 바탕으로 명세서를 작성해 준다.

사용자 삽입 이미지

구체적인 코드에 대한 계획을 보여준다. 이 계획에서 보듯이 여기선 JavaScript이므로 NextApiRequestNextApiResponse를 임포트할 필요는 없지만 Copilot은 TypeScript랑 혼동해서 이를 추가하려고 계획을 세운다. 계획이 잘못되었으므로 NextApiRequestNextApiResponse를 임포트하는 부분을 계획에서 없애준다.

사용자 삽입 이미지

계획에 맞게 간단하지만, 적절한 코드를 작성해 준다.

사용자 삽입 이미지

그리고 구현이 끝나면 터미널을 열어서 서버를 직접 실행하는 것도 가능하다. 서버가 실행되어서 포트가 열리면 Workspace가 자동으로 탐지해서 Live Preview 버튼이 활성화되고 여기에 접속해서 Workspace가 구현한 코드를 직접 테스트해 보면서 코드 리뷰를 하거나 수정하는 것도 가능하다.

정리

GitHub Copilot Workspace가 어떻게 동작하는지 설명하기 위해 간단한 테스트를 했다. 물론 실제 프로젝트는 이것보다 더 복잡할 것이지만 그러면 명세와 계획에 대한 설명이 너무 복잡해질 것이기 때문에 동작 방식을 설명하기 위한 정도로 간단한 테스트만 했다.

이미 GitHub Copilot을 겪어봤겠지만, 코드 작성에 대한 능력은 Copilot과 당연히 비슷할 것으로 생각하고 프롬프트(여기서는 Plan)가 자세할수록 더 잘 작성하기 때문에 얼마나 어려운 코드를 잘 작성하는지까지 테스트하지 않았다.

AI를 사용할 때 내가 못 하는 건 AI로도 할 수 없다고 생각하는 편이지만 GitHub Copilot과는 또 다른 느낌으로 이슈에서 출발해서 작업의 뼈대를 만들고 동료와 같이 협업하듯이 계획을 세우고 코드를 검토한다는 부분이 상당히 재미있는 부분이고 아직 테크니컬 프리뷰임에도 전체적인 기능의 완성도가 상당히 좋다고 느껴졌다.

2024/07/20 21:33 2024/07/20 21:33