[DB-008][중급] 데이터 모양에 맞춰 NoSQL 고르기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DB-008][중급] 데이터 모양에 맞춰 NoSQL 고르기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 139회 작성일 26-09-03 09:35

본문

[이번 수업]
NoSQL은 관계형 표가 아닌 여러 데이터 모델을 묶어 부르는 말입니다. 제품 이름보다 프로그램이 데이터를 저장하고 조회하는 모양부터 적어 선택합니다. 문서형, 키-값형, 와이드 컬럼형, 그래프형과 관계형 모델의 경계를 살펴봅니다.

[선수지식]
DB-007의 트랜잭션과 동시성, 기본 키와 인덱스를 알고 있어야 합니다. JSON의 이름-값과 배열 표현도 복습하세요.

[학습목표]
1. 대표적인 NoSQL 데이터 모델을 조회 패턴과 연결할 수 있습니다.
2. 데이터 중복이 읽기 속도와 갱신 일관성에 주는 영향을 설명할 수 있습니다.
3. 관계형 데이터베이스와 NoSQL 중 하나를 근거를 적어 선택할 수 있습니다.

[핵심개념]
문서형은 한 주문과 상품 목록처럼 함께 읽는 데이터를 한 문서에 담기 좋습니다. 키-값형은 세션처럼 아는 키로 값을 찾는 경우에 잘 맞습니다. 와이드 컬럼형은 대량 데이터를 정해진 조회별 표로 설계해 분산 저장할 때 사용합니다. 그래프형은 사람-관심사-게시물처럼 연결을 여러 단계 따라가는 질문에 알맞습니다.

선택은 프로그램이 실제로 던질 질문에서 시작합니다. 여러 표의 관계, 외래 키 제약, 복잡한 조인, 여러 행을 한꺼번에 지키는 트랜잭션이 핵심이면 관계형 모델이 자연스럽습니다. 관계형 데이터베이스도 JSON 자료형을 제공하므로 JSON을 저장한다는 이유만으로 NoSQL을 택할 필요는 없습니다.

비정규화는 읽기 편하도록 같은 값을 여러 곳에 복사하는 설계입니다. 읽기는 줄어들 수 있지만 원본이 바뀌면 모든 사본을 갱신해야 합니다. 주문 당시의 의도적인 스냅샷인지, 항상 최신이어야 하는 사본인지 구분하세요. ‘스키마가 없다’고 생각하는 것도 위험합니다. 필수 필드, 자료형, 버전, 마이그레이션 규칙은 여전히 필요합니다.

[따라하기]
아래를 nosql_demo.py로 저장하세요. 외부 패키지는 필요 없습니다. 중첩 주문을 JSON 문자열로 바꿨다가 다시 읽어 합계를 계산합니다.

```python
import json

order = {
    "order_id": "o-100",
    "customer_id": "u-1",
    "items": [
        {"name": "키보드", "price": 30000, "quantity": 1},
        {"name": "케이블", "price": 5000, "quantity": 2},
    ],
}

def summarize(document):
    total = sum(item["price"] * item["quantity"] for item in document["items"])
    names = ", ".join(item["name"] for item in document["items"])
    return f"{document['order_id']} | {names} | 합계 {total}원"

encoded = json.dumps(order, ensure_ascii=False)
restored = json.loads(encoded)
print(summarize(restored))
```

Windows는 `py nosql_demo.py`, macOS와 Linux는 `python3 nosql_demo.py`를 실행합니다. 예상 결과는 다음과 같습니다.

```text
o-100 | 키보드, 케이블 | 합계 40000원
```

상품 이름 복사는 주문 당시 표시를 보존하려는 선택일 수 있습니다. 항상 최신 상품명이어야 한다면 중복 갱신 절차가 필요합니다.

[흔한 실수]
첫째, 데이터 양이 많다는 이유만으로 NoSQL을 고릅니다. 먼저 실제 병목과 조회를 측정해야 합니다. 둘째, 모든 문서를 끝없이 중첩합니다. 함께 읽지 않거나 계속 커지는 배열은 분리해야 합니다. 셋째, 자유로운 필드를 검증 없는 필드로 오해합니다. 넷째, 중복 사본을 만들면서 갱신 책임과 저장 비용을 기록하지 않습니다.

[보안 주의]
실습은 본인 소유의 로컬 자료만 사용하세요. 외부 입력 문서는 필수 필드, 자료형, 길이와 숫자 범위를 검사해야 합니다. 사용자가 보낸 JSON을 그대로 쿼리 연산자로 만들지 말고 공식 드라이버의 매개변수 기능과 허용 목록을 사용하세요. 다중 사용자 서비스에서는 사용자나 조직 식별자를 키와 조회 조건에 포함하고 권한도 확인합니다. 개인정보를 여러 문서에 복사하면 접근 통제와 삭제 범위가 늘어납니다.

[직접 해볼 과제]
주문에 status와 shipping 필드를 추가하고, items가 비었거나 price가 음수이면 오류를 내는 validate 함수를 작성하세요. 이어 ‘주문 번호로 한 건 찾기’와 ‘고객별 최근 주문 찾기’를 적고, 문서형과 관계형 중 무엇을 선택할지 중복 갱신과 트랜잭션 요구를 포함해 세 문장으로 설명하세요.

[확인문제]
1. 함께 읽는 데이터를 한 문서에 모을 때 얻는 장점은 무엇인가요?
2. 비정규화된 값을 갱신할 때 어떤 문제가 생길 수 있나요?
3. 관계형 데이터베이스가 더 자연스러운 요구 사항 두 가지는 무엇인가요?

[다음 학습]
다음 OS-008에서는 로그와 시스템 상태를 연결해 장애 원인을 좁히는 방법을 배웁니다.

[공식 참고 자료]
문서형 데이터 모델과 접근 패턴: https://www.mongodb.com/docs/manual/data-modeling/
와이드 컬럼형의 조회 중심 모델링: https://cassandra.apache.org/doc/latest/cassandra/developing/data-modeling/intro.html
키-값·자료구조 유형 개요: https://redis.io/docs/latest/develop/data-types/
관계형 데이터베이스의 JSON 자료형: https://www.postgresql.org/docs/current/datatype-json.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,287
어제
5,103
최대
16,772
전체
772,341
Copyright © 소유하신 도메인. All rights reserved.