Post

Node.js DB 선택 가이드: SQL·Sequelize·MongoDB

데이터 구조와 트랜잭션 요구에 따라 SQL, ORM, MongoDB를 선택하는 기준을 정리

Node.js DB 선택 가이드: SQL·Sequelize·MongoDB

결론 요약

  • DB 선택은 기술 취향 문제가 아니라 데이터 구조·변경 빈도·트랜잭션 요구의 함수다.
  • SQL은 관계·정합성·트랜잭션이 핵심일 때 강하다.
  • Sequelize(ORM)는 생산성을 얻는 대신 쿼리 통제력과 성능 가시성을 비용으로 지불한다.
  • MongoDB/Mongoose는 문서 단위 응집이 맞을 때 강하지만, 관계가 많아지면 설계 난도가 급상승한다.
  • 올바른 선택은 “무엇을 만들지”를 조건문으로 명시할 수 있을 때 가능하다.

Node.js에서 DB를 다루는 3가지 방식 비교

SQL · Sequelize(ORM) · MongoDB/Mongoose


1️⃣ 정의: 무엇을 비교하는가

이 글은 “어느 DB가 더 좋다”를 말하지 않는다. Node.js 프로젝트에서 어떤 조건일 때 무엇을 선택해야 하는지를 명확히 한다.

비교 대상:

  • SQL (MySQL/PostgreSQL + Raw Query)
  • Sequelize (ORM on SQL)
  • MongoDB + Mongoose (ODM)

2️⃣ 왜 필요한가: DB 선택이 늦을수록 비용은 커진다

초기에는 모든 방식이 “돌아간다”. 문제는 다음 시점에 발생한다.

  • 관계가 늘어날 때
  • 트랜잭션이 필요해질 때
  • 조회 성능이 병목이 될 때
  • 데이터 모델이 자주 바뀔 때

이때 DB 선택이 잘못되면 리팩토링이 아니라 재작성이 된다.


3️⃣ 핵심 비교표 ①: SQL vs NoSQL (개념 축)

SQLNoSQL(MongoDB)
데이터 모델링스키마 고정, 정규화유연, 비정규화
쿼리JOIN 중심문서 단위 조회
트랜잭션기본 제공, 강력제한적(문서 단위)
확장수직 확장 유리수평 확장 유리
변경 비용스키마 변경 비용 큼구조 변경 용이
정합성강함설계에 의존

해석

  • 관계와 일관성이 중요하면 SQL
  • 문서 응집과 유연성이 중요하면 Mongo

4️⃣ Sequelize(ORM): 이점과 비용을 동시에 본다

ORM이 주는 이점

  • 모델 중심 개발
  • CRUD 생산성 향상
  • 관계 정의 자동화
  • 마이그레이션 도구 제공
1
Product.findByPk(id);

ORM의 숨은 비용

항목문제
쿼리 가시성실제 실행 SQL이 보이지 않음
성능불필요한 JOIN/N+1 발생
복잡 쿼리ORM 문법이 SQL보다 난해
마이그레이션대규모 변경 시 관리 비용

결론 ORM은 “SQL을 몰라도 되는 도구”가 아니라 SQL을 이해한 상태에서 생산성을 올리는 도구다.


5️⃣ Mongoose: 문서 모델 사고방식과 함정

문서 모델의 핵심 질문

“이 데이터는 함께 조회되는가?

  • 그렇다면 임베딩(embedding)
  • 아니라면 참조(reference)

toy 예시

1
2
3
4
Order {
  userId,
  items: [{ productId, price }]
}

함정

  • 임베딩 남용 → 문서 크기 폭증
  • 참조 남용 → SQL JOIN 같은 수동 조회 로직 증가
  • 트랜잭션 부재 → 다문서 일관성 깨짐

Mongo는 자유도가 높은 만큼, 설계 책임도 크다.


6️⃣ 관계 처리 방식 비교 (1:N, N:M)

1:N 관계 (사용자-주문)

방식구현
SQLforeign key + JOIN
SequelizehasMany / belongsTo
Mongo배열 임베딩 or 참조

N:M 관계 (상품-주문)

방식구현
SQL중간 테이블
Sequelizethrough 옵션
Mongo중간 컬렉션 or 중복 저장

관계가 많아질수록 SQL의 명확성이 이점이 된다.


7️⃣ 실무 선택 기준 표 ② (조건문 사고)

조건유리한 선택
데이터 관계가 복잡SQL
강한 트랜잭션 필요SQL
빠른 CRUD 개발Sequelize
쿼리 튜닝 중요Raw SQL
문서 단위 조회MongoDB
스키마 변경 잦음MongoDB
팀 SQL 숙련도 낮음ORM(초기 한정)

8️⃣ 실무 결론: 조건문으로 말해보면

  • 만약 주문/결제/재고처럼 정합성과 관계가 핵심이면 → SQL
  • 만약 CRUD 위주 서비스 + 빠른 개발이 필요하면 → Sequelize
  • 만약 로그/피드/콘텐츠처럼 문서 응집이 자연이면 → MongoDB
  • 만약 ORM을 쓰더라도 성능 병목이 보이면 → Raw SQL 병행

DB 선택은 “하나만 고르는 문제”가 아니라 어디까지 추상화할지 정하는 문제다.


선택 체크리스트 (질문 10개)

  • 데이터 간 관계가 몇 단계까지 필요한가?
  • 트랜잭션이 비즈니스에 필수인가?
  • 조회 패턴은 문서 단위인가, 조합형인가?
  • 스키마 변경 빈도는 높은가?
  • 팀의 SQL 이해도는 어느 수준인가?
  • 성능 병목을 직접 튜닝할 가능성은?
  • 마이그레이션 관리 역량이 있는가?
  • 데이터 정합성 책임을 어디까지 질 수 있는가?
  • 테스트 데이터 생성이 쉬워야 하는가?
  • 6개월 뒤에도 이 선택을 유지할 수 있는가?

This post is licensed under CC BY 4.0 by the author.