잡담
직장이 구해지지 않고 있습니다,
개발 능력도 키울 수 있고 페이도 좋으며 집과 가까운 그런 회사 없나..
지난번에 GoLang 관련 회사로 면접을 볼 기회가 있었는데 긴장을 너무한 게 두고두고 아깝네요.
개요
이전 회사에서 Laravel 또는 Wordpress로만 프로젝트를 구축하고 관리했습니다
순수 PHP 만으로 개발한 사이트가 없었기기에 해보고 싶었고 곧 놓을지도 모르는 PHP 정리도 할 겸
겸사겸사 게시판 프로젝트를 만들었습니다.
아래가 원본 주소입니다.
만약 에러가 생길 경우 아래 주소를 참고하시면 됩니다.
https://github.com/DSeung001/php-bbs
프로젝트 환경
APM 버전은 아래와 같습니다.
MYSQL | 8.0.30 |
PHP | 8.1.9 |
Apache | 2.4.54 |
Composer | 2.4.1 |
만약에 APM 세팅이 없으시다면 이전에 정리한 글을 참고하면서 설치하면 될 것 같습니다.
추가로 컴포저도 사용하므로 설치가 필요합니다.
MySQL : https://seung.tistory.com/entry/APM-MySQL-%EC%84%A4%EC%B9%98
PHP : https://seung.tistory.com/entry/APM-PHP-%EC%84%A4%EC%B9%98
Apache : https://seung.tistory.com/entry/APM-Apache-%EC%84%A4%EC%B9%98
Composer : https://seung.tistory.com/entry/PHP-%EC%BB%B4%ED%8F%AC%EC%A0%80-%EC%84%A4%EC%B9%98-Composer
프로젝트 폴더 생성
각자 설치한 Apache 폴더에 접속해서 htdocs에 접속한 다음 bbs 폴더를 만들어줍니다.
우리의 사이트는 localhost/bbs로 시작할 것입니다.
Apache 설정
우리의 사이트는 localhost/bbs/post/list와 같은 형식 처럼 .php와 파일의 원래 주소를 노출 안 하게 할 생각입니다.
그러기 위해서는 Apache에서 rewrite 모듈의 허용과 추가적인 설정이 필요합니다.
Apache 폴더로 가서 conf/httpd.conf를 수정합시다
저 같은 경우 다음 주소와 같습니다.
C:\APM\httpd-2.4.54-win64-VS16\Apache24\conf/httpd.conf
1. LoadModule rewrite_module modules/mod_rewrite.so 앞에 있는 #을 지워주세요, 처음부터 없다면 그대로 두세요.
2. 에디터를 통해 <Directory "${SRVROOT}/htdocs">를 검색하고 다음과 같이 수정하세요.
# 샵은 주석입니다.
# "${SRVROOT}/htdocs"에 추가 설정을 하는 것 입니다.
DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
# Indexs는 디렉토리 내 파일 목록을 보여줍니다.
# FollowSymLinks는 심볼릭 링크 허용입니다.
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
# 이게 제일 중요합니다. 이걸로 .htaccess의 내용을 적용하게 됩니다.
AllowOverride All
#
# Controls who can get stuff from this server.
#
# 해당 디렉터리의 엑세스 권한입니다.
Require all granted
</Directory>
여기까지 했다면 cmd에서 서버를 재시작해줍시다.
httpd -k restart
마이그레이션
이제 코딩을 시작해 봅시다.
이번 장에서 할 건 마이그레이션 기능으로 Migration 자체의 뜻은 이주를 의미합니다.
보통 라라벨 프레임워크에서는 테이블의 구조를 선언하여 쉽게 테이블을 생성 및 삭제, 초기화를 할 수 있습니다.
여기서는 간단하게 생성 기능을 가지고 있는 마이그레이션을 만들어 봅시다.
우선 데이터베이스 연결 정보를 파일에 저장해야 합니다.
아래와 같은 형식으로 진행하며 데이터는 본인 환경에서 설치된 MySQL에 따라 수정하면 됩니다.
bbs/config.ini
DB_HOSTNAME="localhost"
DB_NAME="bbs"
DB_USER="root"
DB_PASSWORD="secret"
연결 정보는 중요 파일이므로 만약 git을 사용한다면 .gitignore로 제외해 줍니다.
bbs/.gitignore
.idea
config.ini
/vendor/
composer 설정을 해줍시다.
composer를 통해 php 파일의 autoload를 해줍시다. 이걸로 use 만으로 파일을 포함시킬 수 있습니다.
bbs/composer.json
{
"name": "seung/bbs",
"autoload": {
"psr-4": {
"Controller\\" : "Controller/",
"Model\\" : "Model/",
"Migration\\": "DB/Migration/",
"DB\\" : "DB/",
"Utils\\" : "Utils/",
"Route\\" : "Route/",
"Utils\\": "Utils/"
}
},
"authors": [
{
"name": "seungryeol",
"email": "seungryeol156@gmail.com"
}
],
"require": {
"ext-pdo": "*",
"ext-json": "*",
"ext-mbstring": "*"
}
}
composer.json을 추가한 후 설치합시다.
이러면 composer.lock과 vendor 폴더가 생성될 것입니다.
composer install
composer 연결을 위해 bootstrap을 추가합시다, 다음 장에서 index.php에 연결할 것입니다.
bbs/bootstrap.php
<?php
require_once 'vendor/autoload.php';
위에서 언급한 대로 실제 주소를 감추기 위해 .htaccess를 추가합시다, 이걸로 페이지 Rewrite의 기준과 대상이 정해집니다.
bbs/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /bbs
RewriteCond %{REQUEST_FILENAME} !^/view/404\.php
RewriteCond %{REQUEST_URI} !^/bbs/assets/
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
이제 데이터베이스에 연결 객체를 만들어줄 Connection.php를 만듭시다.
bbs/DB/Connection.php
<?php
namespace DB;
use PDO;
use PDOException;
class Connection
{
private $conn = null;
private $config;
public function __construct()
{
// config.ini 통해 DB 접속 정보 가져옴
$this->config = parse_ini_file(__DIR__ . '/../config.ini');
}
public function getConnection()
{
if ($this->conn == null) {
try {
// 데이터 베이스 연결
$dsn = "mysql:host={$this->config['DB_HOSTNAME']};charset=utf8";
$conn = new PDO($dsn, $this->config['DB_USER'], $this->config['DB_PASSWORD']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 데이터베이스가 이미 존재하는지 확인하는 쿼리
$result = $conn->query("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{$this->config['DB_NAME']}'");
if ($result->rowCount() == 0) {
// 데이터베이스가 존재하지 않으면 생성
$conn->exec("CREATE DATABASE {$this->config['DB_NAME']}");
echo "Database {$this->config['DB_NAME']} created successfully.\n>";
}
$conn->query("use " . $this->config['DB_NAME']);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
$this->conn = $conn;
}
// 이상이 없을 경우 연결 객체 반환
return $this->conn;
}
}
그리고 Migration.php을 추가합니다. 이 파일을 통해 데이터베이스에 테이블 추가할 것입니다.
아직 Migration/Post와 Migration/Reply가 없어 에러가 발생합니다.
bbs/DB/Migration.php
<?php
namespace DB;
require_once __DIR__."/../bootstrap.php";
use Migration\Post;
use Migration\Reply;
new Migration();
// cmd, bbs 폴더에서 다음 명령어 실횅 php .\DB\Migration.php
class Migration
{
public function __construct()
{
$this->post = new post();
$this->reply = new reply();
echo "[Migration Start]\n";
$this->post->migrate();
$this->reply->migrate();
echo "[Migration End]\n";
}
}
나머지도 만들어줍시다
글에 관한 데이터를 담을 테이블을 만들어 줄 파일입니다.
기본적인 글에 추천 기능과 락 기능을 더 해졌고 만들 게시판이 익명 게시판이다 보니
글마다 작성자의 이름과 비밀번호를 저장합니다.
bbs/DB/Migration/Post.php
<?php
namespace Migration;
use DB\Connection;
use PDOException;
class Post
{
private $conn;
public function __construct()
{
$this->conn = new connection();
$this->conn = $this->conn->getConnection();
}
function migrate()
{
try {
$tableName = "posts";
// 테이블이 존재하는지 확인
$checkTableExists = $this->conn->query("SHOW TABLES LIKE '$tableName'")->rowCount() > 0;
// 테이블이 존재하지 않으면 테이블 생성
if (!$checkTableExists) {
$createTableSQL = "CREATE TABLE $tableName (
idx INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
pw VARCHAR(100) NOT NULL,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
views INT(6) UNSIGNED DEFAULT 0,
`lock` INT(1) UNSIGNED DEFAULT 0,
thumbs_up INT(6) UNSIGNED DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
$this->conn->exec($createTableSQL);
echo "Table $tableName created successfully\n";
} else {
echo "Table $tableName already exists\n";
}
} catch
(PDOException $e) {
echo "Connection failed: " . $e->getMessage()."\n";
}
}
}
댓글 테이블을 만들어줄 파일입니다, 대댓글 기능을 위해 parent_idx를 추가했습니다.
bbs/DB/Migration/Reply.php
<?php
namespace Migration;
use DB\Connection;
use PDOException;
class Reply
{
private $conn;
public function __construct()
{
$this->conn = new connection();
$this->conn = $this->conn->getConnection();
}
function migrate()
{
try {
$tableName = "replies";
// 테이블이 존재하는지 확인
$checkTableExists = $this->conn->query("SHOW TABLES LIKE '$tableName'")->rowCount() > 0;
// 테이블이 존재하지 않으면 테이블 생성
if (!$checkTableExists) {
$createTableSQL = "CREATE TABLE $tableName (
idx INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
parent_idx INT(6) UNSIGNED DEFAULT 0,
post_idx INT(6) UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
pw VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";
$this->conn->exec($createTableSQL);
echo "Table $tableName created successfully\n";
} else {
echo "Table $tableName already exists\n";
}
} catch
(PDOException $e) {
echo "Connection failed: " . $e->getMessage()."\n";
}
}
}
정리 및 실행
여기까지 잘 따라오셨다면 파일 구조는 다음과 같아야 합니다.
이제 bbs를 cmd로 접근한 다음 명령어를 실행할 경우 결과는 아래와 같습니다.
명령어 : php .\DB\Migration.php
이제 데이터베이스와 테이블이 생성된 걸 확인할 수 있습니다. 👍👍
만약에 Migration.php에 구조도 이해가 안되시면 아래 그림 참고하시면 됩니다.
Connection.php에서 conn 객체를 Post와 Reply에 주고 이들은 각각 테이블 생성 쿼리를 생성하고 이를
Migration.php에서 실행한다고 보시면 됩니다.
'PHP > Modern PHP' 카테고리의 다른 글
[PHP] 게시판 만들기 with MVC - 3부 View(List & Create) (1) | 2023.12.27 |
---|---|
[PHP] 게시판 만들기 with MVC - 2부 Routing (0) | 2023.12.26 |
[PHP] PHP 면접 질문 정리 (1) | 2023.12.08 |
PHP 써야 할까? (0) | 2022.11.18 |
PHP 인코더, 디코더 (소스코드 암호화) 해보기 (0) | 2020.12.21 |