본문 바로가기
전공 수업/웹 서버 프로그래밍(Node.js)

[13주 차] - MySQL(RDB) 데이터베이스, Workbench 설치, 테이블(Entity) 생성, 데이터베이스의 CRUD

by TwoJun 2023. 5. 29.

    과목명 : 웹 서버 프로그래밍(Web Server-side programming with Node.js)

수업일자 : 2023년 05월 25일 (목)

Node.js & Express.js

 

 

 

 

 

1. 데이터베이스(Database)

1-1. 지금까지 배웠던 내용들은 데이터베이스를 사용하지 않고 특정 데이터를 서버의 메모리에 저장

(1) 서버를 재시작하는 경우 메모리에 저장된 데이터들이 모두 삭제되면서 데이터의 *영속성(Persistance)을 유지할 수 없다는 치명적인 단점이 존재합니다.

 

* 영속성(Persistance) : 컴퓨터 과학(Computer Science, CS)에서의 영속성(Persistance)이란, 특정한 데이터를 생성한 프로그램이 종료되더라도 해당 데이터가 사라지지 않는 속성을 의미하고 있습니다.

 

(2) 사용자의 정보를 안전하게 유지할 수 있는 데이터베이스를 사용해서 안정적인 서비스를 유지해야 할 필요성이 있습니다.

 

 

 

 

1-2. MySQL(RDBMS : Relational Database Management System)

(1) 데이터베이스(Database)

Reference : https://brunch.co.kr/@dan-kim/12

- 데이터베이스는 구조화된 특정한 데이터들 또는 조직화된 데이터들의 집합입니다.

 

- 서로 관련성을 가지고 중복이 없는 데이터들의 집합으로 볼 수 있습니다.

 

 

(2) DBMS(Database Management System)

- 데이터베이스 관리 시스템으로써, 데이터를 저장할 저장소를 만들고 해당 저장소에 권한이 있는 여러 사용자가 접근하여 데이터를 저장 및 관리할 수 있는 응용 소프트웨어 프로그램입니다.

 

 

(3) RDBMS(Relational Database Management System)

- 위에서 설명한 DBMS로써 다루는 데이터의 대상이 관계형 데이터베이스(RDB)인 DBMS를 RDBMS라고 정의합니다. 관계형 데이터베이스를 만들고 이에 대한 데이터를 저장 및 관리할 수 있는 응용 소프트웨어입니다.

 

- RDB의 종류로는 Oracle, MySQL, PostgreSQL, MSSQL 등이 있습니다.

RDB : Oracle, MySQL, PostgreSQL

 

 

(4) NoSQL(Not-only SQL)

- NoSQL 데이터베이스의 경우 다루는 데이터의 타입이 RDB가 아닌 Key-value, Document, Graph, Wide-column store로 이루어진 데이터 타입을 다루는 비관계(Non-relational) 또는 비정형(Unstructured) 데이터베이스를 말합니다.

 

- NoSQL의 종류로는 MongoDB, Redis, Apache Cassandra(CassandraDB) 등이 있습니다.

NoSQL : MongoDB, Redis, Apache Cassandra(CassandraDB)

 

 

(5) 서버의 물리 저장소(HDD, SSD) 등의 저장 매체에 데이터를 저장합니다.

 

(6) 서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있습니다.

 

(7) 권한을 가진 여러 사람이 동시에 접근할 수 있고, 여러 사용자들 간의 권한 설정 여부를 따로 지정할 수 있습니다.

 

 

 

 

 

 

2. MySQL Workbench 설치하기

2-1. Windows 운영체제 기준

(1) 공식 URL : MySQL :: Download MySQL Installer

- 공식 URL에서 MySQL 버전, 운영체제 사양에 맞게 MySQL Installer를 다운로드 받아서 Installer를 실행시킵니다.

 

MySQL :: Download MySQL Installer

Select Operating System: Select Operating System… Microsoft Windows Select OS Version: All Windows (x86, 32-bit) Windows (x86, 32-bit), MSI Installer 8.0.33 2.4M (mysql-installer-web-community-8.0.33.0.msi) MD5: 2a330cf24915964cca87e04dbb34e5d3 | Signatu

dev.mysql.com

 

(2) Custome 타입 선택 후 Next를 클릭합니다.

Custome 타입 선택 후 Next

 

(3) Available product 항목에서 MySQL Server, Workbench를 선택하고 Next를 클릭합니다.

Available product 항목에서 MySQL Server, Workbench를 선택하고 Next

 

(4) Execute 버튼을 클릭해 설치를 진행합니다.

설치가 진행 중인 화면

 

(5) Authentication Method 페이지에서 2번 째 체크 타입인 Legacy Authentication Method 항목을 선택합니다.

Legacy Authentication Method 항목을 선택

 

(6) 루트 계정의 비밀번호를 설정합니다.

Root 계정의 비밀번호 설정

 

(7) 모든 설정을 완료한 화면으로, Execute를 클릭해 최종 단계로 넘어갑니다.

Execute 선택

 

(8) 설치 및 환경설정이 완료되었습니다.

설치 진행 완료

 

 

 

 

2-2. Windows 기준 Command prompt 또는 Powershell에서 MySQL 접속하기

(1) 커맨드 라인 조작을 위한 MySQL의 기본 경로는 C:\Program Files\MySQL\MySQL Server 8.0\bin이며 Windows 환경변수 설정 페이지에서 해당 주소를 등록하여 Prompt 또는 Powershell을 띄우고 초기에 경로 이동 없이 바로 커맨드를 줄 수 있게 하기 위해 환경 변수를 지정해 주도록 하겠습니다.

 

(2) 환경 변수 편집 페이지에서 아래와 같은 새로운 환경 변수를 등록합니다.

MYSQL_HOME이라는 새로운 환경 변수를 추가한다.

 

 

(3) path 변수에서 C:\Program Files\MySQL\MySQL Server 8.0\bin을 새롭게 추가합니다.

path 변수에서  C:\Program Files\MySQL\MySQL Server 8.0\bin을 새롭게 추가

 

 

(3) Powershell을 실행하고 MySQL에 접속하기 위해 다음과 같은 커맨드를 적용합니다.

- 일반 원격지에 접속하는 경우 : mysql -h localhost -u root -p

mysql -h localhost -u root -p

- 로컬로 접속하는 경우 : mysql -u root -p 

mysql -u root -p

 

- MySQL 기본 포트 3306번 외에 다른 포트를 연결 포트로 설정한 경우 : 접속 명령어에서 뒷 부분에 "-P 포트번호"를 추가

- Ex) mysql -u root -p -P 3307

mysql -u root -p -P 3307

※ -h는 호스트, -u는 사용자, -p는 비밀번호 옵션입니다.

 

 

(4) 원격지, 로컬 접속 및 정상 종료 확인

원격지, 로컬 접속 및 정상 종료 확인

 

 

 

 

2-3. Workbench를 통해 데이터베이스에 접속하기

(1) MySQL Workbench를 실행하고 MySQL Connections 우측의 "+" 버튼을 클릭합니다.

MySQL Workbench 실행

 

(2) Connection Name, Port 정보를 설정하고 Connection 생성을 완료합니다.

Connection Name, Port 정보를 설정하고 Connection 생성을 완료

 

(3) 설치 과정에서 입력했던 루트 권한 계정의 패스워드를 입력하고 OK를 누릅니다.

루트 권한 계정의 패스워드 입력

 

(4) MySQL Workbench를 통해 데이터베이스에 접속한 화면을 확인할 수 있습니다.

접속 성공

 

 

 

 

 

 

3. 데이터베이스, 데이터베이스 테이블(Entry) 생성

3-1. Console 환경에서 MySQL에 접속하고 새로운 nodejs 데이터베이스를 생성

(1) 데이터베이스 생성

- CREATE SCHEMA 데이터베이스명;

CREATE SCHEMA nodejs;

CREATE SCHEMA nodejs;

 

(2) 데이터베이스 조회

- SHOW databases;

SHOW databases;

SHOW databases;

 

(3) 생성된 데이터베이스 결과를 Workbench상에서 조회해 보기

- SCHEMAS 영역에서 마우스 우측 클릭 후 Refresh All 클릭

SCHEMAS 영역에서 마우스 우측 클릭 후 Refresh All 클릭

 

생성된 nodejs 데이터베이스를 확인할 수 있다.

 

 

 

 

3-2. 신규 테이블 생성하기 

(1) 이전에 생성한 데이터베이스에 데이터를 저장할 수 있는 새로운 테이블을 만들어 줄 수 있습니다.

- CREATE TABLE [데이터베이스명.테이블명] (

-- 다양한 컬럼에 대한 데이터 형식, 속성 정의

);

 

- 사용자 정보를 저장할 수 있는 users 테이블 생성

CREATE TABLE nodejs.users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT UNSIGNED NOT NULL,
married TINYINT NOT NULL,
comment TEXT NULL,
created_at DATETIME NOT NULL DEFAULT now(),
PRIMARY KEY(id),
UNIQUE INDEX name_UNIQUE (name ASC))
COMMENT = '사용자 정보'
DEFAULT CHARSET=utf8
ENGINE=InnoDB;

 

 

 

 

3-3. RDB의 Column과 Row

(1) 어떤 데이터가 들어갈지 데이터에 대한 정보를 지정해 주는 부분을 Column(컬럼), 실제로 데이터가 적재되는 부분을 Row(로우)라고 합니다.

Column과 Row / Reference : https://velog.io/@pixelstudio/DB-%EC%8B%9C%EB%A6%AC%EC%A6%88-DATABASE-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-A

 

 

 

 

3-4. Column의 여러 가지 옵션들

CREATE TABLE nodejs.users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT UNSIGNED NOT NULL,
married TINYINT NOT NULL,
comment TEXT NULL,
created_at DATETIME NOT NULL DEFAULT now(),
PRIMARY KEY(id),
UNIQUE INDEX name_UNIQUE (name ASC))
COMMENT = '사용자 정보'
DEFAULT CHARSET=utf8
ENGINE=InnoDB;

 

(1) INT

- 정수 자료형을 나타내며 FLOAT, DOUBLE의 경우 실수 타입 자료형입니다.

 

(2) VARCHAR

- 문자열 자료형으로, 가변 길이 타입을 가지며 CAHR의 경우 고정 길이입니다.

 

(3) TEXT

- 긴 문자열은 TEXT 자료형에 저장할 수 있습니다.

 

(4) DATETIME

- 날짜 형식에 대한 자료형으로 직접 값을 입력할 수 있습니다.

 

(5) TINYINT

- -127~128까지의 정수 타입 데이터를 저장할 수 있고 1 또는 0을 저장하고자 한다면 BOOLEAN 타입을 사용할 수 있습니다.

 

(6) NOT NULL

- NULL 형태의 데이터는 저장할 수 없게 됩니다.

 

(7) AUTO_INCREMENT

- 숫자 자료형에 한해 새로운 데이터가 추가될 때마다 1씩 자동으로 증가하는 옵션입니다.

 

(8) UNSIGNED

- 0과 양수만 허용하는 옵션입니다.

 

(9) ZEROFILL

- 숫자의 자릿수가 고정된 경우 빈 자리에 0을 채워넣는 옵션입니다.

 

(10) DEFAULT now()

- 날짜 칼럼의 기본값을 현재 시간으로 자동 설정합니다.

 

 

 

 

3-5. Primary Key(PK, 개인 키), UNIQUE INDEX

(1) Primary key(PK, 개인 키)

- 특정 Column이 PK로 설정된 경우 해당 Row를 대표하는 고유한 값으로 설정됩니다.

 

- PRIMARY KEY(id)의 경우 id 컬럼의 데이터가 해당 테이블에서 각각 고유한 값을 가진다는 의미임과 동시에 Row를 특정할 수 있게 해 주는 고유한 값임을 의미하기도 합니다.

 

- 자주 사용될 수 있는 칼럼으로 사용자의 고유 정보일 수밖에 없는 학번이나 주민등록번호 등이 저장될 수 있는 Column에 PK를 지정할 수 있습니다.

 

 

(2) UNIQUE INDEX Column_Name UNIQUE (Column_Name ASC)

Ex) UNIQUE INDEX name UNIQUE (name ASC);

- 해당 Column(name)이 고유해야 함을 나타내는 옵션입니다.

 

- name UNIQUE는 해당 옵션의 이름입니다.

 

- ASC는 데이터 인덱스를 오름차순으로 저장할 수 있음을 나타내는 속성이며 내림차순은 DESC입니다.

 

 

 

 

3-6. 테이블(Entry) 자체의 옵션

(1) COMMENT

- 생성된 엔트리에 대한 보충 설명을 남길 수 있는 옵션이며 필수적으로 작성해야 할 옵션은 아닙니다.

 

(2) DEFAULT CHARSET

- 뒤에 옵션 값으로 utf8을 설정해야 한글을 입력할 수 있습니다.

 

(3) ENGINE

- MySQL의 InnoDB를 사용한다는 옵션입니다. 다른 엔진으로는 MyISAM이 있고 각 엔진별로 기능적인 차이가 존재합니다.

 

 

 

 

3-7. 테이블의 생성 여부 확인, 테이블 삭제

(1) 생성 여부 확인

- DESC 테이블명;

DESC users;

 

(2) 테이블 삭제

- DROP TABLE 테이블명;

DROP TABLE users;

 

테이블을 조회하고 DROP 명령으로 users 엔트리를 삭제하면 이후 SELECT 쿼리로 해당 엔트리를 조회할 수 없게 된다.

 

 

 

 

3-8. MySQL Workbench를 통한 테이블 생성

- 새로운 nodejs2 데이터베이스 생성

CREATE SCHEMA nodejs2;
show databases;

nodejs2 데이터베이스 생성

 

(1) Workbench를 열고 좌측 nodejs2 → Table 항목에서 우측 마우스 클릭 후 Create Table...을 클릭하고 테이블을 생성하기 위한 모든 정보를 작성하고 하단의 Apply를 누릅니다.

- PK(PRIMARY KEY)

- NN(NOT NULL)

- UQ(UNIQUE INDEX)

- B(Binary)

- UN(UNSIGNED)

- ZF(ZEROFILL)

- AI(AUTO_INCREMENT)

- Default / Expression : 기본 값 설정

테이블을 생성하기 위한 정보 입력

 

 

(2) 마지막으로 Apply SQL Script to Database 페이지에서 적용될 속성들을 확인하고 Apply를 누릅니다.

- Workbench에서  GUI 기반 설계 도구를 사용해서 테이블을 생성하게 되면 아래와 같이 자동으로 SQL문을 작성해서 사용자에게 보여주게 됩니다. 기존 테이블을 생성할 땐 CLI(Command-Line Interface) 환경에서 작업이 수행되었습니다.

생성될 테이블에 대한 SQL문 최종 확인

 

 

 

 

3-9. Comment 테이블 생성과 Foreign key(FK, 외래 키)

CREATE TABLE nodejs.comments (
id INT NOT NULL AUTO_INCREMENT,
commenter INT NOT NULL,
comment VARCHAR(100) NOT NULL,
created_at DATETIME NOT NULL DEFAULT now(),
PRIMARY KEY(id),
INDEX commenter_idx (commenter ASC),
CONSTRAINT commenter FOREIGN KEY(commenter) REFERENCES nodejs2.users(id)
ON DELETE CASCADE ON UPDATE CASCADE)
COMMENT = '댓글'
DEFAULT CHARSET = utf8
ENGINE = InnoDB;

 

 

- comments 엔트리(테이블) 생성 결과

comments  엔트리 생성 결과

 

- Workbench에서 확인 가능합니다.

Workbench에서 엔트리 생성 결과 확인

 

(1) comment 엔트리(테이블)의 경우 users 엔트리와 연관 관계가 존재합니다.

- FOREIGN KEY(외래 키) 속성을 부여해서 두 엔트리 간의 연관관계를 표시할 수 있습니다.

 

(2) FOREIGN KEY(컬럼명) REFERENCES 데이터베이스명.테이블명(컬럼명);

- FOREIGN KEY(commenter) REFERENCES nodejs2.users(id)

 

- commenter 컬럼에 댓글을 작성하면 해당 사용자의 id 값을 저장합니다.

 

 

(3) ON DELETE CASCADE ON UPDATE CASCADE

- 데이터의 일치성을 보장하기 위한 옵션으로 부모 엔트리의 PK값을 넘겨받아서 자식 엔트리에서 FK로 사용하는 경우 PK의 값이 삭제되거나 수정되면 해당 변경사항을 그대로 FK에서도 적용한다는 뜻입니다.

 

 

(4) NO ACTION

- 원본 개체 변경 / 삭제 시에도 참조 개체는 불변입니다.

 

 

(5) SET NULL

- 원본 개체 변경 / 삭제 시 참조 개체의 값은 NULL값으로 변경됩니다.

 

 

(6) SHOW TABLES;

- 선택된 데이터베이스의 모든 테이블(엔트리)를 조회합니다.

 

- USE 쿼리로 우선 조회할 데이터베이스를 선택하고 SHOW TABLES; 쿼리로 엔트리를 조회합니다.

SHOW TABLES;

 

 

 

 

 

 

4. CRUD (Create Read Update Delete)

https://www.atatus.com/glossary/crud/

 

4-1. CRUD의 정의

(1) 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(수정 또는 갱신), Delete(삭제)를 통틀어 이르는 용어로 사용자 인터페이스가 갖추어야 할 데이터 처리 기능을 가리키는 뜻으로도 사용됩니다.

 

 

 

 

4-2. Create - INSERT INTO

(1) INSERT INTO 테이블명 (값을 추가할 컬럼명) VALUES (value1, value2, ... value n);

- 데이터베이스의 엔트리(테이블)에 실제로 데이터를 추가할 때 사용하는 SQL입니다.

INSERT INTO nodejs2.users(name, age, married, comment, created_at) VALUES
('wonjun', 26, 0, '자기소개1', '2023-05-28'),
('wonjun2', 25, 0, '자기소개2', '2023-05-28');

INSERT INTO 테이블명 (값을 추가할 컬럼명) VALUES(value1, value2, ... value n);

 

 

 

 

4-3. Read - SELECT

(1) SELECT 조회할 컬럼명 FROM 테이블명;

- SELECT 구문은 하나 또는 그 이상의 테이블에서 컬럼에 대한 데이터를 추출할 때 사용하는 구문입니다.

 

- 컬럼명 부분에 *(Asterisk)가 들어가는 경우 테이블의 모든 컬럼을 조회한다는 의미입니다.

 

- 전체 컬럼이 아닌 컬럼값을 별도로 지정해서 특정한 컬럼의 데이터만 불러올 수 있습니다.

SELECT * FROM users
SELECT name, comment FROM users;

SELECT 조회할 컬럼명 FROM 테이블명;
SELECT 조회할 컬럼명 FROM 테이블명;

 

 

 

 

4-3. 조건절을 나타내는 WHERE

(1) SELECT 구문과 함께 많이 사용되며 추출할 데이터의 조건을 명시하여 조건에 만족하는 데이터들만 추출할 수 있습니다.

 

(2) AND 키워드로 조건을 모두 만족할 수 있도록 이어줄 수 있고 OR 키워드로 조건 중 하나 이상을 만족하도록 설정할 수 있습니다.

 

(3) 아래 쿼리처럼 조건을 만족하는 경우에만 데이터를 추출할 수 있습니다. 

SELECT name, age FROM users WHERE married = 0 AND age >= 25;
SELECT name, age FROM users WHERE married = 1 OR age > 25;

AND로 조건을 이어준 경우
OR로 조건을 이어준 경우

 

 

 

 

4-4. 정렬해서 찾기 : ORDER BY

(1) ORDER BY 구문으로 특정 컬럼의 데이터들을 순서대로 정렬할 수 있습니다.

 

(2) DESC, ASC 옵션은 차례대로 내림차순, 오름차순 정렬입니다.

SELECT id, name FROM users ORDER BY age DESC;
SELECT id, name FROM users ORDER BY age ASC;

 

 

 

 

4-5. 출력할 행의 개수 조절 : LIMIT, OFFSET

- 모든 행은 첫 인덱스가 1부터 시작하지만 컴퓨터 기준에서 모든 처음 행의 인덱스 값은 0으로 처리합니다. 또한 0은 생략 가능하다는 특성상 아래와 같은 쿼리를 예로 들 수 있습니다.

 

(1) LIMIT 옵션의 경우 엔트리에서 값을 몇 개만 가져올지, OFFSET은 어디서부터 가져올지 결정할 수 있는 옵션입니다.

 

(2) ORDER LIMIT n, m

- (n + 1)행부터 m개의 행을 가져옵니다.

- 처음부터 가져올 경우 Index = 0이므로 아래와 같이 쿼리를 쓸 수 있습니다.

-- 처음 시작 행(Index = 0)부터 10개만 가져오기
SELECT * FROM 테이블명 LIMIT 10;

 

(3) ORDER LIMIT n OFFSET m

- (m + 1)번째 행부터 n개를 가져옵니다.

-- 6번 행부터 20개의 행을 가져옵니다.
SELECT * FROM 테이블명 LIMIT 20 OFFSET 5;

 

LIMIT, OFFSET Query

 

 

 

 

4-6. Update

(1) 데이터베이스의 컬럼에 대한 값을 수정해야 할 때 사용하는 Update 구문입니다.

 

(2) UPDATE 테이블명 SET 컬럼명 = 변경할 값 WHERE 조건문

UPDATE nodejs2.users SET comment = 'wonjun2 내용 변경' WHERE id = 2;

 

(3) 아래와 같이 쿼리를 주게 되면 users 엔티티에서 컬럼 id = 2에 해당하는 사용자의 comment 컬럼 데이터가 변경된 것을 확인할 수 있습니다.

UPDATE nodejs2.users SET comment = 'wonjun2 내용 변경' WHERE id = 2;

 

 

 

 

4-7. Delete

(1) 데이터베이스의 특정 데이터를 삭제하고자 할 때 사용할 수 있는 Delete 구문입니다. 일반적으로 특정 조건을 만족하는 데이터만 삭제될 수 있도록 WHERE 구문과 함께 사용됩니다.

 

(2) DELETE FROM 테이블명 WHERE 조건

DELETE FROM nodejs2.users WHERE id = 2;

DELETE FROM nodejs2.users WHERE id = 2;

 

 

 

 

 

 

5. Reference

Node.js 교과서(Node.js Textbook) - 저자 : 조현영 

https://www.zerocho.com/book/1

 

ZeroCho Blog

ZeroCho의 Javascript와 Node.js 그리고 Web 이야기

www.zerocho.com

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 댓글로 남겨주시면 감사하겠습니다!

댓글