티스토리 뷰
[Docker/MongoDB] Open API로 받아온 Data를 Dockerized Mongo에 일괄 import 하기
nooblette 2023. 9. 12. 22:30목차
배경
도서와 관련된 사이드 프로젝트를 진행하던 중에 도서 data가 필요했고, 대량의 도서 data를 직접 생성해서 입력하는 것은 매우 비효율적이라 생각했다. 그래서 일일이 입력하기보다는 Open API를 활용하여 데이터를 넣어두려고 했는데, API로 내려받은 Data를 하나하나 DB에 넣는것 역시 무의미하고 불필요한 과정일 것이란 생각이 들었다. 조금 더 효율적으로 작업을 진행하고자 구글링하며 찾아보았고 다음 과정으로 도서 data 적재를 진행하였다. (host pc에서 작업한 내용은 모두 mac os 환경을 기준으로 진행하였다)
- host pc에 open api로부터 도서 정보를 json 형식으로 내려받는다.
- 1에서 받은 json 형식의 파일을 적절하게 parsing 한다.
- parsing 한 json 파일을 Mongo DB가 실행중인 컨테이너로 넘겨준다.
- 컨테이너에서 Mongo DB로 json 파일들을 일괄 Insert 한다.
일괄 Insert시에는 mongoimport 명령어를 사용했고, 몽고 컨테이너에서 api 호출을 통해 데이터를 넣는 방법도 있지만 DB용 컨테이너에는 DB 관련 패키지만 설치하고 그러한 작업만 진행하는게 맞을 것 같아, 이 부분을 살짝 번거롭지만 host pc가 api를 내려받는 과정을 추가했다. (혹은 data import가 큰 작업이라 부담된다면 api 용 컨테이너를 새로 구축하는 것도 방법 중 하나가 될 수 있을 것 같다.)
Open API 등록 및 데이터 조회
host pc에서 open api로부터 도서 정보를 json 형식으로 받고, 이렇게 받은 json 형식의 파일들을 컨테어너 내의 Mongo로 insert 하는 과정을 수행하였다. 나는 네이버 Open API를 사용하였다.
도서 open api는 위 문서를 참고하여 진행하였다. 사용자 등록을 하고 Client ID와 Client Secret을 받아두고 curl 명령어로 API를 호출하기만 하면된다. 이때 API 반환값을 별도의 파일로 저장하기 위해 -o 태그를 사용했다.
curl "https://openapi.naver.com/v1/search/book.json?query=%EC%A3%BC%EC%8B%9D&display=20&start=1" \
-H "X-Naver-Client-Id: CLIENT_ID" \
-H "X-Naver-Client-Secret: CLIENT_SECRET" -v -o naver-book-api_response.json
이렇게 내려받은 데이터형식은 다음과 같을 것이다. 여기서 items 원소 내부에 있는 책 정보만을 파싱하여 각각의 json 파일로 만들어줄 것이다.
{
"lastBuildDate":"Tue, 12 Sep 2023 21:49:42 +0900",
"total":3146,
"start":20,
"display":10,
"items":[
{
"title":"주식투자 최적의 타이밍을 잡는 법 (월스트리트의 전설적인 시장분석가에게 배우는)",
"link":"https:\/\/search.shopping.naver.com\/book\/catalog\/32486054452",
"image":"https:\/\/shopping-phinf.pstatic.net\/main_3248605\/32486054452.20230808084823.jpg",
"author":"스탠 와인스타인",
"discount":"19800",
"publisher":"플로우",
"pubdate":"20201214",
"isbn":"9791191228366",
"description":"중고시장에서 10배 이상 가격으로 거래되던 〈주식투자 백전불패〉 개정증보판\n1988년 출간 후 33년간 아마존 초장기 베스트셀러\n국내 주식투자 커뮤니티에서 13년간 회자된 투자필독서\n\n기술적 분석의 필독 고전\n아마존 33년, 국내 13년 베스트셀러\n2020년 개정완역판 출간\n\n주식 투자 전략은 크게 두 가지로 본다. 하나는 기본적 분석(펀터멘털)으로, 기업의 공시, 재무제표, 현금흐름표 등을 통해 기업 가치를 분석하여 실적이나 경쟁력 등 내외부적 요인을 바탕으로 투자를 결정하는 전통적인 방식이다. 또 하나는 기술적 분석이다. 차트, 거래량, 보조지표 등 주가 흐름 속에서 일정한 패턴이나 추세를 찾아 미래 주가를 예측하여 투자하는 방법이다. \n\n기술적 분석에서 차트 우선주의 철학으로 주식투자자들의 호응을 끌어낸 유명한 책이 스탠 와인스타인이 쓴 《Stan Weinstein's Secrets For Profiting in Bull and Bear Markets》이다. 이 책은 1988년 미국에서 처음 출간되었고 국내에는 2007년에 《차트로 배우는 주식투자 백전불패》라는 제목으로 번역 출간되었다. 번역본은 이후 절판되었고 주식투자자들에게 ‘기술적 분석의 바이블’, ‘투자자를 위한 고전’ 으로 불리며 추천도서와 필독서 목록에 이름을 올렸다. 그러나 절판 이후 재출간이 되지 않았고 투자자들 사이에 입소문으로만 전해져 중고도서 시장에서 정가의 10배 이상 가격으로 거래되어왔다. \n\n이 책에는 주식 주기 4단계에 따른 차트 읽기의 기본, 성공률을 높이는 주식 선택 방식, 손대지 말아야 할 주식 알아보는 법, 높은 수익을 보장하는 매수법, 팔아야 할 시점을 알아보는 법 등 주식 투자를 하는 이들이 궁금해하는 모든 것을 담았다. 또한 2007년판에서 누락된 ‘공매도’ 부분을 추가했고, 역자 해설과 역자 주 등 충실한 보충 해설을 달았으며, 본문의 미미한 오류를 바로잡아 완역판의 틀을 갖추었다. 온전한 형태로 재출간된 이 책에서 열렬하게 강연하는 저자의 목소리를 그대로 느낄 수 있을 것이다."
},
{
"title":"평생 저축밖에 몰랐던 66세 임여사, 주식으로 돈 벌다 (임 여사가 했으면, 당신도 할 수 있다!)",
"link":"https:\/\/search.shopping.naver.com\/book\/catalog\/40424111618",
"image":"https:\/\/shopping-phinf.pstatic.net\/main_4042411\/40424111618.20230725121801.jpg",
"author":"강환국",
"discount":"17820",
"publisher":"페이지2북스",
"pubdate":"20230614",
"isbn":"9791169850322",
"description":"임 여사가 했으면, 당신도 할 수 있다!\n\n“아들, 주식 가르쳐 줘.”\n“그럼, 해보자!”\n\n육십 평생 아껴 쓰며 돈을 모아온 임 여사, 돈이 어느 정도 모이면 집을 조금씩 늘려 나갔다. 그러다 보니 어느새 은퇴할 나이가 되었고, 다행히도 경제적으로 부족하지 않은 노후를 보내게 되었다. 하지만 치솟은 집값과 떨어진 금리 때문에 은행 이자도 받는 월세도 너무 적어지자 그녀는 과감히 아들이 한다는 ‘퀀트 투자’를 배우기로 한다. \n임 여사의 아들, 강환국은 퀀트 투자를 통해 경제적 자유를 얻어 ‘신의 직장’을 퇴사한 뒤 작가, 전업투자자, 유튜버, 강사로 활동하고 있다. 그는 10일이면 평생 투자의 방법을 다 익힐 수 있다고 장담하며 임 여사를 가르치기 시작하는데…. 갑작스러운 한마디로 시작된 왕초보 임 여사의 주식투자 프로젝트! 강환국이 엄마를 위해 들려주는 특별한 투자 수업을 이 책에서 만나보자."
},
...
]
}
items 데이터 파싱
데이터 파싱은 다음과 같은 shell script 파일을 작성하여 진행하였다. 이때 bash에서 json 포맷의 데이터를 다루기 위해 jq 패키지를 설치하였다.
- jq 패키지 설치
brew install jq
- items 데이터 파싱을 위한 스크립트 파일
#!/bin/bash
# 에러 log와 실행 log 출력
set -e
set -x
# item 배열의 길이를 가져온다.
length=$(jq '.items | length' naver-book-api_response.json)
# 각 원소를 별도의 파일로 저장.
for (( i=0; i<$length; i++ ))
do
jq ".items[$i]" naver-book-api_response.json > "booklog-book-item/items$(($i+1)).json"
done
스크립트 파일 실행 전 chmod 명령어로 권한을 먼저 부여하고 나서 실행하였다.
(이때 나는 items 데이터 파싱한 결과를 booklog-book-item 디렉토리 내부에 저장할 것이기 때문에, 해당 이름을 갖는 디렉토리를 먼저 생성해주었다.)
# 권한 부여
chmod +x extract_book_item.sh
# 디렉토리 생성
mkdir booklog-book-item
# 스크립트 파일 실행
./extract_book_item.sh
여기까지 이상이 없다면 다음과 같이 items의 원소들이 각 json 파일로 추출이 되었을 것이다.
{
"title": "주식투자 최적의 타이밍을 잡는 법 (월스트리트의 전설적인 시장분석가에게 배우는)",
"link": "https://search.shopping.naver.com/book/catalog/32486054452",
"image": "https://shopping-phinf.pstatic.net/main_3248605/32486054452.20230808084823.jpg",
"author": "스탠 와인스타인",
"discount": "19800",
"publisher": "플로우",
"pubdate": "20201214",
"isbn": "9791191228366",
"description": "중고시장에서 10배 이상 가격으로 거래되던 〈주식투자 백전불패〉 개정증보판\n1988년 출간 후 33년간 아마존 초장기 베스트셀러\n국내 주식투자 커뮤니티에서 13년간 회자된 투자필독서\n\n기술적 분석의 필독 고전\n아마존 33년, 국내 13년 베스트셀러\n2020년 개정완역판 출간\n\n주식 투자 전략은 크게 두 가지로 본다. 하나는 기본적 분석(펀터멘털)으로, 기업의 공시, 재무제표, 현금흐름표 등을 통해 기업 가치를 분석하여 실적이나 경쟁력 등 내외부적 요인을 바탕으로 투자를 결정하는 전통적인 방식이다. 또 하나는 기술적 분석이다. 차트, 거래량, 보조지표 등 주가 흐름 속에서 일정한 패턴이나 추세를 찾아 미래 주가를 예측하여 투자하는 방법이다. \n\n기술적 분석에서 차트 우선주의 철학으로 주식투자자들의 호응을 끌어낸 유명한 책이 스탠 와인스타인이 쓴 《Stan Weinstein's Secrets For Profiting in Bull and Bear Markets》이다. 이 책은 1988년 미국에서 처음 출간되었고 국내에는 2007년에 《차트로 배우는 주식투자 백전불패》라는 제목으로 번역 출간되었다. 번역본은 이후 절판되었고 주식투자자들에게 ‘기술적 분석의 바이블’, ‘투자자를 위한 고전’ 으로 불리며 추천도서와 필독서 목록에 이름을 올렸다. 그러나 절판 이후 재출간이 되지 않았고 투자자들 사이에 입소문으로만 전해져 중고도서 시장에서 정가의 10배 이상 가격으로 거래되어왔다. \n\n이 책에는 주식 주기 4단계에 따른 차트 읽기의 기본, 성공률을 높이는 주식 선택 방식, 손대지 말아야 할 주식 알아보는 법, 높은 수익을 보장하는 매수법, 팔아야 할 시점을 알아보는 법 등 주식 투자를 하는 이들이 궁금해하는 모든 것을 담았다. 또한 2007년판에서 누락된 ‘공매도’ 부분을 추가했고, 역자 해설과 역자 주 등 충실한 보충 해설을 달았으며, 본문의 미미한 오류를 바로잡아 완역판의 틀을 갖추었다. 온전한 형태로 재출간된 이 책에서 열렬하게 강연하는 저자의 목소리를 그대로 느낄 수 있을 것이다."
}
파싱한 데이터를 도커 컨테이너 내부로 전달
먼저 Mongo 컨테이너에서 bash로 쉘 스크립트를 실행하기 위해 Mongo DB가 실행중인 컨테이너의 내부로 bash로 진입하였다. (이때 Docker GUI툴인 Portainer를 사용했다. portainer 세팅 설정은 다음 글을 참고하면 될 것이다.)
Portainer를 통한 도커 컨테이너 내부 진입 과정은 다음과 같다.
여기까지 진행하면 진입 성공한 것이다. 이렇게 진입하였다면 현재 경로는 루트(/) 리렉토리에 있을 것이고 디렉토리의 목록을 조회하면 다음과 같은 파일이 있을 것이다.
다음 과정으로 위에서 파싱한 10개의 json 파일을 도커 컨테이너 내부의 루트(/) 디렉토리로 전달하였다. 이때는 docker cp 명령어를 사용하였다. 명령어와 상세 설명은 다음과 같다.
docker cp booklog-book-item CONTAINER_NAME:/book-item
- cp : 띄어쓰기를 기준으로 좌측 경로에 있는 파일을 우측 경로로 복사
- 이때, host pc의 booklog-book-item 디렉토리 내부의 모든 파일을 CONTAINER_NAME 컨테이너의 /book-item 경로로 복사한다.
성공적으로 복사했다면 다음과 같이 Successfully copied로 나올 것이다
도커 컨테이너에서 조회해봤을때도 정상적으로 10개의 json 파일이 /book-item 경로로 들어온 것을 볼 수 있다.
JSON 데이터 MongoDB에 일괄 Import
이렇게 넣어둔 json 포맷의 데이터를 MongoDB에 일괄로 import를 진행하였고, 이때는 mongoimport 명령어를 사용했다.
(mongoimport 명령어는 Mongo DB를 설치했다면 기본으로 설치되는 명령어이므로 별도로 추가 설치할 필요는 없을 것이다.)
mongoimport 명령어는 다음과 같이 사용하며, 이 때 각 태그에 대한 역할은 다음과 같다.
- --db : 데이터를 import할 DB명
- --collection : 데이터를 Import할 Collection 명
- --file : import할 파일과 그의 확장자
- --username : mongo DB에 인증 권한을 설정했을 경우 사용자 계정정보 기입
- --password : mongo DB에 인증 권한을 설정했을 경우 사용자 패스워드 기입
- --authenticationDatabase : 인증정보를 갖고있는 DB명, 추가적인 설정을 하지 않았을 경우 (대부분) admin DB가 그 정보를 가지고 있다.
mongoimport --db DATABASE_NAME --collection COLLECTION_NAME --file FILE_NAME.file_extension --username USER_NAME --password PASSWORD --authenticationDatabase admin
하지만 mongoimport는 단일 파일에 대해서만 import를 지원하지만 나와 같은 경우 book-item 디렉토리에 있는 모든 *.json 형식의 파일을 Mongo DB로 넣어두기 위해서 shell script를 작성하여 진행하였다.
#!/bin/sh
for book in /book-item/*.json; do
mongoimport --db DATABASE_NAME --collection COLLECTION_NAME --file "$book" --username USER_NAME --password PASSWORD --authenticationDatabase admin
done
마찬가지로 이렇게 생성한 쉘 스크립트 파일을 docker cp 명령어를 통해 컨테이너 내부로 전달한다.
docker cp import_book.sh CONTAINER_NAME:/
그 후 import_book.sh 파일에 실행 권한을 주고 쉘 스크립트를 실행해주면 된다.
# 권한 부여
chmod +x import_book.sh
# 스크립트 파일 실행
./import_book.sh
결과
Mongo Compass로 해당 DB를 조회해봤을때 Open API로부터 내려받은 *.json 형식의 Book 데이터 10개가 book Collection에 적재되었음을 확인할 수 있다.(위 이미지에서는 기존에 받았던 20개와 + 포스팅하면서 추가적으로 받은 10개 로 총 30개의 데이터가 존재)
'DevOps' 카테고리의 다른 글
[Docker] Spring Boot 프로젝트에 도커 컨테이너 연동과 Docker-compose 세팅 (3/3) (0) | 2023.09.10 |
---|---|
[Docker] 도커에 MongoDB 설치 및 MongoDB GUI 툴 Mongo Compass로 접속하기 (2/3) (1) | 2023.09.04 |
[Docker] 도커 설치와 web GUI 툴 Portainer로 Docker 연동하기 (1/3) (0) | 2023.09.03 |