본문 바로가기
GD's IT Lectures : 기초부터 시리즈/파이썬(Python) 기초부터 ~

[파이썬(PYTHON) : 고급] 데이터베이스 연동

by GDNGY 2023. 5. 13.

4. 데이터베이스 연동

4.1. SQL 데이터베이스

4.1.1. SQL 데이터베이스 이해

4.1.1.1. SQL 데이터베이스 소개

SQL(Structured Query Language) 데이터베이스는 관계형 데이터베이스(RDBMS)에서 사용하는 표준 질의 언어입니다. 관계형 데이터베이스는 데이터를 테이블 형태로 저장하며, 이 테이블들은 서로 연결되어 있습니다. 대표적인 SQL 데이터베이스로는 MySQL, PostgreSQL, SQLite 등이 있습니다.

 

4.1.1.2. SQL 문법 기본

SQL은 데이터베이스에서 데이터를 선택(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 등의 작업을 수행하는 데 사용되는 언어입니다.

 

예를 들어, 'employees' 테이블에서 모든 데이터를 선택하려면 다음과 같은 SQL 문을 사용합니다:

SELECT * FROM employees;

 

4.1.2. SQL 데이터베이스 연동

4.1.2.1. 파이썬에서 SQLite 사용하기

SQLite는 서버가 필요 없는 SQL 데이터베이스로, 모든 데이터를 단일 파일에 저장합니다. 파이썬에서 SQLite 데이터베이스를 사용하려면, 먼저 sqlite3 모듈을 import 해야 합니다.

 

다음은 파이썬에서 SQLite 데이터베이스에 연결하고, 테이블을 생성하며, 데이터를 삽입하는 예제 코드입니다:

import sqlite3

# 데이터베이스에 연결합니다. 데이터베이스 파일이 존재하지 않으면 새로 생성합니다.
conn = sqlite3.connect('example.db')

# 커서 객체를 생성합니다. 커서는 SQL 명령을 실행하고 결과를 얻는 데 사용됩니다.
c = conn.cursor()

# 테이블을 생성합니다.
c.execute('''CREATE TABLE employees
             (name text, position text, office text)''')

# 데이터를 삽입합니다.
c.execute("INSERT INTO employees VALUES ('John Doe','Manager','New York')")

# 변경사항을 데이터베이스에 저장합니다.
conn.commit()

# 연결을 닫습니다.
conn.close()

 

4.1.2.2. 파이썬에서 PostgreSQL 사용하기

PostgreSQL은 강력하고 확장 가능한 오픈소스 SQL 데이터베이스입니다. 파이썬에서 PostgreSQL 데이터베이스를 사용하려면, 먼저 psycopg2 모듈을 설치해야 합니다.

pip install psycopg2

 

다음은 파이썬에서 PostgreSQL 데이터베이스에 연결하고, 데이터를 삽입하는 예제 코드입니다:

import psycopg2

# PostgreSQL 데이터베이스에 연결합니다.
conn = psycopg2.connect(
    dbname="your_dbname", 
    user="your_username", 
    password="your_password", 
    host="your_host", 
    port="your_port"
)

# 커서 객체를 생성합니다.
c = conn.cursor()

# 데이터를 삽입합니다.
c.execute("INSERT INTO employees VALUES ('John Doe', 'Manager', 'New York')")

# 변경사항을 데이터베이스에 저장합니다.
conn.commit()

# 연결을 닫습니다.
conn.close()

 

4.2. NoSQL 데이터베이스

4.2.1. NoSQL 데이터베이스 이해

4.2.1.1. NoSQL 데이터베이스 소개

NoSQL(Not Only SQL) 데이터베이스는 관계형 모델을 사용하지 않는 데이터베이스를 일컫습니다. NoSQL 데이터베이스는 대량의 분산 데이터를 저장하고 처리하는 데 특히 유용하며, 확장성과 유연성이 뛰어납니다. 대표적인 NoSQL 데이터베이스로는 MongoDB, Redis, Cassandra 등이 있습니다.


4.2.1.2. NoSQL의 장단점

NoSQL의 장점으로는 크게 세 가지가 있습니다.

  • 유연성: NoSQL 데이터베이스는 스키마가 없으므로 새로운 데이터 타입을 자유롭게 추가할 수 있습니다.
  • 확장성: NoSQL 데이터베이스는 데이터를 여러 서버에 분산 저장할 수 있으므로 높은 수준의 확장성을 제공합니다.
  • 고성능: NoSQL 데이터베이스는 간단한 조회에 대해 빠른 응답 시간을 제공합니다.
    단점으로는 다음과 같습니다.
  • 일관성: 관계형 데이터베이스에 비해 NoSQL은 데이터 일관성을 보장하는 데 제한이 있을 수 있습니다.
  • 표준화 부재: NoSQL 데이터베이스 간에 일관된 표준이 부재합니다

4.2.2. NoSQL 데이터베이스 연동

4.2.2.1. 파이썬에서 MongoDB 사용하기

MongoDB는 문서 지향적인 NoSQL 데이터베이스로, JSON과 유사한 형식의 BSON(Binary JSON)을 사용하여 데이터를 저장합니다. 파이썬에서 MongoDB를 사용하려면, 먼저 pymongo 모듈을 설치해야 합니다.

pip install pymongo

다음은 파이썬에서 MongoDB 데이터베이스에 연결하고, 데이터를 삽입하는 예제 코드입니다:

from pymongo import MongoClient

# MongoDB에 연결합니다.
client = MongoClient("mongodb://your_host:your_port/")

# 데이터베이스를 선택합니다
db = client["your_dbname"]

# 컬렉션(테이블과 유사한 개념)을 선택합니다.
collection = db["employees"]

# 데이터를 삽입합니다.
employee = {"name": "John Doe", "position": "Manager", "office": "New York"}
collection.insert_one(employee)

 

4.2.2.2. 파이썬에서 Redis 사용하기

Redis는 인메모리 데이터 구조 저장소로서, 키-값 쌍을 저장하며, 여러 종류의 데이터 구조를 지원합니다. 파이썬에서 Redis를 사용하려면, 먼저 redis 모듈을 설치해야 합니다.

pip install redis

 

다음은 파이썬에서 Redis에 연결하고, 데이터를 삽입하는 예제 코드입니다:

import redis

# Redis에 연결합니다.
r = redis.Redis(host='your_host', port='your_port', db=0)

# 데이터를 삽입합니다.
r.set('John Doe', 'Manager')

 

4.3. ORM(Object-Relational Mapping) 기법

4.3.1. ORM 기법 이해

4.3.1.1. ORM 기법 소개

ORM(Object-Relational Mapping)은 객체와 데이터베이스 테이블 사이의 관계를 매핑하는 프로그래밍 기법입니다. 이를 통해 개발자는 SQL 질의어 없이도 데이터베이스 작업을 수행할 수 있습니다.

 

4.3.1.2. ORM의 장단점

- ORM의 장점

  • SQL 작성이 필요 없습니다: 개발자는 객체 지향 언어를 사용하여 데이터베이스 작업을 수행할 수 있습니다.
  • 데이터베이스 독립성: ORM을 사용하면 데이터베이스 엔진을 변경해도 코드를 거의 수정할 필요가 없습니다.

- ORM의 단점

  • 성능: ORM은 종종 최적화되지 않은 쿼리를 생성할 수 있습니다.
  • 복잡성: 복잡한 쿼리를 작성하는 것은 종종 ORM에서 어려울 수 있습니다.

4.4. 트랜잭션 처리

4.4.1. 트랜잭션 이해

4.4.1.1. 트랜잭션 개념

트랜잭션은 데이터베이스 작업의 단위를 말하며, 일련의 연산들을 하나의 논리적 작업 단위로 묶은 것입니다. 트랜잭션은 데이터의 일관성과 신뢰성을 보장합니다.

 

4.4.1.2. ACID 속성

트랜잭션은 ACID(Atomicity, Consistency, Isolation, Durability) 속성을 만족해야 합니다.

 

  • Atomicity(원자성): 트랜잭션의 연산은 데이터베이스에 모두 반영되거나, 아예 반영되지 않아야 합니다. 부분적인 작업 결과가 존재해서는 안 됩니다.
  • Consistency(일관성): 트랜잭션은 데이터베이스의 상태를 일관된 상태에서 다른 일관된 상태로 변환해야 합니다.
  • Isolation(독립성): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않아야 합니다.
  • Durability(지속성): 트랜잭션을 성공적으로 완료한 후에는, 그 결과가 시스템 고장 등에도 불구하고 영구적으로 반영되어야 합니다.

4.4.2. 트랜잭션 처리 방법

4.4.2.1. 파이썬에서 트랜잭션 처리하기

파이썬의 DB-API는 트랜잭션을 처리하기 위한 메서드를 제공합니다. 일반적으로 commit() 메서드를 사용하여 트랜잭션을 확정지을 수 있으며, rollback() 메서드를 사용하여 트랜잭션을 취소할 수 있습니다.

다음은 파이썬에서 SQLite 데이터베이스를 사용하여 트랜잭션을 처리하는 예제 코드입니다:

import sqlite3

# 데이터베이스에 연결합니다.
conn = sqlite3.connect('example.db')
c = conn.cursor()

# 트랜잭션을 시작합니다.
c.execute("BEGIN TRANSACTION;")

try:
    # 데이터를 삽입합니다.
    c.execute("INSERT INTO employees VALUES ('John Doe', 'Manager', 'New York')")
    c.execute("INSERT INTO employees VALUES ('Jane Doe', 'Engineer', 'San Francisco')")

    # 트랜잭션을 확정합니다.
    conn.commit()
except Exception as e:
    # 에러가 발생하면 트랜잭션을 취소합니다.
    print("An error occurred: ", e)
    conn.rollback()

# 연결을 닫습니다.
conn.close()

 

4.4.2.2. 트랜잭션 활용 예제

트랜잭션은 여러 개의 데이터베이스 작업을 한 번에 처리해야 할 때 유용합니다. 예를 들어, 은행 계좌 간의 이체를 생각해봅시다. 이 경우, 한 계좌에서 돈을 빼고 다른 계좌에 돈을 넣는 두 개의 작업이 모두 성공해야 합니다. 이때 트랜잭션을 사용하면, 두 작업 중 하나라도 실패하면 모든 작업을 취소할 수 있습니다.

 

다음은 이러한 은행 계좌 이체 작업을 처리하는 예제 코드입니다:

import sqlite3

# 데이터베이스에 연결합니다.
conn = sqlite3.connect('bank.db')
c = conn.cursor()

# 트랜잭션을 시작합니다.
c.execute("BEGIN TRANSACTION;")

try:
    # 계좌 A에서 돈을 뺍니다.
    c.execute("UPDATE accounts SET balance = balance - 100 WHERE name = 'A'")

    # 계좌 B에 돈을 넣습니다.
    c.execute("UPDATE accounts SET balance = balance + 100 WHERE name = 'B'")

    # 트랜잭션을 확정합니다.
    conn.commit()
except Exception as e:
    # 에러가 발생하면 트랜잭션을 취소합니다.
    print("An error occurred: ", e)
    conn.rollback()

# 연결을 닫습니다.
conn.close()

이 예제에서는 계좌 A에서 100 달러를 빼고, 계좌 B에 100 달러를 넣는 두 개의 작업을 하나의 트랜잭션으로 처리하고 있습니다. 만약 두 작업 중 하나라도 실패하면 트랜잭션은 취소되고, 계좌의 잔액은 원래대로 돌아갑니다.

 

이렇게 트랜잭션을 사용하면, 여러 개의 데이터베이스 작업을 안전하고 일관성 있게 처리할 수 있습니다.

반응형

댓글