PHP

PHP

    ›데이터베이스

    시작하기

    • PHP 무료 강좌
    • PHP란 무엇인가요?
    • PHP 시작하기

    개발 환경 설정

    • 코드 에디터 준비하기
    • 윈도우(Windows) 환경에 APM 설치하기
    • macOS 환경에 APM 설치하기
    • 리눅스(Linux) 환경에 APM 설치하기
    • APM 환경 테스트 및 첫 코드 실행

    PHP 기초 문법

    • PHP는 어떻게 동작할까?
    • 기초 문법 - 태그, 마침표, 그리고 주석
    • 변수와 데이터 타입 - 프로그래밍의 기본기
    • 배열과 객체, 그리고 NULL
    • 변수와 함수의 이름 짓기 - 식별자(Identifier)
    • 절대 변하지 않는 값 - 상수(Constants)와 열거형(Enum)
    • 데이터를 요리하는 도구 - 연산자(Operators)
    • 연산자 우선순위 - 괄호의 마법
    • 흐름을 제어하는 마법 - 조건문 (if, match)
    • 흐름을 제어하는 마법 - 반복문
    • 재사용의 미학 - 함수(Function)
    • 변수의 생존 범위(Scope)와 수명
    • 흐름을 제어하는 마법 - 파일 포함과 예외 처리
    • 실무에서 숨 쉬듯 쓰이는 문자열과 배열 함수
    • 문자열을 다루는 마법의 주문 - 정규표현식(Regex)
    • 에러를 두려워하지 마라 - 디버깅과 에러 처리

    웹 개발 기초

    • 절대 믿지 마라! - 미리 정의된 변수와 외부 입력 처리
    • 사용자와 소통하는 창구 - HTML 폼(Form) 다루기
    • 나를 기억해 줘! - 쿠키(Cookie)와 세션(Session)
    • 서버의 기록 보관소 - 파일 입출력(File I/O)

    데이터베이스

    • 데이터베이스(DB)와 SQL 기초 - 데이터의 든든한 금고
    • 데이터베이스와의 안전한 대화 - PDO 기초

    실전 프로젝트

    • 첫 번째 실전 프로젝트 - 방명록(Guestbook) 만들기
    • 실전 프로젝트 2단계 - 기본 게시판(CRUD) 만들기
    • 실전 프로젝트 3단계 - 계층형(답변형) 게시판 만들기
    • 실전 프로젝트 4단계 - 게시판 레벨업 (댓글, 보안, 성능)
    • 실전 프로젝트 5단계 - 안전한 회원가입과 로그인 시스템

    데이터베이스(DB)와 SQL 기초 - 데이터의 든든한 금고

    지금까지 PHP로 프로그래밍의 논리를 짜는 법을 배웠다면, 이제는 그 결과물인 데이터를 안전하고 효율적으로 보관하는 창고에 대해 배울 차례입니다.

    1. 굳이 데이터베이스가 필요한가요?

    "방문자 수나 회원 정보를 그냥 메모장(텍스트 파일)에 저장하면 안 되나요?" 초보자분들이 흔히 하는 질문입니다. 물론 가능합니다. 하지만 데이터가 10만 건으로 늘어난 상황에서 "지난달에 가입한 30대 여성 회원 중, 서울에 사는 사람만 이름순으로 정렬해서 보여줘"라는 요청을 텍스트 파일로 처리하려면 코드가 끔찍하게 복잡해지고 속도도 감당할 수 없게 됩니다.

    데이터베이스(DB)는 이런 엄청나게 복잡한 검색, 정렬, 필터링을 단 한 줄의 명령어(SQL)로 0.01초 만에 해결해 주는 기적의 도구입니다.


    2. 관계형 데이터베이스와 MySQL

    웹 개발 생태계에서 가장 압도적으로 많이 쓰이는 데이터베이스는 MySQL(또는 완벽히 호환되는 MariaDB)입니다.

    이런 류의 데이터베이스를 '관계형 데이터베이스(RDBMS)'라고 부르는데, 말이 좀 어렵지만 엑셀(Excel) 스프레드시트를 떠올리면 아주 정확합니다.

    • 데이터를 표(Table) 형태로 저장합니다.
    • 가로줄(Row)은 회원 한 명, 글 한 편 같은 하나의 완전한 데이터를 뜻합니다.
    • 세로줄(Column)은 이름, 나이, 이메일 같은 데이터의 속성을 뜻합니다.

    3. 데이터를 담는 그릇의 종류 (Data Types)

    테이블을 만들 때는 각 세로줄(Column)에 어떤 종류의 데이터가 들어갈지 미리 깐깐하게 정해두어야 합니다.

    타입설명예시
    INT일반적인 정수 (약 21억까지 저장 가능)42, -7
    BIGINT엄청나게 큰 정수 (요즘은 id 값으로 많이 씁니다)9999999999
    VARCHAR(n)가변 길이 문자열. 최대 n자까지만 들어가는 짧은 글'홍길동'
    TEXT글자 수 제한이 넉넉한 아주 긴 글 (게시판 본문 등)—
    DATETIME날짜와 시간'2026-04-19 14:30:00'
    TINYINT(1)참(1)과 거짓(0)을 표현할 때 쓰는 아주 작은 숫자1 또는 0
    DECIMAL(10,2)소수점 계산이 틀리면 안 되는 돈(금액) 계산용12345.67

    4. 테이블 만들기 (CREATE TABLE)

    자, 회원 정보를 저장할 users 테이블을 만들어 봅시다.

    CREATE TABLE users (
        id         INT UNSIGNED   NOT NULL AUTO_INCREMENT,
        name       VARCHAR(50)    NOT NULL,
        email      VARCHAR(100)   NOT NULL UNIQUE,
        age        TINYINT UNSIGNED NULL,
        created_at DATETIME       NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    [주문 해석]

    • AUTO_INCREMENT: 우리가 번호를 안 매겨도 데이터가 추가될 때마다 알아서 1, 2, 3... 번호를 따줍니다.
    • NOT NULL: 이 칸은 절대 비워둘 수 없다는 강력한 제약입니다. (반대는 NULL)
    • UNIQUE: 똑같은 이메일이 두 번 가입하지 못하게 중복을 완벽히 차단합니다.
    • DEFAULT CURRENT_TIMESTAMP: 글을 쓸 때 시간을 안 넣어도 DB가 알아서 현재 시간을 찍어줍니다.
    • PRIMARY KEY: 이 테이블에서 각 회원을 유일하게 구분할 수 있는 절대적인 기준(주민번호 같은 역할)을 id로 하겠다는 뜻입니다.

    5. SQL의 꽃: CRUD 데이터 조작하기

    데이터베이스에 내리는 명령어를 SQL(Structured Query Language)이라고 부릅니다. 핵심은 4가지뿐입니다.

    ① INSERT (데이터 넣기)

    -- 기본 문법
    INSERT INTO users (name, email, age) 
    VALUES ('홍길동', 'hong@example.com', 30);
    
    -- 한 번에 여러 명 넣기도 가능합니다.
    INSERT INTO users (name, email, age) VALUES 
    ('김철수', 'kim@example.com', 25),
    ('이영희', 'lee@example.com', 28);
    

    ② SELECT (데이터 꺼내 보기)

    -- 모든 회원의 모든 정보를 가져와라 (* 는 전부 다라는 뜻)
    SELECT * FROM users;
    
    -- 보안을 위해 이름과 이메일만 골라서 가져와라
    SELECT name, email FROM users;
    
    -- 28살 이상인 회원만 나이 역순(내림차순)으로 정렬해서 가져와라
    SELECT * FROM users WHERE age >= 28 ORDER BY age DESC;
    
    -- 페이징: 최신순으로 정렬한 뒤, 10개는 건너뛰고(OFFSET) 그 다음 10개만 가져와라
    SELECT * FROM users ORDER BY id DESC LIMIT 10 OFFSET 10;
    

    [다양한 WHERE 조건식]

    SELECT * FROM users WHERE name = '홍길동';      -- 일치 (대입이 아니라 비교입니다!)
    SELECT * FROM users WHERE age != 30;            -- 다름
    SELECT * FROM users WHERE age BETWEEN 25 AND 35; -- 범위 (25 이상 35 이하)
    SELECT * FROM users WHERE age IN (25, 28, 30);  -- 목록 포함
    SELECT * FROM users WHERE email LIKE '%@gmail.com'; -- 패턴 검색 (gmail.com으로 끝나는 사람)
    

    ③ UPDATE (데이터 수정하기)

    -- 1번 회원의 나이를 31살로, 이름을 홍길동으로 바꿔라
    UPDATE users SET name = '홍길동', age = 31 WHERE id = 1;
    

    🚨 선배의 피눈물 나는 경고!
    UPDATE 문을 쓸 때는 손을 바들바들 떨면서 WHERE 조건이 제대로 들어갔는지 세 번 확인하세요. WHERE id = 1을 빼먹고 그냥 엔터를 치는 순간, DB에 있는 수백만 명의 회원이 전부 31살 홍길동으로 변해버리는 대참사가 일어납니다.

    ④ DELETE (데이터 지우기)

    -- 1번 회원을 지워라
    DELETE FROM users WHERE id = 1;
    

    이것 역시 WHERE를 빼먹으면 회원 테이블이 깔끔하게 멸망합니다. 항상 조심하세요.


    6. 통계 내기 (집계 함수)

    "우리 사이트 회원이 총 몇 명이지? 평균 나이는?" 이런 것도 엑셀처럼 단숨에 뽑아낼 수 있습니다.

    -- 전체 회원 수
    SELECT COUNT(*) FROM users;
    
    -- 나이 합계, 평균, 최솟값, 최댓값
    SELECT SUM(age), AVG(age), MIN(age), MAX(age) FROM users;
    
    -- 나이대별로 몇 명이 있는지 그룹으로 묶어서 보여주기
    SELECT age, COUNT(*) AS cnt FROM users GROUP BY age ORDER BY age;
    

    7. 테이블 합치기 (JOIN)

    게시판 글(posts) 테이블에는 보통 '누가 썼는지' 회원 번호(user_id)만 달랑 저장해 둡니다. 화면에 글을 뿌려줄 때 그 번호를 가지고 회원(users) 테이블을 뒤져서 '회원 이름'을 매칭해 가져오는 기술이 바로 조인(JOIN)입니다.

    -- 글(posts)을 가져오면서, 그 글의 user_id와 회원(users)의 id가 같은 사람의 이름(name)을 합쳐서 가져와라!
    SELECT posts.title, users.name
    FROM posts
    INNER JOIN users ON posts.user_id = users.id;
    

    8. 검색 속도를 올려주는 마법: 인덱스(Index)

    두꺼운 전공서적에서 원하는 단어를 찾을 때, 맨 앞장부터 한 장씩 넘겨가며 찾는 사람은 없습니다. 책 맨 뒤에 있는 '찾아보기(색인)'를 보죠. 데이터베이스의 인덱스(Index)가 바로 이 '찾아보기'입니다.

    게시판에서 글쓴이의 이메일로 검색을 자주 한다면, 이메일 칼럼에 인덱스를 걸어줍니다. 검색 속도가 수백 배 빨라집니다.

    ALTER TABLE users ADD INDEX idx_email (email);
    

    주의사항: 인덱스는 검색(SELECT) 속도를 미친 듯이 올려주지만, 글을 쓰거나 수정(INSERT, UPDATE)할 때마다 색인 책자도 같이 업데이트해야 하므로 쓰기 속도는 약간 느려집니다. 그래서 검색에 자주 쓰이는 핵심 칼럼에만 골라서 인덱스를 걸어주는 튜닝 감각이 필요합니다.


    마치며
    오늘 배운 SQL 문법들이 낯설게 보이겠지만, 쫄지 마세요! 결국 현업에서 90% 이상 쓰는 건 방금 배운 SELECT, INSERT, UPDATE, DELETE 네 가지 패턴의 무한 반복일 뿐입니다. 다음 시간부터는 이렇게 훌륭하게 세팅된 데이터베이스를 우리가 짠 PHP 코드와 어떻게 연결해서 조종하는지 알아보겠습니다.

    Last updated on 2026-4-19 by Myeongjin Cho
    ← 서버의 기록 보관소 - 파일 입출력(File I/O)데이터베이스와의 안전한 대화 - PDO 기초 →
    • 1. 굳이 데이터베이스가 필요한가요?
    • 2. 관계형 데이터베이스와 MySQL
    • 3. 데이터를 담는 그릇의 종류 (Data Types)
    • 4. 테이블 만들기 (CREATE TABLE)
    • 5. SQL의 꽃: CRUD 데이터 조작하기
      • ① INSERT (데이터 넣기)
      • ② SELECT (데이터 꺼내 보기)
      • ③ UPDATE (데이터 수정하기)
      • ④ DELETE (데이터 지우기)
    • 6. 통계 내기 (집계 함수)
    • 7. 테이블 합치기 (JOIN)
    • 8. 검색 속도를 올려주는 마법: 인덱스(Index)
    커뮤니티
    PHP 공식 웹사이트한국 PHP 개발자 커뮤니티
    유용한 정보
    책 소스 코드
    Copyright © 2026 EZPHP.NET