본문 바로가기
Node.js

24/09/04 - Node.js 입문(2 - 1): 데이터베이스와 MongoDB, Studio 3T

by Jini_Lamp 2024. 9. 4.

이전에 시간에는 상품 등록 API를 구현했다.(https://dkskfktldi.tistory.com/entry/240904-Nodejs-%EC%9E%85%EB%AC%B81-9-Request%EC%99%80-Response-%EA%B2%BD%EB%A1%9C-%EB%B3%80%EC%88%98)

 

하지만 서버를 종료하거나 재시작할 경우, 등록된 상품 데이터가 모두 사라지는 문제가 있었다. 이는 데이터를 인 메모리(In - Memory) 방식으로 저장했기 때문인데, 이 방식은 데이터를 RAM과 같은 임시 저장소에 보관하고, 어플리케이션이 종료될 경우 함께 소멸한다.

 

이러한 문제를 해결하기 위해 데이터베이스(Database)라는 기술이 등장하게 되었다. 데이터베이스는 서비스하는 어플리케이션이 종료된 후에도 데이터가 보존되는 영속성이라는 특징을 가진 저장소이다.

 

 

 

데이터베이스(Database)

데이터베이스는 데이터의 집합이다. 실제 데이터가 저장되는 저장소의 역할을 수행하며, 이를 관리하는 소프트웨어를 DBMS(Database Management System)라고 부른다.

DBMS가 설치된 서버 컴퓨터를 데이터베이스 서버(이하 DB 서버)라고 부르며, DB 서버의 모든 데이터는 DBMS가 관리하게 된다.

 

데이터베이스의 종류는 다음과 같다.

  • 관계형 DB - Relational DB
    • 데이터의 형식이 정해져 있고, 데이터 간의 관계를 맺어 모순이 없는 데이터를 유지할 수 있도록 도와주는 DB이다.
    • 주로 은행과 같이 정확하고 일관된 데이터가 중요한 경우에 사용된다.(보안이나 안전성을 중시하는 곳에서 사용)
  • 비관계형 DB - Non-relational DB (NoSQL)
    • 데이터의 형식이 고정되지 않고, 유연하게 확장할 수 있는 DB이다.
    • 주로 SNS 서비스, 빅데이터와 같이 다양한 형식의 데이터를 빠르게 저장하고 검색해야 하는 경우에 주로 사용된다.
    • 비관계형 DB는 유연하게 저장되는 만큼 저장되는 데이터를 제대로 관리하지 않으면 DB에 저장된 데이터를 신뢰할 수 없게 되기도 한다.

 

 

 

MongoDB

MongoDB는 국내외 수많은 개발자들이 사용되는 비관계형 DB 중 하나이다.

모든 데이터가 JSON 형태로 저장되고, 복잡한 데이터 구조를 쉽게 저장할 수 있는 장점이 있다. 이는 대용량 데이터를 손쉽게 처리할 수 있다는 뜻이기도 하다.

또한 DB 서버의 확장을 손쉽게 줄이고 늘릴 수 있어 서버의 부하가 늘어나더라도 빠르게 대응할 수 있다.

!! 알아둘 것 !!

MongoDB는 로컬 환경에 설치하는 대신 클라우드 환경에서 대여를 하는 게 더 편하게 되어 있다.

왜냐하면 어떤 환경이든 MongoDB를 외부에 있는 클라우드 서버에서 실행하게 된다면 사용자의 데이터가 데스크탑이 아니라 외부에 있는 클라우드 서버에 저장되기 때문에 좀 더 안전하고 서버와 연결을 할 때도 편리하게 할 수 있어 앞으로는 MongoDB Atlas라고 하는 걸 대여받고 진행할 예정이다.(MongoDB Atlas는 MongoDB의 클라우드 버전이다.)

 

 

 

MongoDB Atlas 대여

  • 해당 사이트에 들어간다(https://www.mongodb.com/)
  • 구글 / 깃허브로 로그인한다.
    로그인하면 다음과 같은 창으로 이동한다.
    이후 체크 박스를 클릭하고, "Submit"도 클릭한다.

  • 설문조사를 끝내면 다음과 같은 창이 뜬다.
  • 설문조사가 끝나면 DB를 만들텐데, 다음과 같이 설정한다.

 

  • 이후 Username과 Password를 입력하게 되는데, 이 부분은 나중에 DB 로그인을 위해 사용된다.
  • 하단으로 이동한 후 My Local Environment 선택한다.
  • IP Address에 0.0.0.0으로 입력한 후 ‘Add Entry’ 버튼을 클릭한다.
    이는 MongoDB를 사용할 수 있는 IP를 제한하는 것으로, 0.0.0.0은 모든 IP에서 사용가능하도록 구성하는 것이다.
    입력을 완료했다면 ‘Finish and Close’ 버튼을 클릭한다.

  • ‘Go to Databases’ 버튼을 클릭하여 MongoDB 생성을 완료한다.

 

 

 

MongoDB 주소 정보 조회

대여를 완료했으니 이제 Express에서 MongoDB를 사용하기 위한 주소 정보를 가져와야한다.

  • Data Services 화면을 보면 아래와 같은 이미지처럼 된 것을 알 수 있는데, 이중 Connect를 클릭한다.

  • Drivers 클릭

  • 아래를 보면 다음과 같이 나와있는데, 이것은 MongoDB URL이다. 복붙으로 사용할 수 있고, <db_password> 부분에 위에서 말한 패스워드를 입력해야 제대로 사용할 수 있다.

 

 

 

MongoDB Client: Studio 3T

Studio 3T은 MongoDB의 데이터를 더욱 편리하게 관리할 수 있는 GUI 툴이다.

즉, API의 사용을 도와주는 API Client처럼 MongoDB를 도와주는 MongoDB Client라고 보면 된다. MongoDB에 저장된 데이터를 직접 확인하고 수정할 수 있으며, JS 코드로만 데이터를 확인하고 수정하는 것보다 더욱 효율적인 작업과 테스트를 할 수 있다.

  • DB Client
    • 직접 데이터베이스에 접근해 데이터를 조회, 추가, 수정, 삭제하는 기능을 제공.
    • SQL, NoSQL과 같은 다양한 유형의 데이터베이스를 지원.
    • Studio 3T는 이러한 DB Client의 한 종류로, MongoDB를 관리할 수 있는 툴이다.
  • API Client
    • 웹 서비스의 API에 연결하여 서버와 데이터를 송수신한다.
    • REST API와 Socket 같은 다양한 프로토콜을 지원.

 

아래는 설치 사이트는 다음과 같다.(https://robomongo.org/)

설치가 완료되고, 구글 아이디와 연동까지 마치면 다음과 같은 화면이 뜬다.

 

이제 본격적으로 DB에 연결을 해보자.

  • 좌측 상단의 Connect를 클릭한다.
  • Connection Manager라는 창이 뜨는데, 마찬가지로 좌측 상단에서 New Connection을 클릭한다.
  • 그러면 아래와 같은 창이 뜨게되는데, URL 입력 창에 MongoDB URL을 입력한다.
    <db_password> 부분에는 위에서 말한 패스워드로 변경한다.

성공했을 경우 뜨는 창

  • Connection name을 변경 후, 우측 하단에 있는 save 버튼을 클릭한다.

  • 그러면 다음과 같이 DB가 생긴 걸 볼 수 있다.
    이후 해당 DB에 마우스 우 클릭 후, Connect를 클릭하면 실제로 Studio 3T와 연결할 수 있게 된다.

  • 최종 화면은 다음과 같다.

 

 

 

다음은 간단하게 데이터를 제어해보는 연습이다.

  • db.collectionName.find({}): 조회하는 기능
  • db.collectionName.insertOne({ key: "value", key2: "값" }): 데이터 삽입
  • db.collectionName.deleteOne({ _id: ObjectId("...")}): 데이터 삭제

진행 순서는 다음과 같다.

  • 우 클릭 후 Add Database 클릭

  • DB이름 지정(나는 mongodb_prac라고 지정했다.)
    그럼 아래 이미지처럼 DB가 생성된 게 보인다.

  • 다시 mongodb_prac를 우 클릭 후 Open IntelliShell 클릭을 하면 다음과 같은 창이 뜬다.

 

  • 이후 창에 `db.mongodb_prac.insertOne({ key: "value", key2: "값" })` 입력
  • 바로 위 초록색 재생 버튼 클릭
    값이 정상적으로 삽입된 것을 볼 수 있다.

  • 해당하는 데이터가 정상적으로 존재하는지 확인을 위해,
    `db.mongodb_prac.find({})` 입력 → 실행

    아래 이미지를 보면 값이 제대로 들어간 것을 볼 수 있다.
    여기서 _id는 데이터를 고유하게 구분하기 위해 따로 생성된 것으로, ObjectId라고 불린다.
    MongoDB에서는 ObjectId라는 형식을 가지고 데이터를 구현하게 되는데, 이 경우 여러개의 데이터를 생성하게 되더라도 무조건 고유하도록 해당하는 데이터가 구현되도록 만들어진다.

 

  • 이젠 삭제를 실험하기 위해 값이 나온 곳에서 우클릭 Document View Document (JSON)... 클릭 & _id 복사

 

  • `db.mongodb_prac.deleteOne({ _id: ObjectId("...")})` 입력
    여기서 ... 부분에 복사한 _id를 붙여 넣는다.

  • 이후 실행을 하면 deletedCount에서 몇 개를 삭제 했는지 확인할 수 있다.