그동안 별도의 기능이나 페이지를 제작할 때도 그누보드의 SQL 문법과 DB 함수가 너무 익숙해서 거의 습관처럼 사용해왔다.
sql_query("SELECT * FROM g5_member WHERE mb_id = '$mb_id'");짧고, 빠르고, 손에 익은 문법.
개발 속도만 놓고 보면 이만한 게 없었다.
하지만 구조가 커지고, 외부 입력값이 많아질수록
보안적인 리스크(SQL Injection)에 대한 부담이 계속 남았다.
결국 안정적인 운영을 위해 PDO 기반으로 전환하기로 결정했다.
PDO로 바꾸면서 불편해진 점
- 코드가 길어진다
- 매번 prepare → bind → execute 과정을 거쳐야 한다
- 단순 쿼리 하나도 작성량이 늘어난다
$stmt = $pdo->prepare("SELECT * FROM member WHERE mb_id = :mb_id");
$stmt->bindParam(':mb_id', $mb_id);
$stmt->execute();
$row = $stmt->fetch();
솔직히 말하면 “이걸 왜 이렇게까지 써야 하나” 싶은 순간도 많다.

그래도 편리해진 점
하지만 불편함을 감수하고 나니, 확실히 달라진 부분이 있다.
- 입력값이 자동으로 이스케이프됨
- SQL Injection 걱정을 거의 하지 않아도 됨
- 쿼리 구조가 명확해짐
- 공통 DB 레이어 구성 가능
특히 외부 입력값이 많은 관리자 페이지나 API에서는 정신적인 부담이 크게 줄어든 게 가장 컸다.
보안 적용이 가능해졌다
PDO 전환의 핵심은 결국 보안이다.
그누보드 방식 (취약할 수 있음)
$sql = "SELECT * FROM board WHERE wr_id = '{$_GET['wr_id']}'";
$result = sql_query($sql);
PDO 방식 (보안 적용)
$stmt = $pdo->prepare("SELECT * FROM board WHERE wr_id = :wr_id");
$stmt->execute([
':wr_id' => $_GET['wr_id']
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
- SQL과 데이터가 분리됨
- 악의적인 입력값이 쿼리 구조를 깨지 못함
- 필터링/검증 로직을 추가하기도 쉬워짐
이제는 “불편하지만, 그만큼 안전해졌다” 라고 말할 수 있는 상태다.
결론은 익숙함보다 중요한 건 유지보수와 안정성
그누보드 SQL 문법은 여전히 빠르고 강력하다.
하지만 서버 구조가 복잡해지고, 직접 만든 스크립트와 서비스가 늘어날수록
PDO 같은 표준적인 접근 방식이 결국 관리와 보안에서 이점을 준다는 걸 체감하고 있다.
익숙함을 버리는 건 쉽지 않았지만, 장기적으로는 운영자를 편하게 해주는 선택이었다.