2026년에 Claude와 함께 PHP 배우기: AI 의존성이 아닌 진짜 실력을 쌓는 법
요약
AI 도구인 Claude를 활용해 코드를 생성할 때 발생할 수 있는 PHP 개발의 함정과 기초 지식의 중요성을 다룹니다. 프레임워크 운영자를 넘어 진정한 언어 숙련도가 되는 학습 방법을 제안합니다.
핵심 포인트
- AI가 생성한 코드는 보안 취약점(Mass assignment)을 포함할 수 있음
- PHP 8.3은 현대적이고 강력한 기능을 갖춘 언어임
- AI는 비즈니스 컨텍스트와 복잡한 디버깅을 해결해주지 못함
- 프레임워크 사용법 이전에 언어의 기초 원리를 이해해야 함
지난주 코드 리뷰를 진행했습니다. 한 "풀스택 (Fullstack)" 개발자가 자신의 Laravel API를 보여주었습니다. 겉보기에는 깔끔했습니다. 잘 정리된 컨트롤러 (Controllers), Eloquent 마이그레이션 (Migrations), Form Request 검증 (Validation)까지 갖추고 있었죠. 저는 그에게 왜 컨트롤러에서 $request->validated() 대신 $request->all()을 사용하고 있는지 물었습니다. 그는 멍한 표정을 지었습니다. 그는 all()이 검증되지 않은 필드를 포함하여 페이로드 (Payload)의 _모든 것_을 반환한다는 사실을 모르고 있었습니다. Claude가 컨트롤러를 생성했고, 그는 그것을 복사했으며, 작동은 했습니다. Laravel을 사용한 지 6개월이 지났지만, 모든 엔드포인트(Endpoint)에는 잠재적인 대량 할당 취약점 (Mass assignment vulnerability)이 잠들어 있었습니다.
PHP에는 Python에는 없는 문제, 즉 평판의 문제가 있습니다. "죽은 언어", "스파게티 코드 (Spaghetti code)", "WordPress용으로만 좋다" 같은 말들 말이죠. 2026년 현재, 이는 아주 오래전부터 잘못된 정보였습니다. PHP 8.3은 열거형 (Enums), 파이버 (Fibers), 읽기 전용 속성 (Readonly properties)을 갖춘 타입 지정이 가능한 현대적인 언어이며, PHP 5 시절에는 상상조차 할 수 없었던 성능을 보여줍니다. 하지만 이러한 평판 때문에 많은 초보자가 기초를 건너뛰고 AI의 안내를 받아 곧바로 프레임워크 (Framework)로 뛰어듭니다. 그 결과는 PHP 개발자가 아닌, Laravel 운영자가 되는 것입니다. 이 글은 어떻게 하면 전자가 되지 않고 Claude를 사용하여 후자가 될 수 있는지 설명합니다.
2026년의 PHP: 사람들이 미워하기 좋아하는 언어
교수법을 이야기하기 전에, 이 논쟁부터 정리해 봅시다. "모두가 Go / Rust / TypeScript로 넘어가는데 왜 PHP를 배워야 하나요?" 의견이 아닌 세 가지 사실을 말씀드리겠습니다.
1. PHP는 웹의 75%를 구동합니다. WordPress, Shopify (백엔드), Symfony, Laravel 등 수백만 개의 프로젝트가 실제 서비스(Production) 중입니다. PHP 일자리는 부족하지 않으며, 실력 있는 PHP 개발자가 드물기 때문에 보수도 높습니다. 모두가 Rust로 코딩하고 싶어 하지만, 새벽 2시에 Doctrine\ORM\Query\QueryException을 디버깅할 수 있는 사람은 거의 없습니다.
2. PHP 8.3은 PHP 5와 공통점이 전혀 없습니다. 타입 선언 (Type declarations), 열거형 (Enums), readonly, match, 명명된 인자 (Named arguments), 파이버 (Fibers), JIT — 이것은 완전히 다른 언어입니다. PHP에 대한 비판은 2012년으로 거슬러 올라갑니다. 2026년 현재, 사람들이 TypeScript에서 찬사를 보냈던 동일한 패턴들이 PHP에 네이티브로 존재합니다.
3. AI는 당신의 비즈니스 컨텍스트(Business Context)를 디버깅해주지 않습니다. Claude는 15초 만에 UserController를 생성합니다. 하지만 스테이징 환경에서 클라이언트의 LDAP 인증이 깨지고, PHP-FPM 워커(Worker) 간에 세션이 더 이상 전파되지 않을 때, HTTP 요청 라이프사이클(Request Lifecycle)을 이해해야 하는 사람은 바로 당신입니다. 만약 당신이 $_SESSION을 한 번도 이해해 본 적이 없다면, 당신은 막히게 됩니다.
AI 보조 학습의 PHP 특화 함정 5가지
PHP에는 고유한 학습 안티 패턴(Anti-patterns)이 있습니다. 만약 당신이 이러한 패턴의 존재를 모른다면, AI는 이를 증폭시킵니다.
함정 1 — 이해 없이 WordPress 코드 복사하기
PHP는 선택적 타입 지정 (optionally typed) 방식을 사용합니다. AI는 종종 코드가 "더 간단하다"는 이유로 타입 없이 코드를 생성합니다. 그 결과: 당신은 무엇이든 받아들이지만, 실제 운영 환경(production)에서는 이해할 수 없는 TypeError를 발생시키며 충돌하는 느슨한 PHP를 배우게 됩니다. 당신의 첫 번째 파일부터 declare(strict_types=1)를 활성화하세요. 예외는 없습니다.
// ❌ 타입 지정 없음 — 모든 것이 통과되지만, 아무것도 안전하지 않음
function calculatePrice($quantity, $unitPrice) {
return $quantity * $unitPrice;
...
함정 5 — PDO vs mysqli: 잘못된 논쟁
Claude는 문맥에 따라 때로는 mysqli를, 때로는 PDO를 제안하곤 합니다. 진짜 조언은 이렇습니다: 그냥 PDO를 사용하세요. 그것이 표준 추상화 계층 (abstraction layer)이며, 준비된 문구 (prepared statements)를 깔끔하게 처리하고, 어떤 데이터베이스 엔진과도 작동합니다. mysqli는 MySQL 전용이며, 99%의 경우 추가적인 이점을 제공하지 않습니다.
// ❌ mysqli — MySQL에 결합되어 있으며, API가 혼란스러움
$conn = new mysqli("localhost", "user", "pass", "db");
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
...
효과적인 워크플로우: 먼저 작성하고, 나중에 질문하기
다른 언어와 동일한 사이클입니다 — Python 가이드에서 다루었습니다 — 하지만 구체적인 PHP 예시를 통해 살펴보겠습니다.
1단계 — 형편없더라도 당신만의 버전을 작성하기
문제: 사용자 배열을 필터링하여 성인만 남기기. AI 없이 작성한 당신의 첫 번째 버전:
// 나의 버전 — 성인 사용자 필터링
function getAdults(array $users): array {
$adults = [];
...
2단계 — 해결책이 아닌 리뷰를 요청하기
사용자 배열을 필터링하기 위한 나의 PHP 코드입니다. 수정된 버전을 주지 마세요. 무엇을 어떻게 개선할 수 있는지, 그리고 그 이유는 무엇인지 알려주세요. 제가 직접 다시 작성해 보겠습니다.
Claude는 다음과 같은 점을 지적할 것입니다: 이를 위해 array_filter가 존재합니다. 반환 타입은 array이지만, @return array<int, array{name: string, age: int}> docblock을 사용하여 더 정밀하게 표현할 수 있습니다. 그리고 만약 $users가 비어 있다면 어떻게 될까요? 당신의 함수가 이를 처리하나요? (네, 처리합니다 — 하지만 당신이 그것을 고려했나요?)
3단계 — 스스로 다시 작성하기
// 검토 후 개선된 버전
/** @param array<array{name: string, age: int}> $users */
function getAdults(array $users): array {
...
당신은 array_filter와 화살표 함수 (arrow functions)를 발견했습니다. fn() =>가 단일 표현식 클로저 (closures)를 위한 문법적 설탕 (syntactic sugar)이라는 점을 이해했습니다. 당신은 이것이 왜 더 간결한지 알고 있으며, array_filter가 키 (keys)를 보존한다는 사실(이후 숫자 인덱스로 반복문을 돌릴 때 함정이 될 수 있음)도 알고 있습니다.
4단계 — "내가 놓치고 있는 것은 무엇인가?"라고 질문하기
여기 개선된 버전이 있습니다. 제가 놓치고 있는 것이 있을까요? 이런 종류의 필터링을 위한 더 견고한 패턴이 있을까요?
Claude는 아마도 다중 기준 필터링을 위한 match 표현식, 클래스를 사용한 타입 지정 컬렉션 (typed collections), 그리고 배열의 인덱스를 재설정하기 위한 array_filter와 array_values(array_filter(...))의 차이점에 대해 언급할 것입니다. 세 단계의 이해 과정 중, 당신은 처음 두 단계를 스스로 해냈습니다.
가르치는 프롬프트 (vs 보조하는 프롬프트)
학습과 위임의 차이는 프롬프트를 어떻게 구성하느냐에 달려 있습니다. 다음은 PHP에 맞춰 조정된 패턴들입니다.
❌ 수동적인 프롬프트 (Passive prompt)
✅ 교육적인 프롬프트 (Pedagogical prompt)
"상품 관리를 위한 PHP CRUD를 작성해줘"
"PDO를 사용하여 상품을 삽입하는 이 POST 라우트를 작성했습니다. 제가 작성한 준비된 문구 (prepared statements)가 정말로 SQL 인젝션 (SQL injection)을 방어할 수 있을까요?"
"이 에러를 수정해줘"
"이 코드는 TypeError: Argument #1 must be of type string, null given을 발생시킵니다. 해결책을 바로 주지 말고, null이 어디서 오는지 설명해 주세요."
"Laravel 인증 기능을 만들어줘"
"password_verify()와 CSRF 토큰을 사용하여 세션 인증 (session auth)을 구현했습니다. 공격자가 이용할 수 있는 취약점은 무엇이 있을까요?"
"네임스페이스 (namespaces)가 뭐야?"
"use App\Service\UserService가 클래스를 가져온다는 것은 이해했습니다. 하지만 네임스페이스에서의 use와 클로저 (closure)에서의 use는 어떤 차이가 있나요?"
"PHP 클래스를 작성해줘"
"8개의 생성자 속성 (constructor properties)을 가진 User 클래스가 있습니다. PHP 8의 프로모티드 속성 (promoted properties)을 사용하면 이를 단순화할 수 있을까요? 차이점을 보여주세요."
일반적인 패턴은 자신이 무엇을 했는지 또는 무엇을 이해했는지 보여준 다음, 구체적인 질문을 던지는 것입니다. "네임스페이스 (namespaces)를 설명해줘"가 아니라 "이만큼 이해했는데, 제가 놓치고 있는 부분이 무엇인가요?"라고 묻는 식입니다. Claude는 PHP.net 문서의 긴 버전을 그대로 내놓는 대신, 사용자의 실제 수준에 맞춰 응답을 조정합니다.
경로: 8주 만에 자율적인 개발자로 성장하기
엄격한 프로그램이 아닙니다. 제가 멘토링했던 사람들에게 효과가 있었던 경로이며, PHP의 특성에 맞춰 조정되었습니다. AI는 노력의 _이전_이 아니라, 노력의 _이후_에 개입합니다.
1-2주 차 — AI 없는 기초 다지기
변수 (variables), 타입 (types), 조건문 (conditions), 반복문 (loops), 함수 (functions), 배열 (arrays). Claude 없이 진행합니다. 공식 PHP 문서 (php.net/manual)를 사용하고 연습 문제를 직접 손으로 풀어보세요. 모든 파일은 declare(strict_types=1);로 시작하세요. 목표는 foreach ($items as $key => $value)를 매번 물어봐야 하는 공식이 아니라, 반사적으로 사용할 수 있는 숙련도로 만드는 것입니다.
연습 문제: CSV 파일을 읽어 숫자 컬럼의 통계(평균, 최소값, 최대값)를 계산하는 스크립트를 작성하세요. 외부 라이브러리는 사용하지 않습니다. 오직 fopen(), fgetcsv(), 연관 배열 (associative array)만 사용하세요. 완료되면 Claude에게 리뷰를 요청하세요.
3-4주 차 — 객체 지향 프로그래밍 (OOP) 및 네임스페이스
클래스 (classes), 인터페이스 (interfaces), 트레이트 (traits), 상속 (inheritance), 합성 (composition), 네임스페이스 (namespaces), PSR-4 오토로딩 (autoloading). 이 단계는 PHP가 돋보이는 구간입니다. 객체 지향 프로그래밍 (OOP)은 현대 언어의 핵심이며, 네임스페이스는 사소하지 않은 모든 프로젝트를 구조화하는 메커니즘입니다. 이때부터 Claude는 리뷰 모드로 전환합니다.
연습 문제: CLI 작업 관리자(task manager)를 만드세요 — 추가, 삭제, "완료" 표시, JSON 내보내기 기능이 포함되어야 합니다. 각 엔티티 (entity)는 별도의 클래스로 구성합니다. readonly, 생성자 프로모티드 속성 (constructor promoted properties), 상태 관리를 위한 열거형 (enums)을 사용하세요. 먼저 직접 작성한 뒤, 나중에 Claude와 함께 리뷰하세요. 아마 Claude가 인터페이스 (interfaces)를 언급할 텐데, 그때가 바로 적기입니다.
// 3주 차에 직접 작성해야 하는 내용
declare(strict_types=1);
...
5-6주 차 — Composer, REST API 및 데이터베이스
Composer, 오토로딩 (autoloading), 의존성 (dependencies). PDO, 준비된 문구 (prepared statements), 수동 마이그레이션 (manual migrations). 프레임워크 없이 최소한의 REST API 작성하기. Claude는 **패턴 교사 (patterns teacher)**가 됩니다: "왜 라우팅 (routing)을 비즈니스 로직 (business logic)에서 분리해야 하나요?", "왜 컨트롤러 (controller)에 SQL을 넣으면 안 되나요?".
연습 문제: 블로그 포스트를 관리하는 REST API (CRUD). 수동 라우팅 ($_SERVER['REQUEST_URI'] + match), 데이터베이스를 위한 PDO, JSON 입출력. HTTP 에러 핸들링 (404, 422, 500). Claude에게 물어보세요: "제 라우팅이 안전한가요?" — 그 답변은 당신을 놀라게 할 것입니다.
7-8주 차 — 실제 완성형 프로젝트
모든 것을 결합한 프로젝트입니다. 두 가지로 조정된 옵션이 있습니다:
- 직접 만든 미니 MVC — 라우터 (router), 컨트롤러 (controllers), PHP 뷰 (views), PDO를 사용한 모델 (models), 모두 네임스페이스 (namespaces)와 Composer 오토로딩으로 구조화됨. Symfony도, Laravel도 아닌 — 당신만의 것입니다. 프레임워크가 내부적으로 무엇을 하는지 마침내 이해하게 될 것입니다.
- 완성된 API — JWT 인증 (authentication), 입력 값 검증 (input validation), 페이지네이션 (pagination), 에러 핸들링 (error handling), PHPUnit 테스트. 기술 면접에서 구축해 보라고 요구받는 수준의 프로젝트입니다.
Claude는 페어 프로그래밍 (pair programming) 모드로 전환합니다: 당신이 기능을 작성하면, Claude와 아키텍처 (architecture)를 논의하고, Claude는 당신의 선택에 이의를 제기합니다. "왜 전용 서비스 (dedicated service) 대신 컨트롤러에 검증 로직을 넣나요?" — 만약 대답할 수 없다면, 당신은 아직 의식적으로 결정하지 못한 것입니다.
Claude Pro vs Claude Code: PHP 학습을 위한 도구 선택
두 가지 도구, 두 가지 용도. 둘 다 월 $20 (Claude Pro) 또는 월 $20 (Max 플랜이 포함된 Claude Code)의 비용이 들지만, 학습 경험은 매우 다릅니다.
Claude Pro (claude.ai) — 교사
웹 인터페이스, 대화형. 다음과 같은 경우에 적합한 도구입니다:
- 개념 이해 — "구체적인 사례를 들어 PHP의
abstract class와interface의 차이점을 설명해 줘" - 코드 리뷰 (Code review) — 코드를 붙여넣고 구조화된 피드백을 요청
- "왜"라는 질문 던지기 — "PHP에서 왜
==가 아니라===를 사용해야 하나요?" - 면접 준비 — "OOP와 타입 (types)에 관한 중급 PHP 질문 5개를 나에게 물어봐 줘"
장점: 접근성이 좋음, 터미널이 필요 없음, 대화 기록 유지. 한계: 코드를 복사해서 붙여넣어야 하며, composer.json 파일을 볼 수 없음.
Claude Code — 페어 프로그래머 (pair programmer)
터미널 내에서, 당신의 프로젝트에서 직접 실행됩니다. 다음과 같은 작업에 적합한 도구입니다:
- 실제 컨텍스트 내에서의 작업 — Claude가 당신의 파일,
composer.json, PHPUnit 테스트를 직접 확인합니다. - 점진적 리팩터링 (refactoring) — "이 컨트롤러는 300줄입니다. 테스트를 깨뜨리지 않고 서비스 (service)를 추출할 수 있게 도와주세요."
- 도구 사용법 학습 — PHPStan, PHP CS Fixer, PHPUnit, Composer 스크립트 등 — Claude가 이를 설정하고 그 이유를 설명합니다.
- 실시간 디버깅 (debugging) —
php -S를 실행하고, 에러를 확인하며, 스택 트레이스 (stack trace)를 설명합니다.
장점: 전체 프로젝트 컨텍스트 파악, 실제 실행 가능. 한계: 설정이 더 기술적이며, 터미널이 필요함.
이상적인 조합
1~4주 차: 개념 학습 및 검토를 위해 Claude Pro를 사용합니다. 아직 복잡한 프로젝트가 없으므로 웹 인터페이스만으로 충분합니다. 5~8주 차: 프로젝트 진행을 위해 Claude Code를 사용합니다. 파일 컨텍스트, 테스트, 실시간 디버깅이 필요해지는 시점입니다. 이와 병행하여 개념적인 질문을 위해 Claude Pro를 계속 활용하는 것이 유용합니다.
AI가 가르쳐주지 않는 관례 (Conventions)
Claude는 올바른 PHP 코드를 작성합니다. 하지만 올바른 코드와 전문적인 (professional) 코드 사이에는 차이가 있습니다. 이러한 관례는 좋은 오픈 소스 코드 (Symfony, Laravel, PHPStan)를 읽고 교정받으면서 습득하게 됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기