MongoDB 구성과 사용자 추가

MongoDB 구성

MongoDB 구성 파일은 /etc 디렉토리에 있으며 mongod.conf라는 이름을 가지고 있습니다. 파일은 YAML 형식을 사용합니다.

기본 구성 설정은 대부분의 경우에 충분합니다. 그러나 운영 환경의 경우 다음과 같이 보안 섹션의 보완을 해제하고 액세스 제어를 사용하는 것이 좋습니다:

sudo nano /etc/mongod.conf

# /etc/mongod.conf
# security:
#  authorization: enabled

권한 부여 옵션은 데이터베이스 리소스 및 작업에 대한 사용자의 액세스를 규제하는 역할 기반 액세스 제어(RBAC)를 활성화합니다. 이 옵션을 활성화하지 않으면 각 사용자는 모든 데이터베이스에 액세스할 수 있으며 모든 작업을 수행합니다.

구성을 변경할 때마다 변경 내용을 적용하려면 mongod 서비스를 다시 시작해야 합니다:

sudo systemctl restart mongod

최신 MongoDB 버전에서 사용할 수 있는 구성 옵션에 대한 자세한 내용은 구성 파일 옵션 설명서 페이지를 참조하십시오.

관리 MongoDB 사용자 만들기

MongoDB 인증을 사용하도록 설정한 경우 MongoDB 인스턴스에 액세스하고 관리할 수 있는 관리 사용자를 만들어야 합니다.

몽고 셸에 액세스:

mongosh

MongoDB 셸 내부에서 다음 명령을 입력하여 관리 데이터베이스에 연결합니다:

use admin

# switched to db admin

다음 명령을 실행하여 관리 사용자를 만듭니다:

db.createUser(
  {
    user: "myMongoAdmin",
    pwd: passwordPrompt(),
    roles: [
      { role: "userAdminAnyDatabase", db: "admin" },
      { role: "readWriteAnyDatabase", db: "admin" }
    ]
  }
)

관리자 이름을 myMongoAdmin이라고 지었습니다. 원하는 대로 불러주세요. passwordPrompt() 방식 대신 명확한 텍스트 비밀번호를 입력할 수도 있지만, 비밀번호를 화면에 표시하는 것은 권장되지 않으며, 쉘 이력에도 저장됩니다.

비밀번호를 입력하고 입력 후 “Enter”(입력)를 누르라는 메시지가 표시됩니다. 안전한 비밀번호를 설정하는 것을 잊지 마십시오:

Enter password

# ********{ ok: 1 }

“ok: 1″은 명령이 성공적으로 실행되었음을 의미합니다.

작업이 완료되면 다음과 같이 몽고 셸을 종료합니다:

quit()

변경 내용을 테스트하려면 이전에 작성한 관리자를 사용하여 MongoDB 셸에 액세스합니다:

mongo -u myMongoAdmin -p --authenticationDatabase admin

정확한 비밀번호를 입력하면 MogoDB 쉘로 연결됩니다.

“admin” 데이터베이스로 전환하고 show users를 실행하여 모든 사용자와 역할에 대한 정보를 가져옵니다:

use admin

# switched to db admin

예제에서 사용자는 한 명뿐입니다:

show users

# In our example, we have only one user:
# 
# [
#   {
#     _id: 'admin.myMongoAdmin',
#     userId: new UUID("a00ab5ca-5c1f-4a3b-8f67-be8a79c7649c"),
#     user: 'myMongoAdmin',
#     db: 'admin',
#     roles: [
#       { role: 'userAdminAnyDatabase', db: 'admin' },
#       { role: 'readWriteAnyDatabase', db: 'admin' }
#     ],
#     mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
#   }
# ]

Ubuntu 20.04 및 22.04에서 MongoDB를 설치 및 구성하는 방법을 안내해 드렸습니다. 이 항목에 대한 자세한 내용은 MongoDB Manual을 참조하십시오.

MongoDB 설치 error 발생과 대처

아래와 같은 mongoDB 설치하는 과정에서 생긴 에러에 대한 수정방법과 대처압나다,

wget -qO – https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add – Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

apt-key 명령어는 더 이상 사용되지 않으며, 최신 버전의 Ubuntu에서는 다른 방식으로 PGP 키를 추가해야 합니다. apt-key 대신 trusted.gpg.d 디렉토리를 사용하여 키를 관리할 수 있습니다.

다음은 wget을 사용하여 MongoDB PGP 키를 추가하고, MongoDB를 설치하는 방법입니다.

1. PGP 키 다운로드 및 추가

먼저, MongoDB의 PGP 키를 다운로드하여 /usr/share/keyrings 디렉토리에 저장합니다.

wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo tee /usr/share/keyrings/mongodb-archive-keyring.gpg > /dev/null

2. MongoDB 저장소 추가

다음으로, MongoDB 저장소를 추가합니다. 여기서는 signed-by 옵션을 사용하여 PGP 키를 지정합니다.

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

3. 패키지 목록 업데이트 및 MongoDB 설치

패키지 목록을 업데이트하고 MongoDB를 설치합니다.

sudo apt-get update
sudo apt-get install -y mongodb-org

4. MongoDB 서비스 시작

MongoDB 서비스를 시작하고, 시작 여부를 확인합니다.

sudo systemctl start mongod
sudo systemctl status mongod

5. MongoDB 서비스 자동 시작 설정

서버가 부팅될 때 MongoDB가 자동으로 시작되도록 설정합니다.

sudo systemctl enable mongod

위 단계를 따라 하면 최신 방식으로 MongoDB를 설치하고 PGP 키를 추가할 수 있습니다. apt-key 경고 메시지를 피하고, 키를 안전하게 관리할 수 있습니다.

하지만 이 방법으로도 오류가 게속된다면 다음 대처 방안을 참고해 주세요.

MongoDB 설치, 설정 그리고 백엔드 프로그램 연결

MongoDB 설치 및 설정 가이드

1. MongoDB 설치

Windows
  1. MongoDB 설치 파일 다운로드
  2. 설치 파일 실행
    • 다운로드한 설치 파일을 실행하고 설치 과정을 따릅니다.
    • 설치 시 “Complete” 설치 옵션을 선택합니다.
    • “Install MongoDB as a Service” 옵션을 선택하여 MongoDB를 서비스로 실행되도록 설정합니다.
  3. 환경 변수 설정
    • MongoDB의 bin 디렉토리를 시스템 환경 변수 PATH에 추가합니다. (기본 설치 경로: C:\Program Files\MongoDB\Server\X.X\bin)
  4. MongoDB 서비스 시작
    • Windows 서비스 관리 도구에서 MongoDB 서비스를 시작합니다.
macOS
  1. Homebrew로 MongoDB 설치
    • Homebrew가 설치되어 있지 않다면 Homebrew 웹사이트를 참조하여 설치합니다.
    • 터미널을 열고 다음 명령어를 입력하여 MongoDB를 설치합니다.bash코드 복사brew tap mongodb/brew brew install mongodb-community@6.0
  2. MongoDB 서비스 시작
    • 다음 명령어를 입력하여 MongoDB 서비스를 시작합니다.bash코드 복사brew services start mongodb/brew/mongodb-community
Linux (Ubuntu)
  1. MongoDB 패키지 관리용 GPG 키 추가bash코드 복사wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
  2. MongoDB 리포지토리 추가bash코드 복사echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
  3. MongoDB 설치bash코드 복사sudo apt update sudo apt install -y mongodb-org
  4. MongoDB 서비스 시작bash코드 복사sudo systemctl start mongod

2. MongoDB 설정

  1. MongoDB 설정 파일 수정 (선택 사항)
    • 기본 설정으로 충분하지 않은 경우 설정 파일 (/etc/mongod.conf)을 수정할 수 있습니다.
    • 설정 파일의 기본 위치는 다음과 같습니다.
      • Windows: C:\Program Files\MongoDB\Server\X.X\bin\mongod.cfg
      • macOS: /usr/local/etc/mongod.conf
      • Linux: /etc/mongod.conf
  2. MongoDB 서비스 재시작
    • 설정 파일을 수정한 경우 MongoDB 서비스를 재시작합니다.
    bash코드 복사sudo systemctl restart mongod

3. MongoDB 연결

  1. MongoDB Compass 설치 (선택 사항)
  2. MongoDB 연결 테스트
    • 터미널에서 다음 명령어를 입력하여 MongoDB 셸에 접속할 수 있는지 확인합니다.
    bash코드 복사mongo

4. Node.js 애플리케이션과 MongoDB 연결

  1. MongoDB Node.js 드라이버 설치
    • 프로젝트 루트 디렉토리에서 다음 명령어를 입력하여 MongoDB Node.js 드라이버를 설치합니다.
    • npm install mongoose
  2. MongoDB 연결 설정 (backend/app.js)
    • backend/app.js 파일에서 MongoDB에 연결하는 코드를 작성합니다.
    javascript코드 복사const express = require('express'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const cors = require('cors'); const app = express(); require('dotenv').config(); // Middleware app.use(bodyParser.json()); app.use(cors()); // MongoDB 연결 mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true, }).then(() => { console.log('MongoDB connected'); }).catch((err) => { console.error('MongoDB connection error:', err); }); // 라우트 설정 const userRoutes = require('./routes/userRoutes'); const bookRoutes = require('./routes/bookRoutes'); const transactionRoutes = require('./routes/transactionRoutes'); app.use('/api/users', userRoutes); app.use('/api/books', bookRoutes); app.use('/api/transactions', transactionRoutes); // 서버 시작 const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
  3. 환경 변수 설정 (.env 파일)
    • 프로젝트 루트 디렉토리에 .env 파일을 생성하고 MongoDB 연결 문자열을 추가합니다.
    bash코드 복사MONGO_URI=mongodb://localhost:27017/your_projec_name JWT_SECRET=your_jwt_secret
  4. 백엔드 서버 실행
    • 백엔드 서버를 시작하여 MongoDB와의 연결을 확인합니다.
    bash코드 복사cd backend node app.js

5. MongoDB 연결 확인

  1. 서버 로그 확인
    • 서버가 시작되면서 “MongoDB connected” 메시지가 출력되는지 확인합니다.
  2. 데이터베이스 확인
    • MongoDB 셸 또는 MongoDB Compass를 사용하여 your_projec_name 데이터베이스가 생성되었는지 확인합니다.

이 과정을 통해 MongoDB를 설치하고 설정하여 Node.js 애플리케이션과 연결할 수 있습니다. MongoDB와의 연결이 성공적으로 이루어지면, 데이터 모델을 정의하고 CRUD 작업을 수행할 수 있습니다.

ubntu Jammy 22.0.4에 MongoDB 설치

MongoDB는 자유로운 오픈 소스 문서 데이터베이스입니다. MySQL이나 PostgreSQL과 같은 기존의 테이블 기반 SQL 데이터베이스와는 다른 NoSQL 데이터베이스 계열에 속합니다. MongoDB의 데이터는 유연한 JSON 형태의 문서에 저장되며, 문서마다 필드가 다를 수 있습니다. 미리 정의된 스키마가 필요하지 않으며, 시간이 지남에 따라 데이터 구조를 변경할 수 있습니다.

MongoDB의 몇 가지 주요 기능은 복제, 인덱싱, 사용자 정의 검색, 로드 밸런싱, 자바스크립트 실행입니다.

설치 단계를 따르려면 Ubuntu 22.04 또는 20.04 인스턴스에서 sudo 권한을 가진 루트 또는 사용자로서 명령을 실행해야 합니다.

일반적으로 표준 우분투 저장소에는 오래된 MongoDB 버전이 포함되어 있습니다. 우리는 공식 MongoDB 패키지를 설치할 것입니다. 우분투에 MongoDB를 설치하는 것은 꽤 간단합니다. 우리는 MongoDB 저장소를 활성화하고 저장소 GPG 키를 가져온 다음 MongoDB 패키지를 설치할 것입니다.

첫 번째 단계는 새 리포지토리를 추가하는 데 필요한 종속성을 설치하는 것입니다. 대부분의 경우 시스템에 해당 패키지가 이미 설치되어 있지만 일부 패키지가 누락되었을 수 있습니다:

sudo apt update
sudo apt install gnupg wget apt-transport-https ca-certificates software-properties-common

다음으로 MongoDB 리포지토리의 GPG 키를 시스템으로 가져옵니다:

wget -qO- \
  https://pgp.mongodb.com/server-7.0.asc | \
  gpg --dearmor | \
  sudo tee /usr/share/keyrings/mongodb-server-7.0.gpg >/dev/null

다음 파일을 생성하여 MongoDB 리포지토리를 추가합니다:

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \
  https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | \
  sudo tee -a /etc/apt/sources.list.d/mongodb-org-7.0.list

위 명령어의 $(lsb_release -cs) 부분은 우분투 코드명을 인쇄합니다. 예를 들어 우분투 버전 22.04가 있으면 명령어가 jammy를 인쇄합니다.

리포지토리가 사용되도록 설정되면 로컬 패키지 인덱스를 업데이트합니다:

sudo apt update

이제 다음을 입력하여 MongoDB를 설치할 수 있습니다:

sudo apt install mongodb-org

mongodb-org는 다음 패키지를 포함하는 메타 패키지입니다:

mongodb-org-server – mongod 데몬 및 해당 init 스크립트 및 구성.

mongodb-org-mongos – the mongos daemon.

mongodb-org-shell – mongoDB에 대한 대화형 자바스크립트 인터페이스인 mongo shell. 명령줄로 생각되는 관리 작업을 수행하는 데 사용됩니다.

mongodb-org-tools – 데이터, 통계 및 기타 유틸리티를 가져오고 내보낼 수 있는 여러 MongoDB 도구가 들어 있습니다.

기본적으로 MongoDB 데몬은 설치 후 시작되지 않습니다. 서비스를 시작하고 부팅 시 활성화하려면 다음을 실행합니다:

sudo systemctl enable --now mongod

Mongosh shell tool을 사용하여 MongoDB 데이터베이스 서버에 연결하고 연결 상태를 출력하면 설치가 성공했는지 확인할 수 있습니다:

mongosh --eval 'db.runCommand({ connectionStatus: 1 })'

출력은 다음과 같습니다:

Current Mongosh Log ID:	655a70dfea9d876644ee6607
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.0.2
Using MongoDB:		7.0.3
Using Mongosh:		2.0.2

{
  authInfo: { authenticatedUsers: [], authenticatedUserRoles: [] },
  ok: 1
}

명령어는 연결 상태와 인증된 사용자 및 사용 권한에 대한 정보를 반환합니다. 확인 필드의 값이 1이면 성공을 나타냅니다.

MongoDB 구성확인

MongoDB 구성 파일은 /etc 디렉토리에 있으며 mongod.conf라는 이름을 가지고 있습니다. 파일은 YAML 형식을 사용합니다.

기본 구성 설정은 대부분의 경우에 충분합니다. 그러나 운영 환경의 경우 다음과 같이 보안 섹션의 보완을 해제하고 액세스 제어를 사용하는 것이 좋습니다:

sudo nano /etc/mongod.conf

# /etc/mongod.conf
# security:
#  authorization: enabled

권한 부여 옵션은 데이터베이스 리소스 및 작업에 대한 사용자의 액세스를 규제하는 역할 기반 액세스 제어(RBAC)를 활성화합니다. 이 옵션을 활성화하지 않으면 각 사용자는 모든 데이터베이스에 액세스할 수 있으며 모든 작업을 수행합니다.

구성을 변경할 때마다 변경 내용을 적용하려면 mongod 서비스를 다시 시작해야 합니다:

sudo systemctl restart mongod

최신 MongoDB 버전에서 자세한 내용은 설명서 페이지를 참조바랍니다.

apt, snap가 아닌 Kubo로 IPFS 설치 방법

Kubo(IPFS)의 설치 방법은 Snap을 사용하지 않고 Kubo를 설치하고 설정하는 방법을 따라 문제를 해결하겠습니다.

1. Kubo 다운로드 및 설치

  1. Kubo 다운로드최신 Kubo 버전을 공식 배포 페이지에서 다운로드합니다.bash코드 복사wget https://dist.ipfs.tech/kubo/v0.18.0/kubo_v0.18.0_linux-amd64.tar.gz
  2. 압축 해제bash코드 복사tar -xvzf kubo_v0.18.0_linux-amd64.tar.gz cd kubo
  3. 설치bash코드 복사sudo bash install.sh
  4. 환경 변수 설정Kubo가 올바르게 설치되었는지 확인하기 위해 환경 변수를 설정합니다.bash코드 복사export PATH=$PATH:/usr/local/bin

2. IPFS(Kubo) 초기화 및 데몬 실행

  1. IPFS 초기화bash코드 복사ipfs init 만약 ipfs 명령어가 인식되지 않는다면, 설치된 경로가 올바른지 확인하고 환경 변수를 다시 설정해보세요.bash코드 복사which ipfs 명령어가 출력되지 않는다면, IPFS 바이너리가 설치된 경로를 확인하고 $PATH에 추가합니다.
  2. 데몬 실행bash코드 복사ipfs daemon

3. 메타데이터 파일 생성 및 업로드

  1. 메타데이터 파일 생성metadata.json 파일을 생성하고 아래와 같이 전자책의 메타데이터를 작성합니다.json코드 복사{ "name": "Example Ebook", "description": "An example ebook for NFT", "image": "https://example.com/cover.jpg", "attributes": [ { "trait_type": "Author", "value": "John Doe" }, { "trait_type": "Genre", "value": "Fiction" } ] }
  2. 메타데이터 파일 IPFS에 업로드bash코드 복사ipfs add metadata.json 출력 결과에서 Qm... 형식의 해시를 얻을 수 있습니다. 이 해시를 사용하여 파일을 참조합니다.plaintext코드 복사added Qmabcdef123456 metadata.json
  3. IPFS URI 구성IPFS의 URI는 다음과 같이 구성됩니다.plaintext코드 복사https://ipfs.io/ipfs/Qmabcdef123456

4. 테스트 파일 업데이트

이제 test/ebook_nft.js 파일에서 tokenURI를 위에서 얻은 IPFS URI로 설정합니다.

javascript코드 복사const EbookNFT = artifacts.require("EbookNFT");

contract("EbookNFT", (accounts) => {
    it("should mint a new NFT", async () => {
        const ebookNFT = await EbookNFT.deployed();
        const tokenURI = "https://ipfs.io/ipfs/Qmabcdef123456";
        await ebookNFT.mint(accounts[0], tokenURI);

        const owner = await ebookNFT.ownerOf(0);
        assert.equal(owner, accounts[0], "Owner of tokenId 0 should be accounts[0]");

        const retrievedTokenURI = await ebookNFT.tokenURI(0);
        assert.equal(retrievedTokenURI, tokenURI, "Token URI of tokenId 0 should match");
    });
});

이제 tokenURI가 실제 IPFS에 업로드된 메타데이터 파일을 가리키므로 테스트가 더 정확하게 동작합니다.

5. 테스트 실행

bash코드 복사truffle test

이제 IPFS를 통해 메타데이터 파일을 업로드하고 해당 URI를 설정하는 과정이 완료되었습니다.

NFT 민팅 발행시 metadata IPFS에 저장 방법

전자책 NFT의 tokenURI는 전자책의 메타데이터가 저장된 위치를 가리킵니다. 일반적으로 이러한 메타데이터는 IPFS(InterPlanetary File System)와 같은 분산 파일 시스템에 업로드하여 보관합니다.

여기서는 IPFS를 사용하여 전자책 메타데이터를 업로드하고, 그 URI를 설정하는 방법을 설명하겠습니다.

1. IPFS 설치 및 설정

IPFS 설치IPFS를 설치합니다. IPFS 공식 사이트에서 설치 방법을 참고하세요.

    # MacOS
    brew install ipfs
    
    # Ubuntu
    sudo apt install ipfs
    
    # Windows
    choco install ipfs

    IPFS 데몬 실행

    ipfs init

    ipfs 가 설치가 안되는 경우가 있는데 그 때는 snap으로 설치합니다.

    ipfs daemon

    2. 메타데이터 파일 생성 및 업로드

    메타데이터 파일 생성metadata.json 파일을 생성하고 아래와 같이 전자책의 메타데이터를 작성합니다.

    { "name": "Example Ebook", "description": "An example ebook for NFT", "image": "https://example.com/cover.jpg", "attributes": [ { "trait_type": "Author", "value": "John Doe" }, { "trait_type": "Genre", "value": "Fiction" } ] }

    메타데이터 파일 IPFS에 업로드bash코드 복사ipfs add metadata.json 출력 결과에서 Qm... 형식의 해시를 얻을 수 있습니다. 이 해시를 사용하여 파일을 참조합니다.plaintext코드 복사added Qm... metadata.json

    IPFS URI 구성IPFS의 URI는 다음과 같이 구성됩니다.plaintext코드 복사https://ipfs.io/ipfs/Qm... 예를 들어, 해시가 Qmabcdef123456이면 URI는 https://ipfs.io/ipfs/Qmabcdef123456가 됩니다.

    3. 테스트 파일 업데이트

    이제 test/ebook_nft.js 파일에서 tokenURI를 위에서 얻은 IPFS URI로 설정합니다.

    const EbookNFT = artifacts.require("EbookNFT");

    contract("EbookNFT", (accounts) => {
    it("should mint a new NFT", async () => {
    const ebookNFT = await EbookNFT.deployed();
    const tokenURI = "https://ipfs.io/ipfs/Qmabcdef123456";
    await ebookNFT.mint(accounts[0], tokenURI);

    const owner = await ebookNFT.ownerOf(0);
    assert.equal(owner, accounts[0], "Owner of tokenId 0 should be accounts[0]");

    const retrievedTokenURI = await ebookNFT.tokenURI(0);
    assert.equal(retrievedTokenURI, tokenURI, "Token URI of tokenId 0 should match");
    });
    });

    이제 tokenURI가 실제 IPFS에 업로드된 메타데이터 파일을 가리키므로 테스트가 더 정확하게 동작합니다.

    4. 테스트 실행

    truffle test
    error: Content is protected !!