데이터를 저장하는 방식은 몇 가지가 존재합니다.

초기에는 파일(File)에 저장하여 사용했습니다. 하지만, 문제가 많았습니다.

보안적인 문제도 있었고, 검색이나 정렬등을 하기에 한계가 있었습니다. 그래서 등장합니다~~

 

바로바아~~~로~~~~~~ Database !!

 

이 방식은 우리 컴퓨터에 깔려있는 스프레드 시트 또는 엑셀과 비슷한 구조로 되어있다는 것을 알 수 있습니다.

공통점으로는 표의 형태로 눈에 보기 쉽게 되어있으며, 정렬하기 쉽고 숨기거나 검색을 하기도 용이합니다.

하지만, 엑셀도 결국 파일이므로 데이터를 내 컴퓨터에서만 사용할 수 있습니다.

하지만, 데이터베이스는 서버 기반으로 코드를 통해서 데이터를 관리할 수 있으며, 전 세계 사람 누구나 볼 수 있도록 할 수 있습니다.

 

데이터베이스는 RDBMS(관계형 데이터베이스 시스템)인 SQL형과 No-SQL형 두 가지 종류로 나뉩니다.

 

Structured Query Language

 

이 두가지는 나중에 알아보고 어떤것이 가장 인기있는 데이터베이스인지 알아봅시다.

 

https://db-engines.com/en/ranking

이렇답니다. 오라클이라는 초대형 데이터베이스와 견주어도 스코어가 막상막하인것 보이시나요?

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

MySQL 용어

id name age
1 GIL 50
2 JANG 32

이러한 구조로 데이터가 저장되게 되는데, 이 표를 Table이라고 하며, Table들이 하나의 Database로 저장되어 관리됩니다.

Mysql에서는 스키마(schema)라는 의미와 데이터베이스를 같은 뜻으로 취급한다. 따라서, 코딩도 동일합니다.

데이터베이스마다 스키마의 의미가 다르기 때문에 난해한 용어인 것 같습니다. 어쨋든 Mysql에서는 테이블 등의 오브젝트 집합입니다.

 

mysql > CREATE DATABASE `user`;

mysql > CREATE SCHEMA `post`;

 

그럼, mysql를 사용해봅시다.

 

터미널을 열고, 다음과 같이 root로 접속해봅시다.

 

$ mysql -u root -p

 

Mysql을 설치할때 입력했던 비밀번호를 넣어주면, 

이렇게 Welcome!!!

 

mysql> 

 

이렇게 나오면, mysql에 접속이 성공적으로 마쳤습니다! 예~ 이제 Mysql문법을 하나하나 작성해봅시다.

 

1. 데이터베이스 생성 --> create database 데이터베이스이름; ( CREATE DATABASE 데이터베이스이름;)

 

대소문자는 구분없이 명령은 잘 되는데, 대문자로 하는게 관습이라고 합니다.

 

무조건 문장의 끝은 세미콜론(;)을 붙여줘야합니다. 그렇지 않고 Enter를 치면 안 끝났다고 생각하고 아래와 같이 계속 말하라고 합니다.

문장 끝에 ;을 입력해주세요

 

에러 없이 데이터베이스 생성!

 

무조건 Query OK, 가 나와야 성공한 겁니다. 그외 이상한 문장이 나왔으면 오타일 확률 99.999%입니다~~ 오타 주의!!

에러 문장

 

2. 데이터베이스 제거(삭제) --> drop database 데이터베이스이름;

 

3. 데이터베이스 목록 보기

show databases;

 

4. 특정(데이터베이스이름) 데이터베이스 선택하기(사용하겠다)

user 데이터베이스이름;

 

5. 테이블 생성하기 create table 테이블명(....ㅇㅇ...);

 

 

 

6. 테이블 목록 보기

show tables;

 

6. 테이블 삭제하기

show table 테이블명;

 

테이블 이름 바꾸기

rename table 기존_테이블명 to 변경할_테이블명;

 

8. 테이블 구조 확인하기

DESC users;

 

CRUD 명령어 작성

 

1. 생성하기. Create가 아니라, insert 명령어입니다.

 

1. INSERT INTO테이블이름(필드이름1, 필드이름2, 필드이름3, ...)  VALUES (데이터값1, 데이터값2, 데이터값3, ...)

 

2. 조회하기 : Select

 

SELECT * FROM users; -- users 테이블에 있는 모든 row를 보여준다. 

SELECT id, email FROM users; -- users 테이블에 있는 모든 row를 보여주는데, id와 email만 보여준다.

SELECT id, email FROM users WHERE first_name="HONG"; -- users 테이블에 있는 row중에, first_name이 HONG인 사람만 보여주는 조건식이다.


WHERE 문 뒤에 ORDER BY로 정렬까지 붙여서 사용할 수 이싿 

Posted by sungho88
,

__dirname & __filename :

 

실행하는 파일의 디렉토리 경로를 출력해준다. OS마다 경로 설정 방식이 다른데, (맥 ㅇㅇ/ㅇㅇ/ㅇㅇ/...) (윈도우 ㅁㅁ\ㅁㅁ\ㅁㅁ\...)  

__dirname을 사용하면 편하게 출력할 수 있다.

__filename을 사용하면, __dirname + 해당파일의 이름까지 붙여서 출력할 수 있다.

 

[URL 구조]

생활코딩 URL 강의 참고...

 

Posted by sungho88
,

시퀄라이즈는 SQL문을 자바스크립트 프로젝트 내에서 자바스크립트 객체로 작성할 수 있습니다. 

그렇지만, 시퀄라이즈 자체의 SQL과 다른 문법이 존재하기 때문에 이것도 익히는데 시간이 걸릴 것 같습니다.

또한, SQL문 데이터베이스를 다룰 백엔드 개발자라면 필수로 배우고 알아둬야하기 때문에 어떤 것을 쓰는게 맞을지 모르겠습니다.

하여튼 Sequelize 문법을 알아보겠습니다. 위에 SQL을 적어 해당 SQL문이 시퀄라이즈로 작성할때 어떻게 바뀌는지 보겠습니다.

 

먼저, 가장 간단한 CRUD부터 익혀보겠습니다. 

 

1) 생성하기(INSERT) 

INSERT INTO users (name,age,married,comment) VALUES ('JANG', 24, 0, '코멘트~');

 

User.create({ // Promise 방식 

name: 'JANG',

age:24,

married: false,

comment: '코멘트~'

});

 

2) 조회하기(SELECT)

// 모든 컬럼을 전부 가지고 오기.

SELECT * FROM users;

 

User.findAll():

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

// 일부 컬럼만 전부 가지고 오기.

SELECT name, married FROM users;

 

User.findAll({

attributes: ['name','married'],

});

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[WHERE절 추가]

 

SELECT * FROM users WHERE authorId = 2

 

User.findAll({

 where: { authorId: 2 }

});  

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SELECT * FROM users WHERE authorId = 12 AND status = 'active';

 

User.findAll({

 where: {

  authorId: 12,

  status: 'active'

   }

});

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

Op라는 연산자가 존재한다. 이것으로 조건문등의 조건을 정할 수 있다.

 

Op.eq --> SELECT * FROM users WHERE authorId = 2와 동일하다.

const { Op } = require("sequelize");
User.findAll({
  where: {
    authorId: {
      [Op.eq]: 2
    }
  }
});

Op.and --> 위 SELECT * FROM users WHERE authorId = 12 AND status = 'active'; 와 동일해짐.

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.and]: [
      { authorId: 12 },
      { status: 'active' }
    ]
  }
});

Op.or --> SELECT * FROM users WHERE authorId = 12 OR authorId = 13; 을 표현할 수 있다.

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.or]: [
      { authorId: 12 },
      { authorId: 13 }
    ]
  }
});

위와 같이 동일한 필드를 조건문으로 찾을 경우, 구조를 바꿔서 좀 더 읽기 쉽게 바꿀 수 있다.

 

DELETE FROM post WHERE authorId = 12 OR authorId = 13;

const { Op } = require("sequelize");
Post.destroy({
  where: {
    authorId: {
      [Op.or]: [12, 13]
    }
  }
});

그 외 엄청나게 많은 종류의 연산자를 제공한다.

너무 많고해서 복붙해 넣었다. 이런게 있구나만 보고 넘어가자.

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.and]: [{ a: 5 }, { b: 6 }],            // (a = 5) AND (b = 6)
    [Op.or]: [{ a: 5 }, { b: 6 }],             // (a = 5) OR (b = 6)
    someAttribute: {
      // Basics
      [Op.eq]: 3,                              // = 3
      [Op.ne]: 20,                             // != 20
      [Op.is]: null,                           // IS NULL
      [Op.not]: true,                          // IS NOT TRUE
      [Op.or]: [5, 6],                         // (someAttribute = 5) OR (someAttribute = 6)

      // Using dialect specific column identifiers (PG in the following example):
      [Op.col]: 'user.organization_id',        // = "user"."organization_id"

      // Number comparisons
      [Op.gt]: 6,                              // > 6
      [Op.gte]: 6,                             // >= 6
      [Op.lt]: 10,                             // < 10
      [Op.lte]: 10,                            // <= 10
      [Op.between]: [6, 10],                   // BETWEEN 6 AND 10
      [Op.notBetween]: [11, 15],               // NOT BETWEEN 11 AND 15

      // Other operators

      [Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)

      [Op.in]: [1, 2],                         // IN [1, 2]
      [Op.notIn]: [1, 2],                      // NOT IN [1, 2]

      [Op.like]: '%hat',                       // LIKE '%hat'
      [Op.notLike]: '%hat',                    // NOT LIKE '%hat'
      [Op.startsWith]: 'hat',                  // LIKE 'hat%'
      [Op.endsWith]: 'hat',                    // LIKE '%hat'
      [Op.substring]: 'hat',                   // LIKE '%hat%'
      [Op.iLike]: '%hat',                      // ILIKE '%hat' (case insensitive) (PG only)
      [Op.notILike]: '%hat',                   // NOT ILIKE '%hat'  (PG only)
      [Op.regexp]: '^[h|a|t]',                 // REGEXP/~ '^[h|a|t]' (MySQL/PG only)
      [Op.notRegexp]: '^[h|a|t]',              // NOT REGEXP/!~ '^[h|a|t]' (MySQL/PG only)
      [Op.iRegexp]: '^[h|a|t]',                // ~* '^[h|a|t]' (PG only)
      [Op.notIRegexp]: '^[h|a|t]',             // !~* '^[h|a|t]' (PG only)

      [Op.any]: [2, 3],                        // ANY ARRAY[2, 3]::INTEGER (PG only)

      // In Postgres, Op.like/Op.iLike/Op.notLike can be combined to Op.any:
      [Op.like]: { [Op.any]: ['cat', 'hat'] }  // LIKE ANY ARRAY['cat', 'hat']

      // There are more postgres-only range operators, see below
    }
  }
});

 

Posted by sungho88
,