All Articles

허선생님과 함께하는 Maria DB로 데이터 만들기와 Node.js에서 적용

image.png

Maria db 설치하기

brew install mariadb 명령어로 설치!

  • 서버 시작 : mysql.server start
  • 서버 멈춤 : mysql.server stop
  • 실행중인 서버 상태확인 : mysql.server status
  • 접속 : mysql -uroot

스크롤을 내리면 나오는 캡쳐들이 사실 시간순서와 관계없긴 하지만 내용은 시간 순서이니.. 캡쳐 내용을 많이 신경쓰지 말것!

ex) 이미 데이터 만들고 마리아디비에서 확인을 했지만, 글의 순서상 마리아디비에서 데이터를 먼저 확인한다.

서버 켜기

image.png

mysql.server start로 서버 켜주거나 혹은 mysql만 입력해도 됨

image.png

위 명령어를 통해 내 컴퓨터가 서버가 된건데, 이 서버는 데이터 베이스 여러개 가질 수 있음. 자! 이제 데이터베이스를 한번 만들어보자!

database 만들기
create database wecode; <- 끝에 땀 꼭 붙여야 한다! 땀 안 쓰면 문장이 계속 이어지는 줄 앎.. 나는 데이터베이스 이름을 wecode로 지정했다

선택한 이름의 database 목록 보기
use wecode로 선택한 이름의 database에 접근할 수 있고

database 목록 보기
show databases; <- 이때 땀방울 꼭 붙여야 함!
show명령어가 터미널에서 ls와 비슷한 명령어 같은 느낌적인 느낌쓰.. 기존 데이터베이스 목록을 보여준다.

image.png

위의 캡쳐이미지는 wecode database에 접속해서 database 목록을 조회하는 화면!

테이블에 담긴 정보를 받아오기 select 무엇 from 테이블명; 명령어를 통해 원하는 정보들을 가지고 올 수 있다. select 는 CRUD에서 read에 해당되는 것! 읽기모드 인것이다~ 무엇의 요소들은 쉼표를 통해 여러 개의 값을 조회할 수 있고, 아니면 *표를 통해 전체 조회가 가능쓰!

예를 들어, post table에서 content와 createdAt만 가져오고자 한다면!
select title, createdAt from post;라고 하면 된다.

image.png

전체를 다 가져오고 싶다??? select * from post; 라고 하면

image.png

짠 다 볼 수 있다! 이제 권한을 부여해볼건데..!

create user wecode_user@localhost identified by 'wecode1234';

위의 명령어를 통해 username과 password를 설정하고 권한을 부여해야 함.

grant all privileges on wecode.\* to wecode_user@localhost; 이렇게 권한을 부여하면 관리자권한으로 mysql을 쓰는것!

database에서 나가기
간단하게 exit 명령어로 나갈 수 있다!

권한도 부여했으니, 다시 한번 wecode 데이터베이스에 접속해보자!

image.png

데이터베이스이름 -u 사용자이름 -p u와 p는 각각 user와 password를 나타낸다.
다만 비번을 공개된 창에 쓰면 쫌 그러니깐, 엔터 한벙 치고 보이지 않는 상태에서 써준다.

project로 다시 돌아가서…

npm i sequelize
npm i mariadb
npm i dotenv

세 가지 명령어 입력 고고!! 하나씩 다시 살펴보자.

sequelize

사전적 정의로는 속편을 만들다. 라는 뜻!
하나의 ORM(Object Relation Mapping)으로써 => db의 관계를 객체로 mapping 한다! 프로그래밍적인 걸로 sql 쿼리를 대신 날려주는 것. orm이 없어도 되긴 하는데, 이걸 써야 개발이 편해지는 것. sql은 조금 관계성을 보기엔 좀 이질적이라고 한다!

mariadb

mariadb는 connection을 관리하는 친구(보통 connector라고 함)
요건 필수로 설치해야 한다! 데이터베이스는 http가 아니기 때문에
fetch 같은거 못쓰고 별도의 프로토콜을 써야 하는데, mariadb는 그걸 관리해주는 애!

dotenv

dotenv 는 환경변수 관리 즉, 마리아디비에 로그인하는 것..
마리아디비에 사용자랑 비번 만들었으니깐 요청할때마다 사용자명과 암호를 치는 것!
이 정보를 어딘가에 저장을 해야하는데, 소스코드에 있으면 데이터베이스 암호도 털리니까 별도의 공간에 데이터베이스 로그인 정보를 따로 빼놓는 장치. 개발환경 및 배포환경이 달라야 할때 환경변수를 사용.

dotenv 파일을 Github에 안 올라가게 하려면..

  • 프로젝트에 .env파일 만듬
  • gitignore에 .env 추가
  • .env 파일에 아래와 같이 써준다
//.env

DB_NAME = wecode; // database name
DB_USERNAME = wecode; // username
DB_PASSWORD = wecode; // password

나는 시험삼아 그냥 다 wecode로 설정해놨는데.. 이렇게 하면 안된다 ㅋㅋ

  • 그담에 server.js 젤 첫줄에다가 이거 한 줄 추가

require('dotenv').config()

  • db.js 파일을 만든다.
// db.js

const Sequelize = require('sequelize');
const sequelize = new Sequelize({
  port: 3306, // database default port(고정값)
  database: process.env.DB_NAME,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  host: 'localhost',
  dialect: 'mariadb',
});

이렇게 환경변수 설정(마리아디비 로그인)까지 완료했고 이제 sequelize를 해줄거다 이걸 왜 해주냐 하면.. 예를들어 post table을 만들었다고 생각해보자!

노드 코드 어딘가에다가 문자열로 SELECT user,~~~ from~~ where~~ 막 이렇게 구구절절 써야하는데 이걸 자동화해주는게 ORM이다!

이걸 하기위해선 먼저 스키마 정의를 해야하는데, models라는 폴더를 만들고 거기에 post.js를 만들어줄것이다!

sequelize.org 공식문서에 가면 방법이 상세히 나와있음!

//post.js

module.exports = (sequelize, types) => {
  return sequelize.define(
    'post',
    {
      // 파일명이라 post
      title: {
        type: types.TEXT('tiny'),
        allowNull: false, // 필수라서 Not Null이라고도 함. NN
        defaultValue: '제목없음',
      },
      content: {
        type: types.TEXT,
        allowNull: false,
      },
    },
    {
      tableName: 'post',
    }
  );
};

이걸 app에서 불러올거임

// app.js
// 앞부분 생략쓰
// export한 요소 세개가 db 변수에 들어오는 것.
// 비구조화 할당 가능쓰
// const db = require('./db')
const { sequelize } = require('./db');

// 서버가 시작되는 순간에 실행이 되게 하는 것!
sequelize.sync();

이제 서버를 켜면!!

image.png

내가 만든 wecode data가 뙇!!! 터미널에 뜬다.

이제 내용을 담아볼거다!

지난번에 했던 것중 routes폴더에 post.js를 post-json으로 바꿔주곻

const express = require('express');
const router = express.Router();

const {
  getOnePost,
  getAllPosts,
  updatePost,
  createPost,
  deletePost,
  validate,
} = require('../controllers/post-json');
const { validationMiddleware } = require('../controllers/validator');

// 목록조회
router.get(
  '/',
  validationMiddleware(validate.offset, validate.limit, validate.order),
  getAllPosts
);

// 단일조회
router.get('/:id', validationMiddleware(validate.id), getOnePost);

// 생성
router.post('/', validationMiddleware(validate.body), createPost);

// 수정
router.put(
  '/:id',
  validationMiddleware(validate.id, validate.body),
  updatePost
);

// 삭제
router.delete('/:id', validationMiddleware(validate.id), deletePost);

module.exports = router;

index.js에 있는 post변수명들을 postJSON으로 바꿔주었음.

그러고 다시 controllers/post.js 로 돌아와서…

const { post } = require('../db');
// ORM으로 모델 정의한 걸 불러옴
// post 테이블이 어떤 속성을 가지고 있는지, 데이터 사용자명 같은 정보도 다 들어있음

const getAllPost = async (req, res, next) => {
  // 데이터베이스는 비동기임. 웹서버 바깥에서 자원을 가지고 오는 거락서(node.js 바깥쪽에서 갖고오는거)
  const result = await post.findAll({});
  console.log(result, '결과당~~₩');
  res.end();
};

const createPost = async (req, res, next) => {
  const result = await post.create({
    title: '나는 제목이당',
    content: '나는 내용쓰',
    // Post 보낼때마다 새로운 내용 쓰고 싶으면 비구조화 할당으로 title, content라고 써줌
  });
  console.log(result);
  res.end();
};

createPost를 작성하고 post로 post를 보내보자!

image.png (몰랐는데 Postman에 다크모드가 있어서 적용해봤다 ㅋㅋ)

이번엔 get을 해줄거다! 그 전에 getAllPost를 작성해준다.

const getAllPost = async (req, res, next) => {
  try {
    const { offset = 1, limit = 20 } = req.query; // 등호 옆에는 기본값 넣어준 것
    const { count, rows } = await post.findAndCountAll({
      // 배열에 숫자가 붙어있음.
      offset: parseInt(offset) - 1,
      limit: parseInt(limit),
    });
    // 데이터베이스는 비동기임. 웹서버 바깥에서 자원을 가지고 오는 거락서(node.js 바깥쪽에서 갖고오는거)

    const results = rows.map((e) => e.toJSON());
    res.json({
      message: '조회함',
      data: { count, results },
    });
  } catch (err) {
    next(err);
  }
};

이제 겟 날리면

image.png

짠 get했더니 넘나 잘 나오고 있고요!

다음번 포스팅은 크롤링에 대한 것이다! 이런 저런 세션으로 수업이 계속 미뤄졌는데 다음주 월요일일부터 다시 재개될듯~? 그동안 Node도, 비동기도, Promise도 다 열심히 공부하자 아자아자!!!

오늘의 느낀 점…

  • 비구조화할당 열심히 공부할 것!
  • Promise 열심히 공부할 것!
  • node.js 구조 확실히 공부할 것!
  • 허선생님 최고 ㅠㅠ