클래스와 DB 테이블, 그리고 ORM 이해하기

- by chatgpt

 

프로그래밍을 처음 배우는 분들에게 클래스와 데이터베이스(DB) 테이블은 처음에는 조금 혼란스러울 수 있습니다. 이 글에서는 클래스와 DB 테이블의 유사점차이점, 그리고 이 둘을 연결해주는 **ORM(Object-Relational Mapping)**에 대해 간단히 설명하겠습니다.


1. 클래스와 DB 테이블의 유사점

클래스와 DB 테이블은 데이터를 구조화한다는 점에서 매우 비슷합니다. 둘 다 데이터를 저장하거나 관리하기 위한 틀을 제공합니다. 다음은 주요 유사점입니다:

(1) 속성과 열 (Columns)

  • 클래스: 클래스의 속성은 객체가 어떤 데이터를 가질지 정의합니다.
    • 여기서 name, age, email이 속성입니다.
  • class User: def __init__(self, name, age, email): self.name = name self.age = age self.email = email
  • DB 테이블: 데이터베이스 테이블의 열은 각 행(row)이 가질 데이터를 정의합니다.
    • 여기서 name, age, email이 열입니다.
  • CREATE TABLE User ( name VARCHAR(50), age INTEGER, email VARCHAR(100) );

(2) 객체와 행 (Rows)

  • 클래스: 클래스의 인스턴스(객체)는 데이터를 담은 구체적인 개체입니다.
    • 객체 user1은 User 클래스의 한 행처럼 데이터를 가지고 있습니다.
  • user1 = User("Alice", 25, "alice@example.com")
  • DB 테이블: 테이블의 행은 각 열에 데이터를 담은 레코드입니다.
    • 데이터베이스에 저장된 한 줄(row)은 객체와 유사합니다.
  • INSERT INTO User (name, age, email) VALUES ("Alice", 25, "alice@example.com");

(3) 데이터 타입

  • 클래스DB 테이블 모두 데이터 타입을 설정합니다. 예를 들어, 나이는 숫자(INTEGER), 이름은 문자열(VARCHAR)로 정의합니다.

(4) 관계 (Relationships)

  • 클래스: 클래스 간 관계를 속성으로 정의할 수 있습니다.
    class Order:
        def __init__(self, user, product):
            self.user = user
            self.product = product
    
  • DB 테이블: 테이블 간 관계를 외래 키(foreign key)로 정의할 수 있습니다.
    CREATE TABLE Order (
        id INTEGER PRIMARY KEY,
        user_id INTEGER REFERENCES User(id),
        product VARCHAR(50)
    );
    

2. 클래스와 DB 테이블의 차이점

비슷한 점이 많지만, 클래스와 DB 테이블은 목적과 동작 방식에서 차이가 있습니다:

(1) 데이터 저장 방식

  • 클래스: 데이터는 프로그램이 실행되는 동안 메모리에 저장됩니다. 프로그램이 종료되면 데이터는 사라집니다.
  • DB 테이블: 데이터는 영구적으로 저장됩니다. 프로그램이 종료되더라도 데이터는 데이터베이스에 남아 있습니다.

(2) 동작(Behavior)

  • 클래스: 클래스는 데이터를 저장하는 것뿐 아니라 데이터를 처리하는 **메서드(함수)**를 포함할 수 있습니다.
    class User:
        def greet(self):
            return f"Hello, {self.name}!"
    
  • DB 테이블: 테이블은 데이터를 저장하고 검색하는 데 초점이 맞춰져 있으며, 자체적으로 동작(함수)을 가지지 않습니다.

(3) 데이터 접근 방법

  • 클래스: 데이터를 변수처럼 바로 접근할 수 있습니다.
    print(user1.name)  # "Alice"
    
  • DB 테이블: 데이터를 SQL 쿼리를 사용하여 접근해야 합니다.
    SELECT name FROM User WHERE age = 25;
    

3. 클래스와 DB 테이블을 연결하는 ORM

**ORM(Object-Relational Mapping)**은 클래스와 DB 테이블을 연결해주는 도구입니다. ORM을 사용하면 SQL 문을 작성하지 않고도, 클래스를 통해 데이터베이스 작업을 할 수 있습니다.

(1) ORM의 역할

  • 데이터베이스 테이블과 클래스를 매핑(mapping)합니다.
  • 클래스의 객체를 데이터베이스의 행(row)처럼 저장하거나 불러올 수 있습니다.
  • SQL 쿼리를 직접 작성할 필요 없이, 파이썬 코드로 데이터베이스 작업을 처리합니다.

(2) ORM 사용 예시 (SQLAlchemy)

  • 예를 들어, 다음과 같이 User 클래스를 데이터베이스의 User 테이블과 매핑할 수 있습니다:
    from sqlalchemy import Column, Integer, String, create_engine
    from sqlalchemy.orm import declarative_base, sessionmaker
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
        age = Column(Integer)
        email = Column(String)
    
    # 데이터베이스 연결
    engine = create_engine('sqlite:///example.db')
    Base.metadata.create_all(engine)
    
    # 데이터 추가
    Session = sessionmaker(bind=engine)
    session = Session()
    new_user = User(name="Alice", age=25, email="alice@example.com")
    session.add(new_user)
    session.commit()
    

(3) ORM의 장점

  • 생산성: SQL 문을 직접 작성하지 않아도 되므로 개발 속도가 빨라집니다.
  • 가독성: 코드가 직관적이고 읽기 쉽습니다.
  • 유지보수: 데이터베이스 스키마가 변경되더라도 클래스만 수정하면 됩니다.

결론

클래스와 DB 테이블은 데이터를 구조화한다는 점에서 유사하지만, 클래스는 메모리 내에서 작동하고 동작(메서드)을 포함한다는 점에서 차이가 있습니다. ORM은 이 둘을 연결해주는 다리 역할을 하며, 프로그래머가 SQL 대신 친숙한 코드로 데이터베이스 작업을 처리할 수 있게 도와줍니다.

처음에는 조금 어려울 수 있지만, 클래스와 DB 테이블의 개념을 이해하고 ORM을 활용하면 더 쉽게 데이터베이스를 다룰 수 있습니다. 프로그래밍과 데이터베이스 작업을 동시에 배울 수 있는 좋은 연습이 될 것입니다!

 

https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000008827991

 

혁신적 사고의 비밀 | 박지온 | 작가와- 교보ebook

비전을 깨우는 메타인지 학습법인간은 누구나 자기중심적인 성향과 생존에 대한 본능적 욕구를 지니고 있습니다. 하지만 회사에서 프로젝트를 진행하거나 학업에 임할 때, 이러한 욕구에 휘둘

ebook-product.kyobobook.co.kr

 

+ Recent posts