과목명 : 웹 서버 프로그래밍(Web Server-side programming with Node.js)
수업일자 : 2023년 05월 25일 (목)
1. 데이터베이스(Database)
1-1. 지금까지 배웠던 내용들은 데이터베이스를 사용하지 않고 특정 데이터를 서버의 메모리에 저장
(1) 서버를 재시작하는 경우 메모리에 저장된 데이터들이 모두 삭제되면서 데이터의 *영속성(Persistance)을 유지할 수 없다는 치명적인 단점이 존재합니다.
* 영속성(Persistance) : 컴퓨터 과학(Computer Science, CS)에서의 영속성(Persistance)이란, 특정한 데이터를 생성한 프로그램이 종료되더라도 해당 데이터가 사라지지 않는 속성을 의미하고 있습니다.
(2) 사용자의 정보를 안전하게 유지할 수 있는 데이터베이스를 사용해서 안정적인 서비스를 유지해야 할 필요성이 있습니다.
1-2. MySQL(RDBMS : Relational Database Management System)
(1) 데이터베이스(Database)
- 데이터베이스는 구조화된 특정한 데이터들 또는 조직화된 데이터들의 집합입니다.
- 서로 관련성을 가지고 중복이 없는 데이터들의 집합으로 볼 수 있습니다.
(2) DBMS(Database Management System)
- 데이터베이스 관리 시스템으로써, 데이터를 저장할 저장소를 만들고 해당 저장소에 권한이 있는 여러 사용자가 접근하여 데이터를 저장 및 관리할 수 있는 응용 소프트웨어 프로그램입니다.
(3) RDBMS(Relational Database Management System)
- 위에서 설명한 DBMS로써 다루는 데이터의 대상이 관계형 데이터베이스(RDB)인 DBMS를 RDBMS라고 정의합니다. 관계형 데이터베이스를 만들고 이에 대한 데이터를 저장 및 관리할 수 있는 응용 소프트웨어입니다.
- RDB의 종류로는 Oracle, MySQL, PostgreSQL, MSSQL 등이 있습니다.
(4) NoSQL(Not-only SQL)
- NoSQL 데이터베이스의 경우 다루는 데이터의 타입이 RDB가 아닌 Key-value, Document, Graph, Wide-column store로 이루어진 데이터 타입을 다루는 비관계(Non-relational) 또는 비정형(Unstructured) 데이터베이스를 말합니다.
- 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를 실행시킵니다.
(2) Custome 타입 선택 후 Next를 클릭합니다.
(3) Available product 항목에서 MySQL Server, Workbench를 선택하고 Next를 클릭합니다.
(4) Execute 버튼을 클릭해 설치를 진행합니다.
(5) Authentication Method 페이지에서 2번 째 체크 타입인 Legacy Authentication Method 항목을 선택합니다.
(6) 루트 계정의 비밀번호를 설정합니다.
(7) 모든 설정을 완료한 화면으로, Execute를 클릭해 최종 단계로 넘어갑니다.
(8) 설치 및 환경설정이 완료되었습니다.
2-2. Windows 기준 Command prompt 또는 Powershell에서 MySQL 접속하기
(1) 커맨드 라인 조작을 위한 MySQL의 기본 경로는 C:\Program Files\MySQL\MySQL Server 8.0\bin이며 Windows 환경변수 설정 페이지에서 해당 주소를 등록하여 Prompt 또는 Powershell을 띄우고 초기에 경로 이동 없이 바로 커맨드를 줄 수 있게 하기 위해 환경 변수를 지정해 주도록 하겠습니다.
(2) 환경 변수 편집 페이지에서 아래와 같은 새로운 환경 변수를 등록합니다.
(3) 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 우측의 "+" 버튼을 클릭합니다.
(2) Connection Name, Port 정보를 설정하고 Connection 생성을 완료합니다.
(3) 설치 과정에서 입력했던 루트 권한 계정의 패스워드를 입력하고 OK를 누릅니다.
(4) MySQL Workbench를 통해 데이터베이스에 접속한 화면을 확인할 수 있습니다.
3. 데이터베이스, 데이터베이스 테이블(Entry) 생성
3-1. Console 환경에서 MySQL에 접속하고 새로운 nodejs 데이터베이스를 생성
(1) 데이터베이스 생성
- CREATE SCHEMA 데이터베이스명;
CREATE SCHEMA nodejs;
(2) 데이터베이스 조회
- SHOW databases;
SHOW databases;
(3) 생성된 데이터베이스 결과를 Workbench상에서 조회해 보기
- SCHEMAS 영역에서 마우스 우측 클릭 후 Refresh All 클릭
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(로우)라고 합니다.
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;
3-8. MySQL Workbench를 통한 테이블 생성
- 새로운 nodejs2 데이터베이스 생성
CREATE SCHEMA nodejs2;
show databases;
(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) 환경에서 작업이 수행되었습니다.
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 엔트리(테이블) 생성 결과
- 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; 쿼리로 엔트리를 조회합니다.
4. CRUD (Create Read Update Delete)
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');
4-3. Read - SELECT
(1) SELECT 조회할 컬럼명 FROM 테이블명;
- SELECT 구문은 하나 또는 그 이상의 테이블에서 컬럼에 대한 데이터를 추출할 때 사용하는 구문입니다.
- 컬럼명 부분에 *(Asterisk)가 들어가는 경우 테이블의 모든 컬럼을 조회한다는 의미입니다.
- 전체 컬럼이 아닌 컬럼값을 별도로 지정해서 특정한 컬럼의 데이터만 불러올 수 있습니다.
SELECT * FROM users
SELECT name, comment FROM users;
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;
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;
4-6. Update
(1) 데이터베이스의 컬럼에 대한 값을 수정해야 할 때 사용하는 Update 구문입니다.
(2) UPDATE 테이블명 SET 컬럼명 = 변경할 값 WHERE 조건문
UPDATE nodejs2.users SET comment = 'wonjun2 내용 변경' WHERE id = 2;
(3) 아래와 같이 쿼리를 주게 되면 users 엔티티에서 컬럼 id = 2에 해당하는 사용자의 comment 컬럼 데이터가 변경된 것을 확인할 수 있습니다.
4-7. Delete
(1) 데이터베이스의 특정 데이터를 삭제하고자 할 때 사용할 수 있는 Delete 구문입니다. 일반적으로 특정 조건을 만족하는 데이터만 삭제될 수 있도록 WHERE 구문과 함께 사용됩니다.
(2) DELETE FROM 테이블명 WHERE 조건
DELETE FROM nodejs2.users WHERE id = 2;
5. Reference
Node.js 교과서(Node.js Textbook) - 저자 : 조현영
https://www.zerocho.com/book/1
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 댓글로 남겨주시면 감사하겠습니다!
댓글