요즘 한참 뜨고 있는 ChatGPT. OpenAI에서 만든 대형 언어 모델입니다. 사용자가 원하는 정보가 있으면 ChatGPT에게 대화형으로 질문으로 하면 그에 맞는 대답을 해줍니다. 이미 chatGPT를 쓰면서 개발을 하시는 분들도 있겠지만 아직 안쓰는 분들이 더 많을 것 같아서 사용기를 공유합니다.

ChatGPT로 Github Action 개발

Github Action이 모르시는 분들을 위해 간략히 설명하자면 Github에 어떠한 상황(push, issue 생성, tag 생성 등)이 발생했을 때 특정한 workflow가 발생하도록 정의할 수 있습니다. 예를 들어 github에 push가 발생한다면 checkstyle을 확인하고 tc를 돌려볼 수 있도록 할 수 있는거죠. 이 github action은 yaml파일을 만들어서 정의합니다.

업무를 하면서 Github Action을 프로젝트에 적용하게 됐는데 오픈소스는 많지만 사내에서 사용할 수 있는 액션이 제한되어 있습니다. 또한 사용할 수 있는 오픈소스도 그대로 사용하기는 어렵고 커스텀하게 사용해야해서 document를 많이 찾아봐야 했습니다. 문제는 document양이 너무 많고 한국어 번역도 거의 없기 때문에 개발 속도가 더디다는게 문제였습니다. 그렇게 개발을 하던 도중 chatGPT의 도움을 받아볼 수 있지 않을까? 라는 생각이 들어서 chatGPT에게 도움을 받아 개발을 해봤습니다.

“Github Action 다 만들어 줘”

제가 필요했던 기능을 요약하자면 다음과 같습니다.

github에 tag가 생성되면 자동으로 release를 만들어 주고 release 내용은 이전 release와 커밋을 비교하여 changelog를 만들어 줍니다.

우선은 전체적인 로직 흐름을 chatGPT에게 주고 코드를 작성해 줄 수 있는지 물어봤습니다. 구체적이고 문장을 짧게 하면 대답을 더 정확하게 해줄 것 같아서 최대한 많은 정보를 주는 질문을 해봤습니다.

image

솔직히 이정도까지 만들어줄지는 몰랐습니다. 제 질문을 거의 완벽히 해석해서 코드를 작성해줬습니다. 심지어 저는 찾지못했던 API 메소드들 (getLatestReleases, compareCommits)를 찾아줬네요. 그렇다면 이 코드를 그대로 적용을 하면 될지 한번 코드를 실행해 봤습니다.

결과는 코드 실행에 실패했습니다. 어떤점이 코드를 실패하게 했는지 확인해 봤습니다.

문제점

  • github.repos.getLatestRelease의 이름이 잘못됨 정확한 메소드 사용법은 github.rest.repos.getLatestReleases 입니다. 때문에 저 메소드는 undefined한 결과를 가지게 됩니다.
  • actions/github-script의 결과값은 outputs.result에 json string으로 저장됨 때문에 create-release 스텝에서 join을 제대로 사용할 수가 없습니다.
  • 가져온 release를 사용하고 있지 않음 제가 요구했던건 최근 release를 가져와서 현재 tag와 commit을 비교하는 것인데 compareCommits 파라미터를 보면 context.payload.beforecontext.payload.after로 비교하고 있습니다. 물론 payload.before는 이전 태그 정보를 가져오기는 하지만 release가 아닐 수도 있기 때문에 제가 원하던 결과는 아닙니다.

“만들어준 코드의 일부분을 고쳐줘”

약간의 부정확함이 있었습니다만 이정도는 제가 수정할 수 있는 영역이라 직접 수정을 하면 될것같습니다. 그러면 chatGPT에게는 조금 더 큰 영역을 수정해달라고 해봤습니다.

우선 저는 github-script 사용하는 단계를 하나로 만들고 싶네요. 다음처럼 부탁해봤습니다.

image

release를 가져오는것과 commit을 비교하는 두 스텝만 하나로 합치길 원했는데 gpt는 create-release 스텝까지 하나로 합쳐버렸습니다. 제가 원했던 답이 아닌데 create-release는 다시 분리해달라고 부탁했습니다.

image

다행히 원하는 답이 나왔습니다. 그리고 context.payload 사용부분도 갑자기 latestRelease.tag_name으로 바꿨네요. 딱히 제가 요구한 사항도 아닌데 이전 질문을 다시 분석해서 수정한 것 같네요. 3번의 질문으로 제가 원하는 코드의 대부분이 만들어졌습니다.

“예시를 들어가면서 로직을 만들어달라고 부탁해볼까?”

전체적인 흐름은 이렇지만 사실 내부에 세부적인 흐름이 더 필요합니다. release 버전명을 구분해서 이전 release를 가져오게 해야합니다. 예를들어 이미 release-2.0.0 버전이 release 되어 있는 상태에서 release-1.1.5 태그가 생성된다면 changelog를 만들기 위해 release-1.1.4를 이전버전으로 봐야합니다. 이러한 로직을 만들 수 있는지 chatGPT에게 부탁해 봤습니다.

image

예시를 들어주면서 설명해 줬습니다. 예시로든 문장도 chatGPT가 해석을 한걸까요? 버전 비교 로직을 잘 만들어 줬습니다. 먼저 변경된 점을 보자면 getLatestReleases 메소드를 없애고 listReleases를 사용하도록 변경했네요. 그리고 compareCommits가 수행되기 전에 previousRelease를 찾아내고 메소드 파라미터로 줬습니다.

놀라운 점은 chatGPT는 단순히 major, minor, patch를 구분해서 비교를 하는 것이 아니라, tag에 prefix로 달려있는 release-를 없애는 문자열 제거 로직도 같이 만들어 줬습니다. tag의 경우에는 제가 예시로 제공해준 정보가 아님에도 불구하고 refs/tags/를 알아서 지워주고 있습니다.

캡처 화면에서는 잘렸지만 compareVersions라는 메소드를 사용해서 버전을 비교해서 previousRelease를 뽑아내고 있습니다. github-script에서 제공하는 메소드로 보이지는 않는데 이게 뭔지 물어봤습니다.

image

split해서 major, minor, patch를 비교하는 메소드를 만들었네요. 동작은 원하는대로 할 것 같은데 제가 원하는 방식의 코드 스타일은 아니어서 방법만 가져오고 제 스타일대로 리팩토링을 진행해야 할 것 같습니다. 그 과정 까지는 이 글에 담지는 않겠습니다. 아무튼 chatGPT가 버전 비교에 필요한 메소드까지 자신이 직접 만들어 주네요.

chatGPT가 github-script 관련 부분은 잘 만들어 준다는 것을 알았습니다. github-script는 대부분 javascript로 작성되기 때문인지 학습이 잘되어 있다고 느껴졌습니다.

“결과값을 다르게 조작해 줘”

원하는 로직은 어느정도 만들어 졌습니다. 그럼 다음 문제로 가보겠습니다. create release에서 전 스텝의 return 값을 사용할 때가 문제가 있습니다. github-script는 result에 결과를 문자열로 저장하기 때문에 .property와 같은 형식으로 각각의 속성에 접근하기는 불가능합니다. 때문에 result를 outputs에 각각의 결과를 저장하는 방법이 필요했습니다. 그래서 질문을 해봤습니다.

image

jq 라는 것을 사용해 json 문자열을 파싱해서 각각 값을 꺼내서 output에 세팅하고 있습니다. 하나 아쉬운 점은 set-output은 현재 deprecated되어 있습니다. 지금은 다른 방법을 사용해서 outputs을 세팅합니다. 이는 chatGPT-3가 2021년 9월 까지 학습되어 있어서 발생하는 한계입니다.

이제 결과값을 다르게하여 다음 스텝으로 넘겨주는 것도 수정이 되었습니다.

이정도면 chatGPT의 임무를 다 한 것 같습니다. 세부적인 로직은 제가 직접 개발하는게 편해보입니다. 그 부분은 이 글에는 담지 않겠습니다. 다만 아직 질문거리는 남아있습니다.

“개념 설명 좀 해줄래?”

개발하다 보면 내가 알지 못한 지식이 나오거나 명령어 옵 션등이 나옵니다. 코드가 아닌 개념 혹은 동작원리에 대해 설명을 하라하면 대답을 해줄 수 있는지 궁금했습니다. 그래서 다음과 같이 github action에 대해서도 물어봤습니다.

image

그렇게 길지도 않으면서 핵심만 가져와서 설명해주네요. 개념에 대한 질문도 잘 대답해 주는것을 볼 수 있습니다.

“개발환경도 만들어 줄 수 있어?”

현재 제가 만들고 있는 깃허브 액션은 github에 tag가 생성되었을 때 이벤트가 발생합니다. 때문에 제가 만든 github action을 테스트를 하려면 직접 tag를 원격 레포지토리로 push 해보는 방법밖에 없었습니다. 로컬에서 테스트하는 방법을 찾지 못해 chatGPT에게 물어봤습니다.

image

어떤 방법이 있는지는 물론 설치 방법까지 알려줍니다. 마지막에 설명한 Docker에서 사용하는 방법도 궁금하다면 더 물어볼 수 있습니다.

“변수명 만들어 줘”

개발을 하면서 가장 힘든 것 중 하나가 변수명 짓기, 클래스명 짓기겠죠? 이번 질문은 github action과는 전혀 상관없는 질문입니다만 복잡한 변수명도 추천해 줄 수 있는지 물어봤습니다.

image

여러 변수명들이 나왔습니다. 변수명이나 클래스명, 함수명을 정할 때 한번 물어보는 것도 괜찮은 방법일 것 같습니다.

느낀점 요약

글은 최대한 짧게 담았지만 실제로 개발할 때는 엄청나게 많은 양의 질문을 했었습니다. 예시로 든 질문 말고도 다른 종류의 질문들도 해봤습니다. 이런 저런 사용을 하면서 느낀점에 대해 요약을 하자면 다음과 같습니다.

  1. 장점
    • chatGPT는 생각보다 좋은 품질의 코드를 만들어 준다
    • 어떤 코드의 경우 내가 작성한 코드보다 더 좋은 품질의 코드를 만들어 준다
    • 개발자가 document를 참고하고 stackoverflow에서 문제를 찾는 시간을 없애준다★
    • 코드 뿐만 아니라 개념 및 소프트웨어 설치과정도 제공하기 때문에 개발자의 검색 시간을 더욱 더 줄여준다
    • 변수명, 함수명, 클래스명에 대한 힌트를 얻기에 좋다
  2. 단점
    • chatGPT가 답변한 코드는 마치 “완벽하게 동작하는 코드” 인것 마냥 말하지만 실행이 안되거나 오류가 존재하는 코드를 제공하는 경우가 많다
    • 대답이 완벽하지 않기 때문에 개발자가 chatGPT가 만든 코드를 한번 더 검증하는 과정이 필요하다
    • 개발자가 코드를 검증하기 위해서는 관련 지식이 필요하기 때문에 아무것도 모르는 상태에서 사용할 수는 없다

그래서 chatGPT를 개발할 때 사용해도 될까?

부정확한 답변을 하는 위험성 때문에 chatGPT를 사용하는 것을 망설이거나 사용하지 않으려 하시는 분들도 계시겠지만 개인적으로는 사용해도 좋다라는 생각입니다. 답변 자체의 신뢰도는 낮을 수는 있지만 개발자가 document를 참고하거나 stackoverflow를 뒤적이는 시간을 없애는 것만으로도 개발 시간이 많이 단축되는 것 같습니다. 특히 신기술을 적용하거나 잘 모르는 분야를 개발할 때는 더더욱 도움이 될 것 같습니다. document를 정말 보고싶을 때 chatGPT에게 관련 document 링크를 달라고 하면 그걸 또 줄 정도로 도움이 많이 됩니다.

다만 말했듯이 chatGPT의 답변의 신뢰도를 100% 보장할 수 없기 때문에 답변에 대한 검증은 반드시 필요합니다. 검증 과정을 거치지 않는다면 오히려 chatGPT를 사용하지 않는 것이 낫습니다. 자칫하다가는 개발자 자신이 잘못된 정보를 학습을 할 수도 있고 애플리케이션에 치명적인 오류를 일으킬 수도 있기 때문입니다.

아직 chatGPT를 사용해보시지 않으신 분들은 한번 사용해보고 개발에 적용할지 말지 판단해 보는 것도 좋을 것 같습니다.