데이터베이스에 대해 학습하고 Docker와 MySQL을 이용하여
데이터베이스를 설치하고 연결하여 SQL문법을 이용한 Table을 만들어 보자.
데이터베이스는 "데이터의 잡합"이라고 할 수 있다.
Database Management System의 약자로서
"데이터의 집합"인 데이터베이스를 관리하고 운영하는 소프트웨어를 말한다.
과거의 데이터 저장방식(파일시스템)의 단점을 보관하고 대량의 데이터를 효율적으로 관리하고 운영하기 위해서
DBMS라는 소프트웨어가 나오게 되었다.
데이터의 저장소인 데이터베이스는 다수의 사용자나 응용 프로그램과 공유하고 접근이 가능해야 하는데
이를 지원해주는 소프트웨어 DBMS가 있기에 가능하다.
이런 DBMS에 데이터를 구축하고 관리하는데 사용되는 언어가 SQL이다.
DBMS | 제작사 | 작동 운영체제 | 기타 |
---|---|---|---|
MySQL | Oracle | Unix, Linux, Windows, Mac | 오픈 소스(무료), 상용 |
MariaDB | MariaDB | Unix, Linux, Windows | 오픈 소스(무료),MySQL 초기 개발자들이 독립해서 만듦 |
PostgreSQL | PostgreSQL | Unix, Linux, Windows, Mac | 오픈 소스(무료) |
Oracle | Oracle | Unix, Linux, Windows | 상용 시장 점유율 1위 |
SQL Server | Microsoft | Windows | 주로 중/대형급 시장에서 사용 |
DB2 | IBM | Unix, Linux, Windows | 메인프레임 시장 점유율 1위 |
Access | Microsoft | Windows | PC용 |
SQLite | SQLite | Android, iOS | 모바일 전용, 오픈 소스(무료) |
Relational DBMS 관계형 DBMS라 불리며, 대부분의 DBMS가 RDBMS형태로 사용된다.
데이터들이 하나 이상의 열과 행으로 이루어진 테이블(table)에 저장된다.
관계형 DBMS를 사용하고 관리하는데 필요한 언어다.
데이터베이스에서 데이블은 데이터를 구조화하여 저장하는 가장 기본적인 단위다.
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
.....
);
/*
CREATE TABLE : DDL 명령어
table_name : 테이블 이름
column : 테이블의 열을 정의
datatype : 데이터 타입
위처럼 정의된 테이블은 'INSERT' 명령어로 데이터를 추가하거나 'SELECT'로 조회할 수 있다.
*/
CREATE TABLE employees (
employee_id INT,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
hire_date DATE,
salary FLOAT
);
MySQL은 오픈 소스 관계형 데이터베이 관리 시스템(RDBMS) 중 하나로,
사용자가 데이터를 저장하고 조회하는 데 필요한 도구와 기능을 제공한다.
MySQL은 클라이언트/서버 아키텍처를 사용하여 데이터베이스에 연결되는 클라이언트 프로그햄과
데이터베이스 서버 프로그램으로 구성된다. 클라이언트는 데이터베이스 서버에 연결하고
데이터베이스 서버는 클라이언트의 요청에 따라 데이터를 저장하고 검색한다.
MySQL은 다양한 운영 체제에서 실행할 수 있으며, 다양한 프로그래밍 언어와 연동하여 사용할 수 있다.
또한, MySQL은 다른 RDBMS와 비교하여 빠른 속도, 안정성, 확장성, 보안성 등의 장점을 가지고 있다.
DDL(Data Definition Language)은 데이터베이스 객체를 정의하거나 수정하는 데 사용되는 SQL 명령어다.
데이터베이스에서 테이블을 생성, 수정 또는 삭제하거나, 인덱스를 추가 또는 제거하거나, 제약 조건을 추가하거나 제거하는 등의 작업에 DDL을 사용한다.
DDL 명령어는 데이터베이스 스키마를 정의하거나 변경하는 역할을 한다.
DQL(Data Query Language)은 데이터베이스에서 데이터를 조회하는 데 사용되는 SQL 명령어다.
SELECT 문이 DQL의 가장 대표적인 예로 DQL 명령어는 데이터베이스에서 데이터를 검색, 필터링, 정렬하는 등의 작업을 수행하는 역할을 한다.
DQL은 데이터베이스 스키마를 변경하지 않고, 데이터를 조회하는 데 사용됩니다.
도커(Docker)는 애플리케이션을 컨테이너화하여 배포 및 실행하는 오픈 소스 플랫폼이다.
다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여
프로그램의 배포 및 관리를 단순하게 해준다.
백엔드 프로그램, 데이터베이스 서버, 메시지 큐등
어떤 프로그램도 컨테이너로 추상화하여 어디서든 실행이 가능하게 해준다.
컨테이너는 격리된 공간에서 프로세스가 동작하는 기술로 가상화 상태의 개념이다.
컨테이너는 프로세스이기에 실행중인 프로세스가 없으면 종료된다.
도커의 핵심 개념 중 하나는 이미지(Image)다.
도커 이미지는 애플리케이션과 그것이 실행되기 위해 필요한 모든 것을 포함하는 패키지라 할 수 있다.
예를 들어, 웹 애플리케이션을 실행하려면 웹 서버, 라이브러리, 설정 파일 등이 필요한데,
도커 이미지는 이러한 모든 것들을 포함하며, 애플리케이션을 실행하기 위해 필요한 모든 것을 제공해준다.
이미지는 Dockerfile이라는 텍스트 파일을 사용하여 작성된다.
Dockerfile은 애플리케이션을 빌드하는 데 필요한 모든 단계를 정의해준다.
예를 들어, 먼저 어떤 기반 이미지를 사용할지, 필요한 라이브러리를 설치할지, 설정 파일을 추가할지 등을 지정한다.
도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다. 누구나 이미지를 쉽게 만들고 배포할 수 있다.
이미지는 컨테이너(Container)를 실행하는 데 사용된다.
즉, 컨테이너는 이미지를 기반으로 실행되며, 컨테이너는 애플리케이션을 실행하는데 필요한 모든 것을 포함한다.
이러한 컨테이너는 호스트 시스템과 격리되며, 각각의 컨테이너는 자체 파일 시스템 및 네트워크 인터페이스를 갖는다.
이를 통해 여러 컨테이너를 사용하여 애플리케이션을 분리하고, 더 안정적으로 실행할 수 있다.
curl -fsSL https://get.docker.com/ | sudo sh
docker version
버전정보를 확인하면 클라이언트와 서버가 나뉘어져 있음을 알 수 있다.
도커는 하나의 실행파일이지만 실제로 클라이언트와 서버역할 각각 할 수 있다.
도커 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고
결과를 받아 터미널에 출력해준다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
OPTIONS | 설명 |
---|---|
-d | detached mode 흔히 말하는 백그라운드 모드 |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트와 컨테이너의 디렉토리를 연결 (마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
–name | 컨테이너 이름 설정 |
–rm | 프로세스 종료시 컨테이너 자동 제거 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
–link | 컨테이너 연결 [컨테이너명:별칭] |
Docker를 통해 mysql 이미지를 가져오면 mysql설치 없이 Docker 컨테이너에 mysql 환경을 만들 수 있다.
아래와 같이 입력한다.
docker run -d -p 3307:3306 --platform linux/amd64 -e MYSQL_ROOT_PASSWORD=비밀번호 --name 이름 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
$ docker run --name 컨테이너이름 -e MYSQL_ROOT_PASSWORD=비밀번호 -d -p 3306:3306 mysql:latest
docker ps -a
docker exec -it 컨테이너이름 bash
mysql -u root -p
CREATE DATABASE testDB;
USE testDB;
show databases
root 사용자는 전체 권한을 가지고 있기에 위험이 따른다.
MySQL 사용자 추가/ DB 생성 / 권한 부여 방법
CREATE USER 'userID'@'%' identified by 'userpassword';
GRANT ALL PRIVILEGES ON dbname.* to userID@'%';
FLUSH PRIVILEGES;
exit
mysql -u userID -p
CREATE TABLE tablename (field1 field1-type PRIMARY KEY, field2 field2-type NOT NULL);
Table에 들어갈 data를 임의로 만들고 txt 파일화 한다.
const fs = require("fs"); // 파일 처리 모듈
const randomWords = require("random-words"); // 랜덤 영어 단어
// 닉네임 필드
const getNickname = () => {
const word = randomWords();
const string = getStr(3);
const number = getNum(4);
return word + string + number;
};
const getStr = (number) => {
const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const length = CHARACTERS.length;
let str = "";
for (let i = 0; i < number; i++) {
str += CHARACTERS.charAt(Math.floor(Math.random() * length));
}
return str;
};
const getNum = (number) => {
let num = "";
for (let i = 0; i < number; i++) {
num += Math.floor(Math.random() * 10);
}
return num;
};
// 돈 필드
const getMoney = () => {
const RANGE = 100000;
return Math.ceil(Math.random() * RANGE);
};
// 방문기록 필드
const getVisitTime = () => {
const DAYS = 30;
// 지금으로부터
const end = new Date();
// 30일 전
const start = new Date(new Date().setDate(end.getDate() - DAYS));
return new Date(
start.getTime() + Math.random() * (end.getTime() - start.getTime())
).toLocaleString();
};
// 100만개의 랜덤 샘플 생성
const insertBulk = () => {
const COUNT = 1000000;
let txt = "";
for (let i = 1; i <= COUNT; i++) {
const nickName = getNickname();
const money = getMoney();
const last_visit = getVisitTime();
txt += `${nickName},${money},${last_visit}\n`;
}
fs.writeFileSync("./userlog.txt", txt, { encoding: "utf-8" });
};
insertBulk();
/Users/sarang_daddy/testDB/userlog.txt
docker cp [host 파일경로] [container id]:[container 내부 파일경로]
mysql> LOAD DATA LOCAL INFILE '/home/userlog.txt'
-> INTO TABLE user_log
-> FIELDS TERMINATED BY ',';
truncate user_log;
위 과정 중 잘못된 data가 들어갔을 때 테이블 내용을 삭제하고 다시 한다.
(내가 그랬다... js 파일을 load해 버렸다.....)
select * from user_log;
const mysql = require("mysql");
const randomWords = require("random-words");
const { performance } = require("perf_hooks");
const connection = mysql.createConnection({
host: "localhost",
user: "sarang",
password: "1234",
database: "testDB2",
port: "3307",
});
connection.connect();
const getNickname = () => {
const word = randomWords();
const string = getStr(3);
const number = getNum(4);
return word + string + number;
};
const getStr = (number) => {
const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const length = CHARACTERS.length;
let str = "";
for (let i = 0; i < number; i++) {
str += CHARACTERS.charAt(Math.floor(Math.random() * length));
}
return str;
};
const getNum = (number) => {
let num = "";
for (let i = 0; i < number; i++) {
num += Math.floor(Math.random() * 10);
}
return num;
};
const getMoney = () => {
const RANGE = 100000;
return Math.ceil(Math.random() * RANGE);
};
const getVisitTime = () => {
const DAYS = 30;
const end = new Date();
const start = new Date(new Date().setDate(end.getDate() - DAYS));
return new Date(
start.getTime() + Math.random() * (end.getTime() - start.getTime())
).toLocaleString();
};
const insertBulk = () => {
const COUNT = 1000000;
let values = [];
for (let i = 1; i <= COUNT; i++) {
const nickName = getNickname();
const money = getMoney();
const last_visit = getVisitTime();
values.push([nickName, money, last_visit]);
}
const query = "INSERT INTO user_log (nickname, money, last_visit) VALUES ?";
const start = performance.now();
connection.query(query, [values], (error, results, fields) => {
if (error) throw error;
console.log("Inserted", results.affectedRows, "rows");
connection.end();
const end = performance.now();
console.log(`myProgram 실행 시간: ${(end - start) / 1000} 초`);
});
};
insertBulk();
디폴트 Packet 용량(4mb)를 초괴해서 한번에 데이터를 INSERT하게 되면 에러가 발생한다.
SET GLOBAL max_allowed_packet=1000000000;
packet 용량 늘리기로 Data load에 성공했다.
CSV 파일은 Comma-Separated Values 파일의 약자로, 쉼표로 구분된 텍스트 파일입니다. 이 파일 형식은 표 형태의 데이터를 저장하기 위해 일반적으로 사용됩니다. 각각의 행은 개별 레코드를 나타내며, 각 레코드는 쉼표로 구분된 값들의 집합으로 구성됩니다.
CSV 파일은 텍스트 파일이므로, 대부분의 텍스트 편집기나 스프레드시트 프로그램에서 열 수 있습니다. 데이터를 CSV 파일로 내보내는 경우, 보통의 경우에는 파일 확장자가 ".csv"로 지정됩니다.
CSV 파일은 데이터베이스나 스프레드시트 프로그램에서 사용되는 데이터를 다른 프로그램에서 사용하기 쉽도록 내보낼 때 자주 사용됩니다. 또한, 웹 애플리케이션에서도 많이 사용됩니다. 데이터베이스에서 쿼리 결과를 CSV 파일로 내보내거나, 웹 페이지에서 표 형태의 데이터를 표시하기 위해 CSV 파일을 사용할 수 있습니다.
MySQL 공식 git
MySQL 한글설치
MySQL 비빌번호 등급 조절
Docker를 사용하여 MySQL 설치하고 접속하기
[Docker] MySQL설치 및 접속하기
우분투 20.04에 MySQL 5.7 설치
MySQL 5.7 설치
SQL 기본 문법