본문 바로가기
42/42SeoulLife

[ChatGPT 주도 개발] - 42서울 수요지식회, 2023.03.01.

by jaemjung 2023. 3. 3.

들어가며

최근 취업하기 위해 이리저리 이력서를 뿌리던 중 iOS 엔지니어로 지원한 회사에서 과제전형을 진행하자는 연락이 왔습니다.

 

기쁜 마음으로 과제를 열어보았으나 난이도가 상당히 높고 기한이 촉박했습니다. 다른 회사와의 면접 및 여러 일정이 있어 그냥 포기할까 생각했으나, 포기하기에는 조금 아쉬운 기회라는 생각이 들었습니다. 여러 방면으로 고심하다 ChatGPT를 잘 활용하면 시간 내에 가능할 것 같아 일단 도전하기로 마음을 먹었습니다.

 

ChatGPT를 적극 활용한 결과, 과제를 예상보다 여유 있고 완성도 있게 끝마칠 수 있었습니다. 과제를 진행하고 ChatGPT의 힘을 느끼면서 참 많은 생각이 들더라고요. 그리고 이 경험을 꼭 42서울의 구성원들과 공유해야겠다는 생각이 들었습니다.

 

그리하여 3월 1일, 일정에 없던 수요지식회를 급하게 준비하여 진행하게 되었습니다. 공휴일에 갑작스럽게 열리게 된 행사라 지인들만 참석하는 소소한 행사가 될 줄 알았는데 생각보다 많은 분들이 관심을 가지고 참여해 주셨습니다. 직원분들이 출근하지 않는 날이라 유튜브 녹화를 요청할 수 없었는데, 발표를 놓쳐 아쉬워하는 분들이 많았습니다. 그래서 블로그에 간단하게 발표 내용을 정리해서 올립니다.

 

부족한 내용이지만 누군가에게 도움이 되길 바라며…

 


1. 개발 시 ChatGPT를 활용한 법

1) 구현 방법 질의

제가 진행했던 과제에는 까다로운 요구사항들이 많았지만, 그 중 가장 난감했던 것은 영상과 관련된 처리였습니다. 영상을 재생하는 뷰를 만들어야 했는데, 다양한 커스텀 영상 컨트롤과 인터랙션을 구현할 것을 명시하고 있었습니다. 문제는 제가 영상을 활용하는 개발을 해본 적이 없다는 것이었습니다. Swift에서 영상을 커스텀하기 위해선 AVFoundation이라는 옛날 옛적 Objective-c로 만들어진 프레임워크를 사용해야 하는데, 사용이 까다롭고 특히나 SwiftUI에서 바로 적용할 수 없고 반드시 UIKit을 이용해 SwiftUI의 View에서 사용할 수 있도록 변환해주어야 했습니다.

 

한참을 레퍼런스를 뒤지다가 그냥 ChatGPT에게 다음과 같이 물어보았습니다.

Q. SwiftUI에서 Video를 재생하려면 어떻게 해야해?

 

그리고 돌아온 답변에 저는 감탄할 수밖에 없었습니다.

저렇게 간단한 질문에 SwiftUI에서 AVFoundation을 사용하기 위한 방법은 물론, 자세한 예제코드와 요청하지도 않은 커스텀 컨트롤의 예시까지 알려주었습니다. 물론 위의 코드를 그대로 사용할 수는 없었지만, ChatGPT가 보여준 예제코드를 통해 빠르게 구현에 필요한 지식과 관련된 키워드들을 뽑아내고 학습하여 요구사항에 명시된 커스텀 컨트롤이 적용된 영상 플레이어를 쉽게 만들어 낼 수 있었습니다.

 

과제를 진행하며 위와 같이 특정한 기능을 어떻게 구현해야 하는지에 대한 질문이 가장 많이 했던 것 같습니다. 항상 정확하게 동작하는 코드를 알려주는 것은 아니지만, 해당 기능에 대한 접근법을 빠르게 파악할 수 있다는 점에서 시간을 톡톡히 절약할 수 있었습니다.

 

2) 코드 작성

프로그래밍을 하다 보면 딱히 구현이 어려운 건 아니지만 작성하기가 매우 귀찮은 코드들이 있습니다. 예를 들어 API에서 넘어오는 JSON 데이터를 이용하여 Swift에서 사용 가능한 구조체로 Decode 하는 코드처럼 말이죠. 감사하게도 Swift에서는 구조체에 Decodable 프로토콜만 적용하면 편리하게 JSON 데이터를 디코드 할 수 있습니다. 그래도 여전히 복잡한 API 명세에 맞추어 여러 구조체를 정의해 주는 일은 필요하죠. 저는 이것도 귀찮아서 ChatGPT에 부탁하기로 했습니다.

Q. 다음 JSON 명세를 Decodable 한 Swift Struct로 바꿔줘

 

ChatGPT는 저를 실망시키지 않았습니다.

만들기 짱귀찮은 CodingKeys enum까지 완벽하게 작성해 주었습니다.

 

이외에도 문자열을 조작하거나 파싱 하는 등 로직이 복잡하지 않은 함수들은 원하는 기능을 잘 입력만 해주면 바로 복붙 해서 쓸 수 있는 함수를 작성해 주었습니다. (실은 꽤나 복잡한 알고리즘을 사용하는 함수들도 잘 작성해 줍니다...)

이런 식으로 직접 짜기 짜증 나는 코드들을 대신 짜달라고 부탁해서 스트레스도 덜 받고 시간도 아낄 수 있었습니다.

사실 이런 코드는 ChatGPT에게 작성을 부탁하는 게 더 나은 방법일 수 있습니다. 사람이 직접 만들면 실수를 하기 쉬운데, ChatGPT는 이런 간단한 업무에서는 보통 실수하지 않더라고요...

 

3) 디버깅

프로그래머의 숙명. 디버깅 과정에서도 ChatGPT는 다시 한번 빛을 발했습니다.

어찌저찌 요구사항의 구현은 다 마쳤고, 동작도 정상적으로 하는 것을 확인하였지만 문제는 메모리 누수가 생기고 있다는 것이었습니다.

급하게 구현하느라 메모리 누수에 대한 고려를 깊게 하지 않고 구현했는데 누수가 나니 매우 당황스러웠습니다.

어찌저찌 한 스텝씩 누수를 찾아 나가며 AVFoundation보다 더 아래에 있는 Audio와 관련된 프레임워크에서 누수가 생긴다는 것까지는 확인할 수 있었는데, 문제는 도저히 어떤 부분의 코드가 누수를 유발하는지 찾을 수 없었습니다.

그래서 안되면 말고... 하는 심정으로 그냥 AVPlayer를 활용하는 코드를 전부 ChatGPT에 때려 넣고 어느 부분에서 누수가 발생할 수 있는지 물어보기로 했습니다.

Q. 혹시 내가 준 코드들 중에서 누수를 유발하는 부분이 있어?

ChatGPT도 명확한 누수의 원인을 찾을 수는 없었지만, 다음과 같은 조언을 남겨주었습니다.

바로 PlayerView에서 AVPlayer를 옵셔널 변수로 주입받아 사용하고 있는데, PlayerView의 소멸 시 AVPlayer가 nil로 설정되지 않아 해당 부분에서 누수가 일어날 가능성이 있다는 것이었습니다.

그래서 PlayerView의 deinit에서 AVPlayer 변수를 nil로 설정하니 누수가 바로 해결되더라구요.

코딩 시 전혀 고려하지 않았던 부분이라 아마 혼자서는 해결하는데 꽤나 오랜 시간이 걸렸을 문제였습니다.

 

이외에도 iOS 앱을 제작하다 보면 수많은 에러메시지와 경고메시지를 만나게 되는데요, 에러메시지들을 ChatGPT에 입력하면 해당 에러가 발생할 수 있는 원인들을 나열해 주어서 문제를 해결하는데 굉장히 큰 도움을 받았습니다.

 

4) 코드 개선

사실 가장 놀라운 점이었고, 앞으로도 굉장히 유용하게 사용할 수 있겠다는 생각이 들었던 활용법이 바로 코드 개선에 ChatGPT를 이용하는 것이었습니다. 그냥 뭔가 아쉬워 보이고 조금 더 낫게 바꿀 수 있을 것 같은데 아이디어가 안 떠오른다... 싶은 코드들은 그냥 ChatGPT에 입력하고 개선할 방법을 알려달라고 하면 즉시 코드의 개선 방법을 알려줍니다. 

멀리 갈 것도 없이 지금 진행 중인 프로젝트의 리팩토링을 ChatGPT에게 맡겨보겠습니다.

struct AnswerBoardView: View {
    @EnvironmentObject var viewModel: MainViewModel
    let keyButtonWidth: Double = Double(uiSize.width - 40) / 6

    var body: some View {
        ZStack {
            VStack(spacing: -2) {
                horline(width: 3)
                    .padding([.bottom], 5)
                ForEach(viewModel.game.answerBoard.indices, id: \.self) { rowIndex in
                    let row = viewModel.game.answerBoard[rowIndex]
                    horline(width: 2)
                    HStack {
                        ForEach(row) { btn in
                            answerBoardBlock(btn)
                        }
                        .padding([.horizontal], -5)
                    }
                    horline(width: 2)
                        .padding([.bottom], 4)
                }
                horline(width: 3)
            }
            .animation(.none)
            Image("Filcrow")
                .resizable()
                .frame(width: 12, height: 16)
                .offset(x: (Double(viewModel.game.currentColumn + 1) - 2.5) * (keyButtonWidth - 2) - 43,
                        y: (Double(viewModel.game.currentRow) - 2.5) * keyButtonWidth + 10)
        }
    }
}

위의 코드는 <한들>의 답안이 입력되는 View입니다. 해당 뷰는 컴포넌트로 분리되어 있지만, Environment로 주입되는 MainViewModel에 의존하고 있어 재사용이 불가능하다는 단점이 있습니다. 이 코드를 개선해 달라고 ChatGPT에 부탁해 보겠습니다.

Q. 위의 코드는 MainViewModel에 의존하고 있어. 이걸 개선할 수 있을까?

 

ChatGPT는 다음과 같이 답해주었습니다.

AnswerBoard를 위한 ViewModel을 작성하거나, 해당 뷰에서 사용되는 데이터를 의존성 주입을 통해서 전달하라고 조언해 줍니다. 둘 다 코드를 개선하기 위한 적절한 방법이며 상황에 따라 적절한 개선 방법을 사용하면 되겠습니다. 

 

그 외에 개선할 수 있는 부분이 있는지 추가로 질문해 보았습니다.

하드코딩 된 사이즈 값을 사용하지 말 것, 인터랙션을 추가할 것, 이중 배열 대신 다른 종류의 자료구조를 사용할 것, 접근성 요소를 추가하여 유저의 편의성을 도모할 것을 조언해 주네요.

모두 타당한 조언입니다.

 

이렇듯 마음에 들지 않는 코드를 개선할 아이디어를 제공해 주는 것만으로도 유용하게 사용할 수 있지만, 정말 강력한 장점은 왜 개선된 코드가 더 좋은 코드인지 알려준다는 점입니다.

과제를 제작하며 API 요청을 받아와 비동기 로직을 통해 처리하는 과정에서 ChatGPT는 Combine을 적용하라는 조언을 해주었습니다.

저는 잘 납득이 가지 않아 왜 Combine을 적용하는 것이 더 나은 지 질문했고, 다음과 같이 답해주었습니다.

이런 식으로 Combine을 적용하는 것의 장점을 자세하게 설명해 줍니다.

사실 실제로 코드를 작성하며 리팩토링의 필요성을 느껴도 어떤 방식으로 어떻게 개선해 나가야 할지 감이 안 잡히는 경우가 많은데, ChatGPT는 이에 대한 해답을 빠르고 명쾌하게 제공했습니다. 위와 같이 활용하여 빠르게 좋은 코드를 작성하는 법을 습득하고, 그것이 왜 더 나은 방법인지까지 납득하고 이해할 수 있는 점이 매우 좋았습니다.


2. ChatGPT 더 잘 쓰는 법

과제를 진행하며 ChatGPT와 오랜 시간 진한 대화를 나누며 더 좋은 답변을 얻을 수 있는 몇 가지 팁을 얻을 수 있었습니다.

핵심은 좋은 아웃풋을 얻기 위해서는 그만큼 좋은 인풋이 필요하다는 것이었습니다.

 

1) 자세히 설명하기

좋은 인풋을 만들기 위한 첫 번째 방법은 질문을 던지는 상황을 최대한 자세히 설명하는 것입니다.

ChatGPT의 최대 장점이자 경이로운 점은 대화의 맥락을 학습하여 맥락에 맞는 최적의 답을 제공하는 것인데, 이를 최대한 활용하기 위해서는 최대한 자세한 맥락을 제공해야 합니다.

 

예를 들어 A라는 기능을 하는 코드를 작성해 달라는 요청을 할 시,

A 기능을 하는 코드를 작성해 줘

 

라는 입력을 주는 것보다,

나는 지금 ~와 관련된 프로그램을 만들고 있어. 이 프로그램은 ~을 위해 만들어지고 있어.
이 프로그램의 ~기능을 만들고 있는데 A기능이 부가적으로 필요해. 해당 코드를 작성해 줘.
단, ~의 경우도 고려해야 하며 ~와 같은 방식으로 접근해 줘...

 

와 같이 A라는 기능의 맥락을 제공할 경우 원하는 아웃풋이 나올 확률이 훨씬 높은 것이죠.

슬랙에서 읽은 인상적인 표현이 "자연어로 된 쿼리를 작성하는 것 같다"였는데 정확한 표현인 것 같습니다.

원하는 데이터에 대해 정확히 명시해주어야 합니다.

 

2) 꼬리질문하기

한 번 받은 응답에 대해 꼬리질문을 던지는 것도 좋은 방법입니다. 

예를 들어 A와 B 중 B가 더 낫다는 답변을 받았다면, 왜 B가 더 나은 안인지, A의 장점은 무엇인지, B의 단점은 무엇인지, A와 B 이외에 다른 방법은 없는 지와 같은 질문을 추가로 던지는 것입니다.

이렇게 꼬리질문을 통해 해당 주제에 대해서 더욱 자세한 설명을 얻을 수 있으며 동시에 미처 알지 못했던 다른 키워드들을 알 수 있게 됩니다. 

또한 꼬리질문을 통해 대화에 쌓인 내용들 역시 학습하여 다음번 질문 시 원하는 답을 얻을 확률이 높아졌습니다. 질문에 연관된 내용들까지 알려주는 식으로요.

 

3) 🚨의심하기🚨

마지막으로 가장 중요한 것은 ChatGPT의 답변을 의심하는 것입니다.

지금까지 작성한 내용들만 보면 ChatGPT는 마법의 도구 같기만 합니다.

그러나 이 고도로 발전한 인공지능은 때때로 꽤나 성의 있게 잘못된 답변을 진실인 양 제공하기도 합니다. 사실 꽤나 자주 말이죠.

어떤가요?

대단히 신뢰감이 가는 형식으로 글을 작성하여, 마치 실제로 2021년에 카뎃봉기사건이 일어난 것처럼 느껴지지 않나요? 42서울에 대한 배경을 모르고, 이 질문이 장난이라는 사실을 모른다면 별 의심 없이 실제 일어났던 사건이라고 믿어버릴 것만 같습니다.

ChatGPT는 온라인에 존재하는 정보를 긁어모아 사실을 검증한 후 정확한 정보를 제공하는 인공지능이 아닙니다.

엄청난 양의 데이터를 때려 넣어서 우리가 하는 질문에 가장 그럴듯한 답변을 제공하는 인공지능이죠.

따라서 현시점에서는 ChatGPT의 답변이 사실인지, 코드를 받았다면 실제로 문제없이 작동하는지 반드시 검증하여야 합니다. 저도 과제를 진행하며 무지성 복붙을 몇 번 했다가 피를 본 경험이 있네요.

ChatGPT가 정보 탐색의 효율성을 압도적으로 높여주긴 하지만, ChatGPT가 제공하는 정보에는 언제든지 거짓이 섞여있을 수 있다는 것을 명심해야만 합니다.


3.  총평

ChatGPT를 실제 프로그램 제작에 사용해 본 저의 후기는 "미쳤다"입니다. 지금까지 프로그래밍을 해오며 가장 고통스러웠던 순간들이 더 이상 그렇게까지 고통스럽게 느껴지지 않게 해 주었거든요. 무엇을 검색해야 할지 몰라 구글 검색창을 띄워놓고 한참을 멍 때리는 일, 간단한 코드를 작성하느라 시간이 낭비되는 일, 원인을 알 수 없는 버그는 발생하는데 그 원인을 도저히 특정할 수 없는 일, 분명히 더 나은 코드가 있는데 어떻게 개선해야 할지 감이 안 오는 일. 모두 ChatGPT와 함께 평소보다 훨씬 수월하게 문제를 해결할 수 있었습니다. ChatGPT를 사용하였기 때문에 프로그래밍이 한층 더 즐거운 일이 된 것이죠. 과제를 진행한 후 저는 ChatGPT 없이 살 수 없는 몸이 되어버렸습니다. 코딩은 물론 삶의 사소한 문제들까지 일단 ChatGPT와 의논하려고 하는 제 모습을 종종 발견하게 됩니다. 

 

지금은 분명한 한계를 가지고 있지만 이 한계가 얼마나 빠르게 사라질지 모르겠습니다.

'언젠가 ChatGPT와 같은 인공지능이 신뢰할 수 있는 답변을 내놓는 시대가 온다면...' 이라는 가정을 하지 않을 수 없지 않나요?

그래서 이번 수요지식회를 열어야겠다는 생각이 들었던 것 같습니다. 제 발표를 보고 ChatGPT에 이런 가능성이 있다는 것을 한 분이라도 느껴가셨으면 좋겠기도 하고, 또 동시에 다른 분들은 이 경이로운 도구를 어떻게 잘 활용하고 있는지 궁금하기도 했거든요. 저도 사용을 하다 보니 항상 같은 방식으로 비슷한 질문만 던지게 되는데, 여러 사람이 이 경이로운 도구를 사용하는 법을 공유한다면 다 같이 틀을 깰 수 있는 기회가 되지 않을까 생각했던 것 같습니다.

 

앞으로 ChatGPT는 더 많은 분야에서 활약하게 될 것입니다. 코딩뿐만 아니라 인간의 사고력을 요하는 모든 분야에서 인간을 보조하는 훌륭한 도구로 활약하겠죠. 생각하는 것보다 근시일 내에 아마 인간을 대체할 수도 있을 것입니다. 이제 뭐해먹고살아야 하나...라는 생각이 안 들 수가 없는 것 같네요. 그러나 그런 걱정을 하기보다는 어떻게 하면 이 도구를 잘 이용할 수 있을까?라는 고민을 해야 할 것 같습니다. 높은 지식수준을 요구하는 일들이 점점 쉬워진다는 것은, 곧 우리의 아이디어를 현실로 구현해 내는 것이 점점 쉬워진다는 것입니다. 불과 십수 년 전만 하더라도 인터넷을 통해 내가 만든 앱을 서비스하려면 서버를 구매하여 시스템을 구축하고 네트워크를 설정하고... 도저히 혼자서는 해낼 수 없는 일이었습니다. 그러나 지금은 아이디어와 간단한 코딩실력만 있다면 누구나 자신의 서비스를 전 세계에 선보일 수 있습니다. 아마 머지않아 아이디어와 그걸 명확하게 표현할 수 있는 어휘력만 있다면 누구나 자신의 아이디어를 현실로 만들어 낼 수 있는 시대가 올 것 같네요.

 

...

 

아, 뭐 해먹고 살지?

'42 > 42SeoulLife' 카테고리의 다른 글

우수상을 받는 나  (2) 2023.09.05
Don't panic  (2) 2023.02.01
42서울 공통과정을 마무리하며  (6) 2022.12.29
최우수상을 받는 나  (3) 2022.12.18
42 파리와의 인터뷰  (2) 2022.11.09

댓글