MariaDB를 이용하여 블로그 서비스를 구축하는 방법 개괄하여 소개

MariaDB 기반 블로그 서비스 설계 가이드입니다. DB 계정 권한, utf8mb4, posts/tags schema, JDBC prepared statement, 운영 점검과 DB/업로드 백업 기준을 정리했습니다.

MariaDB로 블로그 서비스를 구축할 때는 “DB를 만들고 테이블을 만든다”보다 애플리케이션 구조, 계정 권한, 문자셋, migration, 백업, connection pool을 먼저 설계해야 합니다. 직접 블로그 엔진을 만든다면 게시물, 태그, 사용자, 댓글, 첨부파일 메타데이터가 핵심 테이블이 됩니다.

기본 아키텍처

  • Web/API 서버: Spring Boot, Django, Laravel, Express 등
  • MariaDB: 게시물과 사용자 데이터 저장
  • Object/File storage: 이미지와 첨부파일 저장
  • Reverse proxy: Nginx/Apache에서 TLS와 routing 처리
  • Backup: DB dump와 업로드 파일을 함께 백업

데이터베이스와 계정 생성

애플리케이션 계정은 필요한 DB에만 권한을 줍니다. root 계정으로 앱을 연결하면 안 됩니다.

CREATE DATABASE blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'blog_app'@'10.0.0.%' IDENTIFIED BY 'REPLACE_WITH_STRONG_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX ON blog.* TO 'blog_app'@'10.0.0.%';
FLUSH PRIVILEGES;

간단한 테이블 구조 예시

USE blog;

CREATE TABLE posts (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  slug VARCHAR(200) NOT NULL UNIQUE,
  title VARCHAR(255) NOT NULL,
  body MEDIUMTEXT NOT NULL,
  status VARCHAR(20) NOT NULL DEFAULT 'draft',
  published_at DATETIME NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_posts_status_published (status, published_at)
);

CREATE TABLE tags (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(80) NOT NULL UNIQUE
);

CREATE TABLE post_tags (
  post_id BIGINT NOT NULL,
  tag_id BIGINT NOT NULL,
  PRIMARY KEY (post_id, tag_id),
  FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
  FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);

애플리케이션 연결

JDBC URL 예시는 다음과 같습니다. 실제 비밀번호는 환경변수나 secret manager로 주입합니다.

jdbc:mariadb://db.example.local:3306/blog?useUnicode=true&characterEncoding=utf8

Java에서는 직접 Statement 문자열 연결보다 connection pool과 prepared statement를 사용합니다.

String sql = "select id, title from posts where status = ? order by published_at desc limit ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, "published");
    ps.setInt(2, 20);
    try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
            System.out.println(rs.getString("title"));
        }
    }
}

운영 체크

SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS\\G
mysqldump --single-transaction --routines --triggers blog > blog.sql

블로그 서비스 백업은 DB만으로 부족합니다. 업로드 이미지, 테마, 설정 파일, reverse proxy 설정을 함께 백업해야 실제 복구가 됩니다.

공식 문서

BGM EVER