이번에는 PHP의 PDO(Database Object)를 사용하여 데이터베이스 작업을 수행할 때 발생하는 예외를 처리하는 클래스를 만들어보겠습니다. PDO를 사용할 때 예외 처리를 적절하게 해주지 않으면 오류가 발생했을 때 어떤 일이 일어날지 예측하기 어려울 수 있기 때문에 이를 방지하기 위해 예외 처리를 잘 해주어야 합니다.
PDO 예외 처리 설정
우선, PDO 객체를 생성하고 예외 처리 모드를 설정해야 합니다. 다음은 데이터베이스에 연결하고 PDO 예외 처리 모드를 설정하는 코드입니다.
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
위 코드에서 setAttribute
함수를 사용하여 PDO 객체의 예외 처리 모드를 ERRMODE_EXCEPTION
으로 설정하고, try-catch
블록을 사용하여 PDO 객체 생성 과정에서 발생하는 예외를 처리합니다.
PDO 예외 처리 클래스
이제 위에서 설정한 PDO 예외 처리를 좀 더 추상화하여 각각의 데이터베이스 작업에 대한 예외 처리를 더욱 효율적으로 관리할 수 있는 예외 처리 클래스를 만들어봅시다.
class PDOWrapper {
private $pdo;
public function __construct($dsn, $username, $password) {
try {
$this->pdo = new PDO($dsn, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
public function query($sql) {
try {
return $this->pdo->query($sql);
} catch (PDOException $e) {
echo "Query failed: " . $e->getMessage();
}
}
public function prepare($sql) {
try {
return $this->pdo->prepare($sql);
} catch (PDOException $e) {
echo "Prepare failed: " . $e->getMessage();
}
}
// 다른 PDO 메소드들에 대해 예외 처리 추가
}
위 코드에서는 PDOWrapper
클래스를 생성하고, 생성자에서 PDO 객체를 생성하고 예외 처리 모드를 설정합니다. 또한, query
와 prepare
메소드에서 각각의 PDO 메소드 호출 시 발생하는 예외를 처리하도록 합니다.
예외 처리 클래스 사용 예시
이제 이 예외 처리 클래스를 사용하여 데이터베이스 작업을 수행하는 예시 코드를 살펴보겠습니다.
$pdoWrapper = new PDOWrapper('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $pdoWrapper->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindParam(':id', $id);
$stmt->execute();
위 코드에서는 PDOWrapper
클래스를 사용하여 PDO 객체를 생성하고, prepare
메소드를 통해 SQL 쿼리를 실행합니다. 이때 발생하는 예외는 PDOWrapper
클래스에서 처리되므로 예외를 적절히 처리할 수 있습니다.
이렇게 PDO 예외 처리 클래스를 만들어 사용하면 데이터베이스 작업을 보다 안정적으로 수행할 수 있습니다.
마무리
이렇게 PHP의 PDO를 사용하여 데이터베이스 작업을 수행할 때 발생하는 예외를 효율적으로 처리할 수 있는 예외 처리 클래스에 대해 알아보았습니다. 이를 통해 데이터베이스 작업을 보다 안정적으로 수행하고, 발생할 수 있는 예외에 대비할 수 있습니다.