Nodejs/DB

Database - MySQL #1

Sila 2022. 2. 18. 16:48

지금까지 js에서 listen 메소드를 사용해 서버를 구동할 때 전부 데이터를 메모리에 저장했다.

 

그렇기 때문에 서버를 한 번 끄면 저장한 모든 데이터들이 날아가버렸다.

 

실제 서버에서는 정보를 저장하기 위해 DB, 데이터베이스를 이용한다.

 

 

이 데이터를 관리하는 프로그램이 있는데, 이들을 통틀어 database manage system (DBMS) 라고 칭한다.

 

여기서는 dbms중 하나인 mysql을 셋업, 사용하는 법을 알아보자.

 

1.  설치

MySQL도 라이브러리이므로 npm으로 받을 수 있다.

 

우선 패키지를 설치하기 전에 다음 두 줄을 순차적으로 입력해 패키지 리스트를 최신화해준다.

 

sudo apt upgrade
sudo apt update

 

(뭘 설치하든 안되면 일단 이거부터 해보면 된다.)

sudo apt install mysql-server

 

설치가 되었다면

 

sudo service mysql start
sudo mysql

 

를 입력해 실행한다.

 

제대로 실행이 되었다면 

 

mysql >

 

이렇게 커서 앞에 mysql이 붙어있음을 확인할 수 있다.

 

2.  사용

MySQL도 자체적인 문법이 있으며, 이 문법에 따라 명령어를 입력해야 원하는 바를 실행할 수 있다.

 

2.1 DB 생성

우선 현재 데이터 베이스의 목록을 보자.

 

show databases;

 

(문장 끝마다 반드시 (;)을 붙여줘야 실행된다.)

 

현재 생성된 데이터베이스 항목이 나타나는 것을 볼 수 있을 것이다.

 

이것들은 건드리지 말고 새로운 데이터베이스를 하나 생성해보자.

 

create database [DB명];

 

이렇게 하면 기입한 이름을 가진 DB를 하나 생성할 수 있다.

 

예를 들어 practice로 DB명을 정하고 싶다면

 

create database practice;

 

이렇게 입력하면 된다.

 

다시 데이터베이스 목록을 확인하면 새로운 DB가 생성된 것을 알 수 있다.

 

이제 우리가 조작할 DB를 지정해줘야한다.

 

방금 생성한 DB를 조작할 것이므로 이 DB를 지정해주자.

 

use [DB명];

 

2.2 DB 조작

이제 DB안의 table 상태를 확인해보자.

 

엑셀에 비유해보자면 DB는 엑셀 파일, 테이블은 파일 내의 각각의 시트라고 생각하면 된다.

 

show tables;

 

지금은 내가 아무것도 DB안에 만들지 않았으므로 아무것도 없다고 나온다.

 

다음으로 테이블에 어떤 데이터들이 올지 그 종류와 갯수를 우선 설정한 후,

 

데이터를 입력, 수정하고 table 안의 데이터를 확인하는 방법에 대해 알아보자.

 

2.2.1 테이블 셋업

우리가 어떤 사람에 대한 자료를 저장하고 싶고,

 

그 사람의 이름, 나이, 생년월일을 데이터베이스에 넣고 싶다고 가정해보자.

 

우선 각각의 정보를 종류별로 분류해야한다.

 

엑셀로 치환해 생각해보면 각 column의 이름을 정하는 작업이 선행되어야 한다.

 

MySQL에서는 column대신 field라고 이름을 붙인다.

 

MySQL에서도 특정 명령어를 사용해 각각의 열의 이름과 형식을 설정해줄 수 있다.

 

create table members(
   name varchar(50),
   age int(40),
   birth date,
);

 

;을 치기전까지는 제출되지 않으므로 comma를 치고 엔터를 쳐도 된다.

 

member라는 table을 만드는데,

 

그 안에 이름, 나이, 생일에 대한 정보를 담을 것이다.

 

각각의 데이터 형식, 최대 용량도 함께 지정해준다.

 

varchar 는 문자열, int는 정수, date는 날짜 형식을 의미하며,

 

괄호 안의 숫자는 데이터의 최대 용량을 바이트 단위로 보여주는 것이다.

 

이제 테이블 리스트를 다시 불러오면 members라는 테이블이 생긴 것을 확인할 수 있을 것이다.

 

이제 틀은 만들어졌고, 이 테이블 안에 데이터를 저장해보자.

 

2.2.2 데이터 삽입 (INSERT INTO)

INSERT INTO [테이블명]([필드1], [필드2],[필드3]) values(['값1'], ['값2'], ['값3'])

과 같이 작성해주면 필드n이라는 항목에 값n이라는 데이터를 생성해 저장할 수 있다.

INSERT INTO members(name, age, birth) values(sila, 29, 19940916);

이렇게 입력하면 sila라는 사람의 나이와 생년월일을 저장했다.

 

date 타입의 데이터는 입력시 '-' 없이 YYYYMMDD 형식으로 적어주면 알아서 '-'를 넣어 표시해줄 것이다.

 

비슷하게 두 개의 데이터를 더 추가해보자.

INSERT INTO members(name, age, birth) values(test, 20, 19900101);
INSERT INTO members(name, age, birth) values(chro, 25, 19980515);

이제 3개의 데이터가 테이블 안에 추가되었다.

 

2.2.3 데이터 불러오기 (SELECT)

생성한 데이터를 불러오기 위해서는 SELECT문을 사용한다.

 

우선 모든 데이터를 불러오는 방법부터 알아보자.

SELECT * FROM members;

이렇게 입력해주면 members table안의 모든 데이터를 불러와줄 것이다.

 

 

지금까지 문제없이 진행되었다면 다음과 같은 결과를 볼 수 있을 것이다.

 

여기서 특정 조건을 만족하는 데이터만 가져오고 싶다면 WHERE문을 추가해서 사용한다.

 

예를 들어 sila라는 사람의 데이터만을 가지고 싶다면 name='sila' 를 만족하는 데이터셋을

 

가져오도록 할 수 있다.

 

SELECT * FROM members WHERE name='sila'

 

이렇게 입력하면 name field의 value가 sila인 데이터를 가져온다.

 

 

이번엔 데이터 셋 전체를 가져오지 말고 특정 field만 가져오도록 해보자.

 

*대신 불러올 field를 선택해주면 된다.

 

예를 들어 29살인 사람들의 이름만을 보고 싶다면 다음과 같이 불러올 field를 입력한다.

 

SELECT name FROM members where age=29;

 

 

2.2.4 데이터 수정 (UPDATE)

데이터의 수정과 삭제는 조건을 걸지 않으면 한 방에 테이블을 통쨰로 날려버릴 수 있으므로 주의해야한다.

 

UPDATE [테이블명] SET [바꿀 필드명] = '새로운 값' WHERE [선택할 필드]='선택할값';

 

조건을 만족하는 값을 가진 필드의 값을 바꿔준다.

 

WHERE 절이 없다면 지정 field의 모든 값을 바꿔버리므로 주의한다.

 

입력해줄 값이 많아서 좀 어려운데

 

생년 월일이 94년 9월 16일인 사람의 나이가 29살인데,

 

생일이 지나 한 살 올려주고 싶다고 하자.

 

UPDATE members SET age=30 WHERE birth=19940916;

 

이렇게 birth field에 19940916이라는 값을 가진다는 조건을 만족한 데이터셋을 가져와 age=30 으로 바꿔주는 것이다.

 

입력 후, 결과를 불러와보면 나이가 30으로 바뀐 것을 확인할 수 있다.

 

 

2.2.5 데이터 삭제 (DELETE)

마찬가지로 조건을 주지 않으면 테이블을 통째로 날려버리니 주의해야한다.

 

보통은 다음과 같은 형식으로 써준다.

 

DELETE FROM [테이블명] WHERE [필드명]=[value];

 

생년 월일이 1998년 5월 15일인 사람의 데이터를 삭제하고 싶다고 하자.

 

그럼 이를 WHERE 문을 이용해 표현해주면 된다.

 

DELETE FROM members WHERE birth = 19980515;

 

입력 후, 다시 members 테이블을 불러오면 해당하는 데이터가 삭제되었음을 알 수 있다.

 

2.2.6 데이터 정렬 (desc/asc)

마지막으로 데이터를 내림차순 혹은 오름차순으로 정렬하는 방법을 알아보자.

 

SELECT * FROM members order by [필드명] asc/desc;

 

asc를 마지막에 붙이면 내림차순으로, desc를 붙이면 오름차순으로 데이터를 불러올 것이다.

 

예를 들어 나이가 적은 순서대로 데이터를 정렬해 불러오고 싶다면 

 

SELECT * FROM members order by age asc;

 

라고 입력해주면 된다.

 

2.2.7 테이블, DB 삭제 (DROP)

명령어는 drop으로 DB를 지우든 table을 지우든 동일하다.

 

drop table [테이블명]

 

database를 지우고 싶으면 table 대신 database를 써주면 된다.

 

3. 데이터값의 속성 지정

우리가 게시판을 운영하는데, 해당 시점에서 게시판의 자료들을 백업하고 싶다고 하자.

 

글의 번호, 제목, 내용, 작성일, 조회수를 담은 데이터를 저장 해야한다.

 

이들 각각은 데이터 기입 시 (데이터 타입 말고) 특정한 속성을 추가해줄수 있다.

 

이 속성에 대해 어렵지 않은 것 몇 가지만 알아보자.

 

 

예를 들어, 글번호 같은 경우 굳이 사용자가 작성하지 않아도 알아서 번호가 붙게 할 수 있고,

 

제목이나 내용은 그 데이터 값이 반드시 존재해야한다. (null이면 안된다.)

 

어떤 데이터의 경우, 중복된 값이 존재해선 안되기도 한다.

 

이런 각 field 재각각의 특성을 고려해 데이터를 저장하고 싶을 때 이를 구현하는 방법이 있다.

 

 

/*  mysql > */

CREATE database board;

데이터 베이스를 생성한 후, 

 

테이블들을 생성할 때, 각 테이블의 데이터타입 뒤에 속성을 적어줄 것이다.

 

/*  mysql  */

CREATE TABLE board (
    idx int auto_increment primary key,
    title varchar(40) not null,
    content text not null,
    date timestamp not null,
    hit int not null
);

 

- not null : null값을 허용하지 않는다는 것을 의미한다. 반드시 뭔가 데이터를 넣어줘야 한다.

 

- auto_increment : 생성된 순서대로 자동으로 번호를 카운트해 붙여준다.

 

- primary key : 중복을 허용하지 않는다.

 

4. 외부에서 명령어 입력하기

터미널에서 명령어를 직접 입력하는건 줄을 바꿧다가 오타때문에 에러가 나면

 

명령어를 처음부터 다시 써줘야 한다거나 하는 등 불편한 점이 많다.

 

그래서 외부에 명령어를 미리 써두고, 터미널에서 그 파일에 있는대로 실행해

 

원하는 바를 수행하도록 하는 방법이 있다.

 

4.1 sql 파일 생성

VS code를 열어 새로운 파일을 만든 후, 확장자를 sql로 정한다.

 

그 후, 입력하고 싶은 명령어를 여기서 대신 작성한다.

 

/*  practice.sql  */

insert into members(name, age, birth) 
values('data', 27, 20220219);

 

이 파일을 터미널 > mysql에서 열면 안의 코드가 실행되어 members table안에

 

데이터를 추가해줄 것이다.

 

터미널 > mysql에 다음과 같이 입력한다.

 

source [파일절대경로];

 

문제 없이 실행이 되었다면 select문을 입력해 확인했을 때 데이터가 추가되었음을 확인할 수 있다.

'Nodejs > DB' 카테고리의 다른 글

Database - MySQL #2  (0) 2022.02.19