본문 바로가기
TIL,WIL

면접카타 [DB] -23,24 : NoSQL와 트랜션

by GREEN나무 2025. 2. 24.
728x90

23. NoSQL이란 무엇인가요? 기존 RDBMS와 다른 점도 설명해주세요 😊

NoSQL은 "Not Only SQL"의 약자로, 전통적인 관계형 데이터베이스(RDBMS)와는 다른 방식으로 데이터를 저장하고 관리하는 데이터베이스를 의미합니다. NoSQL 데이터베이스는 대규모 데이터 처리, 빠른 읽기/쓰기 성능, 유연한 스키마 등의 특징을 가지며, 특히 빅데이터와 분산 시스템에서 많이 사용됩니다.

NoSQL의 특징

  1. 스키마가 유연하다 → 테이블처럼 고정된 구조가 아니라, 데이터 형식이 자유롭다.
  2. 확장성이 뛰어나다 → 수평 확장(Sharding)으로 쉽게 확장 가능.
  3. 빠른 데이터 처리 속도 → 인덱스나 조인을 최소화하여 읽기/쓰기 속도가 빠름.
  4. 다양한 데이터 모델 지원 → Key-Value, Document, Column-Family, Graph 기반 저장 방식 제공.

RDBMS와 NoSQL의 차이점

항목 RDBMS NoSQL
데이터 모델 테이블 기반 (Row-Column) Key-Value, Document, Column-Family, Graph
스키마 고정된 스키마 필요 동적 스키마 지원
확장성 수직 확장(Scale-Up) 수평 확장(Scale-Out)
트랜잭션 강력한 ACID 지원 대부분 Eventually Consistent (BASE 모델)
성능 복잡한 쿼리에 최적화 빠른 읽기/쓰기 처리

 

꼬리 질문 & 상세 답변

  • Q1. NoSQL 데이터베이스의 종류와 각각의 특징을 설명해주세요.
    • Key-Value Store: Redis, DynamoDB (빠른 조회와 캐싱 용도)
    • Document Store: MongoDB, CouchDB (JSON/XML 기반 문서 저장)
    • Column-Family Store: Cassandra, HBase (대규모 데이터 처리에 최적화)
    • Graph Database: Neo4j, ArangoDB (그래프 탐색 최적화)
NoSQL 유형대표 DB특징 사용 사례
Key-Value Store Redis, DynamoDB 빠른 조회, 캐싱 최적 세션 관리, 실시간 데이터 처리
Document Store MongoDB, CouchDB JSON 기반, 유연한 구조 블로그, e-커머스, 로그 저장
Column-Family Store Cassandra, HBase 대규모 데이터 처리 최적 추천 시스템, IoT, 빅데이터 분석
Graph Database Neo4j, ArangoDB 관계형 데이터 탐색 최적 소셜 네트워크, 추천 시스템, 경로 탐색
  • Q2. RDBMS와 NoSQL을 혼합하여 사용할 수 있나요?
    • 네, 사용 사례에 따라 RDBMS와 NoSQL을 함께 사용하는 폴리글랏 퍼시스턴스(Polyglot Persistence) 전략이 있습니다. 예를 들어, 금융 데이터는 RDBMS에 저장하고, 로그 데이터는 NoSQL에 저장할 수 있습니다.
    • 폴리글랏 퍼시스턴스(Polyglot Persistence) 폴리글랏 퍼시스턴스는 하나의 애플리케이션에서 여러 종류의 데이터베이스를 조합하여 사용하는 전략을 의미합니다. 각 데이터 유형에 적합한 데이터베이스를 선택하여 효율적인 데이터 저장과 처리를 가능하게 합니다.
      • 사용자 계정 및 금융 데이터 → RDBMS (MySQL, PostgreSQL) 사용 (정합성이 중요)
      • 로그 및 이벤트 데이터 → NoSQL (MongoDB, Cassandra) 사용 (빠른 처리 필요)
      • 추천 시스템 → Graph DB (Neo4j) 사용 (관계 분석 최적화)
      • 캐싱 → Key-Value Store (Redis) 사용 (빠른 조회 필요)
  • Q3. NoSQL이 ACID 트랜잭션을 지원하나요?
    • 전통적으로 NoSQL은 BASE 모델을 따르지만, MongoDB(4.0 이후)나 Cosmos DB 같은 일부 NoSQL은 트랜잭션을 지원합니다.

예제 코드 (MongoDB)

const { MongoClient } = require("mongodb");
async function run() {
    const client = new MongoClient("mongodb://localhost:27017");
    await client.connect();
    const session = client.startSession();
    session.startTransaction();
    try {
        const users = client.db("test").collection("users");
        await users.insertOne({ name: "Alice", age: 25 }, { session });
        await users.insertOne({ name: "Bob", age: 30 }, { session });
        await session.commitTransaction();
    } catch (err) {
        await session.abortTransaction();
    } finally {
        session.endSession();
    }
}
run();

참고 사이트

 


24. 트랜잭션이란 무엇인가요? 😊

트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 작업 단위를 의미하며, 모든 작업이 성공적으로 완료되거나, 실패 시 원래 상태로 되돌아가야 하는 성질(Atomicity) 을 가집니다.

트랜잭션의 성질 (ACID 원칙)

  1. 원자성 (Atomicity): 트랜잭션은 모두 수행되거나, 전혀 수행되지 않아야 한다.
  2. 일관성 (Consistency): 데이터베이스의 상태가 항상 유효해야 한다.
  3. 격리성 (Isolation): 동시에 실행되는 트랜잭션은 서로 영향을 미치지 않는다.
  4. 지속성 (Durability): 트랜잭션이 완료되면 결과가 영구적으로 저장된다.

트랜잭션과 Lock (잠금) 트랜잭션이 실행될 때, 데이터 무결성을 보장하기 위해 잠금(Lock) 메커니즘이 사용됩니다.

  1. Shared Lock (공유 잠금): 다른 트랜잭션이 읽을 수는 있지만 변경할 수 없음.
  2. Exclusive Lock (배타 잠금): 특정 트랜잭션만이 읽고 쓸 수 있음.

트랜잭션을 사용할 때 주의할 점

  1. Deadlock(교착 상태) 방지 → 여러 트랜잭션이 서로의 자원을 기다리며 멈춰버릴 수 있음.
  2. 트랜잭션 범위를 최소화 → 너무 긴 트랜잭션은 성능 저하의 원인이 됨.
  3. 격리 수준(Isolation Level) 조정 → 성능과 데이터 무결성의 균형을 맞추기 위해 필요.

꼬리 질문 & 상세 답변

  • Q1. 트랜잭션의 격리 수준(Isolation Level)에는 어떤 것들이 있나요?
    • Read Uncommitted, Read Committed, Repeatable Read, Serializable 네 가지가 있으며, 높은 격리 수준일수록 동시성은 낮아집니다.
  • Q2. 트랜잭션이 실패하면 어떻게 복구되나요?
    • ROLLBACK을 수행하여 변경 사항을 취소합니다.
  • Q3. NoSQL도 트랜잭션을 지원하나요?
    • 일부 NoSQL(MongoDB, DynamoDB)은 트랜잭션을 지원하지만, 대부분은 Eventually Consistent 모델을 사용합니다.

예제 코드 (MySQL 트랜잭션 예제)

START TRANSACTION;
INSERT INTO accounts (id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
COMMIT;