프로그래밍

ChatGPT에게 커밋 메시지 생성, 코드 리팩터링을 맡기면 어떻게 될까?

Tetrahedrite 2023. 2. 15. 02:25

리팩터링 책을 기반으로 책 스터디를 진행하고 있는데, 역시 리팩터링은 대부분 코드를 따라치면서 리팩터링 과정을 따라가는 것이 글로 읽는 것보다 몇 배는 더 나은 효과를 가져오는 것 같다.

 

그러면서 Git에 커밋 메시지를 영어로 해서 찍어보는 걸 주로 연습하고 있는데, 얼마 전에 ChatGPT를 알고 난 후 영어 커밋 메시지를 작성할 때 문장에 대한 조언을 자주 물어보는 편이다.

 

예를 들어 문장이 자연스러운지에 대한 질문을 할 수 있다.

그림 1 - 문장의 자연스러움을 묻는 질문

대충 Is this sentence natural?: "Blahblah" 처럼 질문하면...

문장이 깔끔하고 자연스럽다.

문장이 거의 자연스럽긴 한데, 이렇게 고치면 좋을 것 같다. (고치면 좋을 법한 내용)

이런식으로 답장이 온다.

 

그러다가 중간에 코드를 작성하고 커밋하기 전에 Diff를 보고 있는데 문득 이 Before, After를 ChatGPT에게 보여주고 커밋 메시지를 써달라고 하면 어떻게 될지 궁금해졌다.

 

바로 Generate git commit message for this diff: 라는 문장과 함께 Before, After 코드를 보여주었다.

코드 변경점은 아래와 같다.

 

그림 2 - 서브클래스 대신 종별로 위임을 사용하도록 코드를 변경하는 리팩터링 작업

 

그랬더니 잠시 후...

 

그림 3 - 커밋 메시지를 만들어달라는 질문에 대한 답변

 

꽤 깔끔한 커밋 메시지를 만들어 온 것을 볼 수 있다. 심지어 부연 설명까지 덧붙여서...

 

사실 이 정도의 내용은 복붙보다 직접 입력하는게 더 빠를 수도 있다.

그렇다면 현재까지 2종의 서브클래스를 위임으로 바꾸어 놓고, 나머지 1종의 서브클래스도 위임으로 바꾸어달라고 하면 알아서 바꾸어 줄까?

 

`NorwegianBlueParrot`에 대해서 `NorwegianBlueParrotDelegate`로 리팩터링 해달라고 요청해보자.

 

그림 4 - ChatGPT에게 NorwegianBlueParrot 리팩터링 요청

그러자 온 답변...

 

그림 5 - 첫 리팩터링 요청 시도에 대한 답변

아이고 이런... 대충 하려는 느낌은 맞았는데, 이전에 내가 하던 리팩터링을 보여주지 않아서인지, switch-case문과 생성자를 수정해서 구현을 했다. 이런 느낌을 원하는게 아니라서 "아직 AI는 멀었군"이라고 생각하다가, 정보를 좀 더 줘보기로 했다.

 

이번에는 질문 맨 뒤에 " like `EuropeanSwallowDelegate` or `AfricanSwallowDelegate`"라는 문장을 추가하여 다른 새의 내용을 참고해서 리팩터링하게끔 질문을 바꾸어보았다.

 

그림 6 - ChatGPT에게 NorwegianBlueParrot 리팩터링 맡기기 2차 시도

 

그러자 꽤 마음에 드는 결과를 보여줬다.

 

그림 7 - ChatGPT에게 맡긴 리팩터링 2차 시도본

 

꽤 괜찮게 NorwegianBlueParrot을 리팩터링했다.

createBird 함수도 수정됐고, selectSpeciesDelegate에서 NorwegianBlueParrotDelegate 객체를 생성하도록 만들었으며, NorwegianBlueParrot 클래스도 NorwegianBlueParrotDelegate로 잘 수정된 듯 보인다.

 

하지만 원래라면 constructor로 bird의 역참조를 가져와서 plumage의 게터에서 this._bird._plumage를 불러왔어야 가장 완벽하게 리팩터링되었다고 볼 수 있는데, 그 절차는 빠져있다.

 

혹시나 그 절차도 대신해줄 수 있을까? 바로 한번 질문해보았다.

 

요청사항을 전부 적어서 고봉밥처럼 꽉꽉 눌러담아서 보냈다. 단, AI가 헷갈리지 않도록 모든 것을 명확하게 적었다.

1. 이전 코드에서 `NorwegianBlueParrotDelegate`에 대해 생성자에 bird를 추가하고 this._bird에 그것을 설정해라.

2. `NorwegianBlueParrotDelegate`의 plumage 게터에 대해 this.plumage 대신 this._bird._plumage를 반환하도록 해라.

3. 그리고나서 `Bird` 클래스의 plumage 게터에 대해 this._speciesDelegate가 존재하면 this._speciesDelegate.plumage를 반환하고, 존재하지 않으면 원래 것을 반환해라.

 

 

그러자 온 답변이... 분명 이전 코드라고 명시했는데 또 방금 전에 만든 그 이상한 코드를 가져오더니 거기다가 작업을 하기 시작했다.

그런데, 생각보다 모든 요구사항을 완벽하게 이행하기는 했다. 1번, 2번, 3번 모두 잘 적용되어 있는 모습이다.

 

이대로는 아쉬우니까 마지막으로 한번 더 요청해보도록 하자.

작업을 원하는 코드를 그대로 복사 붙여넣기하고 이 코드에다가 작업해달라고 말해보자.

 

그림 9 - 코드를 복사 붙여넣기해서 다시 작업 요구

 

그러자 1시간에 일을 얼마나 시키는거냐며 쿠사리 이빠이먹고 바로 나가리됐다... ㅜㅜ

그만 알아보자...

'프로그래밍' 카테고리의 다른 글

집에 서버를 놓으면 전기세가 얼마나 나올까?  (0) 2023.02.24