관계형 데이터베이스(RDBMS)는 데이터를 테이블 형태로 저장하며 데이터 간의 관계를 명확히 정의하며 스키마(schema)가 고정되어 있음. 각 테이블은 Primary Key를 통해 데이터를 고유하게 식별
수직적 확장(Scale-Up), 즉 물리적으로 더 강력한 하드웨어로 업그레이드 해야한다. 분산 환경 구성에 한계가 있어 대규모 트래픽 처리에는 부적합할 수 있다.
ACID 속성(Atomicity, Consistency, Isolation, Durability)을 엄격히 준수하며 데이터 일관성과 무결성을 보장한다. 그렇기에 금융 및 회계 시스템 등 높은 정확성이 요구되는 곳에 적합.
: Atuomicity(원자성) - 트랜잭션이 모두 완료되거나 전혀 수행되지 않아야 한다는 특성. 중간에 실패하면 데이터베이스는 트랜잭션 이전 상태로 복구
: Consistency(일관성) - 트랜잭션 수행 후에도 데이터베이스의 무결성 제약 조건이 항상 유지되어야 한다.
: Isolation(격리성) - 동시에 여러 트랜잭션이 수행될 경우, 서로 간섭하지 않도록 독립적으로 실행되어야 함. 격리 수준은 트랜잭션 간 충돌 가능성과 성능을 조율하는데 사용됨.
: Durability(지속성) - 트랜잭션이 완료되면 그 결과 영구적으로 저장되어야 한다. 데이터베이스 시스템 장애나 전원 손실이 발생해도 트랜잭션 결과는 손실되지 않음.
SQL(Strucured Query Language)을 사용하여 데이터 조작 및 조회를 위한 표준화된 언어 제공.
관계형 데이터와 고정된 스키마를 가진 구조화된 데이터에 적합하며 금융 시스템, 전자상거래 플랫폼, ERP, CRM 등
비정형 데이터나 반정형 데이터를 저장할 수 있음. 다양한 데이터 모델을 지원하며 그 예에는 문서(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 기반 백엔드 개발자로서 매우 중요한 학습 요소입니다. 아래에는 신입 또는 취업 준비생이 실습을 통해 두 시스템의 차이를 체감하고 배울 수 있는 실습 아이디어를 정리했습니다.
User(id, name, email, created_at)@Entity와 @Repository를 사용해 CRUD 기능 구현.Account(account_id, balance)@Transactional 어노테이션을 사용해 트랜잭션 처리.User, Product, Order, OrderDetail.JOIN을 활용해 데이터 조회:spring-boot-starter-data-mongodb 의존성 추가.{ "id": 1, "title": "Post Title", "tags": ["Java", "Spring"], "content": "..." }session:{userId}관계형 데이터베이스:
NoSQL:
도구:
실습을 진행하며 얻은 결과를 블로그에 정리하거나 프로젝트 포트폴리오에 포함하면 취업 준비에도 큰 도움이 될 것입니다!