본문 바로가기
사이드 프로젝트/뉴스구독 웹서비스

AWS What's new 뉴스레터1 | MongoDB를 써볼까?!

by 카프리썬_ 2021. 4. 16.
728x90

aws에는 매달 새로운 소식을 전하는 what's new라는 서비스? 기사? 가 있다.

이걸 마치 내가 구독한 뉴스테러처럼

내가 직접 찾아가서 보는게 아니라 먼저 소식이 나에게 찾아오는 방식으로 만들어보고 싶었다.

 

사실 이전에는 한번했던 적이 있다.

aws lambda로 자동화해서 매주 월요일마다 신규소식을 크롤링하고 엑셀에 담아두는 것이다. 

엑셀로 남기전 데이터들은 이런 모양인데.. 

하나의 entries에 담긴 데이터들▼

더보기

이중에서 필요한 정보만 파싱해서 새로운 JSON데이터형식으로 만들까 한다.

너무 불필요한 정보들이 많아서 먼저 필요한 정보를 파싱했다

하지만, 엑셀로 담아두면 뭐하노 다시 해당 주제에 대한 카테고리를 분류를 또 해야했다.

 

물론 신규소식을 읽는다는게 매일 새로웠지만 번거롭고 시간이 드는 작업이였다.

그러다 크롤링 공부도 다시 해볼겸, 다시 새로 갈아엎었다.

AWS 소식은 RSS로 되어 있어서 feedparser로 쉽게 긁어올수 있었다. 

feedparser를 이용해서 긁어온 4월 what's new 소식들 (날짜/카테고리/제목/링크)

하지만 이제부터 문제였다.

이걸 어떻게 어디제 저장할 것인가?

매번 하던 RDB가 아니라 드디어 NoSQL을 사용해볼 기회인가! 몽고디비를 해봐야겠다!!


왜 NoSQL을 쓰게 되었나?

물론 새로운 데이터베이스를 쓰고 싶은 마음이기도 하지만, 무엇보다 데이터형태가 적합했다고 생각했다.

이전엔 데이터베이스라곤 없었다. 왜냐면 굳이 저장할 필요가 없다고 생각했기 때문이다. 

그래도 잠시라도 담아둘 공간(?)이 필요했기 때문에 크롤링한 내용들을 '엑셀'에 담아두었었다.

하지만 넣은 데이터는 '제목' | '날짜' | '링크' 정도였다. 

그런데 이 모든 소식들이 다 중요한게 아니다보니까 카테고리별로 핵심되는 소식이 아닌건 걸러내야했다.

그래서 사실상 뉴스레터처럼 소식을 받기 이전에 카테고리를 분류하는 작업이 더 중요한 것이다. 

그러나 RSS를 feedparser로 파싱한 결과에 있는 카테고리 관련 데이터들는 이런 형식이였다.

'tags': [
{
'term': 'general:products/aws-glue,marketing:marchitecture/analytics',
'scheme': None,
'label': None
}
],

저 term에 들어간 데이터들 저장하고 분류하기 위해서 NoSQL을 써보기로 했다..

 

NoSQL은 Not Only SQL 

즉, 기존의 RDB는 관계형데이터베이스로 말그대로 데이터간의 관계가 연결되어 있었따.

하지만 NoSQL은 이름처럼 SQL을 활용하지 않고, 데이터들의 관계가 없으니 스키마도, 테이블도 없다. 

그만큼 자유로운 형식으로 데이터로 저장할 수 있기 때문에 선택했다. 

복습하러가기 ▼

2020.01.19 - 정형데이터 vs 비정형데이터 (RDBMS VS NOSQL)


MongoDB란?

대표적인 NoSQL 데이터베이스로 도큐먼트베이스(문서지향) 데이터베이스다.

 

RDB처럼 스키마가 없는데, 몽고디비는 어떻게 row데이터들을 넣는가? 

document형식으로 넣는다. 

예를 들어, json형태의 key-value쌍으로 이루어진 데이터구조를 하나의 document라고 한다 

{ "_id": "5f2ad6b54866e5109dd2367b" "username": "홍길동", "hashedPassword": "비밀번호", }

이렇게 이거 하나 자체가 rdb에서 row를 넣는거랑 같은 것! 

이때 각 _id는 primary key랑 동일한 개념이다. 

 

RDB처럼 테이블이 없는데, 몽고디비는 어떻게 저장하는가?

 '컬렉션(Collection)'에 저장한다.

그래서 데이터베이스는 곧 컬렉션의 집합이라고 한다. 

다만 스키마를 가지고 있는 형태가 아니다보니까 다른 구조를 가진 데이터이더라도 넣을 수 있다.

 

RDB처럼 JOIN이 없는데, 어떻게 쓰는가?

서브다큐먼트

예를 들어 하나의 post에 comment가 있는 데이터라하면, 

post하나에 comment가 여러개 있으니까 1대 다 관계이다. 

그래서 RDBMS를 썼다면 두개의 테이블로 분리시켰을 것이다. 

하지만 몽고디비에서는 post내부에 comment를 넣는 방식으로 쓰인다는 것이다!

{
   _id: POST_ID,
   title: POST_TITLE,
   content: POST_CONTENT,
   username: POST_WRITER,
   tags: [ TAG1, TAG2, TAG3 ],
   comments: [
     { 
        username: COMMENT_WRITER,
        mesage: COMMENT_MESSAGE,
        time: COMMENT_TIME
     },
   ]
}


 

출처 : 몽고디비란? velog.io/@ckstn0777/MongoDB%EB%9E%80

반응형