Mongodb에 Open API 데이터 넣기

송윤주·2024년 4월 23일
0

데이터베이스

목록 보기
5/13

프로젝트를 진행하려는데 open api를 이용해 데이터를 가져오고 그 데이터를 데이터 베이스에 넣기 위해 json 데이터이기에 몽고db를 사용하기로 하였다. 그래서 그 과정을 적어보고자 작성한다.

mongodb 설치

우선 필자는 M2 pro 맥북을 가지고 있다. 그래서 구글링을 통해 어떻게 설치하는 지 파악했다. 맥북을 가진 개발자라면 brew는 다 깔려있을것이라 가정하고 아래의 명령어를 터미널에 순서대로 입력하면 된다.

brew tap mongodb/brew
brew update
brew install mongodb-community@6.0
brew install mongodb-community-shell
brew services start mongodb-community@6.0

이러면 설치가 완료된다! 설치가 제대로 됐는지 확인하기 위해서는 크롬창에 localhost:27017 를 쳐보자

고롬 이렇게 활성화 된 것을 볼 수 있다.
그다음 터미널에서mongo 를 쳐보면

몽고디비를 제어할 수 있는 클라이언트 접속이 가능해진다. 지금 상황은 인증이 활성화되지 않았기에 바로 로그인이 가능하다. 그래서 몽고디비 셸에서 현재 로그인한 사용자가 누구인지 확인하기 위한 명령어를 입력하면 아무것도 나오지 않는것을 확인할 수 있다.




데이터베이스 생성

현재 존재하는 데이터베이스를 확인하는 명령어인 show dbs 를 통해 확인해보면

이렇게 초기에 만들어지는 데이터베이스만 존재하고 있다. 이 명령은 사용 가능한 모든 데이터베이스의 이름과 각 데이터베이스가 사용중인 디스크 공간을 보여준다.
그래서 처음부터 만들어져 있는 저 데이터베이스들은 뭘까?

  1. admin 데이터베이스
    • 이 데이터베이스는 MongoDB 인스턴스의 관리와 관련된 중요한 역할을 한다. 전체 시스템에 걸친 관리 작업, 사용자 인증과 역할 관리 등의 작업이 이 데이터베이스에서 이루어진다. 특히, MongoDB에서 데이터베이스 간의 사용자 역할을 관리할 때 admin 데이터베이스에 있는 사용자가 다른 모든 데이터베이스의 사용자 역할을 관리할 수 있다.
  2. config 데이터베이스
    • config 데이터베이스는 MongoDB의 샤딩 설정을 저장하는 데 사용된다. 샤딩은 데이터베이스의 데이터를 여러 서버에 분산시켜 저장하는 방법을 말하며 이 데이터베이스는 샤드 클러스터의 메타데이터를 포함하고 있으며, 샤드된 클러스터의 각 샤드에 저장된 데이터와 관련된 정보를 포함한다. 예를 들어, 어떤 샤드가 어떤 데이터 범위를 담당하는지, 시스템의 구성 요소들이 어떻게 연결되어 있는지 등의 정보가 이곳에 저장된다.
  3. local 데이터베이스
    • local 데이터베이스는 해당 서버 인스턴스에 국한된 정보만을 저장하며, 이 데이터는 다른 서버와 복제되지 않는다. 주로 복제 관련 정보가 저장되며, MongoDB가 복제를 설정할 때 각 복제 노드의 상태와 작업 로그(오프레이션 로그 또는 oplog)를 관리하는 데 사용된다. oplog는 다른 모든 복제 노드가 데이터의 동기화를 유지할 수 있게 하는 데 필수적인 로그이다.

이 세 데이터베이스는 MongoDB의 기본 작동과 유지 관리, 그리고 확장성을 위해 필수적인 역할을 하며, MongoDB의 운영에 있어서 중요한 구성 요소들이라고 한다.

일단 몽고디비의 개념공부를 하는 시간이 아니기에 계속 진행해보자.
MongoDB 셸에서 데이터베이스와 컬렉션을 생성하는 방법은 매우 간단하다. 먼저 MongoDB에 연결된 상태에서 새 데이터베이스를 생성하려면, 해당 데이터베이스를 "사용"하는 명령을 실행해야 한다. MongoDB에서는 데이터베이스를 명시적으로 "생성"하는 명령이 없기에 데이터베이스에 데이터를 처음 삽입할 때 자동으로 생성된다.

데이터베이스 생성하기

새 데이터베이스를 사용하려면, 먼저 그 데이터베이스를 선택해야 한다. 예를 들어, "myNewDatabase"라는 이름의 데이터베이스를 만들고 싶다면 다음과 같이 입력한다:

use myNewDatabase

이 명령은 myNewDatabase라는 이름의 데이터베이스를 사용하겠다고 지정하는 것이다. 만약 이 데이터베이스가 존재하지 않는다면, MongoDB는 데이터가 처음 삽입될 때 자동으로 생성한다.

내가 진행하는 프로젝트명이 cg이기에 이걸로 이름을 지정해주었다. 그럼 cg db로 변경했다는 출력이 뜬다.

컬렉션 생성하기

MongoDB에서 컬렉션은 데이터베이스 내에서 데이터를 구조화하는 데 사용되는 컨테이너이다. 컬렉션 역시 명시적으로 생성할 필요는 없으며, 데이터를 처음 삽입할 때 자동으로 생성된다. 그러나 명시적으로 컬렉션을 생성하고자 할 경우, 다음과 같은 명령을 사용할 수 있다:

db.createCollection("myCollection")

이 명령은 현재 선택된 데이터베이스(myNewDatabase) 안에 myCollection이라는 이름의 컬렉션을 생성한다.

나는 인구혼잡도 api를 사용하려고 하기에 congest라는 이름의 컬렉션을 생성해주었다. 잘 생성됐으면 ok 시그널이 떨어진다. 그리고 꿀팁! 몽고디비 셸에서도 탭이 먹히니까 잘 사용해서 시간을 아껴보자~~~

데이터 삽입하기

데이터베이스와 컬렉션이 준비되었다면, 이제 데이터를 삽입할 수 있다. 예를 들어, 다음과 같이 간단한 문서를 myCollection에 삽입할 수 있다:

db.myCollection.insert({name: "John", age: 30})

이 명령은 myCollection 컬렉션에 새 문서를 추가하는 것이고 이 문서는 {name: "John", age: 30}라는 내용을 포함한다.
이거는 이제 셸에서 삽입할 수 있는 것이고 나는 코드를 통해 넣을 것이기에 넘어가보자.




Open API 데이터 넣기

사실 node.js를 통해서 백엔드 서버를 구성하고 개발된 api 호출할 때 open api 콜을 통해 데이터를 가져와 몽고db에 넣는 것이기에 자바스크립트 언어로 작성해야된다. 근데 일단 주피터로 테스트용도로 확인하는 것이기에 파이썬으로 먼저 확인해보자.

python 사용

import pymongo
import requests
import json

# MongoDB에 연결
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["cg"]  # 사용할 데이터베이스 이름
collection = db["congest"]  # 사용할 컬렉션 이름

# API 데이터 가져오기
url = f'http://openapi.seoul.go.kr:8088/{api_key}/json/citydata/1/5/광화문·덕수궁'
data = requests.get(url)
data_json = json.loads(data.text)
city_congestion = data_json['CITYDATA']['LIVE_PPLTN_STTS'][0]

# MongoDB에 저장할 데이터 구조 정의
document = {
    "congestion_level": city_congestion['AREA_CONGEST_LVL'],
    "congestion_message": city_congestion['AREA_CONGEST_MSG'],
    "population_min": city_congestion['AREA_PPLTN_MIN'],
    "population_max": city_congestion['AREA_PPLTN_MAX'],
    "male_population_rate": city_congestion['MALE_PPLTN_RATE'],
    "female_population_rate": city_congestion['FEMALE_PPLTN_RATE'],
    "population_rate_00s": city_congestion['PPLTN_RATE_0'],
    "population_rate_10s": city_congestion['PPLTN_RATE_10'],
    "population_rate_20s": city_congestion['PPLTN_RATE_20'],
    "population_rate_30s": city_congestion['PPLTN_RATE_30'],
    "population_rate_40s": city_congestion['PPLTN_RATE_40'],
    "population_rate_50s": city_congestion['PPLTN_RATE_50'],
    "population_rate_60s": city_congestion['PPLTN_RATE_60'],
    "population_rate_70s": city_congestion['PPLTN_RATE_70']
}

# 데이터베이스에 데이터 삽입
collection.insert_one(document)

이런식으로 데이터를 적재할 수 있다. 근데 여기서 pymongo.MongoClient안에 있는 값이 낯설다! 그럼 공부해봐야지. 이 값은 어떤 값을 넣을 수 있을까?

MongoClient에 들어가는 텍스트는 MongoDB 데이터베이스에 연결하기 위한 연결 문자열이다. 이 연결 문자열은 데이터베이스 서버의 위치, 포트 번호, 사용자 인증 정보 등을 포함할 수 있으며, MongoDB와의 통신을 설정하는 데 사용된다. 연결 문자열의 기본 구조는 다음과 같다:

mongodb://username:password@host:port/database

여기서 각 요소는 다음을 의미한다:

  • username: 데이터베이스에 접근 권한이 있는 사용자의 이름이다.
  • password: 해당 사용자의 비밀번호이다.
  • host: MongoDB 서버의 호스트 이름 또는 IP 주소이다.
  • port: MongoDB 서버가 듣고 있는 포트 번호이다 (기본값은 27017입니다).
  • database: 연결 시 기본적으로 사용될 데이터베이스의 이름이다.

예를 들어, 사용자 이름이 admin이고 비밀번호가 1234, 호스트가 localhost, 포트가 27017이며 기본 데이터베이스로 mydatabase를 사용하는 경우, 연결 문자열은 다음과 같다:

mongodb://admin:1234@localhost:27017/mydatabase

지금 나의 상황에서는 유저를 만들어서 그 유저가 데이터베이스를 제어하는게 아니기에 그냥 유저와 패스워드를 삭제하여 접근하는 코드로 만들었다.

print(client)
print(client['cg'])
print(client['cg']['congest'])

'''
출력결과
MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True)
Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'cg')
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'cg'), 'congest')
'''

그래서 이렇게 각 변수들을 확인하면 딕셔너리 형식으로 키값으로 접근하면 데이터베이스와 컬렉션에 들어갈 수 있는 것을 확인할 수 있다.

그래서 다큐먼트를 넣어보면 저렇게 ObjectId가 자동으로 생성되는 것을 확인할 수 있다.

profile
모두가 정보를 습득할 수 있도록 냠냠쩝쩝 먹어보는 공간

0개의 댓글