PHP 데이터베이스 연결: 초보자를 위한 PDO 가이드 (MySQL 및 PostgreSQL)
Source: Dev.to
왜 PDO를 선택해야 할까?
PHP에서 데이터베이스에 연결하는 방법은 크게 두 가지가 있습니다: mysqli와 PDO.
현대 PHP 개발에서는 PDO를 강력히 권장합니다. 가장 큰 장점은 PDO가 데이터베이스 추상화 레이어 역할을 한다는 점입니다. 즉, 어떤 데이터베이스를 사용하든 동일한 코드 구조를 사용할 수 있습니다.
- 나중에 MySQL에서 PostgreSQL로 전환하더라도 연결 문자열(DSN)만 약간 바꾸면 됩니다.
mysqli는 MySQL 전용으로 제한됩니다.- PDO를 마스터하면 보다 다재다능하고 미래에도 대비된 개발자가 됩니다.
PDO로 MySQL에 연결하기
기본 연결 스크립트
getMessage();
exit();
}
?>
핵심 개념
- DSN (Data Source Name) – 데이터베이스 정보를 담은 문자열입니다. 보안 문제를 피하려면 항상
charset=utf8mb4를 명시하세요. - try‑catch 블록 – 연결을
try‑catch로 감싸PDOException을 우아하게 처리합니다. - 보안 팁 – 프로덕션 환경에서는
$e->getMessage()를 절대 출력하지 마세요; 민감한 정보가 유출될 수 있습니다.
전문가를 위한 필수 “옵션 설정”
new PDO의 네 번째 인자로 옵션 배열을 전달하여 PDO 동작을 커스터마이징할 수 있습니다.
PDO::ERRMODE_EXCEPTION,
// 기본적으로 연관 배열 형태로 결과 반환
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// 보안을 위해 준비문 에뮬레이션 비활성화
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$dbh = new PDO($dsn, $user, $password, $options);
echo "Connected with optimized settings!";
} catch (PDOException $e) {
error_log($e->getMessage()); // 화면에 표시하지 말고 로그에 기록
}
?>
ATTR_ERRMODE– SQL 오류가 발생하면 예외가 발생하도록 하여 잡을 수 있게 합니다.ATTR_DEFAULT_FETCH_MODE–FETCH_ASSOC는 메모리를 절약하는 깔끔한 연관 배열을 반환합니다.ATTR_EMULATE_PREPARES– 이를false로 설정하면 PDO가 데이터베이스의 네이티브 준비문을 사용하게 되며, 이는 더 안전합니다.
PostgreSQL에 연결하기
코드 구조는 동일하며, DSN 접두사만 바뀝니다.
문제 해결 체크리스트
SQLSTATE[...]와 같은 오류가 발생하면 다음을 확인하세요:
- 자격 증명 – 데이터베이스 이름, 사용자명, 비밀번호에 오타가 없는지 확인합니다.
- 호스트 및 포트 – Docker 컨테이너나 원격 서버의 경우
localhost가 작동하지 않을 수 있습니다. 올바른 포트(MySQL 3306, PostgreSQL 5432)와 커스텀 설정을 확인하세요. - 드라이버 –
php.ini에서 해당 PDO 드라이버(pdo_mysql또는pdo_pgsql)가 활성화되어 있는지 확인합니다.phpinfo()로 확인할 수 있습니다. - localhost vs. 127.0.0.1 – Linux/macOS에서는
localhost가 소켓 연결을 시도합니다.127.0.0.1로 바꾸면 TCP/IP 연결을 강제하게 되어 연결 문제를 해결할 수 있습니다.
결론
PDO는 PHP에서 데이터베이스와 상호작용하기 위한 금본위입니다. DSN 구조를 숙지하고 적절한 예외 처리를 적용하면, 여러 데이터베이스 시스템에서 작동하는 안전하고 이식 가능하며 전문가 수준의 코드를 작성할 수 있습니다.
Originally published at: https://code-izumi.com/php/database-connection/