Database Amazon 검색 시스템 구축 - 장동욱 강사님 강의
📌 3차 세션 - Amazon.com 검색 시스템 구축
이번 세션에서는 Amazon.com 검색 시스템을 구축하기 위해 MySQL 데이터베이스를 사용하여 도서 데이터를 삽입하고 검색하는 방법과 함께 주문 시스템 설계 및 트랜잭션 처리에 대해 배웁니다. 또한, 데이터베이스의 성능을 향상시키기 위한 인덱스에 대해서도 학습합니다.
🚦 도서 데이터 삽입 (INSERT)
목표:
도서를 검색하려면 기본적인 도서 데이터가 필요합니다. 이를 MySQL 데이터베이스에 삽입하는 방법을 실습합니다.
실습:
도서 데이터를 MySQL에 삽입하는 방법을 배우며, 기존 테이블을 활용하여 24686000권의 데이터를 삽입합니다.
- 경고: 오늘 실습으로 생성한 books 테이블이 존재한다고 가정합니다. 해당 테이블을 생성하지 못한 분들은 실습 후 다시 과제를 수행해 주세요! 🙏🏻
MySQL 테이블 수정:
출판일자의 자료형을 VARCHAR(4)로 변경:
ALTER TABLE `books`
CHANGE COLUMN `published_at`
`published_at` VARCHAR(4) DEFAULT NULL;
Python 코드 (데이터 삽입):
import json
import pymysql
def insert_books_to_mysql(json_file):
connection = pymysql.connect(
host='localhost',
user='root',
database='amazon',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
cursor = connection.cursor()
with open(json_file, 'r', encoding='utf-8') as f:
books = json.load(f)
insert_query = """
INSERT INTO books (
title, published_at
) VALUES (
%s, %s
)
"""
# Insert each book entry
for book in books:
cursor.execute(insert_query, (
book.get('title'),
book.get('first_publish_year'),
))
connection.commit()
cursor.close()
connection.close()
print("Data inserted successfully")
json_file = 'amazon_books.json'
insert_books_to_mysql(json_file)
🚦 도서 데이터 조회
목표:
도서 데이터를 도서명으로 검색하는 방법을 이해합니다. 이는 인터넷 서점에서 책을 검색하는 것과 유사한 방식입니다.
핵심:
도서 검색 시스템의 브레인스토밍을 통해 효율적인 검색 방법을 설계합니다.
🚦 인덱스
목표:
효율적으로 도서를 검색할 수 있는 인덱스를 생성하는 방법을 배웁니다.
인덱스 종류:
- B-tree 인덱스: 기본적인 인덱스 유형으로, 정렬된 데이터를 효율적으로 검색합니다.
- Hash 인덱스: 해시 알고리즘을 사용해 정확한 값 찾기에서 유용합니다.
- 공간 인덱스: GIS 데이터 등 공간 정보를 처리할 때 사용됩니다.
인덱스 생성 예시:
- 단일 컬럼 인덱스:
ALTER TABLE books ADD INDEX idx_title (title);
title 컬럼에 인덱스를 추가하여, 해당 컬럼을 기준으로 검색 성능을 향상시킬 수 있습니다.
- 복수 컬럼 인덱스:
ALTER TABLE books ADD INDEX idx_title_author (title, author);
title과 author 두 컬럼을 기준으로 인덱스를 추가하여, 여러 조건에 대한 검색 성능을 향상시킬 수 있습니다.
📌 Amazon.com 주문 시스템 구축
🚦 주문 시스템 설계
목표:
주문 시스템을 어떻게 설계할지 배우고, 재고 관리와 결제 처리 등의 문제를 해결하는 방법을 학습합니다.
- 문제점: 초당 0.38개의 주문이 들어오는 상황에서 재고가 1개 남아있을 때, 첫 번째 주문이 들어오면 재고가 0이 되어 주문이 실패할 수 있습니다. 이를 해결하려면 재고 확인 후 alert을 띄워야 합니다.
- 기능:
- 재고 확인: 재고가 부족하면 알림을 보냅니다.
- 쿠폰/마일리지 차감: 사용 후 차감 처리합니다.
- 결제 PG사 API: 한도 초과시 알림을 띄웁니다.
- 결제/적립: 마일리지 적립 및 재고 차감을 처리합니다.
🚦 트랜잭션의 특징 (ACID 원칙)
목표:
ACID 원칙을 이해하고 트랜잭션 처리에 어떻게 적용할지 배웁니다.
ACID 원칙은 데이터베이스 트랜잭션에서 정확하고 일관된 처리를 보장하는 4가지 핵심 요소입니다:
- Atomicity (원자성): "전체 작업이 하나처럼 실행된다"
- 예: 결제 시스템에서 오류가 발생하면 전체 주문이 취소됩니다.
- Consistency (일관성): "데이터가 항상 올바른 상태를 유지한다"
- 예: 사용자가 존재하지 않으면 주문을 생성할 수 없습니다.
- Isolation (격리성): "다른 트랜잭션과 영향을 받지 않는다"
- 예: 할인 프로모션을 적용한 가격으로 결제해야 합니다.
- Durability (영속성): "완료된 트랜잭션은 영구적으로 저장된다"
- 예: 시스템 장애가 발생해도, 완료된 주문은 절대로 사라지지 않습니다.
정리:
Atomicity | 트랜잭션은 하나의 단위로 처리되어야 하며, 부분 실패가 없어야 한다. | 결제 실패 시, 모든 작업이 취소되어야 한다. |
Consistency | 트랜잭션이 완료될 때 데이터의 일관성이 보장되어야 한다. | 사용자가 존재하지 않으면 주문을 생성하지 않는다. |
Isolation | 동시에 실행되는 트랜잭션들은 서로 영향을 미치지 않아야 한다. | 할인 프로모션을 적용한 가격으로 결제가 이루어야 한다. |
Durability | 트랜잭션이 완료되면, 그 결과는 영구적으로 저장된다. | 완료된 주문은 장애가 있어도 사라지지 않는다. |
🧠 쉽게 말하면:
ACID는 트랜잭션의 핵심 원칙으로, 데이터베이스에서 정확하고 안전하게 데이터를 처리하기 위해 필요한 4가지 보장입니다:
- Atomicity: 트랜잭션은 완전하게 실행되거나, 전혀 실행되지 않음.
- Consistency: 트랜잭션 전후에 데이터의 일관성이 유지됨.
- Isolation: 트랜잭션은 다른 트랜잭션과 격리되어 독립적으로 실행됨.
- Durability: 트랜잭션이 완료되면 영구적으로 저장됨.
ACID 원칙을 통해 시스템이 안정적이고 신뢰성 있게 동작하도록 돕습니다.