by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

23장. 나쁜 것 안 보기




1. 목표: 코드를 적게 작성하기

적은 코드로 멋진 일을 하고 싶어하다.바보 같은 짓이다.
디버깅을 위한 코드를 꼭 삽입하라 .

2. 안티패턴: 짚 없이 벽돌 만들기

( 오류처리 로직과 같은 중요 요소를 넣지 않는 행위를 이름 )

2.1. 진단 없는 진료

 
<?php
1 -- $pdo = new PDO("mysql:dbname=test;host=db.example.com", //<callout id="co.see.anti1"/>
    "dbuser", "dbpassword");
$sql = "SELECT bug_id, summary, date_reported FROM Bugs
    WHERE assigned_to = ? AND status = ?";
2 -- $stmt = $dbh->prepare($sql);         //<callout id="co.see.anti2"/>
3 -- $stmt->execute(array(1, "OPEN"));    //<callout id="co.see.anti3"/>
4 -- $bug = $stmt->fetch();               //<callout id="co.see.anti4"/>

1. DB 접속에 대한 오류 처리 없음
2. SQL 문장에 대한 오류 처리 없음
3. 2 번 스텝 오류시, 오류 발생 가능
4. 1 번 스텝 오류시, 오류 발생 가능

2.2. 읽기간 행

SQL 만들어 내는 코드를 보지말고, SQL 자체를 보라

 
<?php
$sql  = "SELECT * FROM Bugs";
if ($bug_id) {
    $sql .= "WHERE bug_id = " . intval($bug_id);
}
$stmt = $pdo->prepare($sql);

==>

SELECT * FROM BugsWHERE bug_id = 1234

3. 안티팬턴 인식 방법

  • "데이터베이스를 조회한 다음에 프로그램이 죽어버려"
  • "내 SQL에서 에러 찾는 것을 도와 주겠니? 내 코드는 여기 있어...."
  • "내 코드를 에러 처리로 어지럽히고 싶지 않아."

4. 안티패턴 사용이 합당한 경우

에러에 대해 정말 아무것도 할 것이 없다면 에러 검사를 생략할 수 있다.
close() 함수.... Memory Leak....

4. 해법: 에러에서 우아하게 복구하기

실수의 원인을 인지할 수 있는 기회를 가져야 복구 할 수 있다.

4.1. 리듬 유지하기

에러가 발생할 수 있는 모든 호출에 대해 상태를 확인하는 코드

<?php
try {
    $pdo = new PDO("mysql:dbname=test;host=localhost",
	"dbuser", "dbpassword");
} catch (PDOException $e) {                       //<callout id="co.see.soln1"/>
    report_error($e->getMessage());    return;
}

$sql = "SELECT bug_id, summary, date_reported FROM Bugs
    WHERE assigned_to = ? AND status = ?";
if (($stmt = $pdo->prepare($sql)) === false) {    //<callout id="co.see.soln2"/>
    $error = $pdo->errorInfo();
    report_error($error[2]);
    return;
}

if ($stmt->execute(array(1, "OPEN")) === false) { //<callout id="co.see.soln3"/>
    $error = $stmt->errorInfo();
    report_error($error[2]);
    return;
}

if (($bug = $stmt->fetch()) === false) {          //<callout id="co.see.soln4"/>
    $error = $stmt->errorInfo();
    report_error($error[2]);
    return;
}

4.2. 스텝 되집기

  • API 메서드의 인수에서 SQL 쿼리를 만들지 말고 변수를 사용해서 변수를 만든다.
    이렇게 하면 사용하기 전에 변수 값을 확인할 수 있는 기회가 생긴다.
  • 로그 파일, IDE 디버거 콘솔 또는 디버깅 정보를 보여주는 브라우저 확장기능 등
    애플리케이션 출력이 아닌 다른 곳에 SQL을 출력하도록 한다.
  • SQL 쿼리를 웹 애플리케이션 HTML 주석으로 출력하지 않는다.
    페이지 소스는 어느 사용자든 볼 수 있다.
    해커가 SQL 쿼리를 보면 데이터엡이스 구조에 대한 많은 정보가 노출될 수 있다.

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.