관리 메뉴

나만을 위한 블로그

[PHP] PDO란? 본문

PHP

[PHP] PDO란?

참깨빵위에참깨빵 2021. 5. 3. 01:03
728x90
반응형

PHP에서 MySQL DB에 접근할 때 사용하는 3가지 방법이 있다.

  1. mysql_connect()
  2. mysqli_connect()
  3. PDO

1번 메서드는 공식 홈페이지 기준 PHP 5.5.0에서 사용되지 않게 되었고 7.0에서 삭제되었다. PHP 7.0이 2015년 12월에 공개됐으니 쓰이지 않게 된지는 제법 오래 됐다.

내가 PHP를 공부했을 때도 mysqli_connect()를 써서 데이터베이스에 접근하는 예제가 많았고, mysql_connect()는 쓰지 말라고 하는 포스팅들을 많이 봤다.

그런데 3번째 단어가 매우 생소하다. 뭔가의 약어같다. 이것에 대해 검색하면 나오는 정의는 아래와 같다.

opentutorials.org/module/6/5155

 

PDO - PHP

데이터베이스란? 데이터의 저장, 조회, 수정을 편리하고 안전하게 할 수 있도록 고안된 소프트웨어다. MySQL이란? 데이터베이스라는 분류의 제품군에 속한 구체적인 상품으로 ORACLE에 의해서 개발

opentutorials.org

PDO란 여러 데이터베이스를 제어하는 방법을 표준화시킨 것이다. DB는 다양한 종류가 있다. 그리고 종류에 따라 다른 드라이브를 써 왔는데, 드라이브 종류에 따라 DB를 제어하기 위한 API가 달랐다. PDO를 쓰면 같은 방법으로 DB를 제어할 수 있다.

여러 데이터베이스를 제어하는 방법을 표준화시킨 것이라고 한다.

위 문장들만 놓고 보면 데이터베이스들은 각각 접근 방법이 다른데, PDO를 쓰면 하나의 메서드 또는 어떤 방법을 통해 다양한 데이터베이스에 접근해 데이터를 다룰 수 있다는 뜻으로도 생각해볼 수 있다.

PHP 공식 홈페이지에선 PDO 소개를 아래와 같이 하고 있다.

www.php.net/manual/en/intro.pdo.php

PDO(PHP Data Objects) 확장은 PHP에서 데이터베이스에 액세스하기 위한 가볍고 일관된 인터페이스를 정의한다. PDO 인터페이스를 구현하는 각 데이터베이스 드라이버는 데이터베이스 특정 기능을 일반 확장 기능으로 노출할 수 있다. PDO 확장을 단독으로 사용해서 데이터베이스 기능을 수행할 수 없다.
PDO는 데이터 액세스 추상화 계층을 제공한다. 즉, 사용 중인 데이터베이스에 상관없이 동일한 기능을 써서 쿼리를 사용하고 데이터를 가져온다. PDO는 데이터베이스 추상화를 제공하지 않는다...(중략)...PDO는 PHP와 함께 제공된다.

위에서 생각한 내용과 어느 정도 비슷한 말이 쓰여진 걸 볼 수 있다.

근데 이 PDO는 왜 나온 걸까? PHP 개발자들이 아무 생각 없이 만든 것은 아닐 것이다. PDO가 사용되는 이유를 검색해봤다.

www.w3schools.com/php/php_mysql_connect.asp

 

PHP MySQL Connect to database

PHP Connect to MySQL PHP 5 and later can work with a MySQL database using: MySQLi extension (the "i" stands for improved) PDO (PHP Data Objects) Earlier versions of PHP used the MySQL extension. However, this extension was deprecated in 2012. Should I Use

www.w3schools.com

- MySQLi 또는 PDO 중 뭘 사용해야 하는가?
아무거나 써라. MySQLi와 PDO는 각각 이점이 있다. PDO는 12개의 다른 데이터베이스에서 작동하지만 MySQLi는 MySQL DB에서만 작동한다. 따라서 다른 데이터베이스를 쓰도록 프로젝트를 전환해야 하는 경우, PDO를 쓰면 프로세스가 쉬워진다. 연결 문자열과 쿼리 몇 개만 바꾸면 된다. MySQLi를 쓰면 쿼리가 포함된 전체 코드를 다시 작성해야 한다. 둘 다 객체지향적이지만 MySQLi는 절차적 API도 제공한다. 둘 다 Prepared Statements를 지원한다.
Prepared Statements는 SQL 삽입으로부터 보호하며 웹 애플리케이션 보안에 매우 중요하다.

MySQLi는 MySQL 데이터베이스에서만 작동하지만 PDO를 쓰면 여러 관계형 데이터베이스를 비슷한 방식으로 접근할 수 있기 때문에 쓰는 것 같다.

 

그럼 PDO는 어떻게 쓰는 걸까? 디비 커넥션은 mysqli_connect를 사용할 경우 아래와 같이 할 수 있다.

아래 코드들은 xampp를 실행한 다음 사용했다.

<?php

$serverName = "localhost";
$username = "root";
$password = "";

$conn = mysqli_connect($serverName, $username, $password);

if (!$conn)
{
    die("연결 실패 : " . mysqli_connect_error());
}
else
{
    echo "연결 성공";
}

위 코드를 실행할 경우 웹 페이지 좌상단에 '연결 성공'이라는 문구가 출력된다.

이 코드를 PDO 형식으로 바꾼다면 아래와 같이 바꿀 수 있다.

아래 코드를 실행하기 전에 데이터베이스에 test란 이름의 데이터베이스를 미리 만들어둬야 한다. 쓰지 않는 데이터베이스가 있다면 그걸 써도 좋다.

<?php

$serverName = "localhost";
$username = "root";
$password = "";

try
{
    $conn = new PDO("mysql:host=$serverName;dbname=test", $username, $password);
    // PDO 오류 모드를 예외로 설정한다
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "PDO 연결 성공";
}
catch(PDOException $e)
{
    echo "PDO 연결 실패" . $e->getMessage();
}

PDO로 데이터베이스에 접근하는 데 성공했다. 이제 $conn을 통해 DB 작업을 수행할 수 있을 것이다.

 

 

그런데 위에서 Prepared Statements라는 말이 나왔었다. 이건 무슨 말일까? 직역하면 '준비된 진술'이라는 뜻이다.

이것에 대해 검색하면 아래와 같은 내용을 볼 수 있다.

www.w3schools.com/php/php_mysql_prepared_statements.asp

 

PHP MySQL Prepared Statements

PHP MySQL Prepared Statements Prepared statements are very useful against SQL injections. Prepared Statements and Bound Parameters A prepared statement is a feature used to execute the same (or similar) SQL statements repeatedly with high efficiency. Prepa

www.w3schools.com

준비된 문(Prepared Statements)은 동일한(또는 유사한) SQL 문을 높은 효율성으로 반복 실행하는 데 사용되는 기능이다. 준비된 문은 기본적으로 아래와 같이 작동한다.
1. Prepare(준비) : SQL문 템플릿이 완성돼 데이터베이스로 전송된다. 매개변수라 하는 특정 값은 지정되지 않은 상태로 남는다("?" 레이블이 지정됨). 예를 들어 INSERT INTO table VALUES(?, ?, ?) 형태로 사용한다.
2. DB는 SQL문 템플릿에서 쿼리 최적화를 파싱, 컴파일 및 수행하며 결과를 실행하지 않고 저장한다.
3. Execute(실행) : 나중에 응용 프로그램은 값을 매개변수에 바인딩하고 DB는 명령문을 수행한다. 응용 프로그램은 다른 값으로 원하는 만큼 문(Statements)을 실행할 수 있다.

SQL 문을 효율 좋게 반복 실행하는 데 쓰이는 기능이 Prepared Statements라는 것 같다. 거꾸로 말하면 쿼리문을 한 번만 쓰거나 동적 SQL문을 사용하는 경우에는 사용을 자제해야 할 것 같다.

그런데 이게 무슨 장점이 있는 걸까? 위 링크의 저 부분 밑을 보면 이점이라고 쓴 내용들이 나온다.

1. 준비된 명령문은 쿼리에 대한 준비가 한 번만 수행되므로 구문 분석 시간이 줄어든다.(Statements가 여러 번 실행되더라도)
2. 바인딩된 매개변수는 전체 쿼리가 아닌 매번 매개변수만 보내야 하므로 서버의 대역폭을 최소화한다.
3. 준비된 명령문은 나중에 다른 프로토콜을 사용해 전송되는 매개변수 값을 올바르게 이스케이프할 필요가 없기 때문에, SQL 삽입에 대해 매우 유용하다. 원본 Statements 템플릿이 외부 입력에서 파생되지 않은 경우 SQL 주입이 발생할 수 없다.

SQL 주입에 대해선 다음에 포스팅하겠다.

 

결론

  • PDO는 사용 중인 데이터베이스에 상관없이 같은 기능을 써서 쿼리를 통해 데이터를 가져온다.
  • PDO는 PHP와 같이 사용된다.
  • Prepared Statements는 매개변수가 없는 SQL문으로, SQL 주입을 방어할 수 있다.
 
반응형
Comments