본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP MYDB.php 재사용 — CRUD 전체에 하나의 접속 함수 완전 정리

by 왕진 2026. 7. 9.
반응형

 

 

Web Development · PHP PDO

PHP MYDB.php 재사용 — CRUD 전체에 하나의 접속 함수 완전 정리

INSERT · SELECT · UPDATE · DELETE 모두 동일한 db_connect() 함수 하나로 — 공통 모듈로 분리하는 이유와 동작 원리
시작 오늘 분석할 코드

MYDB.php는 PDO 접속을 함수로 감싼 공통 모듈이다. INSERT를 처리하는 view.php, SELECT+DELETE를 처리하는 list.php, UPDATE를 처리하는 update.php — 어느 파일이든 2줄이면 DB 접속이 완료된다. 접속 정보는 오직 MYDB.php 한 곳에만 존재한다.

// MYDB.php — 공통 DB 접속 함수 <?php function db_connect() { $db_user = "root"; $db_pass = ""; $db_host = "localhost"; $db_name = "sampledb"; $db_type = "mysql"; $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; try { $pdo = new PDO($dsn, $db_user, $db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { die('오류: ' . $e->getMessage()); } return $pdo; } ?>
CRUD 전체에서의 사용 패턴 — 항상 이 2줄
require_once("MYDB.php"); // 함수 정의 로드 (중복 로드 방지) $pdo = db_connect(); // PDO 객체 반환받아 $pdo에 저장 // 이후 INSERT/SELECT/UPDATE/DELETE 어느 쿼리든 $pdo로 처리
실제 구조 미리보기 — MYDB.php 하나가 전체 CRUD를 지탱
MYDB.php
db_connect()
→ PDO 객체 반환
view.php — INSERT (등록)
list.php — DELETE + SELECT
updateform.php — SELECT (조회)
update.php — UPDATE (수정)
접속 정보 변경 → MYDB.php 1곳만 수정하면 4개 파일 모두 자동 반영
용어 핵심 용어 정리
CRUDCreate(INSERT), Read(SELECT), Update(UPDATE), Delete(DELETE) — DB 데이터 조작의 4가지 기본 연산
공통 모듈여러 파일에서 공통으로 필요한 기능을 하나로 분리한 파일 — MYDB.php가 접속 공통 모듈
require_once파일 포함 + 중복 방지. 같은 함수가 두 번 정의되는 오류를 막는 핵심 키워드
db_connect()PDO 접속 로직을 캡슐화한 함수. 호출 시 PDO 객체를 반환해 $pdo 변수에 저장
return $pdo함수 안에서 생성된 PDO 객체를 밖으로 내보내는 유일한 방법
ERRMODE_EXCEPTIONPDO 에러를 예외로 던지도록 설정 — catch 블록에서 에러를 잡을 수 있게 함
EMULATE_PREPARES falsePHP가 아닌 MySQL 드라이버가 직접 prepared statement 처리 — 타입 처리 정확도 향상
die()접속 실패 시 에러 메시지 출력 후 즉시 중단 — 이후 코드가 null $pdo로 연쇄 실패하는 것 방지

1 CRUD 전체를 하나의 접속 함수로 — 무엇이 달라지는가

4개 파일(view, list, updateform, update)은 각기 다른 SQL을 실행하지만, 모두 같은 DB에 접속해야 한다. MYDB.php 이전에는 각 파일 상단에 10줄짜리 접속 코드가 중복되었다. MYDB.php로 분리한 후, 각 파일의 접속 코드는 2줄로 줄어들고 접속 정보는 단 1곳에만 존재한다.

파일 SQL 종류 MYDB.php 사용 방식
view.php INSERT (회원 등록) require_once + db_connect() → $pdo로 INSERT 실행
list.php DELETE + SELECT (삭제 + 목록) require_once + db_connect() → 삭제 후 전체 조회
updateform.php SELECT (수정 폼 데이터 조회) require_once + db_connect() → id로 1건 조회
update.php UPDATE (회원 정보 수정) require_once + db_connect() → id 조건으로 UPDATE

2 function 안의 try-catch — 접속 실패를 왜 함수 안에서 처리하는가

PDO 접속 실패를 외부에서 처리하려면 모든 파일에서 catch 블록을 작성해야 한다. 함수 안에 try-catch를 두면, 접속 오류를 한 곳에서 처리하고 die()로 즉시 중단한다. 파일마다 에러 처리 코드를 반복하지 않아도 된다.

function db_connect() { try { $pdo = new PDO(...); $pdo->setAttribute(...); } catch (PDOException $e) { die('오류: ' . $e->getMessage()); // 접속 실패 → 여기서 즉시 종료, 반환값 없음 } return $pdo; // 접속 성공 시에만 도달 }
⚠ die() 이후에는 return $pdo가 실행되지 않는다. 접속 실패 시 함수가 null을 반환하지 않고 스크립트 자체가 종료된다. 호출부에서 null 체크가 필요 없는 이유다.

3 require_once의 _once — 함수 중복 정의를 막는 원리

list.php가 MYDB.php를 include하고, list.php를 include하는 다른 파일이 있다면 MYDB.php가 두 번 로드될 수 있다. function db_connect()가 두 번 정의되면 PHP는 "Cannot redeclare db_connect()" Fatal Error를 발생시킨다. require_once는 이미 로드된 파일을 두 번 포함하지 않도록 내부적으로 추적한다.

// require (once 없음) — 두 번 포함되면 함수 재정의 에러 require("MYDB.php"); // 첫 번째 로드 — db_connect() 정의됨 require("MYDB.php"); // 두 번째 — "Cannot redeclare db_connect()" 에러! // require_once — 두 번째 포함 시 그냥 무시 require_once("MYDB.php"); // 처음이면 로드, 이미 로드됐으면 무시

 

반응형

 

4 $pdo의 수명 — 함수 스코프 vs 파일 스코프

db_connect() 안의 $pdo는 함수 스코프에 갇혀 있다. return $pdo로 반환된 PDO 객체는 호출한 쪽의 변수에 저장되어, 파일이 끝날 때까지(또는 변수가 null이 될 때까지) 살아있다. 파일 전체에서 하나의 PDO 연결을 공유하므로 DB 커넥션을 1번만 연다.

1
db_connect() 호출함수 스코프 안에서 new PDO() 실행 → $pdo 생성
2
return $pdoPDO 객체가 호출부로 반환됨
3
$pdo = db_connect()반환된 객체가 파일 스코프의 $pdo에 저장
4
$pdo->prepare() / execute() 등 사용파일 어디서든 같은 $pdo로 쿼리 실행
5
PHP 요청 처리 종료$pdo 변수 소멸 → PDO 소멸자가 DB 연결 닫음

5 MYDB.php의 위치 — 경로 설정 주의점

require_once("MYDB.php")의 경로는 실행 파일 기준 상대경로다. list.php와 MYDB.php가 같은 폴더에 있으면 파일명만 써도 된다. 폴더 구조가 복잡해지면 __DIR__ . "/MYDB.php" 형태의 절대경로를 쓰는 것이 안전하다.

경로 방식 예시 특징
파일명만 (상대경로) "MYDB.php" 같은 폴더에 있을 때. 실행 위치 변경 시 깨질 수 있음
__DIR__ 절대경로 __DIR__ . "/MYDB.php" MYDB.php와 같은 폴더. 실행 위치 무관하게 안정적
상위 폴더 "../common/MYDB.php" 여러 폴더에서 공유하는 공통 MYDB.php 위치 지정
※ __DIR__은 현재 파일이 위치한 디렉토리의 절대경로를 반환하는 PHP 매직 상수다. 경로 문제를 근본적으로 해결하는 가장 안전한 방법이다.

6 접속 함수의 확장 — 실제 프로젝트에서의 발전 방향

이 MYDB.php 패턴은 객체지향(OOP)의 시작점이다. 함수 한 개에서 출발해 클래스와 메서드로 발전하는 경로가 자연스럽게 연결된다. 또한 .env 파일로 접속 정보를 분리하거나, 싱글톤 패턴으로 PDO 인스턴스를 재사용하는 방향으로 확장할 수 있다.

현재 패턴 — 함수형
function db_connect() {
  $pdo = new PDO(...);
  return $pdo;
}
$pdo = db_connect(); // 매번 새 연결
발전 방향 — 싱글톤 패턴
class DB {
  private static $pdo = null;
  public static function connect() {
    if (!self::$pdo) self::$pdo = new PDO(...);
    return self::$pdo;
  }
} // 연결 1회만 생성

7 자주 하는 실수
실수 증상 해결
require 대신 include 사용 MYDB.php 없어도 경고만 출력하고 진행 → null $pdo로 연쇄 에러 접속 파일은 require_once — 없으면 즉시 Fatal Error가 더 안전
require 반복 사용 (_once 없음) "Cannot redeclare db_connect()" Fatal Error require_once로 중복 방지
return $pdo 누락 $pdo = db_connect() 결과가 null → prepare() 호출 시 에러 함수 마지막 줄에 return $pdo 필수
경로 오류 (파일명만 사용) 다른 폴더에서 실행 시 "Failed opening required" Fatal Error __DIR__ . "/MYDB.php" 형태로 안전한 절대경로 사용
접속 정보를 MYDB.php 외에도 보관 비번 변경 시 여러 파일 수정 필요 — 분리의 이점 사라짐 접속 정보는 반드시 MYDB.php(또는 .env) 단 1곳에만 존재

핵심 한 줄 요약

MYDB.php의 역할INSERT/SELECT/UPDATE/DELETE 전체가 같은 db_connect() 함수 사용 — 접속 정보 단 1곳
require_once중복 포함 방지 — 함수가 두 번 정의되는 Fatal Error를 막는 _once의 역할
return $pdo함수 스코프 안 $pdo를 밖으로 전달 — 없으면 null이 반환돼 prepare() 에러
try-catch + die()접속 실패를 함수 안에서 처리 — 모든 파일에 에러 처리 코드 반복 불필요
__DIR__ 절대경로실행 위치와 무관하게 MYDB.php를 찾음 — 파일명만 쓰면 폴더 이동 시 깨짐

Tags

#PDO #PHP #MySQL #MYDB #함수재사용 #require_once #CRUD #공통모듈 #db_connect #접속함수 #DRY원칙 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PDO, PHP, MySQL, MYDB, 함수재사용, require_once, CRUD, 공통모듈, db_connect, 접속함수
반응형

댓글