[SOPT] 3차 세미나 - NoSQL, MongoDB, Mongoose, 견고한 Node.js 프로젝트 설계

공혁준·2022년 4월 23일
1

SOPT 활동

목록 보기
4/8
post-thumbnail

📌 이 글은 THE SOPT 30기 서버파트 3차 세미나에서 학습한 내용을 다룹니다.

NoSQL, SQL?

SQL

관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어

NoSQL

비관계형 데이터베이스로 비정형 데이터를 처리할 수 있는 유연한 스키마 제공

SQL vs NoSQL

SQLNoSQL
규칙에 맞는 데이터 입력자유로운 데이터 입력
테이블 간 JOIN 지원컬렉션 간 JOIN 미지원
안정성, 일관성 중시확장성, 가용성
Table, Row, ColumnCollection, Document, Field
수직적 확장수직, 수평적 확장

NoSQL 특징

  • 표준화된 구조적 질의 언어(ex. SQL)가 없음
  • 관계를 갖지 않음

NoSQL 언제 쓰지?

  • 데이터의 수정 보다는 조회가 더 많은 경우
  • 비정형 데이터가 있는 경우 -> 유연한 구조
  • 막대한 양의 트래픽을 다룰 경우 -> 수평적 확장

ex. 일관성이 중요한 은행 시스템 -> SQL
실시간 데이터 조회가 많은 SNS -> NoSQL

MongoDB

Document 지향 NoSQL 데이터베이스 시스템
JSON 형태의 동적 스키마형 document 사용

MongoDB 특징

Document

Document 기반으로 구성
Database -> Collection -> Document -> Field 계층

BASE

ACID 대신 BASE

RDBMS vs MongoDB

Document

  • MongoDB에서 데이터를 저장하는 최소단위
  • Document는 필드와 값의 쌍으로 구성
  • 데이터 입출력 시에는 JSON 형식 사용, 저장 시에는 BSON(Binary JSON) 변환
  • 관계를 갖는 데이터는 중첩 document, 배열 등을 사용해 1개의 document로 나타냄

BASE

  • Basically Available (가용성)
  • Soft State (소프트 상태)
  • Eventually Consistent (결과적 일관성)

데이터 모델링

1:1

1:N


M:N

알아두면 좋은 Modeling Pattern

Extended Reference


Subset

Why?

  • 다른 Collection에 있는 분리된 데이터
  • 따라서 Join이 어렵다. 할 수는 있지만 쿼리로 인해 조회 성능이 떨어질 수 있다!
  • 그렇기에 조회 성능을 높이기 위해 미리 보여지는 데이터를 내부에 저장하는 패턴

다만, Update 시 양쪽 모두 수정해야함
꼭 이 패턴을 사용할 필요는 없고, 상황에 따라 적용하시면 됩니다

Mongoose

  • MongoDB ODM
  • 비동기 환경에서 작동하도록 설계된 MongoDB 객체 모델링 도구
  • Promise, Call back 지원

ODM vs ORM

ODM

  • Object Document Mapping
  • 객체와 Document를 매핑

ORM

  • Object Relational Mapping
  • 객체와 관계형 데이터베이스를 매핑

견고한 Node.js 프로젝트 설계

3-Layer Architecture

Controller

Model이 처리하기 전에 1차적으로 데이터 가공
비즈니스 로직 수행 후 다시 받은 데이터를 Response한다.

Service

Controller에서 받아온 데이터를 가지고 가공하여 DB에 접근해서 결과값을 받아온다.
이러한 데이터 가공 과정을 비즈니스 로직이라 함

Why?

  • 독립적인 기능 수행
  • 유지 보수
  • 확장성, 유연성

How?

  • 비즈니스 로직은 Service Layer로
  • Service Layer는 req, res 객체를 받지 않음
  • req, res는 Controller Layer에서만

예시



DTO

Data Transer Object

  • 계층 간 데이터 교환을 위해 사용하는 객체
  • Typescript에서는 Interface를 이용해 구현합니다.
  • Request <-> Controller <-> Service Layer <-> Response의 데이터 교환
profile
몰입을 즐기는 개발자입니다.

2개의 댓글

comment-user-thumbnail
2022년 4월 23일

얼마전에 당근마켓 기술블로그에서 읽은 mongoDB 서버의 메모리 관리에 대한 이야기가 있어서 가져와봤어요 ^^ㅎ
https://medium.com/daangn/memory-allocator-for-mongodb-1953f9cee06c

1개의 답글