ServBay에서 PHP MySQL 확장(mysqlnd, mysqli, PDO) 사용하기
ServBay는 강력한 통합형 로컬 웹 개발 환경으로, PHP 애플리케이션과 데이터베이스 간의 연동을 매우 간단하게 만들어줍니다. ServBay는 모든 지원 PHP 버전에 MySQL 데이터베이스 연결에 필요한 핵심 확장 프로그램인 mysqlnd
, mysqli
, PDO_MySQL
를 사전 설치 및 기본 활성화하여 제공합니다. 따라서 별도의 수동 설정 없이 바로 MySQL이나 MariaDB 데이터베이스를 PHP 프로젝트에서 사용할 수 있습니다.
ServBay에서 지원하는 PHP MySQL 확장
ServBay는 관리 환경 내에 다음의 세 가지 주요 MySQL 확장을 내장하여 호환성과 성능을 보장합니다:
- MySQL Native Driver(
mysqlnd
): PHP의 네이티브 드라이버로,mysqli
와PDO_MySQL
의 기반 라이브러리로 동작합니다. MySQL/MariaDB 서버와의 통신을 위한 기본 레이어를 제공하며, 일반적으로 더 나은 성능과 메모리 관리 기능을 가집니다. - MySQLi(
mysqli
): MySQL Improved Extension으로 MySQL과 MariaDB 데이터베이스 연결에 특화되어 있으며, 객체지향 및 절차적 인터페이스를 모두 지원합니다. 예비 처리문, 트랜잭션, 저장 프로시저, 다중 쿼리 등 고급 기능을 활용할 수 있습니다. - PDO MySQL(
PDO_MySQL
): PHP Data Objects(PDO)의 MySQL 드라이버로, PDO는 다양한 데이터베이스(MySQL, MariaDB, PostgreSQL, SQLite 등)와 일관된 API로 상호작용할 수 있는 추상화 계층을 제공합니다. 이로 인해 코드 이식성이 뛰어납니다.
활성화 상태
ServBay의 모든 PHP 버전에는 mysqlnd
, mysqli
, PDO_MySQL
확장이 기본 활성화되어 있습니다. 별도의 추가 설정이 전혀 필요하지 않습니다. ServBay가 관련 php.ini
설정을 이미 처리하였으므로, 곧바로 코드에서 해당 확장을 사용해 DB에 접속할 수 있습니다.
각 PHP MySQL 확장의 상세 설명
이 세 가지 확장의 차이를 이해하면 프로젝트 요구에 따라 최적의 선택이 가능합니다.
MySQL Native Driver(
mysqlnd
)- 핵심 역할:
mysqlnd
는 C 언어로 작성된 PHP 네이티브 드라이버로서, PHP와 MySQL/MariaDB 데이터베이스 서버 간 통신의 기반 역할을 합니다. - 주요 특징: PHP 5.3 이후부터
mysqlnd
는mysqli
와PDO_MySQL
확장의 기본 라이브러리가 되어 외부 MySQL 클라이언트 라이브러리(libmysqlclient
등) 없이도 바로 사용할 수 있습니다. - 주요 장점: 이전
libmysqlclient
에 비해 더 뛰어난 성능과 효율적인 메모리 관리를 제공하며, 비동기 쿼리, 향상된 지속적 연결, 다양한 플러그인 API 등 고급 기능을 지원합니다. 실제로는 직접적으로mysqlnd
API를 사용할 일이 드물고,mysqli
나PDO
를 통해 간접적으로 이점을 누리게 됩니다.
- 핵심 역할:
MySQLi(
mysqli
)- 핵심 역할: MySQL Improved Extension은 MySQL(4.1.3 이상) 및 MariaDB용으로 설계된 PHP 확장입니다.
- 주요 특징: 객체지향과 절차적 인터페이스 모두 제공, 예비 처리문(SQL 인젝션 예방 가능), 트랜잭션, 저장 프로시저, 다중 쿼리 등 고급 기능 제공.
- 주요 장점: MySQL/MariaDB에 대해 최적화되어 있어 강력하면서도 좋은 성능을 보여줍니다. 프로젝트가 오직 MySQL이나 MariaDB만을 사용할 것이 확실하고 해당 DB 고유의 고급 기능이 필요하다면
mysqli
가 좋은 선택입니다.
PDO MySQL(
PDO_MySQL
)- 핵심 역할: PHP Data Objects(PDO)는 여러 데이터베이스를 일관된 방법으로 다룰 수 있는 경량 추상 계층입니다.
PDO_MySQL
은 PDO의 MySQL/MariaDB용 드라이버입니다. - 주요 특징: 표준화된 API(
PDO
,PDOStatement
클래스 등)로 작업하며, 예비 처리문(prepare()
,execute()
) 사용을 강제하여 SQL 인젝션을 방지하고 트랜잭션 처리도 지원합니다. - 주요 장점: 데이터베이스 이식성이 가장 큰 강점입니다. 앞으로 PostgreSQL, SQLite 등 다른 DB로 전환 가능성이 있거나 유지보수성을 중시하면 PDO가 적합합니다. 코드가 더 깔끔하고 안전하며, 새로운 프로젝트에 가장 추천되는 방식입니다.
- 핵심 역할: PHP Data Objects(PDO)는 여러 데이터베이스를 일관된 방법으로 다룰 수 있는 경량 추상 계층입니다.
PHP 코드 예시: 데이터베이스 연결 및 조작
아래 예제는 ServBay가 관리하는 MySQL 또는 MariaDB 데이터베이스에 (mysqli
와 PDO
각각) 연결하여 기본적인 작업을 수행하는 방법을 보여줍니다.
사전 조건:
- ServBay에서 MySQL 또는 MariaDB 서비스를 실행 중이어야 합니다.
servbay_db
라는 데이터베이스가 생성되어 있어야 합니다.servbay_user
라는 사용자 계정이 있으며, 비밀번호는your_password
, 그리고servbay_db
에 적절한 권한이 부여되어야 합니다.servbay_db
내에users
테이블이 반드시 존재해야 하며,id
(INT, PK, AI),name
(VARCHAR),email
(VARCHAR),age
(INT) 컬럼을 포함해야 합니다.
이러한 설정 작업은 ServBay의 내장 phpMyAdmin 또는 다른 DB 관리 도구로 쉽게 할 수 있습니다.
예제 코드 (mysqli
방식)
php
<?php
// --- mysqli 예제 ---
// 데이터베이스 접속 정보
$servername = "127.0.0.1"; // 또는 'localhost'
$port = 3306; // ServBay의 MySQL/MariaDB 기본 포트
$username = "servbay_user";
$password = "your_password"; // 실제 비밀번호로 변경 필요
$dbname = "servbay_db";
// 객체지향 방식의 mysqli 연결 생성
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// 연결 성공 여부 확인
if ($conn->connect_error) {
die("mysqli Connection failed: " . $conn->connect_error);
}
echo "mysqli Connected successfully<br>";
// 데이터 삽입 (SQL 인젝션 방지를 위한 예비 처리문 이용)
$stmt = $conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$name = "ServBay Demo";
$email = "[email protected]";
$age = 5;
// "ssi"는 string, string, integer 타입을 의미
$stmt->bind_param("ssi", $name, $email, $age);
if ($stmt->execute()) {
echo "mysqli: New record created successfully<br>";
} else {
echo "mysqli Error: " . $stmt->error . "<br>";
}
$stmt->close();
// 데이터 조회
$sql = "SELECT id, name, email, age FROM users WHERE name = 'ServBay Demo'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "mysqli Queried data:<br>";
// 데이터 출력
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "mysqli: 0 results found<br>";
}
// 연결 종료
$conn->close();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
예제 코드 (PDO
방식)
php
<?php
// --- PDO 예제 ---
// 데이터베이스 접속 정보
$host = '127.0.0.1'; // 또는 'localhost'
$port = 3306; // ServBay의 MySQL/MariaDB 기본 포트
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // 실제 비밀번호로 변경 필요
$charset = 'utf8mb4';
// 데이터 소스 이름 (DSN)
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset";
// PDO 연결 옵션
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 경고 대신 예외 발생
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 기본은 연관 배열 형태 반환
PDO::ATTR_EMULATE_PREPARES => false, // 네이티브 예비 처리문 사용
];
try {
// PDO 인스턴스 생성 및 연결
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO Connected successfully<br>";
// 데이터 삽입 (예비 처리문 사용)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Demo';
$email = '[email protected]';
$age = 10;
// 파라미터 바인딩 및 실행
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO: New record created successfully<br>";
// 데이터 조회
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Demo']);
// 결과 모두 가져오기
$users = $stmt->fetchAll(); // 기본은 FETCH_ASSOC
if ($users) {
echo "PDO Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO: 0 results found<br>";
}
} catch (\PDOException $e) {
// 연결 또는 쿼리 오류 처리 및 출력
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// PDO 연결은 스크립트 종료 시 자동으로 닫힙니다. 명시적으로 닫을 필요는 거의 없습니다.
// $pdo = null; // 명시적으로 연결을 끊고 싶을 경우 사용
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
코드 배치 방법: 위의 예시 코드 중 하나를 .php
파일(예: db_test_mysqli.php
또는 db_test_pdo.php
)로 저장한 뒤, ServBay의 웹사이트 루트 디렉토리(예: /Applications/ServBay/www/myproject/
)에 업로드하세요. 그런 다음 브라우저에서 해당 URL(예: http://myproject.servbay.demo/db_test_mysqli.php
)로 접속해 코드 실행 결과를 확인하면 됩니다. 해당 웹사이트가 ServBay에서 정상적으로 구동 중인지 반드시 확인하세요.
자주 묻는 질문(FAQ)
Q: ServBay에서 PHP의 MySQL 확장 모듈을 직접 설치해야 하나요?
A: 아닙니다. ServBay에서는 관리 중인 모든 PHP 버전에 대해 mysqlnd
, mysqli
, PDO_MySQL
세 가지 MySQL 확장 모듈을 사전 설치 및 기본 활성화해두었습니다. 별다른 설치 또는 설정 단계 없이 바로 PHP에서 사용하실 수 있습니다.
Q: mysqli
와 PDO
중 어느 쪽을 선택해야 할까요?
A:
- PDO 사용 추천: 여러 종류의 데이터베이스 연결 필요성이 있거나(예: MySQL/MariaDB 외 기타 RDBMS), 더 현대적이고 객체지향적이며 이식성이 높은 코드를 원한다면 PDO가 최적입니다. 예비 처리문이 강제되어 더 안전한 코드를 작성할 수 있습니다.
- mysqli 고려: 프로젝트가 오직 MySQL/MariaDB만 필요하고, 이들 DB의 특화된 고급 기능을 최대한 활용하고 싶다면
mysqli
도 훌륭한 선택입니다. 객체지향/절차식 두 방식 모두 지원합니다.
신규 프로젝트는 일반적으로 PDO 사용을 권장합니다.
Q: ServBay의 MySQL/MariaDB 서비스에 접속하기 위한 파라미터는 어떻게 확인하나요?
A:
- 호스트명(Host): 보통
127.0.0.1
또는localhost
사용. - 포트(Port): ServBay의 MySQL/MariaDB 서비스는 기본적으로
3306
포트를 사용하지만, 실제 포트 번호는 ServBay 패키지 관리 화면에서 확인 가능. - 사용자 이름/비밀번호: MySQL/MariaDB에서 미리 생성한 DB 사용자 계정의 정보가 필요합니다. 처음이라면 새 계정을 생성하거나(추천), root 계정을 사용할 수도 있지만, production 환경에서는 root 사용을 피하는 것이 좋습니다. ServBay 내장 phpMyAdmin 및 기타 DB 도구로 계정 및 권한 관리가 가능합니다.
- 데이터베이스명: 접속하고자 하는 DB 이름 지정 필요.
Q4: 기존 레거시 프로젝트에서 폐기된 mysql_*
함수 사용 중입니다. ServBay에서 지원하나요?
A: 네. 레거시 코드 유지·마이그레이션의 편의를 위해, ServBay는 PHP 5.6 환경에서 과거 mysql_connect
등 기존 mysql_*
함수 지원을 포함하고 있습니다. 해당 함수들은 PHP 5.5에서 폐기(deprecated), PHP 7.0 이후 삭제되어 있습니다. ServBay의 PHP 5.6 환경을 통해 옛 코드도 무리 없이 실행할 수 있으므로, 예전 PHP 버전을 구하지 않아도 됩니다.
단, 강력히 권장합니다:
- 이 기능은 임시 호환 또는 유지보수 용도로만 사용하세요.
- 새 프로젝트 또는 레거시 코드 리팩토링 시 반드시
mysqli
또는PDO
로 전환하시길 권고합니다.mysql_*
함수는 보안 취약점(SQL 인젝션 등)에 노출되어 있고, 최신 DB 기능 지원이 미흡합니다.
결론
ServBay는 지원하는 모든 PHP 버전에 mysqlnd
, mysqli
, PDO_MySQL
확장을 사전 설치 및 기본 활성화하고, PHP 5.6에서는 레거시 mysql_*
함수 지원까지 제공하여, PHP 개발자의 데이터베이스 연동 작업을 혁신적으로 단순화합니다. 별도의 번거로운 설치나 구성 과정 없이, 프로젝트에 가장 적합한 확장(PDO 또는 mysqli 사용 권장)을 선택해 즉시 ServBay 환경의 MySQL/MariaDB 데이터베이스와 연동할 수 있습니다.
이러한 즉시 사용 가능한 편리함 덕분에, 개발자는 반복적 인프라/환경 설정 대신 비즈니스 로직 개발에 집중할 수 있고, ServBay가 제공하는 안정적이고 고성능의 로컬 환경에서 웹 서비스를 빠르게 구축, 테스트, 유지보수가 가능합니다.