Post

데브코스 TIL - Day 9

23년 11월 24일 강의를 들은 내용과 추가로 더 학습한 내용을 기록한 글입니다.

데이터베이스

데이터를 통합하여 효율적으로 관리하기 위한 데이터 집합체를 데이터베이스라고 한다. 데이터를 구조화하여 관리함으로써 데이터 중복을 막고, 효율적이고 빠른 데이터 연산을 가능하게 해준다.

DBMS (DataBase Management System)

데이터베이스를 운영하고 관리하기 위한 시스템

■ 종류

Oracle, MySQL, mariaDB 등

SQL (Structured Query Language)

데이터베이스에 연산을 요청하기 위해 사용되는 언어
데이터를 생성, 조회, 수정, 삭제 등과 같은 기능을 수행함

■ 데이터 관련 명령어

  • 데이터 삽입: INSERT
  • 데이터 조회: SELECT
  • 데이터 수정: UPDATE
  • 데이터 삭제: DELETE

■ 데이터베이스 관련 명령어

  • DATABASE 확인: SHOW DATABASES;
  • DATABASE 생성: CREATE DATABASE database명;
  • DATABASE 접속: USE database명;

도커 Docker

리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트

OS 바로 프로그램을 설치하는 것이 아닌 Docker를 깔고 그 위에 설치

Docker가 가지고있는 컨테이너… 흠? 다시 듣고 정리

빠르고 가벼워짐

[실습하기]Docker와 mariaDB 설치하기 _Window

Docker 홈페이지에 가서 본인과 맞는 버전의 window용 도커 데스크톱 설치하기

docker download site

window의 경우 리눅스 환경이 세팅되어있지 않다면 도커를 실행할 때 오류가 발생할 수 있다.

1. window cmd(명령 프롬프트)에 docker pull mariadb를 입력하고 설치하기

!! docker pull mariadb를 입력했지만 아래와 같은 오류가 발생할 수도 있다. 이는 docker가 아직 실행되지 않아서 발생하는 오류이다.

1
2
docker run -p 4443:4443 --rm -e OPENVIDU_SECRET=MY_SECRET openvidu/openvidu-server-kms:2.22.0
docker: error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.: Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/create": open //./pipe/docker_engine: The system cannot find the file specified.

docker

Docket 데스크톱을 실행했을 때 왼쪽 하단 고래 모양 Box가 초록색이면 실행이 잘 된 것이고, 빨간색이면 오류가 발생한 것이다.

docker 데스크톱이 실행되어있는지 확인하고, 다시 명령어를 입력하면 잘 설치가 된 것을 확인할 수 있다.

2. mariadb 실행하기

docker run --name mariadb -d -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb

  • 3306:3306: 데이터베이스 서버 포트 번호
  • --restart=always: 도커가 실행되는 경우 항상 컨테이너를 실행
  • MYSQL_ROOT_PASSWORD=root mariadb: root 비밀번호

위의 명령어를 입력했을 때 하단과 같은 오류가 발생할 수 있음! 이미 3306 포트번호를 사용중이라는 오류기 때문에 호스트의 3306 포트 번호를 다른 것으로 변경하고 도커 컨테이너의 3306 포트를 연결해서 생성해주면 된다.

1
docker Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

docker run --name mariadb -d -p 3307:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb

내 경우에는 이미 mysql이 3306 포트를 사용해주고 있어서 사용하지 않는 3307 포트와 연결해줌

누가 포트 사용중인지 확인하기 #### 3306 포트 사용중인지 확인하기 ```bash C:\Users\user>netstat -ano | findstr 3306 TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 5952 TCP 0.0.0.0:33060 0.0.0.0:0 LISTENING 5952 TCP [::]:3306 [::]:0 LISTENING 5952 TCP [::]:33060 [::]:0 LISTENING 5952 ``` #### 5952 포트 사용하는게 누군지 확인하기 ```bash C:\Users\user>tasklist | findstr 5952 mysqld.exe 5952 Services 0 3,092 K ```


하지만 하단과 같은 오류가 다시 발생!!!

docker run --name mariadb -d -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb 명령어 입력 시 오류가 발생했지만 ‘/mariadb’라는 컨테이너가 생성되었기 때문에 발생하는 오류이다.
기존 컨테이너를 삭제하고 다시 한번 명령어를 입력하면 잘 설치된다.

1
docker: Error response from daemon: Conflict. The container name "/mariadb" is already in use by container "44e9379dbfd8a35b26ea06347b3b6db3214fd5f64f8555f1e661aff22caca7a1". You have to remove (or rename) that container to be able to reuse that name.
  • 기존 컨테이너 삭제: docker rm mariadb
  • 설치: docker run --name mariadb -d -p 3307:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb

3. mariadb 접속하기

docker exec -it mariadb /bin/bash

  • mariadb: container name

4. mariadb 접속하기

1
2
C:\Users\user>docker exec -it mariadb /bin/bash
root@a9ebbe82fc:/#

docker exec -it mariadb /bin/bash 명령어를 입력하면 커멘드창에 다음과 같은 내용이 입력됨

’#’ 뒤에 mariadb -u root -p명령어를 입력하고, 비밀번호를 입력하면 끝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 비밀번호 입력할 때 글자가 보이지 않음!
# 비밀번호 root를 입력하고 엔터 치면 실행 됨
C:\Users\user>docker exec -it mariadb /bin/bash
root@a9ebbe82fcf2:/# mariadb -u root -p
Enter password:

# 접속 성공 메세지!!
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 11.2.2-MariaDB-1:11.2.2+maria~ubu2204 mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

데이터베이스 만들고 접속하기

데이터베이스 목록 확인하기

SHOW DATABASES;

1
2
3
4
5
6
7
8
9
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

데이터베이스 목록 확인하기

CREATE DATABASE Tennis

위 명령어를 입력하면 Tennis 라는 데이터베이스가 새로 생성된 것을 확인할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MariaDB [(none)]> CREATE DATABASE Tennis;
Query OK, 1 row affected (0.003 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| Tennis             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.001 sec)

데이터베이스 설정하기

USE Tennis

위 명령어를 입력하면 Tennis 라는 MariaDB[(none)]이었던 부분이 MariaDB[Tennis]로 변경됨

1
2
3
MariaDB [(none)]> USE Tennis;
Database changed
MariaDB [Tennis]>

■ 데이터베이스 안에 table 만들기

CREATE TABLE table명(내용...)

member 테이블내용
id문자열_VARCHAR(30)
name문자열_VARCHAR(30)
pwd문자열_VARCHAR(30)
1
2
3
4
5
6
CREATE TABLE member
(
  id VARCHAR(30),
  name VARCHAR(30),
  pwd VARCHAR(30)
);

■ table 내용 조회하기

SELECT 칼럼명 FROM TABLE명;

SELECT id, name FROM member;

■ 특정 데이터 조회하기
SELECT 칼럼명 FROM TABLE명 WHERE 조건;

예시

1
2
3
4
5
6
7
MariaDB [Tennis]> SELECT * FROM member WHERE id = 'tennisking';
+------------+--------+-------+
| id         | name   | pwd   |
+------------+--------+-------+
| tennisking | marrrk | bbbbb |
+------------+--------+-------+
1 row in set (0.012 sec)

■ table 안에 데이터 넣기

INSERT 칼럼명1, 칼럼명2 INTO TABLE명 VALUES (칼럼1 데이터, 칼럼2 데이터...);

1
2
3
MariaDB [Tennis]> INSERT INTO member
    -> VALUES ("hyeeeeeemin", "hyemin", "aaaaa");
Query OK, 1 row affected (0.025 sec)
  • 잘 들어갔는지 확인해보기
    (모든 칼럼을 다 보려면 ‘*‘를 입력하면 됨)
1
2
3
4
5
6
7
MariaDB [Tennis]> SELECT * FROM member;
+-------------+--------+-------+
| id          | name   | pwd   |
+-------------+--------+-------+
| hyeeeeeemin | hyemin | aaaaa |
+-------------+--------+-------+
1 row in set (0.005 sec)

■ 데이터 수정하기

UPDATE TABLE명 SET 칼럼명 = 수정할 값 WHERE 조건;

예_tennisking의 비밀번호를 ‘bbbbb에서’ ‘ZZZZZ’로 변경하기

1
2
3
4
5
6
7
8
9
10
11
12
MariaDB [Tennis]> UPDATE member SET pwd = 'ZZZZZ' WHERE id = 'tennisking';
Query OK, 1 row affected (0.010 sec)
Rows matched: 1  Changed: 1  Warnings: 0

# 변경된 내용 확인
MariaDB [Tennis]> SELECT * FROM member WHERE id = 'tennisking';
+------------+--------+-------+
| id         | name   | pwd   |
+------------+--------+-------+
| tennisking | marrrk | ZZZZZ |
+------------+--------+-------+
1 row in set (0.001 sec)

※ 주의!
UPDATE할 때 조건을 설정하지 않으면 TABLE의 모든 값이 변경됨

1
2
3
4
5
6
7
8
9
10
11
12
MariaDB [Tennis]> UPDATE member SET pwd = 'sssss';
3 rows in set (0.000 sec)

MariaDB [Tennis]> SELECT * FROM member;
+-------------+----------+-------+
| id          | name     | pwd   |
+-------------+----------+-------+
| hyeeeeeemin | hyemin   | sssss |
| tennisking  | marrrk   | sssss |
| programmers | songsong | sssss |
+-------------+----------+-------+
3 rows in set (0.000 sec)

■ 데이터 삭제하기

DELETE FROM TABLE명 WHERE 조건;

예_name이 ‘songsong’인 데이터 삭제

1
2
3
4
5
6
7
8
9
10
11
MariaDB [Tennis]> DELETE FROM member WHERE name = 'songsong';
Query OK, 1 row affected (0.012 sec)

MariaDB [Tennis]> SELECT * FROM member;
+-------------+--------+-------+
| id          | name   | pwd   |
+-------------+--------+-------+
| hyeeeeeemin | hyemin | aaaaa |
| tennisking  | marrrk | ZZZZZ |
+-------------+--------+-------+
2 rows in set (0.001 sec)

※ 주의!
DELETE할 때 조건을 설정하지 않으면 TABLE의 모든 값이 삭제됨

1
2
3
4
5
MariaDB [Tennis]> DELETE FROM member;
Query OK, 2 row affected (0.012 sec)

MariaDB [Tennis]> SELECT * FROM member;
Empty set (0.001 sec)

[실습하기2] 테니스 쇼핑몰과 DB 연동하기

테니스 제품 TABLE 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# tennis_product table 생성
MariaDB [Tennis]> CREATE TABLE tennis_product
    -> (
    ->   id INT,
    ->   name VARCHAR(30),
    ->   desicription VARCHAR(100),
    ->   price INT
    -> );
Query OK, 0 rows affected (5.641 sec)

# 내용 넣기
MariaDB [Tennis]> INSERT INTO tennis_product VALUES (1, '그린델 테니스 라켓','초록색이 포인트인 라켓', 300000);
Query OK, 1 row affected (0.004 sec)

MariaDB [Tennis]> INSERT INTO tennis_product VALUES (2, '네오 테니스 라켓', '형광색이 포인트인 라켓', 250000);
Query OK, 1 row affected (0.538 sec)

MariaDB [Tennis]> INSERT INTO tennis_product VALUES (3, '블루몬 테니스 라켓', '파란색이 포인트인 라켓', 500000);
Query OK, 1 row affected (0.006 sec)


# 테이블 확인
MariaDB [Tennis]> SELECT * FROM tennis_product;
+------+----------------------------+----------------------------------+--------+
| id   | name                       | desicription                     | price  |
+------+----------------------------+----------------------------------+--------+
|    1 | 그린델 테니스 라켓         | 초록색이 포인트인 라켓           | 300000 |
|    2 | 네오 테니스 라켓           | 형광색이 포인트인 라켓           | 250000 |
|    3 | 블루몬 테니스 라켓         | 파란색이 포인트인 라켓           | 500000 |
+------+----------------------------+----------------------------------+--------+
3 rows in set (0.001 sec)

mysql과 연결하기

  1. mysql 패키지 설치하기
    npm i mysql --save

  2. database/connect/mariadb.js 파일 생성하고, mysql 연결을 위한 준비하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // database/connect/mariadb.js
    
    // mysql 모듈 가져오기
    const mariadb = require("mysql");
    
    const conn = mariadb.createConnection({
      host: "localhost",
      // 나는 3306 포트를 mysql이 이미 사용하고 있어서 3307 변경함
      port: 3307,
      user: "root",
      password: "root",
      database: "Tennis"
    });
    
    module.exports = conn;
    
  3. index.js파일에서 데이터베이스와 node 서버 연결하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    // index.js
    const server = require("./server");
    const route = require("./router");
    const requestsHandler = require("./requestHandler");
    
    // 데이터베이스 연결
    const mariadb = require("../database/connect/mariadb");
    mariadb.connect();
    
    server.start(route.route, requestsHandler.handle);
    
  4. 메인페이지 접속 시 tennis_product에 있는 데이터 모두 가져오도록 설정하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    // requestHandler.js
    const mariadb = require("../database/connect/mariadb");
    /* 메인페이지 접속 */
    function main(response) {
      mariadb.query("SELECT * FROM tennis_product", (err, rows) => {
        console.log(rows);
      });
    
      response.writeHead(200, {
        "Content-Type": "text/html"
      });
      response.write("Main Page!");
      response.end();
    }
    function orderList(response) {
      //...
    }
    let handle = {};
    handle["/"] = main;
    handle["/orderList"] = orderList;
    exports.handle = handle;
    
  5. 서버를 실행하고, localhost:8888로 접속을 한다면 콘솔창에 tennis_product 데이터들이 잘 출력되는 것을 확인할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    [
     RowDataPacket {
       id: 1,
       name: '그린델 테니스 라켓',
       desicription: '초록색이 포인트인 라켓',
       price: 300000
     },
     RowDataPacket {
       id: 2,
       name: '네오 테니스 라켓',
       desicription: '형광색이 포인트인 라켓',
       price: 250000
     },
     RowDataPacket {
       id: 3,
       name: '블루몬 테니스 라켓',
       desicription: '파란색이 포인트인 라켓',
       price: 500000
     }
    ]
    
  6. 메인페이지 접속 시 가져온 tennis_products 데이터 화면에 출력하기

###

참고 사이트

This post is licensed under CC BY 4.0 by the author.