왜 MySQL 일까?

의진·2024년 7월 7일

백엔드 인턴 면접을 보면서 '왜 많은 DB 중에서도 MySQL이죠?', '왜 많은 캐시 서비스 중 Redis죠?', '왜 동적쿼리를 작성하기 위해 Querydsl을 선택하셨죠?'라는 기술 선택의 이유를 묻는 질문을 많이 받았다..!

항상 어떤 기술을 선택하기 전에는,
1️⃣ 그 기술을 도입해야 하는가? (배경)
2️⃣ 도입해서 얻을 수 있는 것은 무엇인가? (장점)
3️⃣ 도입할 때 지불해야 하는 비용은? (단점)

을 고려해 봐야 하는데, 해당 부분을 놓치고 있었던 것 같다..🥲
그래서 why 시리즈를 만들어 내가 지금까지 사용한 기술들을 선택하는 과정을 정리해 보려 한다!

그리고 바로 첫번째 시리즈는 🌟 DB 기술 🌟이다!

왜 DB를 사용해야 할까?

우리는 서비스를 제공하기 위해 데이터를 저장해야 한다. 누군가가 열심히 작성한 게시글이 저장되지 않고 사라진다면, 아무도 그 서비스를 이용하고 싶지 않을 것이기 때문이다
이 이야기를 들은 어떤 사람은 '파일로 데이터를 저장하면 되지 않나요?' 라고 이야기 한다. 그리고 이 질문으로부터 DB를 사용해야 되는 이유가 설명된다! 왜냐하면 데이터베이스는 파일 시스템의 단점을 보완하기 위해 생겨났기 때문이다!

데이터베이스의 장점

  • 단순한 데이터의 저장을 넘어, 대량의 데이터를 효율적으로 처리할 수 있는 방법을 제공
  • 데이터를 쉽고 안정적이게 업데이트할 수 있으며 정확성을 보장
  • 정보에 대한 액세스를 제어하는 보안 기능을 제공하고 데이터 중복을 방지
  • 체계적이고 일관되며 신뢰할 수 있고 검색 가능한 방식으로 정보를 저장

그리고 다양한 사용 사례를 위해 고안된 다양한 종류의 데이터베이스가 있다!
대표적으로 사용되는 DB인 RDBMS와 NoSQL에 대해서 살펴보자 🔍

관계형 데이터베이스 (RDBMS)

데이터가 행과 열로 저장되는 테이블 기반 데이터베이스로 RDBMS의 표준 언어가 바로 SQL이다.
RDB에는 테이블을 조인하여 정보 간 관계를 설정할 수 있는 기능이 있어, 여러 데이터 간의 관계를 쉽게 이해하고 정보를 얻을 수 있다.

예시) MySQL, MariaDB, PostgreSQL

👍🏻 장점

  • 데이터 중복성을 줄이고 데이터 무결성을 개선하는 정규화라는 설계 기법을 사용
  • 트랜잭션 ACID(원자성, 일관성, 격리, 내구성) 성능을 지원하므로 오류, 실패, 기타 잠재적 오작동에 관계없이 데이터 유효성을 검사할 수 있음

👎🏻 단점

  • 수평 확장이 어려움 (여러 서버에서 테이블을 관리하는 것은 어려움 but 수직 확장에 한계가 있음)
  • 복잡성 RDBMS의 구조는 비교적 복잡하고 처리하기 어려움

비관계형 데이터베이스 (No SQL)

"Not Only SQL", NoSQL을 사용하면 구조화된 스키마(sachem) 없이 데이터를 여러 컬렉션과 노드에 저장할 수 있으며, 제한된 조인 쿼리를 지원하며 수평적으로 확장할 수 있다.

예시) MongoDB, Redis, Apache Cassandra

👍🏻 장점

  • 수평 확장이 쉬움
  • 서버 유지 관리 비용이 저렴
  • 고정된 데이터 모델이 없어 데이터 변경에 자유로움
  • 다양한 유형의 데이터를 저장할 수 있음

👎🏻 단점

  • MongoDB(NoSQL 데이터베이스)에는 저장 프로시저가 없어, 모든 비즈니스 로직을 애플리케이션에서 처리해야 함
  • 비교적 최신 기술이기 때문에 정의된 표준이 많지 않음 (학습이 어려움)

결국, 가용성과 확장성을 더 중요하게 생각한다면 NoSQL을!
데이터 무결성과 정확성을 더 중요하게 생각한다면 RDBMS를 사용하는 것이 적합해 보인다!

💡 프로젝트 당시 팀원 모두 NoSQL 경험이 없기도 했고, 서비스에 검색, 통계와 같이 조인을 사용하는 복잡한 쿼리문을 작성해야 하는 경우가 많았기 때문에 RDBMS를 사용하기로 결정했다!

그럼 어떤 RDBMS를 사용해야 할까?

위에서 보았듯이 RDBMS에는 대표적으로 MySQL, MariaDB, PostgreSQL 등이 있다! 이 중에서 어떤 RDB를 사용해야 할까?

MySQL

  • 오픈소스, Oracle에서 유지관리
  • 상용 DB이므로, RDS를 사용할 경우 동일 사양 대비 가격이 높음
  • 영리 목적이 아니라면 무료로 사용가능!
    💡 참고) 소스 코드를 수정해서 배포했지만, 수정한 코드를 공개하고 싶지 않은 경우 유료를 사용해야 함!
  • 마스터-스탠바이 복제 지원
  • NoSQL(Json 타입) 지원
  • 쓰기 잠금을 통해 동시성을 달성
  • 멀티 쓰레드 방식

장점
👍🏻 읽기 중심 작업에 탁월
👍🏻 큰 시장 점유율과 풍부한 학습 리소스
👍🏻 사용자 친화적

MariaDB

  • 오픈소스
  • MySQL의 포크로 등장한 RDBMS
  • 마스터-스탠바이 복제 지원
  • NoSQL(Json 타입) 지원
  • 쓰기 잠금을 통해 동시성을 달성
  • 멀티 쓰레드 방식

장점
👍🏻 읽기 중심 작업에 탁월
👍🏻 MySQL 보다 향상된 성능
👍🏻 MySQL과 100% 호환
👍🏻 MySQL보다 더 많은 스토리지 엔진과 더 큰 연결 풀
👍🏻 쓰기 작업이 MySQL 보다 빠름
👍🏻 사용자 친화적

PostgreSQL

  • 오픈소스
  • ORDBMS(객체 지향 RDBMS)로 테이블 뿐만 아니라 객체, 클래스, 상속 지원
  • 멀티 프로세스 방식

장점
👍🏻 테이블 파티셔닝 DDL 기능
👍🏻 마스터-스탠바이 복제 지원 (스탠바이 서버의 다운타임을 최소화하여 거의 실시간 복제가 가능)
👍🏻 대량의 데이터와 복잡한 쿼리를 다룰 때 탁월
👍🏻 동시 쓰기를 지원하기 때문에 읽기/쓰기 작업이 빠름
: 트랜잭션 격리 및 스냅샷을 구현하고 ACID를 완벽하게 준수
👍🏻 NoSQL(Json 타입, 배열) 지원 (Json 타입에 인덱스 지원)

단점
👎🏻 학습 곡선이 있음
👎🏻 읽기 집약 프로세스에 약함
: 각 connection에 대한 새로운 프로세스를 포크할 때, 상당한 양의 메모리를 할당 (메모리 사용량 ↑)

결국, PostgreSQL은 복잡한 쿼리에서 MySQL/MariaDB 보다 탁월하며, 대량 데이터와 분석 작업에 더 성능이 좋다. 반면 MySQL/MariaDB는 간단한 쿼리에서 PostgreSQL을 압도하고 더 사용자 친화적이며 전문가를 찾기도 쉽다.


🔗 참고 링크

profile
📖 오브젝트

0개의 댓글