[WEB_풀스텍]/개발일지

[3주차] Python / Web Crawling / MongoDB

Code_Otaku 2022. 7. 7. 11:08

 

안녕! 안녕!

드디어 HTML / CSS / JavaScript를 이용한 프론트 단 꾸미기가 끝이 나고..

3주차에 들어서는 본격적으로 컴파일 언어를 하나 선택하여 백엔드 서버를 구축하는 과정에 돌입했다.

바로 파이썬을 이용해서!

사실 파이썬은 컴파일러라기보다는.. 인터프리터에 더 가깝다고 한다.

어찌 되었건.. 저급 언어인 Java에서 한 발자국 더 나아가 고급언어인 Python을 처음 접해본 것이다.

 

보통 저급언어, 혹은 고급언어를 나누는 기준은 특정 언어가 얼마나 진보되었나?

그런 요소로 판가름 하는게 아니다.

저급 언어일수록 컴퓨터에 친화적이고, 고급 언어일수록 개발자에게 더 친화적임을 나타내는 업계 용어다.

그러한 점에서 파이썬은 자바보다 더 고오오오급! 언어라고 할 수 있겠다.

 

그렇다고는 하나..

필자는 이 댄디한 언어를 다루면서 여간 불편한 것이 아니었다.

아니.. 기능적으로 불편하다는 것이 아니다.

오히려 문법 자체는 자바와는 비교가 안될 정도로 편리하고, 직관적이다.

그래서 심기가 불편했다..

실력과 쏘울은 충만하나 버르장머리가 없는 MZ 신입사원을 보는 기분이라고 해야할까?

 

필자보다 나이가 어린 전공생들은 그런 생각이면 격식이 넘치는 어셈블리를 배우라고 하는데..

솔직한 말로 코드의 양이 많아지고, 분업이 세분화 될수록 이런 언어는 욕이 나올 수밖에 없다고 생각한다.

주석을 하나 하나 달아놓지 않으면 나중 가서 본인들조차 헷갈릴 것이 분명하다. 

내가 이쪽 업계 엔지니어들 생태를 얼핏 보고, 들은 바가 있어서 아는데..

니들 ㅅ1발 존나게 게으르잖아.. ㅡㅡ

 

후우.. 하여튼!

이렇게 필자로 하여금 서론부터 넋두리를 주저리 주저리 늘어뜨려 놓게 만든

이 파이썬이라는 녀석을 간략하게 훑어보는 시간을 가져보겠다.

전공서적을 가지고 깊이 있게 배운 것이 아니라서, 너무 변태같이 파헤칠 수는 없다.

이 점은 양해 바란다.

 

그리고 더 나아가!

DB 분야에서 MySQL과 양대 산맥을 이루는 NOSQL, 그 중에서도 MongoDB에 대해서도 다뤄보겠다.

마지막으로 예제 하나 던져놓고 그것을 레로레로 핥아보면 딱이겠지?

그럼 이번에도 기합차게 달려보자.

아쎄이.. 위치로..!

 


1. Python 기초

말 그대로 파이썬의 가장 기초적인 문법을 다뤄보고자 한다.

여기에도 자바처럼 다형성이나 상속 개념이 분명 있을 테지만..

수업에서는 당장 써먹을 만한 데이터 타입이나 조건문, 반복문 정도만 알려줬다.

 

a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?

 

하.. 진짜 버르장머리 없네..

왜 그렇겠는가?

자바와는 달리 변수를 선언할 때 데이터 타입을 별도로 지정해주지 않아도 된다.

 

그러니까..

 

int a = 1;

String b = "Hello, Python!";

 

요런 식으로 엄격하게 정의할 필요가 하나도 없다는 것이다.

사람마다 취향이 제각각이듯이 오히려 저런 타입을 더 선호하는 사람들도 분명 있을 것이다.

분명하게 말해두지만 필자는 '불호'에 가깝다.

세미콜론은 무너졌냐?

 

name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,

is_number = True 
# True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.

 

뭐.. 요 놈은 한 술 더 떴다고 할 수 있다.

Integer이건, String이건, Boolean이건.. 문제 없다는 저 당당한 태도를 보라.

 

"상무님~~ 오늘 점심은 돌솥비빔밥 콜?!?! >.<"

마치 이러는 거 같아서 속에서 울화통이 치밀어 오른다.. ㅡㅡ

 

a_list = []
a_list.append(1)     # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다

# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2

 

어딘가 모르게 익숙하지 않는가?

그렇다 JS에서 쓰던 Array 타입과 거의 똑같다.

비어있는 상태의 배열을 하나 만들어주고..

거기에 값을 하나씩 밀어넣는 구조임을 쉽사리 알 수 있다.

 

 

영 미덥지 못해서 하나씩 출력 테스트를 해봤다.

잘 나오네? ㅎㅎㅎㅎ

 

a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# a_dict의 값은? {'name':'bob','age':21, 'height':178}
# a_dict['name']의 값은? 'bob'
# a_dict['age']의 값은? 21
# a_dict['height']의 값은? 178

 

요 놈도 꽤나 친숙한 녀석이 아닌가?

그렇다 JS에서 지겹도록 쓰던 Dictionary 라는 기법이지?

자바에서 라이브러리만 깔아주면 JSON 형식으로도 데이터를 다룰 수 있던..

 

 

요 놈도 문제 없이 잘 출력되고 있구만..

 

필자가 말했지? 저급언어와 고급언어를 나누는 기준은 우열이 아니라, 개발자에게 얼마나 친화적인가의 차이라고..

익숙해지면 오히려 인터프리터가 더 친숙하게 다가올 수도 있겠다.

 

people = [{'name':'bob','age':20},{'name':'carry','age':38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'

 

요 놈은 배열과 딕셔너리를 짬뽕해놓은 형태구만..

어디 한 번 테스트를 해보자.

 

 

이번에도 문제 없이 잘 출력되고 있구만..

 

워낙 기초적인 내용이기 때문에 코드리뷰 달듯이 상세하게 코멘트 하지는 않겠다.

그냥 자료형하고 콘솔창을 비교해가면서 쳐다보면 뭐가 뭔지 대충 알 것이다.

어짜피 시작은 다 C언어에서 파생됐기 때문에 크게 다를 건 없다.

 

def sum_all(a,b,c):
	return a+b+c

def mul(a,b):
	return a*b

result = sum_all(1,2,3) + mul(10,10)

# result라는 변수의 값은?

 

더 이상 말도 안나온다.

자바 같았으면.. 하아..

확실히 유저 친화적인 언어이기 때문에 이해가 빠르기는 하다.

 

 

이래서 쌩초보 뉴비들 상대로는 파이썬이 인기가 많은 거구나.. 싶다.

눈으로만 따라가도 금방 코드가 읽히지 않는가?

하지만 필자는 왜 걱정이 먼저 앞서는지 모르겠다..

 

def is_adult(age):
	if age > 20:
		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
	else:
		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

is_adult(30)
# 무엇이 출력될까요?

 

요런 식으로 조건문도 만들 수 있다.

 

 

...

당연한 결과겠지..

 

@NoArgsConstructor

int age;

public is_adult(int age){
	age = 30;

	if(age > 20){
    	system.out.println("성인입니다.");
    }else{
    	system.out.println("잼민이입니다.");
    }
}

 

자바라면 이런 식으로 만들어야 했겠지.

파이썬보다 다소 복잡해보일지는 모르겠지만 필자는 이게 더 좋다.

 

 

여기까지가 내일배움단에서 다루고 있는 파이썬 기초 문법이다.

저 정도만 할 줄 알아도 5주짜리 토이 프로젝트 하나 만드는데 문제 없다는 거겠지..

필자도 파이썬 자체를 너무 깊게 파고 들어가지는 않을 것이다.

 


2. Package & Library Import

파이썬 환경에서도 역시 패키지나 라이브러리를 밀어넣는 것이 가능하다.

당연하겠지?

지금 필자가 사용하고 있는 PyCharm 역시 IntelliJ와 마찬가지로 JetBrains 사에서 만든 IDE이기 때문이다.

 

혹시라도 개념이 낯선 분들을 위해 설명을 덧붙이자면..

패키지 ( < 라이브러리) 라는 녀석들은 특정한 기능을 구현하기 위해 가져다가 쓰는 '모듈 (Module)' 이라고 할 수 있다.

'가져다가 쓰는' 이라고 했다.

파이참에서 기본적으로 제공하는 라이브러리 외에 남들이 만들어놓은 툴도 임포트 해서 쓰는 것이 가능한 것이다.

 

 

요런 식으로 설정 탭으로 먼저 들어가라.

 

 

+ 버튼을 눌러 원하는 라이브러리를 밀어 넣어줄 수 있다.

 

 

저렇게 검색창에서 찾아다가 쓸 수도 있다.

리처드슨 형님이 만든 Beautiful Soup라는 모듈이네?

앞으로 우리가 쓸 라이브러리 중에 하나이다.

우측 하단 패키지 설치만 누르면 간편하게 임포트가 가능..

괜히 유료 툴이 아닌 것이다.

 

 

다음 시간부터 우리는 여태까지 배운 것들을 기반으로..

'웹 크롤링 (Web Crawling)' 이라는 기법에 대해 다뤄볼 것이다.

기본적으로 Beautiful Soup 라는 패키지를 밀어넣어야 원하는 기능을 가져다가 쓸 수 있다.

아직까지는 어렵지 않으니 서두르지 말고 필자를 따라와주기 바란다.

 


 

3. Web Crawling (Web Scraping)

 

필자가 구글링을 조금 해보니 파이썬을 배울 때 사실상 입문단계에 해당하는 내용 같다.

 

여태까지 파이썬 기본 문법만 다루는 둥.. 마는 둥.. 하다가 갑자기???

 

필자는 미륵 부처라 관심법을 쓸 줄 안다.

딱 봐도 귀찮아 죽을라고 하는데, 자바같은 꼰대언어랑 비교질만 해대고..

독자들이 봤을 때는 뻔한 것 아닌가?

 

그냥 관심사의 차이라고 생각해라.

 

필자가 배우던 Java는 딱!

기업 내지 관공서에서 원하는 웹 / 앱을 만들고, 그것을 배포하는 게 주 목적이다.

진입하고 안착만 확실하게 한다면 일감이 끊기는 분야는 아닌 것이다.

 

반면에 Python은 웹 / 앱 개발 그 자체보다는 데이터를 분석하고, 핸들링 하는 것에 더 특화되어 있다.

앱만 만들어서 서비스하는 거라면 Java면 충분하지 뭣하러 Python까지 끌어들이겠는가?

 

이번 챕터에서 다룰 Web Crawling, Web Scraping이 바로 그 취지에 부합하는 기법이다.

하나의 웹 사이트만 하더라도 무수히 많은 정보가 여기 저기 산재해 있을텐데..

 

그 중에서 내가 필요한 정보만 쏙쏙 뽑아다가 쓸 수는 없을까?

 

있다. 파이썬은 그러한 방면으로 진짜 탁월하다.

Web Crawling이 바로 그런 기법이다.

내가 원하는 데이터만 doGet 방식으로 취합해서 가져갈 것이다.

 

지니차트>월간 - 지니 (genie.co.kr)

 

지니차트>월간 - 지니

AI기반 감성 음악 추천

www.genie.co.kr

 

 

우선은 이 사이트를 가지고 장난질을 좀 쳐보자.

 

장난질을 쳐?

또 HTML 뜯어고쳐가지고 '내가 네이버를 해킹했다!!!' 이러려는 거지? 흥! 안속지롱~ ㅋㅋㅋㅋ

 

...

 

그런거 아니다.

우리는 저기에서 세 가지 데이터만 가져갈 것이다.

곡의 순위 (rank), 곡 정보 (title), 아티스트 (artist), 이렇게 말이다.

 

그러기 위해서 우선 PyCharm을 실행시켜주자.

이름 아무렇게나 해서 *.py 파일을 하나 만든 다음에...

 

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20220707',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

 

요 소스코드를 복붙 해가라.

bs4 패키지 임포트 하는 방법은 바로 이전 장에서 알려줬지?

분량은 짧을지언정 무려 하나의 챕터로 할애한 내용이다.

대충 훑고 지나갔으면 다시 복습하고 와.. ㅡㅡ

 

 

bs4 패키지를 임포트 했으면 다시 웹으로 돌아가.

대충 곡 정보 어디 즈음에 마우스 갖다대고 우클릭 해라.

그 다음 개발자도구 창 여는 것 정도는 알지?

 

 

뭐.. 대충 선머슴이라는 노래가 1위를 먹고 있는 중인거 같다.

TOMBOY 영역 선택한 다음에 우클릭!

 

 

복사!

그 다음에 또 selector 복사!

 

 

요런 식으로 붙여 넣어줘라.

뭔가 설명이 생략된 거 같은데?

싶더라도 우선은 필자의 가이드에 따라주기 바란다.

다 생각이 있다.

 

 

그 다음으로는 이거다! 싶은 셀렉터들은 모두 긁어올거다.

그.. 뭔가 공통적인 패턴은 반복되는 거 같지 않은가?

 

#body-content > div.newest-list > div > table > tbody > tr

 

<tr> 태그 까지는 전부 똑같다.

 

# Copy + Paste Web Selector
# 0. <div>: #body-content > div.newest-list > div > table > tbody > tr
# 1. 곡 정보: td.info > a.title.ellipsis
# 2. 순위: td.number
# 3. Artist: td.info > a.artist.ellipsis

 

그럼 이런 식으로 필요한 정보들을 추려낼 수가 있겠지.

이제 요 놈들을 적재적소에 가져다가 쓰는 일만 남았다.

 

infos = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for info in infos:
    title = info.select_one('td.info > a.title.ellipsis').text.strip()
    rank = info.select_one('td.number').text[0:2].strip()
    artist = info.select_one('td.info > a.artist.ellipsis').text

    print(rank,title,artist)

 

이렇게!

필자가 bs4 패키지를 미리 임포트 해오라고 했지?

HTML에서 긁어온 selector를 가지고 필요한 정보를 뽑아내기 위함이다.

설명이 장황해질 필요가 없다.

우선 출력테스트부터 해보자.

 

 

짜잔~!

우리가 필요로 하는 데이터 (title, rank, artist) 만 보기좋게 출력해왔다.

파이참 서버가 Genie라는 웹 클라이언트GET 요청 (Request)을 날린 결과,

우리가 코딩한 방식대로 응답 (Response)이 되돌아 온 것이다.

 

코드 하나 하나에 집중하기 보다는 전체적인 구조를 먼저 파악하기 바란다.

어짜피 지겹도록 복붙해서 쓸 것이다.

 

...

 

쨌든! 이러한 기법을 Web Crawling / Scraping 이라고 한다.

어때? 꽤 쓸만하지 않는가?

비록 필자가 아직까지는 JAVA ♡ FOREVER를 고수하고 있지만! (...)

신박한 기술인 건 맞지 않은가?

데이터는 돈 그 자체이다.

지금도 그렇지만 앞으로도 데이터를 잘 다룰 줄 아는 사람이 큰 돈을 만질 것이다.

 

그런 의미에서!

다음 챕터에서는 비교적 새로운 SQL!

Not Only SQL의 약자인 NOSQL!

그 중에서도 요즘 가장 핫한 MongoDB를 다뤄보도록 하자.

 


4. MongoDB (Ⅰ)

 

앞으로 우리가 5주동안 뻔질나게 쪼물딱 해볼 MongoDB라는 DB 전용 프로그램이다.

딱 접속하자마자 저런 화면이 뜨는데..

뭔가 알듯 말듯하게 느낌이 오지 않는가?

익숙할 수도 있고, 그렇지 않을 수도 있지만..

대부분 한 두번씩은 오고가면서 들어본 적 있는 개념이다.

 

그래! 바로 그거야!

Cloud..

그게 뭔지 정확히는 모르겠지만 클라우드 서버라고 들어본 적 있지 않은가?

하다 못해 네이버 클라우드라도!

 

우리가 사용할 요 MongoDB는 Atlas 라는 회사에서 지원하는..

클라우드 기반 데이터베이스 전용 서비스이다.

왜 하필 클라우드일까??

그건 조금 있다가 설명하도록 하고..

 

우선은 아래 링크를 타고 들어가 회원가입까지 완료해주기 바란다.

https://account.mongodb.com/account/register 

 

Cloud: MongoDB Cloud

 

account.mongodb.com

 

혹시 어려움을 겪고 있는 독자분들이 있을지도 모르니 필자가 도와줄게!

 

 

뭐 아마 요런 창이 하나 뜰 것이다.

필자는 선호하는 언어로 당당하게 파이썬을..

아니 자바를 선택했다.

다음..

 

 

현업에서는 당연히 가장 비싼 버전을 구매해서 쓰겠지?

어짜피 회사 단위 프로젝트일테니..

하지만 우리가 교보재로 쓸 녀석은 공짜로 제공되는 'Shared' 만으로 충분하다.

'생성하기 (Create)' 를 눌러라!

 

 

필자가 듣고 있는 인강은 1년인가.. 2년 전 기준으로 미리 찍어놓은 내용이라..

아시아에선 싱가포르밖에 지원을 안할 것이다.

하지만 필자가 가입할 시점 (2022년 07월 06일)에는 서울 서버까지 열려 있었다.

우리는 당연히 서울 서버로 생성해줘야겠지?

 

 

무언가 개설된 거 같으면 우측 상단 본인 계정을 클릭해서..

필자가 마킹해놓은 'Organization' 을 클릭해라.

 

 

독자들은 아마 이제 막 계정을 만들었을 터..

'Create New Organization' 을 클릭해라.

 

 

프로젝트가 새로 생성되었다면 필경 'Cluster0' 라는 이름으로 DB가 생성되었을 것이다.

연결 (Connect)!

.. 이 아니라

 

 

독자들은 아마 다음과 같은 과정을 거쳐야 할 것이다.

필자는 이미 만들어 놓았기 때문에 잠시 까먹었다.

ID는 본인 꼴리는대로, PW는 본인이 까먹지 않을만큼 적당히 복잡하게!

 

pymongo, dnspython

 

어어.. 아직 연결하지 말아라.

우선 파이참에 라이브러리를 새롭게 임포트 시켜줘야 한다.

필자가 이전 이전 챕터에서 설명한 대로 pymongo와 dnspython 패키지를 새롭게 설치해줘라.

 

 

제대로 설치까지 완료했겠지?

완료 했다고 가정하고 다음 과정을 진행하겠다.

 

 

다시 연결!

 

 

예아. 어플리케이션에 연결해주도록 한다.

 

 

클러스터 설정까지 완료 해줘야 한다.

드라이버는 파이썬에.. 버전은 3.6 이상.

그리고 어플리케이션 코드라고 생성된 저 놈을 복사해라.

필자가 친절하게 동그라미로 마킹까지 해놓았지?

그 놈을 어디에다 써먹을 거냐면...

 

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20220707',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

from pymongo import MongoClient
client = MongoClient('mongodb+srv://admin:<password>cluster0.n5ejj.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

 

저 MongoClient() 라는 메서드 안에 복붙해줄 것이다.

<password>는 따로 작성해야 하므로 반드시 기억할 수 있는 걸로 생성하랬지?

 

특히 from pymongo import MongoClient 이하 세 줄은..

앞으로 늘 하나의 패키지처럼 가져다가 쓸 'Connection Pool' 같은 녀석이다.

커넥션 풀!

자바에서 나오는 내용이지롱~ ㅎㅎㅎㅎ

구글링 해봤자 무슨 말인지 모를텐데 가르쳐 줄까? 말까?

 

기분이다.

파이썬에도 있는 내용인지는 모르겠지만 이 참에 하나 배워가라.

수영장에 바람을 넣지 않은 튜브가 100개 정도 준비돼 있다고 쳐.

이 놈을 어떻게 써먹을 수 있을까?

 

개장 시간이 지나서 손님들이 100명 조금 못미치게 들어왔다고 쳐.

그 중에서 튜브를 이용하고 싶은 사람들이 있다면..

본인들이 직접 튜브에 바람을 넣어서 쓰던지, 말던지 해야 함 ㅋㅋㅋㅋ

 

압도적인 폐활량으로 직접 불어 넣던지..

아님 펌프를 빌려와서 순식간에 공기를 채우던지..

본인이 9시에 입장했다고 하면, 샤워하고 튜브에 바람까지 불어넣는 시간까지..

넉넉잡아 한 시간 정도 버릴 각오는 해야 제대로 워터파크를 즐길 수 있을 것이다.

 

비효율적이다.

지극히 비효율적이다.

그래서 자바에서 만든 기법이 바로 커넥션 풀이라는 녀석이다.

 

손님들 개장 시간에 맞춰서..

쓰던, 안쓰던 튜브에 미리 바람을 불어넣는다면?

갯수가 모자라면 낭패겠지만, 딱 준비한 갯수만큼 손님들이 방문한다면?

누이 좋고, 매부도 좋은 것 아니겠는가?

 

커넥션 풀은 딱 그런 개념이다.

DB 서버에 접속하는 시간을 조금이라도 더 줄일 수 있느냐, 없느냐..

이것보다 더 쉽게 비유할 수는 없을 것이다.

 

저 세 줄을 하나의 컬렉션으로 처리 하였을 때..

파이썬에서도 비슷한 효과를 낼 수 있는 것 같다.

정확히 자바에서의 그것과 일치하는지는 필자가 파이썬을 깊게 공부하지 않아서 잘 모르겠다..

하지만 알아두면 진짜 유용한 기법이니 필자들도 상식 하나 늘은 셈 쳐라.

 

 

후아..

사실 이렇게 깊게 다룰 내용이 아닌데 글이 너무 늘어져 버린거 같다..

걍 DB 생성하고,

그걸 CREATE, READ, INSERT, UPDATE, DELETE, JOIN 하는 과정 정도만 다루면 그만인데..

필자가 하고 싶은 말이 많은가 보다.

 

우선 여기서 한 번 끊겠다.

다음 시간에는 원론적인 내용은 조금..만 다루도록 하고

MongoDB의 기능성을 주로 얘기 해보도록 노력해보겠다.

승모근이 너무 아파서 더 이상 글을 못 쓰겠어..

 


5. MongoDB (Ⅱ)

 

자.. 계속 이어서 얘기를 나눠보자.

 

우선 RDBMS라는 녀석이 있다.

관계형 데이터베이스라고 하여 마치 엑셀시트처럼 생겨가지고..

컬럼 (Column)과 로우 (Row)의 테이블 형태로 데이터를 체계적으로 관리하는 데 특화된 녀석이다.

종류에는 원래부터 독보적인 위치에 있었던 Oracle이 있고.. 지금도 금융권에서는 이 녀석 외에 선택지가 없다.

그 외에 민간 기업에서는 사실상 MySQL이 대부분이다.

이 녀석들도 기본적으로 데이터를 INSERT, DELETE 할 수 있지만..

누적된 데이터가 수 십만, 수 백만에 달한다면 솔직히 수정하기가 어렵다.

 

반면에..

 

저번시간부터 횡설수설 다뤄보았던 MongoDB는 살짝 궤를 달리 하는 녀석이다.

기본적으로 NOSQL이라고 한다.

SQL이 아님!

그.. 저.. 그런 헛소리는 하면 안되고!

Not Only SQL의 줄임말이다.

 

그런데 왜 꼭 데이터를 꼰대같이 테이블 형태로 관리해야 함?

중간에 DB 자체를 수정해야 할 일이 얼마나 많은데?

일관성은 좀 차치하더라도.. 좀 더 프리하게 데이터를 관리할 수는 없을까?

라는 고민을 많은 개발자들이 오랜 시간을 두고서 고심을 했나보다.

그래서 나온 새로운 모델이 NOSQL이다.

 

특히!

MongoDB Atlas는 클라우드 환경에서 DB 관리 서비스를 제공해주는 녀석이다.

테이블이 아닌 JS의 딕셔너리와 같은 형태로 말이다. 

유저가 지나치게 몰려서 트래픽이 과부화 되거나

DB를 급하게 백업할 때

실시간으로 DB를 모니터링 해야 할 때

등등..

강력한 기능을 무료로도 제공해주는 툴이기 때문에 요즘 가장 핫하다고 할 수 있다.

 

자! DB 서버에 연결하고, 환경설정까지 하는 부분은 이전 챕터에서 상세하게 다뤘기 때문에 넘어가겠다.

이번 챕터에서는 pymongo로 DB를 직접적으로 관리하고, 조작까지 해보자.

파이참에 pymongo 패키지는 진즉에 임포트 해줬겠지?

그렇게 알고 넘어가겠다.

 

5-1) DB Connection & Handling mongoDB

 

from pymongo import MongoClient
client = MongoClient('mongodb+srv://admin:<password>cluster0.n5ejj.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

우선은 이런 식으로 데이터 커넥션 풀을 먼저 생성 해줘야겠지?

파이참 pymongo 서버에서 MongoClient로 데이터를 요청하는 시간을 최소화 하기 위함이다.

참고로 from 이하 세 줄은 하나의 패키지처럼 가져다가 쓸 것이라고 강조한 바 있다.

 

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

SQL 문에서는 요 놈을..

INSERT INTO TABLE VALUES (?, ?, ?, ?, ?) 

처럼 다룰 것이다.

pymongo도 똑같다.

특정 데이터 값을 테이블에 INSERT 해주겠다는 뜻이다.

 

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

이런 식으로 READ도 할 수 있다.

SELECT USER FROM TABLE WHERE NAME LIKE 'BOBBY'

SELECT * FROM TABLE

SQL에서와 마찬가지로 데이터를 여러 개 조회할 수도 있고, 한 개씩 SELECT 할 수도 있다.

 

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

업데이트도 가능하다

name이 bobby인 녀석의 age 값을 19로 변경해 주겠다네?

이것 역시 SQL 같았으면 컬럼에서 어떤 로우를 찾아내서 어쩌구 저쩌구..

식으로 설명을 했겠지만 MongoDB는 그러지 말라고 쓰는 거다.

 

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

DELETE 역시 가능하지만..

우선 주니어 급으로 들어갈 우리가 이 기능을 실제로 써볼 일은 거의 없을 것이다.

뭘 믿고서 DELETE나 DROP을 맡기는데?

그래도 기능이 있다는 것 정도만 알아두자.

 

히이익.. 저것들을 전부 외워야 함???

댓츠 노노! 그렇지 않다 아쎄이.

필요할 때마다 복붙해서 쓸 것이다.

물론 필자의 경우는 오라클로 먼저 DB를 배움으로서 거기에 나오는 기법은 다 외워두긴 했다.

그래야만 이후에 접하게 될 새로운 DB 툴을 손 쉽게 접근할 수 있었기 때문이다.

 

독자들도 저 녀석들을 딸딸딸 외우기 보다는..

차라리 오라클 DB를 먼저 파보도록 하자.

정말 정말 도움 많이 된다.

 


3주차 내용은 이 정도로 다뤄보면 충분한 거 같다.

간략하게 파이썬 기초 문법에 대하여 살펴보았고,

파이썬을 이용한 웹 크롤링 (스크래핑),

그리고 클라우드 기반의 MongoDB까지 다뤄보았다.

 

여기까지가 웹 개발 입문반으로서 다룰 수 있는 최대한의 도입부 개념파트고..

다음 4주차부터는 본격적으로 장난감 하나를 들고 실습하는 시간을 가져볼 것 같다.

 

미리 양해를 구하는 거지만.. 필자는 시작언어가 Java였다.

아직 한 가지 언어도 제대로 커버하기 어려운 게 사실이라..

자바 공부할 때처럼 파이썬도 전공 서적 하나 정해서 깊게 들어가지는 못하였다.

개념적인 부분은 소상하게 파헤치기는 힘들지만

웹 개발에 한해서 상통하는 부분이 있으면

내용이 좀 늘어지는 한이 있더라도 제대로 짚고 넘어가고자 한다.

데이터 커넥션 풀 처럼 말이다.

 

긴 글 읽어주느라 고생 많았다.

다음에 보도록 하자.

'[WEB_풀스텍] > 개발일지' 카테고리의 다른 글

[5주차] Web Application 배포하기!  (0) 2022.07.14
[4주차] Python Framework: Flask  (0) 2022.07.08
[2주차] JavaScript  (0) 2022.07.03
[1주차] HTML / CSS / JavaScript  (0) 2022.06.30