
「AI에게 코드를 쓰게 하면 자동화할 수 있다」라고 생각했었다
요약
AI를 활용한 코드 자동화 과정에서 겪은 시행착오와 이를 통해 깨달은 올바른 프롬프트 작성 및 검증 절차를 소개합니다. 단순히 코드를 생성하는 것을 넘어, 예외 상황을 정의하고 테스트하는 설계 역량의 중요성을 강조합니다.
핵심 포인트
- AI에게 지시하기 전 정상/이상 시의 동작을 직접 결정해야 함
- 한 번의 성공에 안주하지 말고 다양한 조건으로 테스트할 것
- 모든 과정을 자동화하기보다 중요한 판단에는 사람의 확인을 포함할 것
- 모호한 지시 대신 예외 처리(폴더 부재 등)를 포함한 구체적 프롬프트 필요
2025년, 신입 사원이었던 나는 생성 AI에게 하고 싶은 일을 전달하면, 업무에서 사용할 수 있는 자동화 코드가 간단히 완성될 것이라고 생각했습니다.
실제로 AI는 몇 초 만에 PowerShell이나 Excel VBA 코드를 작성해 줍니다. 간단한 처리라면 그대로 동작하기도 합니다.
하지만 내가 처음 만든 PowerShell 코드는, 복사 대상 폴더가 존재하지 않는다는 이유만으로 에러가 발생했습니다.
원인은 AI의 성능이 아니었습니다. 내가 「복사 대상이 존재하지 않을 경우 어떻게 할지」를 결정하지 않았고, AI에게도 전달하지 않았던 것이었습니다.
이 기사에서는 그 실패를 계기로 AI를 대하는 방식이 바뀐 과정과, 현재 사용하고 있는 구체적인 절차 및 프롬프트(Prompt)를 소개합니다.
먼저 결론부터 적어두겠습니다.
- AI에게 지시하기 전에,
자신이 정상 시와 이상 시의 동작을 결정한다 - 한 번 동작했다고 해서 완성이라고 판단하지 말고,
서로 다른 조건으로 테스트한다 - 모든 것을 자동화하지 말고,
중요한 판단에는 사람의 확인을 남긴다
AI에게 코드를 작성하게 하는 것은 자동화의 목표가 아니었습니다. 나에게는 그곳이 시작이었습니다.
- 사회인 2년 차 엔지니어 (24세)
- 대학에서는 C 계열과 Python이 중심. PowerShell과 Excel VBA는 업무 효율화를 위해 공부 중
- 설계는 바로 현재 진행형으로 배우고 있는 단계
업무를 하다 보면 비슷한 조작을 반복하는 상황이 있습니다.
- 정해진 폴더로 파일을 복사한다
- 파일명을 정해진 형식으로 변경한다
- Excel의 정해진 셀에 정보를 입력한다
- 여러 파일에서 필요한 정보를 찾는다
하나하나가 어려운 작업은 아닙니다. 하지만 몇 번이고 반복하면 시간이 걸리고, 수작업으로 인한 실수도 발생할 수 있습니다.
같은 조작을 반복하고 있다면 PowerShell이나 Excel VBA로 자동화할 수 있지 않을까. 그렇게 생각했지만, 당시에는 하고 싶은 처리를 처음부터 코드로 만들 수 있을 정도로 자세히 알지 못했습니다.
그래서 사용하기 시작한 것이 생성 AI입니다. 일본어로 전달하는 것만으로, 스스로는 바로 쓸 수 없는 코드가 몇 초 만에 나옵니다. 처음 코드가 동작했을 때는 솔직히 감동했습니다.
동시에, 이런 선입견도 생겼습니다.
AI에게 작업 내용을 전달하면, 나머지는 생성된 코드를 실행하기만 하면 된다.
지금 되돌아보면, 코드를 「만드는 것」에만 주목하고 그 이후의 확인을 가볍게 생각했습니다.
예를 들어, 지정한 폴더 내의 Excel 파일을 백업용 폴더로 복사하는 처리를 생각해 보겠습니다.
당시의 나는 이렇게 지시하고 있었습니다.
폴더 내의 Excel 파일을
다른 폴더로 복사하는 PowerShell을 작성해 주세요.
상당히 모호한 지시입니다. 그럼에도 AI는 다음 코드를 생성했습니다.
$sourceFolder = "C:\Work\Source"
$destinationFolder = "C:\Work\Backup"
Get-ChildItem -Path $sourceFolder -Filter "*.xlsx" |
...
짧고 보기에도 이해하기 쉬운 코드입니다. 나는 복사 원본 폴더에 Excel 파일을 두고 그대로 실행했습니다.
실행하자 파일이 복사되지 않았습니다. 복사 대상이 존재하지 않는다는 에러가 표시됩니다.
확인해 보니 복사 원본인 C:\Work\Source는 생성했지만, 복사 대상인 C:\Work\Backup은 생성하지 않았습니다.
나는 AI에게 「Excel 파일을 다른 폴더로 복사해 줘」라고만 전달했습니다. 그 때문에 다음 조건은 아무것도 결정되어 있지 않았습니다.
- 복사 대상이 존재하지 않을 경우 자동으로 생성할 것인가
- 에러를 표시하고 종료할 것인가
- 상위 폴더도 존재하지 않을 경우에는 어떻게 할 것인가
보충하자면, Copy-Item은 존재하지 않는 경로를 전달받았을 때 반드시 에러가 난다고 단정할 수 없습니다. 대상 파일이 1개뿐인 경우, 복사 대상을 「폴더」가 아니라 「복사 대상의 파일명」으로 해석하여 C:\Work\Backup이라는 확장자가 없는 파일이 만들어지는 경우가 있습니다. 에러로 멈춰준 편이 오히려 알아차릴 수 있어 친절한 셈이 됩니다.
복사 대상 폴더를 수동으로 생성하고 재실행하니 이번에는 복사가 되었습니다. 하지만 거기서 새로운 의문이 생깁니다.
이번에는 폴더를 만들면 동작했지만, 그 외에도 결정하지 않은 조건이 있는 것이 아닐까.
확인해 보니 다음 조건도 빠져 있었습니다.
- 복사 대상 위치에 동일한 이름의 파일이 있는 경우
- 대상 파일이 하나도 없는 경우
- Excel 임시 파일이 포함된 경우
- 파일에 대한 액세스 권한이 없는 경우
- 도중에 복사에 실패한 경우
- 몇 건이 복사되었는지 확인하고 싶은 경우
처음 작성한 코드는 필요한 폴더가 존재하고, 대상 파일에도 문제가 없는 상태에서만 기대한 대로 동작하는 코드였습니다.
처음에는 AI가 불완전한 코드를 생성했다고 생각했습니다.
하지만 애초에 저는 "복사 대상 위치가 존재하지 않을 경우 어떻게 할 것인가"를 AI에게 전달하지 않았습니다. 그뿐만 아니라, 저 자신도 결정하지 않은 상태였습니다.
AI에 대한 지시가 모호했다기보다, 자동화할 처리의 사양(Specification) 자체가 모호했던 것입니다.
그리고 복사가 성공한 시점에서도 완성은 아니었습니다. 저는 다음 질문에 답할 수 없었기 때문입니다.
Get-ChildItem은 구체적으로 무엇을 가져오는가 - 하위 폴더의 파일도 대상이 되는가- 동일한 스크립트를 두 번 실행하면 어떻게 되는가
코드가 한 번 동작했다는 것과, 안전하게 반복해서 사용할 수 있다는 것은 별개의 문제입니다. 확인된 것은 특정 조건에서 복사할 수 있었다는 사실뿐이었습니다.
부족했던 조건을 정리하여 지시를 다음과 같이 변경했습니다.
PowerShell로, 지정한 폴더 내의 .xlsx 파일을
백업 폴더로 복사하는 스크립트를 작성해 주세요.
조건은 다음과 같습니다.
...
생성된 코드 중 요점은 다음 세 곳입니다.
복사 대상 위치가 존재하지 않으면 생성합니다. New-Item -ItemType Directory는 중간 단계의 상위 폴더가 존재하지 않는 경우에도 한꺼번에 생성해 줍니다.
if (-not (Test-Path -LiteralPath $DestinationFolder -PathType Container)) {
New-Item -ItemType Directory -Path $DestinationFolder -Force | Out-Null
}
대상 파일을 가져올 때, Excel 임시 파일을 제외합니다.
$files = @(
Get-ChildItem -LiteralPath $SourceFolder -File -Force |
Where-Object { $_.Extension -eq '.xlsx' -and $_.Name -notlike '~$*' } |
...
복사 대상 위치에 동일한 이름의 파일이 있는 경우, 덮어쓰지 않고 건너뜁니다.
if (Test-Path -LiteralPath $destinationPath) {
Write-Host "건너뜀 : $($file.Name)(복사 대상 위치에 동일한 이름의 파일 있음)"
$skipCount++
...
처음 코드보다 길어졌지만, 무엇을 정상으로 간주하고 어떤 조건에서는 처리하지 않을지가 명확해졌습니다. 극단적으로 말하면, 자신이 원하지 않는 처리를 하지 않기 위한 코드입니다.
모든 조건을 반영한 결과는 다음과 같습니다. Backup-ExcelFiles.ps1로 저장하면 동작합니다.
Windows PowerShell 5.1은 BOM이 없는 UTF-8로 저장된 .ps1 파일을 ANSI로 읽어 들입니다. 일본어 주석이나 Write-Host 문자열이 깨질 수 있으므로, "UTF-8 (BOM 포함)"으로 저장해 주세요. VS Code라면 오른쪽 하단의 인코딩 표시에서 Save with Encoding → UTF-8 with BOM을 선택하면 됩니다.
#Requires -Version 5.1
<#
.SYNOPSIS
...
스크립트 실행이 차단되는 경우에는 실행 정책(Execution Policy) 설정이 필요합니다. 다만 AI는 Set-ExecutionPolicy Bypass를 무분별하게 권할 때가 있습니다. 영구적으로 완화하기보다는 Set-ExecutionPolicy -Scope Process와 같이 영향 범위를 한정하거나, 사내 운영 규칙을 따르십시오.
이 스크립트에는 -WhatIf를 붙일 수 있도록 구성되어 있습니다. 실제로 복사하지는 않고 무엇이 실행될지만 표시하는 PowerShell의 표준 기능입니다.
PS C:\ሴ\Work> .\Backup-ExcelFiles.ps1 -SourceFolder 'C:\\Work\\Source' -DestinationFolder 'C:\\Work\\Backup' -WhatIf
복사 원본 : C:\\Work\\Source
복사 대상 : C:\\Work\\Backup
...
「실행하기 전에 확인을 남기는 것」은 직접 로직을 작성하지 않아도 표준 기능으로 구현할 수 있습니다. Remove-Item이나 Move-Item처럼 되돌릴 수 없는 처리를 다룰 때일수록, 우선 이것을 붙여서 실행하도록 하고 있습니다.
다음 구성의 폴더에서 확인했습니다.
C:\\Work\\Source
├─ test01.xlsx
├─ test02.xlsx
...
복사 원본 : C:\\Work\\Source
복사 대상 : C:\\Work\\Backup
대상 파일: 2건
...
복사 원본 : C:\\Work\\Source
복사 대상 : C:\\Work\\Backup
대상 파일: 2건
...
임시 파일 ~$test03.xlsx와 텍스트 파일 test_memo.txt는 모두 대상에서 제외되어 처리되었습니다. 초기 코드에서는 애초에 복사 대상 폴더가 존재하지 않는 시점에서 멈춰 있었습니다.
제외 조건을 작성한 후, 만약을 위해 Get-ChildItem의 결과만 표시해 보았더니 ~$test03.xlsx는 처음부터 목록에 포함되어 있지 않았습니다.
Excel이 생성하는 ~$xxxx.xlsx에는 숨김 파일 (Hidden file) 속성이 붙어 있으며, Get-ChildItem은 -Force를 붙이지 않는 한 숨김 파일을 반환하지 않기 때문입니다.
즉, -Force가 없는 코드에서는 「제외 조건이 올바르게 작동한 것」이 아니라 「애초에 가져오지 않았던 것」뿐이었습니다.
더 까다로운 점은, 테스트용으로 직접 만든 ~$test03.xlsx에는 숨김 속성이 붙지 않는다는 점입니다. 수작업으로 준비한 테스트 데이터는 실제 운영 환경의 조건과 일치하지 않을 수 있습니다.
이 스크립트에서는 의도적으로 -Force를 사용하여 숨김 파일도 가져온 뒤, ~$를 명시적으로 제외하고 있습니다. 그렇게 함으로써 무엇을 제외하고 있는지가 코드에서 읽힐 수 있는 상태가 됩니다.
조건을 자세히 지정하면 목적에 가까운 코드가 생성되기 쉬워집니다. 반면, 조건을 늘릴수록 코드는 길어집니다.
저는 한때 떠오르는 조건을 모두 프롬프트 (Prompt)에 추가하여, 처음부터 완벽한 코드를 만들게 하려고 했습니다. 그 결과가 다음과 같습니다.
- 간단한 지시로는 조건이 부족한 코드가 생성된다
- 조건을 대량으로 추가한다
- 길고 복잡한 코드가 생성된다
- 스스로 코드 전체를 확인할 수 없게 된다
자신의 이해를 넘어서는 코드를 생성할 수 있다는 점은 AI의 장점이지만, 이해하지 못한 채 실행하면 리스크가 될 수도 있습니다. 그래서 현재는 처음부터 완성본을 만들게 하지 않고 있습니다.
먼저, 코드가 아니라 필요한 조건들을 나열해 달라고 요청합니다.
지정한 폴더 내의 Excel 파일을
백업 폴더로 복사하는 작업을
PowerShell로 자동화하고 싶습니다.
...
AI가 제시한 조건을 스스로 확인하고, 채택할 것을 결정합니다.
이번 예시라면 다음과 같은 단위로 분할합니다.
- 폴더의 존재를 확인한다
- 대상 파일을 가져온다
- 대상 파일을 표시한다
- 파일을 복사한다
- 처리 결과를 표시한다
작게 만듦으로써 각 처리의 의미와 동작을 확인하기 쉬워졌습니다.
이해되지 않는 행은 그 부분만 AI에게 질문합니다.
다음 PowerShell 코드를 초보자용으로 설명해 주세요.
Get-ChildItem -LiteralPath $sourceFolder -File -Force
다음 내용을 나누어서 설명해 주세요.
...
코드 전체가 아니라 모르는 부분을 한정하는 편이 확인하기 쉽습니다. 이번 숨김 파일 건도 이 질문을 통해 깨달았습니다.
「문제없나요?」라고만 물으면 확인 관점이 모호해지기 때문에, 구체적인 조건을 지정합니다.
이 코드에 문제가 있다는 전제로 엄격하게 리뷰해 주세요.
특히 다음 사항을 확인해 주세요.
・기존 파일을 덮어쓸 가능성
...
AI의 리뷰도 반드시 옳다는 보장이 없으므로, 확인 자료 중 하나로 취급합니다.
코드를 확인한 후에는 실제 업무 파일이 아닌 테스트용 폴더에서 시도합니다. 특히 다음 조건들을 확인합니다.
- 대상 파일이 없는 경우
- 복사 대상 경로가 존재하지 않는 경우
- 동일한 이름의 파일이 존재하는 경우
- 임시 파일이 포함된 경우
- 동일한 처리를 2회 실행하는 경우
정상적으로 작동하는지뿐만 아니라, 예상치 못한 조건에서 위험한 동작을 하지 않는지도 확인합니다.
이전의 저는 수작업이 남으면 자동화에 실패했다고 느꼈습니다.
현재는 정형화된 처리(定型処理)만 스크립트(Script)에 맡기고, 중요한 판단은 사람이 수행하는 반자동화(Semi-automation)도 유효하다고 생각합니다.
- 기존 파일을 덮어쓰기 전의 확인
- 파일을 삭제하기 전의 확인
- 대량의 파일을 처리하기 전의 확인
- 업무상의 판단이 필요한 처리
모든 것을 자동화하는 것보다, 확인 단계를 하나 남겨두는 것이 안전성과 효율성을 양립할 수 있는 경우가 있습니다.
이번 스크립트는 다음과 같은 사항에 대해서는 아무것도 수행하지 않습니다.
- 동일한 이름의 파일 내용을 비교하지 않음 — 이름이 같으면 스킵하기 때문에, 복사 원본만 업데이트된 파일은 반영되지 않습니다.
- 긴 경로(Path)에 대응하지 않음 — 합계 260자를 초과하는 경로는 실패합니다.
- Excel로 열려 있는 파일 — 잠금(Lock) 상태에 따라 실패합니다(
실패로 기록됩니다). - 세대 관리(Generation management)를 하지 않음 — 날짜 폴더로의 퇴피(Evacuation) 등은 포함되지 않습니다.
필요해진 시점에 추가한다는 방침으로 하고 있습니다. 처음부터 모든 것을 담으려다 보니 스스로 읽을 수 없는 코드가 되었던 것이 앞서 언급한 실패였습니다.
이번 실패는 복사 대상 폴더가 존재하지 않았던 것이었습니다. 표면적으로는 단순한 에러이지만, 원인을 추적해 보니 제가 이상 발생 시의 동작을 결정하지 않았다는 점에 도달했습니다.
이전의 저는 AI에게 코드를 쓰게 하고, 그대로 실행했습니다.
현재는 AI와 함께 사양(Specification)을 정리하고, 작게 코드를 만든 뒤, 테스트를 거쳐 사용하고 있습니다.
특히 배운 점은 다음 3가지입니다.
- AI에게 지시하기 전에, 자신이 정상 시와 이상 시의 동작을 결정한다.
- 한 번 작동했다고 해서 완성이라고 판단하지 않고, 서로 다른 조건에서 테스트한다.
- 모든 것을 자동화하지 않고, 중요한 판단에는 사람의 확인을 남긴다.
AI에게 코드를 작성하게 하는 것은 자동화의 목표가 아닙니다. 저에게 있어서 그것은 자동화의 시작이었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기