특강

Database Amazon 검색 시스템 구축 - 장동욱 강사님 강의

Chansman 2025. 3. 27. 19:11

📌 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)

🚦 도서 데이터 조회

목표:

도서 데이터를 도서명으로 검색하는 방법을 이해합니다. 이는 인터넷 서점에서 책을 검색하는 것과 유사한 방식입니다.

핵심:

도서 검색 시스템의 브레인스토밍을 통해 효율적인 검색 방법을 설계합니다.


🚦 인덱스

목표:

효율적으로 도서를 검색할 수 있는 인덱스를 생성하는 방법을 배웁니다.

인덱스 종류:

  1. B-tree 인덱스: 기본적인 인덱스 유형으로, 정렬된 데이터를 효율적으로 검색합니다.
  2. Hash 인덱스: 해시 알고리즘을 사용해 정확한 값 찾기에서 유용합니다.
  3. 공간 인덱스: 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가지 핵심 요소입니다:

  1. Atomicity (원자성): "전체 작업이 하나처럼 실행된다"
    • 예: 결제 시스템에서 오류가 발생하면 전체 주문이 취소됩니다.
  2. Consistency (일관성): "데이터가 항상 올바른 상태를 유지한다"
    • 예: 사용자가 존재하지 않으면 주문을 생성할 수 없습니다.
  3. Isolation (격리성): "다른 트랜잭션과 영향을 받지 않는다"
    • 예: 할인 프로모션을 적용한 가격으로 결제해야 합니다.
  4. Durability (영속성): "완료된 트랜잭션은 영구적으로 저장된다"
    • 예: 시스템 장애가 발생해도, 완료된 주문은 절대로 사라지지 않습니다.

정리:

ACID 특징설명실생활 예시
Atomicity 트랜잭션은 하나의 단위로 처리되어야 하며, 부분 실패가 없어야 한다. 결제 실패 시, 모든 작업이 취소되어야 한다.
Consistency 트랜잭션이 완료될 때 데이터의 일관성이 보장되어야 한다. 사용자가 존재하지 않으면 주문을 생성하지 않는다.
Isolation 동시에 실행되는 트랜잭션들은 서로 영향을 미치지 않아야 한다. 할인 프로모션을 적용한 가격으로 결제가 이루어야 한다.
Durability 트랜잭션이 완료되면, 그 결과는 영구적으로 저장된다. 완료된 주문은 장애가 있어도 사라지지 않는다.

🧠 쉽게 말하면:

ACID는 트랜잭션의 핵심 원칙으로, 데이터베이스에서 정확하고 안전하게 데이터를 처리하기 위해 필요한 4가지 보장입니다:

  • Atomicity: 트랜잭션은 완전하게 실행되거나, 전혀 실행되지 않음.
  • Consistency: 트랜잭션 전후에 데이터의 일관성이 유지됨.
  • Isolation: 트랜잭션은 다른 트랜잭션과 격리되어 독립적으로 실행됨.
  • Durability: 트랜잭션이 완료되면 영구적으로 저장됨.

ACID 원칙을 통해 시스템이 안정적이고 신뢰성 있게 동작하도록 돕습니다.