AI로 PHP 코드를 수정할 때 지켜야 할 작업 흐름 — 권한 제한부터 diff·테스트까지

조회수 2

도입

AI 개발 도구는 채팅, IDE와 에이전트처럼 이름과 기능이 다르지만 안전성을 결정하는 기준은 비슷하다. 어떤 파일을 읽고 수정하는지, 어떤 명령과 외부 작업을 실행할 수 있는지, 그리고 결과를 사람이 어떻게 검증하는지가 핵심이다.

이 글은 특정 제품의 우열을 정하지 않는다. PHP 코드의 SQL Injection 가능성을 수정하는 작은 과제를 기준으로 입력 준비, 권한 설정, 실행, diff 검토와 품질 비교 방법을 하나의 흐름으로 정리한다.

제품 이름보다 작업 권한을 먼저 구분한다

권한가능한 작업기본 경계
읽기저장소 검색, 호출 관계와 코드 설명비밀·개인정보 파일 제외
쓰기승인된 파일 수정과 테스트 추가작업 디렉터리와 파일 범위 제한
실행lint, 단위 테스트, 빌드허용한 명령과 작업 시간 제한
외부 변경PR, 배포, 패키지 게시, DB·클라우드 변경사람의 별도 승인

자동완성은 코드 일부를 제안하지만 에이전트는 검색 결과를 바탕으로 여러 파일을 수정하고 명령 출력에 따라 추가 행동을 할 수 있다. 최종 코드뿐 아니라 검색 범위, 실행 명령과 중간 결과도 검토해야 한다.

첫 과제는 작고 되돌릴 수 있게 만든다

목표:
게시글 검색 함수의 SQL Injection 가능성을 제거한다.

환경:
PHP 8.1, PDO, MariaDB 10.11

수정 범위:
src/PostRepository.php와 관련 테스트만 수정

제약:
- 공개 메서드 인자와 반환형 유지
- 새 패키지와 DB 스키마 변경 금지
- 네트워크, 배포와 운영 DB 접근 금지

검증:
- 정상 검색과 작은따옴표 입력 테스트
- php -l과 지정 단위 테스트 실행

완료 보고:
- 수정 파일, 핵심 diff, 실행 명령과 결과
- 실행하지 못한 검사와 남은 위험

“코드를 개선해 줘”처럼 완료 여부를 판정하기 어려운 요청을 피한다. 목표, 허용 범위, 금지 작업과 성공 조건을 함께 제공한다.

PHP 수정 범위와 금지 작업 및 검증 조건을 명시한 AI 작업 요청
AI 작업을 시작하기 전에 수정 범위와 완료 조건을 제한했다.

필요한 문맥만 제공한다

  1. 문제를 재현하는 입력과 현재·예상 결과
  2. 진입점부터 DB 접근까지 필요한 코드
  3. 관련 인터페이스와 테이블 구조의 최소 부분
  4. 현재 오류 또는 실패 테스트
  5. 변경할 수 없는 호환성 조건

저장소 전체나 긴 운영 로그를 무작정 전달하지 않는다. 빠진 문맥을 모델이 추측하지 않도록 제공하지 않은 정보와 모르는 조건을 명시한다.

외부 도구에 보내기 전에 민감정보를 제거한다

원본 정보대체 방식
API 키·비밀번호·세션REDACTED_SECRET
이메일·전화번호형식만 유지한 합성 값
내부 IP·호스트db.internal.example
전체 운영 로그문제 전후의 필요한 필드만 추출

URL query, HTTP 헤더, 스택 트레이스와 SQL 파라미터에도 민감정보가 남을 수 있다. 도구의 데이터 보존 조건과 조직 정책도 사용 시점에 확인한다.

프로젝트 규칙은 검증 가능한 행동으로 쓴다

# PHP project rules
- PHP 8.1 문법과 기존 공개 메서드 시그니처를 유지한다.
- env, key, credential 파일을 읽거나 출력하지 않는다.
- SQL 값은 PDO Prepared Statement로 바인딩한다.
- 의존성·스키마·외부 상태 변경은 먼저 승인을 요청한다.
- 수정 전 관련 테스트를 찾고 수정 후 같은 테스트를 실행한다.
- 실행하지 않은 검사를 통과했다고 표현하지 않는다.
- 요청 범위 밖의 파일은 수정하지 않는다.

규칙 파일은 보조 수단이다. 실제 파일 시스템 권한, 저장소 보호 정책과 사람의 diff 검토를 대신하지 않는다.

근거와 불확실성을 함께 요구한다

각 지적에 다음을 포함하세요.
- 위험도와 발생 조건
- 근거가 되는 파일·함수·코드 조각
- 확실하지 않은 전제
- 가장 작은 수정안
- 수정 전 실패하고 수정 후 통과할 테스트

제공하지 않은 코드의 동작을 추측하지 말고
추가로 필요한 정보를 질문하세요.

답변이 단정적이어도 실제 코드 위치와 동작이 맞는지 확인한다. 존재하지 않는 함수, 설정이나 라이브러리를 인용하면 적용하지 않는다.

명령은 영향 범위를 확인한 뒤 실행한다

  • php -l, 읽기 전용 검색과 지정 단위 테스트는 영향이 작다.
  • 패키지 설치는 lock 파일과 많은 소스를 바꿀 수 있다.
  • 마이그레이션, 배포와 클라우드 명령은 외부 상태를 변경한다.
  • 삭제·초기화 명령은 정확한 대상과 복구 방법이 필요하다.

명령 실행을 허용한 것과 결과 판정을 위임한 것은 다르다. 종료 코드, 경고와 실패 출력을 직접 확인한다.

적용 전 diff와 테스트 결과를 검토한다

git status --short
git diff --stat
git diff -- src/PostRepository.php tests/PostRepositoryTest.php
php -l src/PostRepository.php
vendor/bin/phpunit tests/PostRepositoryTest.php

다음 변화가 있으면 바로 적용하지 않는다.

  • 요청하지 않은 파일과 대규모 포맷 변경
  • 오류를 숨기는 빈 catch 또는 검증 제거
  • 하드코딩된 비밀번호·토큰·내부 경로
  • 테스트를 통과시키기 위한 assertion 완화
  • 근거 없이 추가된 패키지와 설정
AI가 수정한 PHP 파일과 테스트 파일의 Git diff 검토 화면
전체 diff에서 요청 범위 밖의 변경과 검증 완화가 없는지 확인했다.
PHP 문법 검사와 관련 단위 테스트가 완료된 터미널 출력
수정한 코드의 문법과 경계 테스트 결과를 실제 명령으로 확인했다.

도구 비교는 동일한 과제로 측정한다

항목확인 방법
요구사항명시한 조건을 빠짐없이 반영했는가
실행 가능성lint와 테스트를 실제로 통과하는가
보안입력과 SQL 구조가 분리됐는가
변경 범위요청하지 않은 파일을 수정하지 않았는가
검토 비용수정 요청과 사람의 재작업이 얼마나 필요한가
비교일:
제품 / 모델 / 요금제:
허용한 권한:
첫 답변 소요 시간:
수정 요청 횟수:
수정 파일 수:
php -l 결과:
테스트 결과:
사람이 다시 수정한 부분:
남은 위험:

한 번의 과제로 제품 전체의 우열을 단정하지 않는다. 모델, 요금제와 도구 권한이 다르면 비교 조건도 달라진다. 문체보다 실행 결과, diff와 검토 비용을 우선한다.

도입 전 확인표

  • 읽기·쓰기·실행·외부 변경 권한을 구분했다.
  • 과제의 목표와 수정 가능한 파일을 제한했다.
  • 비밀정보와 개인정보를 제거했다.
  • 완료 여부를 판정할 테스트를 지정했다.
  • 전체 diff와 실제 명령 출력을 사람이 확인했다.
  • 배포와 운영 데이터 변경은 별도 승인 경계로 남겼다.

참고 자료

한 줄 요약

AI 개발 도구의 품질은 답변의 문체가 아니라 제한된 권한 안에서 만든 작은 diff와 사람이 확인한 테스트 결과로 판단한다.

댓글 0

  • 첫 번째 댓글을 남겨보세요.