개발노트
고즐의 개발 및 서버 개발 노트![]()
예전에 개발하거나 만들어 놓은 소스를 보면 mysqli 연결 방식을 사용하고 있었다. 너무 오래된 방식이라 새로운 방식을 사용하는 게 왜 좋은지 알아보려고 한다. 그러나 유지 보수를 하다 보면 기존 소스를 전부다 변경하기 어렵기에 부분적으로 개선하는 방법이 필요하다. 가장 마음에 드는 부분은 보안과 확장성에 있다고 볼 수 있다.
PHP에서 mysqli와 PDO의 차이, 그리고 전환이 필요한 이유
DB 연결 방식 변화가 가져오는 차이
mysqli와 PDO의 구조적 차이
PHP에서 데이터베이스를 연결하는 방법은 크게 mysqli와 PDO 두 가지로 나뉩니다. mysqli는 MySQL 전용이지만 PDO는 다양한 데이터베이스를 지원하며, prepared statement 구조가 더 단단하여 보안적인 이점이 있습니다. 또한 PDO는 예외 기반 에러 처리 방식으로, 현대적인 PHP 개발 환경에 더 잘 맞는 구조를 제공합니다.
보안 관점에서 PDO가 더 우수한 이유
mysqli에서 문자열을 그대로 SQL에 삽입하는 전통적 방식은 SQL Injection 공격에 취약합니다. 반면 PDO는 기본이 prepared statement 기반이며, 파라미터 바인딩을 통해 입력값을 자동으로 안전하게 처리할 수 있습니다. 이 덕분에 코드 유지보수와 확장성이 매우 좋아지는 장점이 있습니다.
전환 부담 없이 부분 적용 가능한 PDO
기존 프로젝트가 mysqli 기반이라도 전면 교체를 할 필요는 없습니다. 새로운 모듈이나 단독 기능 파일부터 PDO로 작성하고, 기존 mysqli 코드는 그대로 유지하면서 점진적으로 확장하면 됩니다. 이 방식은 리스크가 낮으며 실제 실무에서도 많이 채택되는 전략입니다.
기존 mysqli 패턴을 PDO로 쉽게 전환하는 실전 예제
네가 자주 쓰던 반복 패턴 그대로 유지 가능
mysqli 반복 조회 패턴
$q = mysqli_query($connect,"SELECT * FROM tbl_story_admin WHERE ispublic!=1 ORDER BY idx ASC");
while($r = mysqli_fetch_array($q)) {
$key_num[$r["nm"]] = $r["title"];
}
동일 구조의 PDO 반복 패턴
$sql = "SELECT * FROM tbl_story_admin WHERE ispublic != 1 ORDER BY idx ASC";
$stmt = $pdo->query($sql);
$key_num = [];
$in = '';
foreach ($stmt as $r) {
$key_num[$r["nm"]] = $r["title"];
$in .= ($in ? ',' : '') . $r["nm"];
}
이처럼 기존 mysqli 스타일을 유지하면서도 PDO의 장점을 활용할 수 있으며, fetch 모드는 기본을 FETCH_ASSOC로 설정해 두면 배열 구조 또한 동일하게 사용할 수 있습니다.
변수가 포함되는 SELECT 패턴
mysqli에서 직접 문자열 붙이던 방식을 PDO에서는 prepare와 execute를 이용해 안전하게 처리합니다.
$stmt = $pdo->prepare("SELECT * FROM table WHERE nm = :nm");
$stmt->execute([':nm' => $nm]);
$row = $stmt->fetch();
네가 기존에 사용하던 SQL 스타일을 거의 그대로 유지하면서 보안성은 크게 향상됩니다.
INSERT와 UPDATE를 편하게 만드는 PDO 자동화 방식
네가 원하던 ‘set 필드=값’ 방식 그대로 유지 가능
자동 SET 문자열 생성 기반 UPDATE
$data = [
'name' => $name,
'email' => $email
];
$set = [];
foreach ($data as $key => $val) {
$set[] = "$key = :$key";
}
$setString = implode(', ', $set);
$sql = "UPDATE tbl_user SET $setString WHERE id = :id";
$stmt = $pdo->prepare($sql);
$data['id'] = $id;
$stmt->execute($data);
이 방식은 mysqli보다 오히려 유지보수성이 좋아지고, 필드 수가 많을수록 효율성이 커집니다. 실제 실무 개발자들이 가장 선호하는 패턴이기도 합니다.
INSERT 자동화 템플릿
$data = [
'title' => $title,
'contents' => $contents,
'date' => time()
];
$fields = implode(', ', array_keys($data));
$place = ':' . implode(', :', array_keys($data));
$sql = "INSERT INTO tbl_story ($fields) VALUES ($place)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
입력 필드가 많아질수록 이 방식의 진가가 드러납니다. 중복 코드를 크게 줄이고, 가독성과 유지보수성이 모두 올라갑니다.
mysqli에서 PDO로의 실전 전환 전략
전체 교체 대신 ‘부분 전환’이 정답
새 기능부터 PDO로 작성하기
sitemap, rss, API 엔드포인트, 관리자 모듈처럼 독립 파일부터 PDO로 작성하면 기존 코드와 충돌 없이 자연스럽게 전환할 수 있습니다. 이 방식은 프로젝트 리스크가 낮고, 실제 현업에서도 가장 많이 사용하는 전략입니다.
기존 mysqli 코드는 그대로 두기
이미 안정적으로 동작하는 mysqli 기반 페이지는 굳이 변경할 필요가 없습니다. 필요할 때만 업데이트 또는 리팩토링 과정에서 PDO로 변경하는 식으로 ‘단계적 전환’을 적용하면 됩니다.
PDO Wrapper Class를 만들어 전환 부담 줄이기
선언적인 DB 헬퍼 클래스를 하나 만들어 두면, 나중에 내부 엔진을 mysqli에서 PDO로 변경해도 외부 코드 수정 없이 그대로 동작하게 만들 수 있습니다. 이는 유지보수와 확장성을 극대화하는 대표적인 방식입니다.
하이브리드 방식으로 안정적인 병행 운영
mysqli와 PDO는 동시에 사용해도 충돌이 없습니다. 따라서 신규 기능은 PDO, 레거시는 mysqli로 운영하는 하이브리드 구조는 가장 현실적이며 안정적인 전환 전략입니다.
전환 후 느끼는 가장 큰 변화
PDO의 예외처리 구조, 강력한 prepared statement, 그리고 깔끔한 SQL 구성은 기존 mysqli보다 가독성이 크게 향상됩니다. 단순한 전환 작업을 넘어 전체 코드 품질이 올라가는 경험을 하게 될 것입니다.