2025. 7. 20. 18:34ㆍ프로그램/PHP 중급
📚 PHP 중급 - 3주차: 게시판 CRUD 구현 (기본) - 01 게시판 테이블 설계

안녕하세요! #PHP 중급 과정 3주차, #게시판 #CRUD 구현의 첫 번째 시간입니다. 지난 시간에는 #회원가입 및 #로그인 시스템을 통해 #사용자 #인증과 #세션 #관리의 기초를 다졌습니다. 이제는 #사용자들이 자유롭게 #게시물을 작성하고 조회하며 소통할 수 있는 #게시판 기능을 만들어 볼 차례입니다.
이번 포스팅에서는 #게시판 #구현의 첫걸음이자 가장 중요한 단계인 #데이터베이스 #테이블 #설계에 대해 상세히 다룰 것입니다. #효율적이고 #안정적인 #게시판을 만들기 위한 #테이블 #구조와 각 #컬럼의 역할, 그리고 #데이터 #타입 선정 기준까지, #실제 #코드와 함께 자세히 설명해 드릴게요.
1. 게시판 기능 분석 및 요구사항 정의

#게시판 #테이블을 #설계하기 전에, 우리가 만들 #게시판이 어떤 기능을 제공해야 할지 명확히 정의하는 것이 중요합니다. 기본적인 #게시판은 다음과 같은 기능을 가집니다.
- #게시물 #작성 (Create): #사용자가 #제목, #내용, #작성자 등을 입력하여 새로운 #게시물을 생성합니다.
- #게시물 #조회 (Read): #사용자가 작성된 #게시물 목록을 확인하고, 특정 #게시물의 #상세 #내용을 볼 수 있습니다. #조회수 증가 기능도 필요합니다.
- #게시물 #수정 (Update): #작성자 본인만 자신의 #게시물을 수정할 수 있습니다.
- #게시물 #삭제 (Delete): #작성자 본인 또는 #관리자만 #게시물을 삭제할 수 있습니다.
- #댓글 (선택 사항): #게시물에 대한 #댓글을 작성하고 조회할 수 있습니다 (이번 기본 과정에서는 다루지 않습니다).
- #파일 #첨부 (선택 사항): #게시물에 #파일을 첨부할 수 있습니다.
이러한 #요구사항을 바탕으로 #게시물을 저장할 #테이블의 #구조를 구상해 볼 수 있습니다.
2. 게시판 테이블 설계 (posts 테이블)

#게시판 #데이터를 저장할 #테이블의 이름은 posts (게시물들)라고 가정하겠습니다. 이 #테이블에는 각 #게시물에 대한 고유한 정보가 저장됩니다.
CREATE TABLE posts (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT(11) NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
views INT(11) DEFAULT 0,
-- FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
-- 위 주석은 user_id가 users 테이블의 id를 참조하는 외래키임을 나타냅니다.
-- 실제 사용 시, users 테이블이 먼저 존재해야 합니다.
);
각 컬럼에 대한 설명
- id (INT, NOT NULL, AUTO_INCREMENT, PRIMARY KEY)
- #게시물마다 부여되는 고유한 번호입니다.
- INT: 정수형으로, #게시물 번호를 저장합니다.
- NOT NULL: 비어 있을 수 없습니다.
- AUTO_INCREMENT: 새로운 #게시물이 추가될 때마다 자동으로 1씩 증가합니다.
- PRIMARY KEY: #테이블 내에서 각 #게시물을 고유하게 식별하는 기본 키입니다.
- user_id (INT, NOT NULL)
- 이 #게시물을 작성한 #사용자의 고유 #ID를 저장합니다.
- users #테이블의 id #컬럼과 연결되는 #외래 키(Foreign Key) 역할을 합니다. 이를 통해 어떤 #사용자가 어떤 #게시물을 작성했는지 파악할 수 있습니다.
- NOT NULL: #게시물은 반드시 #작성자가 있어야 합니다.
- title (VARCHAR(255), NOT NULL)
- #게시물의 #제목을 저장합니다.
- VARCHAR(255): 가변 길이 문자열로 최대 255자까지 저장할 수 있습니다. #제목은 일반적으로 짧으므로 충분한 길이입니다.
- NOT NULL: #제목은 반드시 입력해야 합니다.
- content (TEXT, NOT NULL)
- #게시물의 #본문 #내용을 저장합니다.
- TEXT: 긴 텍스트를 저장하는 데 사용되는 #데이터 #타입입니다. VARCHAR보다 훨씬 긴 텍스트를 저장할 수 있습니다.
- NOT NULL: #내용은 반드시 입력해야 합니다.
- created_at (DATETIME, DEFAULT CURRENT_TIMESTAMP)
- #게시물이 #작성된 날짜와 시간을 저장합니다.
- DATETIME: 날짜와 시간을 YYYY-MM-DD HH:MM:SS 형식으로 저장합니다.
- DEFAULT CURRENT_TIMESTAMP: #게시물이 삽입될 때 자동으로 현재 시간이 저장됩니다.
- updated_at (DATETIME, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
- #게시물이 #마지막으로 #수정된 날짜와 시간을 저장합니다.
- DATETIME: 날짜와 시간을 저장합니다.
- DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP: #게시물이 삽션될 때는 현재 시간이 저장되고, 이후 #게시물이 #업데이트될 때마다 자동으로 현재 시간으로 갱신됩니다.
- views (INT, DEFAULT 0)
- #게시물의 #조회수를 저장합니다.
- INT: 정수형으로, #조회수를 저장합니다.
- DEFAULT 0: 새로운 #게시물이 작성되면 #조회수는 기본적으로 0으로 시작합니다.
3. users 테이블과의 관계 (외래키 설정)

우리가 지난주에 구현했던 #회원가입 시스템의 users #테이블과 posts #테이블은 user_id #컬럼을 통해 연결됩니다. 이는 #관계형 #데이터베이스의 핵심 개념입니다.
user_id #컬럼을 users #테이블의 id #컬럼과 #외래 키로 연결하면 다음과 같은 이점이 있습니다.
- #데이터 #무결성 유지: posts #테이블의 user_id는 반드시 users #테이블에 존재하는 id여야 합니다. (참조 무결성)
- #데이터 #연결성: 특정 #사용자가 작성한 모든 #게시물을 쉽게 조회할 수 있습니다. (예: SELECT * FROM posts WHERE user_id = [사용자_ID];)
posts #테이블 생성 시 FOREIGN KEY 제약 조건을 추가하는 것은 다음과 같습니다. (users #테이블이 먼저 생성되어 있어야 합니다.)
CREATE TABLE posts (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT(11) NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
views INT(11) DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
-- user_id가 users 테이블의 id를 참조하며, users 테이블의 해당 사용자가 삭제되면
-- 이 사용자가 작성한 게시물도 함께 삭제되도록 설정 (CASCADE)
-- ON DELETE RESTRICT (기본값): 참조하는 레코드가 있으면 삭제 불가
-- ON DELETE SET NULL: 참조하는 레코드가 삭제되면 user_id를 NULL로 설정 (user_id가 NULL 허용해야 함)
);
ON DELETE CASCADE는 #사용자 #계정이 삭제될 때 해당 #사용자가 작성한 모든 #게시물도 자동으로 삭제되도록 설정하는 강력한 옵션입니다. 상황에 따라 ON DELETE RESTRICT (참조 무결성 위배 시 삭제 불가) 또는 ON DELETE SET NULL (참조 레코드 삭제 시 user_id를 NULL로) 등을 사용할 수 있습니다.
결론
이번 포스팅에서는 #PHP #게시판 #CRUD 구현을 위한 첫 단계로 posts #테이블을 #설계하는 방법을 알아보았습니다. 각 #컬럼의 #데이터 #타입과 역할, 그리고 #사용자 #테이블과의 #외래 키 관계 설정을 통해 #게시판의 #뼈대를 #견고하게 만들었습니다.
#테이블 #설계는 #애플리케이션의 #성능과 #유지보수성에 큰 영향을 미치므로, 신중하게 접근하는 것이 중요합니다. 다음 시간에는 이렇게 #설계된 #테이블을 바탕으로 #게시물을 #작성하는 #기능 (Create)을 구현해 보겠습니다.
PHP 중급 게시판 CRUD 테이블 설계 posts user_id title content created_at updated_at views 외래키 데이터베이스 관계형 CASCADE
루젠VPN: 당신의 안전한 온라인 동반자!

#VPN순위 상위권 루젠VPN으로 #구글VPN, #갤럭시VPN, #노트북VPN 등 어떤 기기에서든 손쉽게 #VPN사용법 익히고 #VPN우회 경험하세요. #중국출장VPN 이 필요할 때, 복잡한 #VPN원리 고민 없이 #VPN어플 이나 #VPN앱 (PC/모바일 모두 지원) 하나로 끝! #TOUCHVPN, #TURBOVPN 못지않은 강력한 성능을 #VPN체험 해보세요. 다양한 #VPN종류 중 단연 돋보이는 루젠VPN! (PROTON VPN도 좋지만!) 지금 바로 루젠VPN과 함께 안전하고 자유로운 인터넷을 만끽하세요!
LuzenVPN 루젠VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원
국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이
vpn.luzensoft.com
'프로그램 > PHP 중급' 카테고리의 다른 글
| 📚 PHP 중급 - 3주차: 게시판 CRUD 구현 (기본) - 03 페이징 처리 (0) | 2025.07.23 |
|---|---|
| 📚 PHP 중급 - 3주차: 게시판 CRUD 구현 (기본) - 02 글 목록, 글 작성, 글 보기, 글 수정, 글 삭제 (0) | 2025.07.22 |
| 📚 PHP 중급 - 2주차: 회원가입 및 로그인 시스템 구현 - 04 로그아웃 및 세션 관리 (0) | 2025.07.19 |
| 📚 PHP 중급 - 2주차: 회원가입 및 로그인 시스템 구현 - 03 로그인 기능 (세션 기반 인증) (0) | 2025.07.18 |
| 📚 PHP 중급 - 2주차: 회원가입 및 로그인 시스템 구현 - 02 회원가입 기능 (데이터 유효성 검사, 비밀번호 해싱) (0) | 2025.07.17 |