MongoDB 설치

# 파일 생성
vi /etc/yum.repos.d/mongodb-org-5.0.repo

# 파일 작성
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc

# 파일 생성 완료 후, 설치
yum repolist
yum install -y mongodb-org

# 서비스 시작, 상태 확인
systemctl start mongod
systemctl status mongod

 

포트 변경, 접속 허용 IP 설정

# 파일 수정
vi /etc/mongod.conf

# network interfaces
net:
   port: 27017
   bindIp: 127.0.0.1

 

# network interfaces
net:
   port: 22222
   bindIp: 127.0.0.1,123.123.123.123
   bindIpAll: true
   
security:
   authorization: enabled

MongoDB의 기본 포트는 27017이지만 특정 포트(ex. 22222)로 변경이 가능하다

기본적으로 설치 PC에서만 접속 가능하도록 설정이 되어있어서,  다른 IP (ex. 123.123.123.123)에서도 접속 가능하도록 설정했다

각 IP들은 쉼표(,)로 구분해주어야 하고, bindIpAll 옵션을 추가해야 한다

 

security 옵션은 클라이언트에서 연결 시, 계정을 요구하도록 설정할 수 있다

 

 

 

방화벽 설정

# 방화벽 목록 확인
firewall-cmd --permanent --list-all

# 방화벽 추가
firewall-cmd --permanent --zone=public --add-port=22222/tcp

# 재시작 (적용)
firewall-cmd --reload

# 방화벽 설정 제거
firewall-cmd --permanent --zone=public --remove-port=22222/tcp

 

'데이터베이스 > MongoDB' 카테고리의 다른 글

[NoSQL] NodeJS + MongoDB(mongoose)  (0) 2022.09.12
[NoSQL] MongoDB 설치 - Mac  (0) 2022.09.10

brew 설치

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrew Site


 

MySQL 설치,  설정

# Installation
$ brew install mysql

# version
$ mysql -V

# server start
$ mysql.server start

# server stop
$ mysql.server stop
$ mysql_secure_installation

 

 

root password를 설정하지 않았는데 입력하라고 나오고, 진행이 불가능
brew services list 확인 시, mysql none 확인. brew serviecs start mysql 입력을 통해 started 상태로 변경

# brew command
# list
$ brew services list

# mysql start
$ brew services start mysql

# mysql stop
$ brew services stop mysql

# mysql restart
$ brew services restart mysql

mysql_secure_installation 명령어를 입력해 루트 비밀번호를 설정해 준다

$ mysql -u root -p

루트 비밀번호가 설정되었는지 root 사용자 로그인을 해본다

루트 계정 비밀번호 변경

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '변경할-비밀번호';
mysql> FLUSTH PRIVILEGES;

 

데이터베이스 생성, 사용자 생성

# mysql 쉘 접속
> mysql -u root -p

# database 확인
mysql> show databases;

# database 생성
mysql> create database [database name];

# user 생성
# %는 모든 IP 대해서 해당 계정으로 접속 가능하다는 뜻. 본인 컴퓨터에서 접속하려면 127.0.0.1 또는 localhost 로 설정
mysql> create user 'sejin'@'%' identified by 'userPw';

# user 권한 부여
mysql> grant all privileges on [database name].* to 'sejin'@'%';

# 권한 적용 (변경된 내용을 메모리에 반영)
mysql> flush privileges;

# database 접속
mysql> use [database name];

# shell 환경으로 나와서 생성된 계정으로 접속
mysql> exit
> mysql -u userId -p

 

user 생성 확인 완료

 

계정 접속 IP 제한

mysql> use mysql
mysql> select host,user from user;
mysql> update user set host = 'IP 입력(xxx.xxx.xxx.xxx)' where user = 'userId';
mysql> flush privileges;

 

 

외부 접속 설정

맥북에서 homebrew를 통해 mysql을 설치했고 my.cnf를 통해 포트를 열어줄 수 있다

파일 위치는 /usr/local/etc/my.cnf 에 있었음 (경로는 다를 수 있음)

# vi /usr/local/etc/my.cnf

# 파일 내용
[mysqld]
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1

bind-address 값을 0.0.0.0 (모든 IP 요청 허용) 으로 변경한다  → 이제부터 포트 요청이 가능함 (telnet으로 접속 가능)

내부 IP에서의 접속이 아닌 외부망을 통해 접속하려면 포트포워딩 설정을 해주어야함

 

 


MySQL DB Tools

1. VSCode Extensions (MySQL)

2. HeidiSQL (윈도우 전용)

3. DBeaver

4. MySQL Workbench

 


참고 링크

Github losskatsu
Tistory jaynamm

https://nickjoit.tistory.com/144

NodeJS + MongoDB 데이터 다루기

# npm 설치
npm install mongoose

 

const mongoose = require("mongoose");

mongoose.connect("mongodb://127.0.0.1:27017/databaseName"); // database name: project

// 아래 db 코드는 확인할 때 사용한다. 코드 생략 가능
const db = mongoose.connection;
db.on("open", function () {
  console.log("Connected");
});
db.on("error", function () {
  console.log("Connection Failed!");
});

/**
 * 최초 데이터 1건을 조회한다. (가장 오래된 데이터)
 * @param {mongoose.Schema} schema
 * @param {object} filter
 * @returns
 */
const FindFirst = async (schema, filter) => {
  return await schema
    .findOne(filter)
    .then((response) => response)
    .catch((error) => error);
};

/**
 * 데이터를 저장한다.
 * @param {mongoose.Schema} schema
 * @param {object[]} data
 */
const Save = (schema, data) => {
  for (value in data) {
    new schema(data[value])
      .save()
      .then((response) => response)
      .catch((error) => error);
  }
};
/**
 * 데이터를 조회하고, 최신순으로 조회한다.
 * @param {mongoose.Schema} schema
 * @param {object} filter
 * @param {number} limit
 * @returns
 */
const Find = async (schema, filter = undefined, limit = undefined) => {
  return await schema
    .find(filter)
    .sort({ _id: -1 })
    .limit(limit)
    .then((response) => response)
    .catch((error) => error);
};

/**
 * 데이터를 삭제한다.
 * @param {mongoose.Schema} schema
 * @param {object[]} data
 * @returns { acknowledged: boolean, deletedCount: number }
 */
const Delete = async (schema, filter = undefined) => {
  return await schema.deleteMany(filter)
    .then((response) => response)
    .catch((error) => error);
};

// mongoose 조회 함수 호출하기
( async () => {
  const returnDelete = await Delete(Ticker);
  console.log(returnDelete.deletedCount);
}) ();

 

Schema.js

const mongoose = require("mongoose");
const { Schema } = mongoose;

const ticker = new Schema({
  name: string
});

const Ticker = mongoose.model("tickers", ticker);

module.exports = {
  Ticker,
};

 


Reference Site

mongoose guide

 

Mongoose v6.6.0: Schemas

If you haven't yet done so, please take a minute to read the quickstart to get an idea of how Mongoose works. If you are migrating from 5.x to 6.x please take a moment to read the migration guide. Everything in Mongoose starts with a Schema. Each schema ma

mongoosejs.com

 

토이 프로젝트 진행하면서 OpenAPI를 사용하는데, 요청 수 제한이 있어, 클라이언트에서 많은 요청들을 계속하여 호출하는데 무리가 있었다. (429 Too Many Requests)

백엔드 서버에서 스케줄링을 통해 데이터베이스에 API 정보를 저장한다면, 문제를 해결할 수 있을 것 같았다.

OpenAPI를 사용하다보니 RDBMS로는 데이터 정보 구조를 정의하고 관리하기에는 무리가 있을 것 같아, 비정형화 데이터를 저장할 수 있는 NoSQL을 사용하기로 했다.

오래전에 Firebase(Only 클라우드 서비스, 비용 발생 가능성)를 통해 NoSQL을 접해본 적은 있지만, 가장 많이 사용하는 NoSQL인MongoDB를 접해보고 싶었고, 환경을 직접 구축(On-premise)해보는 경험을 해보기로 했다.


NoSQL 이란?

  • non SQL, non relational SQL, not only SQL 와 같은 의미로 해석된다. SQL을 사용하지 않는다는 의미보다 SQL만을 사용하지 않는 데이터베이스 관리 시스템(DBMS)이다.
  • NoSQL에 대한 구체적인 정의는 없지만, 공통적인 성향이 있다.
    • 대부분 클러스터(하나의 클러스터에서 여러개의 서버를 이용하도록 설계)에서 실행할 목적으로 만들어졌기 때문에 관계형 모델을 사용하지 않는다
      • 분산 환경에서 노드(서버)들이 잘 작동할 때, 하나의 노드 시스템에 장애가 났을 때, 문제를 해결하기 좋다.
    • Schema-less, 스키마(구조에 대한 정의) 없이 동작한다. 따라서 데이터 구조를 미리 정의할 필요가 없으며, 시간이 지나더라도 언제든지 바꿀 수 있기 때문에 비형식적인 데이터를 저장하는 데 용이하다.
    • 비일관성(Inconsistency), 게임의 로그 같은 데이터들은 매 초마다 엄청난 양이 생성되지만 한번 저장되고 난 뒤에는 수정될 일이 거의 없다. 이런 데이터의 일관성을 보장하기 위해 ACID 트랜잭션을 지원할 필요는 없다.
      • 다수가 동시에 읽고 쓰는 (Read and Write) 상황에 좋다.
  • 데이터와 트래픽이 증가함에 따라 RDBMS에서는 원활한 데이터 처리가 어려워졌다. 이를 해결하기 위해 장비의 성능을 키우는 수직적 확장(Scale-up)은 비용적인 문제가 발생한다. NoSQL에서는 수평적 확장(Scale-out)을 통해 성능을 올리기 쉽다.

 MongoDB 란?

  • NoSQL DBMS의 한 종류이고, Document 모델을 사용한다.
  • mongo는 humongous를 줄인 표현이다. '겁나 큰 DB' 라는 뜻.

장점

  • Schema-less 구조로 다양한 형태의 데이터 저장이 가능하고, 데이터 모델의 유연한 변화가 가능하다.
  • Read/Write 성능이 뛰어나다.
  • 수평적 확장(Scale-out) 구조로 많은 데이터 저장이 가능하고 장비 확장이 간단하다.
  • JSON 구조로 데이터를 직관적으로 이해 가능하다.

단점

  • 데이터 업데이트 중 장애 발생 시, 데이터 손실이 가능하다.
  • 많은 인덱스 사용 시, 충분한 메모리가 필요하다.
  • 데이터 공간 소모가 RDBMS에 비해 많다. (중복 key, 데이터 발생 가능)
  • ACID 트랜잭션 지원이 RDBMS 대비 미약하다.

1. 몽고디비 설치 명령어

brew tap mongodb/brew
brew install mongodb-community

설치 위치: /usr/local/var/mongodb

 

2. 서비스 명령어

# start
brew services start mongodb/brew/mongodb-community
mongod # deamon 프로세스로 실행. 백그라운드에서 실행

# stop
brew services stop mongodb/brew/mongodb-community

# 위 명령어로 실행하면서 오류가 계속 발생하였음
sudo su # 관리자 모드로 접속하여 아래 명령어를 통해 실행함
brew services # 서비스 확인
brew services start mongodb-community
brew services stop mongodb-community

brew services start mongodb/brew/mongodb-community
Default MongoDB Port: 27017

 

Install MongoDB Community Edition on macOS — MongoDB Manual

Docs Home → MongoDB Manual MongoDB AtlasMongoDB Atlas is a hosted MongoDB service option in the cloud which requires no installation overhead and offers a free tier to get started.Use this tutorial to install MongoDB 6.0 Community Edition on macOS using

www.mongodb.com

이후 mongo shell 접속하기 위해, mongo 명령어를 통해 접속하려 했지만 실패하였다.

MongoDB 문서를 참고하여, mongosh 명령어로 접속할 수 있었음

mongosh

 

3. MongoDB-Compass 설치

brew install cask
brew install mongodb-compass

 

4. Mongo Shell 명령어

db # 현재 사용중인 DB 확인

show dbs # DB 리스트 확인.  처음 db 명령어를 통해 확인한 DB를 확인할 수 없는데, 최소 1개의 Document 를 추가해야함

use <database name> # DB 접속

db.foo.insertOne({name:"foo"}) # 데이터 추가하기. collection은 foo로 추가, 명령어 맨 앞의 db의 현재 DB를 뜻함

db.foo.find() # 데이터 확인

show collections # collection 확인

# 1개의 데이터 추가
db.collection.insertOne({document}

# 여러 데이터 추가
db.collection.insertMany([{document1},{document2}...])

데이터 추가하기
데이터 확인
find 조건 검색

4. 데이터베이스, 계정 생성

# root 권한 계정 생성
use admin # admin DB 접속
db.createUser({ user:"sejin", pwd:"******", roles: ["root"] })

# root 계정으로 shell 진입
mongosh admin -u sejin -p ******

use project # 데이터베이스 생성(create), 전환(switched)
db.createUser({user:"user", pwd:"******", roles:["dbOwner"]}) # 일반 계정 생성

# 생성한 일반 계정 확인
db.getUsers()

 

 


 

NoSQL - 나무위키

“Not Only SQL” : 데이터를 저장하는 데에는 SQL 외에 다른 방법들도 있다. NoSQL이라고 하는 말은 대한민국이 아닌 모든 나라를 외국이라고 부르는 것과 비슷하다. 세상에는 한국 말고도 각자의 문

namu.wiki

 

[MongoDB] MongoDB 장점/단점

MongoDB 장점 Schema-less 구조 - 다양한 형태의 데이터 저장 가능 - 데이터 모델의 유연한 변화 가능(데이터 모델 변경, 필드 확장 용이) Read/Write 성능이 뛰어남 Scale Out 구조 - 많은 데이터 저장이

tychejin.tistory.com

 

Requests can only be made in the LoggedIn state, not the Connecting state


 

Sql Server Configuration Manager 접속

  • SQL Server 네트워크 구성 - SQLEXPRESS에 대한 프로토콜 - TCP/IP 사용으로 변경
  • 속성을 클릭하여 [IP주소] 탭 맨아래 쪽 IPAll - TCP포트 - 1433 으로 설정

 

MSSQL를 처음 설치할 때, 포트를 막기 때문에 발생하는 현상임. 포트를 열어 접속이 가능하도록 설정하여 해결

 

var { Connection, Request } = require("tedious");

var config = {
  server: "localhost",
  authentication: {
    type: "default",
    options: {
      userName: "dev",
      password: "dev"
    }
  },
  options: {
    trustServerCertificate: false,
    encrypt: false,
    database: "vue_project"
    // port: 1433
  }
};

/* detail err msg
 connection.on("debug", function(err) {
   console.log("debug : ", err);
 });
*/

const connection = new Connection(config);
// Attempt to connect and execute queries if connection goes through
connection.on("connect", err => {
  if (err) {
    console.error(err.message);
  } else {
    queryDatabase();
  }
});

function queryDatabase() {
  console.log("Reading rows from the Table...");

  const request = new Request(`SELECT * FROM USR_INFO`, (err, rowCount) => {
    if (err) {
      console.error(err.message);
    } else {
      console.log(`${rowCount} row(s) returned`);
    }
  });

  request.on("row", columns => {
    columns.forEach(column => {
      console.log("%s\t%s", column.metadata.colName, column.value);
    });
  });

  connection.execSql(request);
}

 

 


 

[MSSQL] 호스트 localhost, 포트 1433에 대한 TCP/IP 연결에 실패했습니다.

오랜만에 MSSQL을 재설치 했더니 아래와 같은 오류가 뜹니다.설치 할 때마다 검색하는거 같아서 아예 ...

blog.naver.com

 

+ Recent posts