[PHP] 게시판 만들기 with MVC - 1부 Migration

2023. 12. 26. 20:38· PHP/Modern PHP
목차
  1. 잡담
  2. 개요
  3. 프로젝트 환경
  4. 프로젝트 폴더 생성
  5. Apache 설정
  6. 마이그레이션
  7. 정리 및 실행

잡담

직장이 구해지지 않고 있습니다,

개발 능력도 키울 수 있고 페이도 좋으며 집과 가까운 그런 회사 없나..

 

지난번에 GoLang 관련 회사로 면접을 볼 기회가 있었는데 긴장을 너무한 게 두고두고 아깝네요.

 

개요

이전 회사에서 Laravel 또는 Wordpress로만 프로젝트를 구축하고 관리했습니다

순수 PHP 만으로 개발한 사이트가 없었기기에 해보고 싶었고 곧 놓을지도 모르는 PHP 정리도 할 겸 

겸사겸사 게시판 프로젝트를 만들었습니다.

 

아래가 원본 주소입니다.

만약 에러가 생길 경우 아래 주소를 참고하시면 됩니다.

https://github.com/DSeung001/php-bbs

 

GitHub - DSeung001/php-bbs

Contribute to DSeung001/php-bbs development by creating an account on GitHub.

github.com

 

프로젝트 환경

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 면접 질문 정리  (2) 2023.12.08
PHP 써야 할까?  (0) 2022.11.18
PHP 인코더, 디코더 (소스코드 암호화) 해보기  (0) 2020.12.21
  1. 잡담
  2. 개요
  3. 프로젝트 환경
  4. 프로젝트 폴더 생성
  5. Apache 설정
  6. 마이그레이션
  7. 정리 및 실행
'PHP/Modern PHP' 카테고리의 다른 글
  • [PHP] 게시판 만들기 with MVC - 3부 View(List & Create)
  • [PHP] 게시판 만들기 with MVC - 2부 Routing
  • [PHP] PHP 면접 질문 정리
  • PHP 써야 할까?
DSeung
DSeung
DSeung
Dev log
DSeung
  • 분류 전체보기 (193)
    • PHP (62)
      • Laravel (31)
      • Error (5)
      • Setting (11)
      • Modern PHP (15)
    • Go Lang (51)
      • Study (30)
      • Algorithm (17)
      • Setting (1)
      • Error (3)
    • Java (11)
      • Spring (3)
      • JSP (0)
      • Error (2)
      • Setting (2)
      • 단축키 (2)
    • JavaScript (6)
      • Modern JavaScript (4)
      • Node (1)
    • Android Kotlin (5)
      • Study (4)
      • Error (1)
    • 컴퓨팅 기술 (12)
      • 데이터베이스시스템 (4)
      • Docker (2)
      • 크롤링 & 스크래핑 (1)
      • API (1)
      • 클라우드 (1)
      • 네트워크 (1)
    • MySQL (7)
    • AWS (1)
    • Git (5)
      • GItLab (1)
      • GitHub (4)
    • 도메인 (2)
      • 안과 (2)
    • 자격증 (7)
      • SQLD (1)
      • 정보처리기사 (6)
    • Mac os (1)
    • 나머지 (13)
      • tistory (1)
      • 기타 (9)
      • 일기 (3)
    • 독서 (10)

인기 글

최근 글

블로그 메뉴

  • 홈
  • 태그
전체
오늘
어제
hELLO · Designed By 정상우.v4.2.0
DSeung
[PHP] 게시판 만들기 with MVC - 1부 Migration
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.