SeoMiYoung / CA_nodedotjs_mongodb

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

데이터베이스와 MongoDB

SeoMiYoung opened this issue · comments

🔶 왜 DB를 사용할까?

게시판 같은 걸 만드려면, 유저들이 작성한 게시물들을 영구적으로 보관할 곳이 하나 필요할거에요. 뭐 대충 유저들의 게시물들을 엑셀이나 메모장에 저장해둬도 되지만, 보통 실제 서비스들은 데이터베이스에 데이터들을 저장해놓습니다.
=> 데이터베이스가 훨씬 입출력이 빠르고 대용량의 데이터를 보관할 수 있습니다.

🔶 Relational(관계형) DB VS Non-Relational(비관계형) DB

데이터베이스는 크게 두가지로 나뉠 수 있습니다.

🔸 관계형 데이터베이스

  • 엑셀처럼 똑같이 데이터를 저장할 수 있음
  • table이 하나 있고, 데이터를 한 줄 한 줄 차례로 입력
  • ex. MySQL, PostgreSQL, Oracle, SQLite, MSSQL 등...
  • 한국에선 MySQL, PostgreSQL, Oracle 점유율이 높음
  • 데이터를 입출력할 때, SQL이라는 언어를 사용해야한다는게 좀 귀찮을 수 있음
  • 최대한 중복 데이터를 제거하려는 강박관념이 있음(=정규화(즉, 데이터의 중복을 줄이고, 무결성을 유지하며, 효율성을 향상시키는 프로세스))
  • 데이터의 정확도가 중요하거나, 돈을 다루는 서비스라면 관계형 데이터베이스 추천

🔸 비관계형 데이터베이스

  • 좀 더 다양한 형식으로 데이터 저장 가능
  • ex. redis, MongoDB
  • 정규화같은 걸 안하고 저장함. 그래서 데이터 입출력시, 생각할게 없어서 빠르게 입출력 가능하나, 나중에 데이터를 수정/삭제할 땐, 느릴 수 있음
    • 왜냐하면, 정규화를 안해놓았따면, 나중에 조그만한거 하나를 수정이나 삭제하려면 수많은 부분을 수정해야하기 때문에 귀찮을 수 있음
  • 빠른 입출력이 필요하나 정확도가 크게 중요하지 않은 게시판이나 SNS를 만들때는 비관계형이 나을수도.. => 그치만 꼭 그래야만 하는 건 아니니 참고만 할 것!

[Redis가 저장하는 데이터 형식]

{ 데이터이름 : 데이터값 }

[MongoDB에 저장된 데이터]

{
    name: "smy",
    age: 25,
    groups: [ "politics", "news" ]
}

🔶 MongoDB

🔸 특징

  1. SQL을 배울 필요가 없어서 쉬움
  2. 귀찮은 정규화 작업이 없음
  3. 테이블 정의가 필요 없음
  4. JavaScript object 자료랑 형태가 동일하게 데이터를 넣을 수 있음

🔸 Document DB라고 불림

image

  • 'document 1개 == 엑셀 가로줄 1개'로 이해하면 될 듯
  • document 1개는 최대 16MB까지 저장 가능(그러니 너무 무리 ㄴㄴ)
  • 참고로, document가 너무 크다면, 원하는 정보를 찾기 어려울 수 있음

🔸 사용 방법 2가지

  1. 컴퓨터에 직접 MongoDB를 설치
  2. Cloud에서 호스팅 받기(초보자 픽)
    • 가입만 하면, 무료 용량 512MB주고
    • 돈내서 업그레이드하면 백업 자동으로 해주고
    • replica set: 자동으로 3개의 데이터베이스로 분산 저장해줌

🤔 왜 FE 스쿨에서 DB를 Firebase를 사용했을까?

firebase는 비관계형 DB이다. 비관계형 데베중에는 MongoDB, redis이런것들이 있다. Firebase는 서버리스 아키텍처를 사용하므로 백엔드를 구축하고 관리하는 부담을 줄여준다. 반면, MongoDB, redis같은건 데이터베이스를 직접 호스팅하거나 관리해야하므로 좀 더 백엔드 개발에 대한 이해가 필요하다.
그 당시 진행했던 프로젝트의 경우, 프론트에 초점을 두었으니깐 Firebase를 사용한거다..!

서버리스 아키텍처는 애플리케이션을 개발하고 실행하는데 필요한 서버를 직접 관리할 필요 없이 클라우드 공급자가 제공하는 서버를 사용한다. 즉, 클라우드 공급자가 서버를 자동으로 관리하고 실행해준다. 만약 몽고디비같은걸 사용했다면, 그때 우리가 직접 서버를 개발하고 호스팅을 관리했어야겠지?

🔶 DB에서 데이터 불러와보기

// 누가 /list로 접속하면 DB의 게시물들 가져오자
app.get('/list', async (요청, 응답) => {
    // [구글 검색] mogodb document 전부 가져오기
    // post에 있는 모든 document들이 출력됨
    let result = await db.collection('shopData').find().toArray()
    console.log(result);
    응답.send('DB에 있던 게시물');
})

image
image
image

🔶 DB에 데이터 저장하기

app.get('/', (요청, 응답) => {
    응답.send('기본 페이지에요~')
})

// 누군가 /shop에 접속하면 DB에 뭔가 저장해보자
app.get('/shop', (요청, 응답) => {
    db.collection('shopData').insertOne({ // forum의 shopData에 저장됨
        name: 'seo',
        item: 'shirts',
        num: 1
    })
})

image