Skip to content

Docker Compose로 데이터베이스 자동화 구성하기

안지환 edited this page Jan 12, 2024 · 1 revision

개요

데이터베이스에 데이터 변경 할 때마다 추가/삭제를 수동으로 하는 과정이 번거럽고 상당한 시간을 소유하는 문제가 있습니다.
Docker Compose를 활용해서 데이터베이스를 자동으로 삭제/추가를 할 수 있도록 구성했습니다.

Task 1. Docker Compose 환경 구축하기

Docker Compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 묶어 관리를 용의하게 할 수 있는 작업 환경 도구 입니다.

MariaDB 데이터베이스를 Docker 단일 컨테이너만 사용해서 구축이 가능합니다. 그렇지만 커맨드라인에 Docker 환경 설정 내용을 한 눈에 보기가 어렵습니다.

docker-compose.yml 파일에서는 Docker 환경 설정 명령어는 yml 파일로 문서화 할 수 있다는 점에서 Docker Compose 파일을 만들어 사용하게 되었습니다.

docker-compose.yml 작성하기

version: '3.1'

services:
  database:
    image: mariadb:11.2.2
    container_name: book-store-compose
    restart: always
    ports:
      - 3307:3306
    env_file:
      - ./server/.env
    volumes:
      - ./data/conf.d:/etc/mysql/conf.d
      - ./data/data:/var/lib/mysql
      - ./server/resources/init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      TZ: Asia/Seoul
      command: --init-file /docker-entrypoint-initdb.d/init.sql

환경 구성은 다음과 같습니다.

  • 데이터베이스 MariaDB 11 버전
  • Docker Container : books-store-compose
  • 매번 재실행
  • Docker 포트는 3306, 외부 접근 포트는 3307
  • MariaDB 설정 파일은 .env에 설정
  • volumes:
    • /server/resources/init.sql에 SQL Script 파일을 /docker-entrypoint-initdb.d/init.sql에 저장
  • environment
    • 타임존 : Asia/Seoul
    • --init-file /docker-entrypoint-initdb.d/init.sql command 실행

Docker 이미지가 구축 될 때 자동으로 데이터가 주입이 됩니다.

Task 2. SQL 데이터 작성하기

init.sql 스트립트 파일에 데이터는 다음과 같습니다.

use BookStore;

-- set Foreign key = 0
set FOREIGN_KEY_CHECKS = 0;

-- truncate tables
TRUNCATE BookStore.books;
TRUNCATE BookStore.category;
TRUNCATE BookStore.likes;
TRUNCATE BookStore.users;

-- insert Data
INSERT INTO BookStore.category (name) VALUES ('소설');
INSERT INTO BookStore.category (name) VALUES ('컴퓨터/IT');
INSERT INTO BookStore.category (name) VALUES ('자기계발');
INSERT INTO BookStore.category (name) VALUES ('기술/공학');
INSERT INTO BookStore.category (name) VALUES ('시/에세이');
INSERT INTO BookStore.category (name) VALUES ('인문');
INSERT INTO BookStore.category (name) VALUES ('가정/육아');
INSERT INTO BookStore.category (name) VALUES ('요리');
INSERT INTO BookStore.category (name) VALUES ('건강');
INSERT INTO BookStore.category (name) VALUES ('취미/실용/스포츠');
INSERT INTO BookStore.category (name) VALUES ('정치/사회');
INSERT INTO BookStore.category (name) VALUES ('역사 문화');

INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("어린왕자들", 7, 1, "종이책", 0, "어리다....", "많이 어리다...", "김어림", 100, "목차", 20000, 3 , "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("신델렐라", 2, 2, "종이책", 1, "유리구두...", "투명한 유리구두", "걍구두", 100, "목차", 20000, 10, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("백설공주들", 10, 3, "종이책", 2, "사과...", "많이 어리다...", "김어림", 100, "목차", 20000, 15, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("흥부와 놀부", 20, 4, "종이책", 3, "제비...", "많이 어리다...", "김어림", 100, "목차", 20000, 20, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("콩쥐 팥쥐", 4, 1, "ebook", 4, "콩팥..", "콩심은데 콩나고..", "김콩팥", 100, "목차입니다.", 20000, 5, "2024-01-07");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("용궁에 간 토끼", 5, 1, "종이책", 5, "깡충..", "용왕님 하이..", "김거북", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("해님달님", 15, 2, "ebook", 6, "동앗줄..", "황금 동앗줄..!", "김해님", 100, "목차입니다.", 20000, 5, "2024-01-16");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("장화홍련전", 80, 1, "ebook", 7, "기억이 안나요..", "장화와 홍련이?..", "김장화", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("견우와 직녀", 8, 2, "ebook", 8, "오작교!!", "칠월 칠석!!", "김다리", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("효녀 심청", 12, 1, "종이책", 9, "심청아..", "공양미 삼백석..", "김심청", 100, "목차입니다.", 20000, 5, "2024-01-12");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("혹부리 영감", 22, 2, "ebook", 10, "노래 주머니..", "혹 두개 되버림..", "김영감", 100, "목차입니다.", 20000, 5, "2024-01-05");

INSERT INTO BookStore.users (email, name, password, salt) VALUES ('[email protected]', '홍길동', 'DXG6vjL/j7wfMA==', 'y9gFwrBaPpH7FQ==');
INSERT INTO BookStore.users (email, name, password, salt) VALUES ('[email protected]', '이홍철', '7Gzc43UTFzogzA==', 'I+0dnN1aFMFdDA==');

INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 1);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (2, 2);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 3);

-- set Foreign key = 1
set FOREIGN_KEY_CHECKS = 1;

Docker Compose가 실행이 되면 Docker 이미지 파일이 생성이 됩니다.
Docker 이미지 생성 시 SQL 파일이 자동으로 데이터를 주입합니다.

SQL 파일에 데이터를 주입 하기 전에 데이터베이스를 먼저 선택을 해야합니다.
외래키(FK) 맺은 테이블은 데이터 주입이 자동으로 되지 않기 때문에 set FOREIGN_KEY_CHECKS = 0; 외래키 설정을 꺼야 합니다.

외래키(FK)가 꺼진 후에 데이터 주입이 가능합니다.
TRUNCATE <TableName>로 데이터 베이스 테이블를 초기화 합니다. 기존에 있던 데이터를 지워야 새로운 데이터 주입이 가능합니다.

각 테이블에 데이터가 초기화 되면 데이터를 주입합니다.

INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 1);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (2, 2);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 3);

모든 데이터가 주입이 완료가 되면 마지막에 외래키 맺은 설정(set FOREIGN_KEY_CHECKS = 1)을 다시 켜줍니다.

이 과정이 완료가 되면 데이터베이스 새로운 데이터를 주입 할 수 있습니다.

Task 3. 명령어 작성하기

Node 환경에서 npm Script에 명령어를 작성합니다.

"scripts": {
    "docker:up": "docker-compose up -d",
    "docker:down": "docker-compose down",
},

docker-compose up -d 명령어는 Docker 컨테이너를 생성하는 명령어입니다. 새로 시작 할 때 이 명령어를 사용하면 됩니다.
docker-compose down 명령어는 Docker 컨테이너를 삭제하는 명려어입니다.

두 명령어는 npm Script에 작성합니다.
npm run docker:up, npm run docker:down 두 명령어만 입력하면 자동생성, 삭제가 가능합니다.

운영 환경에서는 이 과정을 하면 안됩니다.
로컬 환경에서 테스트용으로 사용해야 됩니다.

참고 사항