관계형 데이터베이스와 NoSQL의 차이점은 무엇인가요?

김상욱·2024년 12월 14일

관계형 데이터베이스와 NoSQL의 차이점은 무엇인가요?

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

관계형 데이터베이스(RDBMS)는 데이터를 테이블 형태로 저장하며 데이터 간의 관계를 명확히 정의하며 스키마(schema)가 고정되어 있음. 각 테이블은 Primary Key를 통해 데이터를 고유하게 식별

수직적 확장(Scale-Up), 즉 물리적으로 더 강력한 하드웨어로 업그레이드 해야한다. 분산 환경 구성에 한계가 있어 대규모 트래픽 처리에는 부적합할 수 있다.

ACID 속성(Atomicity, Consistency, Isolation, Durability)을 엄격히 준수하며 데이터 일관성과 무결성을 보장한다. 그렇기에 금융 및 회계 시스템 등 높은 정확성이 요구되는 곳에 적합.
: Atuomicity(원자성) - 트랜잭션이 모두 완료되거나 전혀 수행되지 않아야 한다는 특성. 중간에 실패하면 데이터베이스는 트랜잭션 이전 상태로 복구
: Consistency(일관성) - 트랜잭션 수행 후에도 데이터베이스의 무결성 제약 조건이 항상 유지되어야 한다.
: Isolation(격리성) - 동시에 여러 트랜잭션이 수행될 경우, 서로 간섭하지 않도록 독립적으로 실행되어야 함. 격리 수준은 트랜잭션 간 충돌 가능성과 성능을 조율하는데 사용됨.
: Durability(지속성) - 트랜잭션이 완료되면 그 결과 영구적으로 저장되어야 한다. 데이터베이스 시스템 장애나 전원 손실이 발생해도 트랜잭션 결과는 손실되지 않음.

SQL(Strucured Query Language)을 사용하여 데이터 조작 및 조회를 위한 표준화된 언어 제공.

관계형 데이터와 고정된 스키마를 가진 구조화된 데이터에 적합하며 금융 시스템, 전자상거래 플랫폼, ERP, CRM 등

NoSQL

비정형 데이터나 반정형 데이터를 저장할 수 있음. 다양한 데이터 모델을 지원하며 그 예에는 문서(Document) 기반인 JSON, BSON 등이나 키-값(Key-Value) 저장소, 열(Column) 기반 저장소, 그래프(Graph) 데이터베이스 등이 있다.
또한 스키마가 없거나 유연하며, 데이터 구조가 동적으로 변화 가능하다.

보통 수평적 확장(Scale-Out), 즉 여러 서버를 추가해 분산형 시스템 구축에 유리하다. 그렇기에 대용량 데이터 처리와 고성능 요구사항에 적합하다.

일반적으로 BASE(Basically Available, Soft state, Eventual Consistency)를 따르며 강한 일관성보다 최종적 일관성(Eventual Consistency)을 지향한다. 실시간 처리가 중요한 애플리케이션에 적합하다.
: Basically Available(기본적인 가용성) : 시스템의 일부 노드가 실패하더라도 전체 시스템은 기본적인 기능을 제공. 완전한 일관성보다는 서비스의 가용성을 우선.
: Soft State(소프트 상태) : 시스템 상태는 언제든지 변화할 수 있음. 데이터가 변경되거나 반영되기까지 일시적인 비일관성이 허용됨.
: Eventual Consistency(최종적 일관성) : 일정 시간이 지나면 데이터가 모든 노드에서 일관된 상태로 수렴함. 즉시 일관성을 보장하지 않고 특정 조건하에서 최종적으로만 보장. 즉, 분산 데이터베이스에서 데이터 복제를 통해 일시적인 불일치가 발생할 수 있지만 시간이 지나면 모든 노드가 일관된 상태에 도달. ex) SNS 좋아요 기능처럼 내 화면에서는 즉시 반영되지만 다른 사용자에게는 몇 초 뒤에 반영될 수 있음. 시간이 지나면 모든 사용자에게 같은 상태가 보이게 됨.

SQL이 아닌 각 데이터베이스 고유의 API나 쿼리 언어 사용. 예를 들면 MongoDB의 JSON 기반 쿼리 사용.

대규모 데이터 처리, 빠른 확장성, 비정형 데이터에 적합. ex) 소셜 네트워크, IoT 데이터 처리, 로그 데이터 분석, 실시간 데이터 처리 등


관계형 데이터베이스(RDBMS)와 NoSQL의 차이를 이해하고 실습하는 것은 Java 및 Spring 기반 백엔드 개발자로서 매우 중요한 학습 요소입니다. 아래에는 신입 또는 취업 준비생이 실습을 통해 두 시스템의 차이를 체감하고 배울 수 있는 실습 아이디어를 정리했습니다.


실습 아이디어: 관계형 데이터베이스 (RDBMS)

1. Spring JPA(Hibernate) 기반 CRUD 구현

  • 목표: Spring Data JPA를 활용해 RDBMS와 연동하여 CRUD(Create, Read, Update, Delete)를 구현.
  • 실습 내용:
    1. MySQL 또는 PostgreSQL에 간단한 "사용자 관리 시스템" 테이블 설계:
      • 테이블: User(id, name, email, created_at)
      • Primary Key와 제약 조건 설정.
    2. Spring Boot 프로젝트 생성 후, @Entity@Repository를 사용해 CRUD 기능 구현.
    3. JPQL, Native Query를 사용해 데이터 조회와 필터링 구현.
    4. 데이터 무결성을 위반할 때의 예외 처리 실습.
  • 결과 확인: 데이터 삽입, 수정, 삭제 후 데이터베이스에서 결과 확인 및 쿼리 실행.

2. 트랜잭션 관리

  • 목표: RDBMS의 ACID 속성을 직접 실습.
  • 실습 내용:
    1. 사용자 잔액을 관리하는 은행 시스템 시뮬레이션:
      • 테이블: Account(account_id, balance)
      • 사용자가 돈을 송금하는 기능 구현.
    2. Spring의 @Transactional 어노테이션을 사용해 트랜잭션 처리.
      • 송금 중 에러 발생 시 데이터 롤백 테스트.
      • 트랜잭션 격리 수준(Isolation Level) 설정 및 실험.
    3. SQL 로그를 통해 트랜잭션 실행 흐름 확인.
  • 결과 확인: 예외 발생 시 롤백 여부 확인.

3. ERD 설계 및 SQL 쿼리 최적화

  • 목표: RDBMS의 스키마 설계 및 JOIN 쿼리 실습.
  • 실습 내용:
    1. 전자상거래 시스템 설계:
      • 테이블: User, Product, Order, OrderDetail.
      • 관계: User-Order(1:N), Order-OrderDetail(1:N), Product-OrderDetail(N:1).
    2. 데이터 삽입 후 JOIN을 활용해 데이터 조회:
      • 사용자별 주문 내역 조회.
      • 특정 제품의 판매량 분석.
    3. 쿼리 성능 분석:
      • 인덱스를 추가하고 성능 차이를 확인.
      • 실행 계획(EXPLAIN)을 사용해 쿼리 최적화.

실습 아이디어: NoSQL

1. MongoDB와 Spring Boot 연동

  • 목표: 문서형 데이터베이스의 스키마리스 구조 체험 및 Spring Data MongoDB 연동.
  • 실습 내용:
    1. MongoDB 설치 및 데이터베이스 생성.
    2. Spring Boot에서 spring-boot-starter-data-mongodb 의존성 추가.
    3. 간단한 블로그 게시판 구현:
      • 데이터 구조: { "id": 1, "title": "Post Title", "tags": ["Java", "Spring"], "content": "..." }
    4. 데이터 삽입, 조회, 수정, 삭제 구현.
    5. 동적으로 필드 추가/삭제 실습.
  • 결과 확인: MongoDB Compass 또는 CLI로 데이터 구조 확인.

2. 수평적 확장 실험

  • 목표: NoSQL의 Scale-Out 구조를 이해하고 데이터 분산 저장을 체험.
  • 실습 내용:
    1. MongoDB Replica Set 설정:
      • 로컬에서 여러 MongoDB 인스턴스를 실행하여 Replication 구성.
    2. 데이터를 분산 저장한 후, 읽기/쓰기 성능 비교.
    3. 장애 발생 시 데이터 가용성 확인.
  • 결과 확인: 데이터 손실 없이 읽기 가능 여부 확인.

3. Redis 기반 세션 관리

  • 목표: NoSQL의 Key-Value Store 활용 사례 체험.
  • 실습 내용:
    1. Redis 설치 및 Spring Boot와 연동.
    2. 사용자가 로그인할 때 세션 데이터를 Redis에 저장:
      • Key: session:{userId}
      • Value: JSON 형태의 사용자 정보.
    3. 세션 데이터 만료 설정 및 TTL(Time-to-Live) 확인.
    4. Redis Pub/Sub를 사용해 메시지 브로커 기능 실습.
  • 결과 확인: Redis CLI로 세션 데이터를 조회하고 만료 시간 확인.

RDBMS와 NoSQL을 비교 실습

1. 유연성 vs 무결성 실험

  • 목표: 스키마 유연성과 무결성 제약의 차이를 체험.
  • 실습 내용:
    1. 동일한 데이터를 RDBMS와 NoSQL(MongoDB)에 저장.
      • RDBMS: 스키마를 엄격하게 정의.
      • NoSQL: 스키마 없이 유연하게 삽입.
    2. 잘못된 데이터(예: 중복, 누락된 필드) 삽입 후 차이를 확인.
  • 결과 확인: 삽입 결과와 오류 메시지 비교.

2. 읽기 성능 비교

  • 목표: 대량 데이터에서 읽기 성능의 차이를 비교.
  • 실습 내용:
    1. RDBMS와 NoSQL에 각각 10만 개 이상의 데이터를 삽입.
    2. 특정 조건의 데이터를 검색하고, 쿼리 성능 측정.
      • RDBMS: 복잡한 JOIN 쿼리.
      • NoSQL: 필터링과 정렬.
    3. 인덱스 추가 후 성능 차이 비교.
  • 결과 확인: 쿼리 실행 시간 기록 및 분석.

추천 실습 환경

  • 관계형 데이터베이스:

    • MySQL, PostgreSQL (로컬 또는 Docker로 실행 가능).
    • Spring Boot와 JPA 활용.
  • NoSQL:

    • MongoDB, Redis.
    • 로컬 설치 또는 Docker를 활용.
  • 도구:

    • IntelliJ IDEA, Visual Studio Code.
    • DB 관리 도구: DBeaver, MongoDB Compass, Redis CLI.

실습 후 학습할 점

  1. RDBMS와 NoSQL의 사용 목적에 맞는 설계 방식 이해.
  2. 스키마 설계의 중요성과 데이터 모델링 차이 체감.
  3. 트랜잭션 관리와 데이터 일관성의 실제 동작 방식 학습.
  4. 확장성(Scale-Up vs Scale-Out)의 차이 이해.
  5. 실무에서 적합한 데이터베이스 선택 기준 체험.

실습을 진행하며 얻은 결과를 블로그에 정리하거나 프로젝트 포트폴리오에 포함하면 취업 준비에도 큰 도움이 될 것입니다!

0개의 댓글