[파이썬/프로젝트] "내 꿈은 건물주!" 2편: SQLite DB 연동 및 입주사 정보 CRUD 구현하기

2026. 8. 14. 12:12·Programming/Python

"메모리 상에서만 동작하던 내 빌딩, 이제 진짜 데이터베이스에 영구 저장하자!"

 

안녕하세요! 지난 1편에서는 파이썬의 dataclass와 객체지향(OOP) 스타일을 활용해 빌딩 관리 프로그램의 기본 데이터 구조를 설계해 보았습니다.

하지만 프로그램을 종료하면 입력했던 입주사 데이터가 싹 사라져 버린다면 진짜 '빌딩 관리'라고 할 수 없겠죠?

그래서 이번 2편에서는 파이썬 기본 내장 데이터베이스인 SQLite를 연동하여, 데이터를 영구적으로 저장하고 관리(Create, Read, Update, Delete - CRUD)하는 로직을 만들어 보겠습니다!

 

💡 왜 SQLite인가요?

  1. 별도 설치 불필요: Python 설치 시 기본으로 제공되는 sqlite3 모듈을 사용합니다.
  2. 가볍고 빠름: 파일 하나(.db)로 모든 데이터베이스를 관리할 수 있어 토이 프로젝트나 소규모 앱에 최적입니다.
  3. 표준 SQL 지원: 데이터베이스 표준 언어인 SQL을 학습하고 실습하기에 매우 적합합니다.

 

🗄️ 데이터베이스 테이블 설계

우리가 관리할 tenants (입주사/호수) 테이블 구조입니다.

컬럼명 (Column) 데이터 타입 설명
room_number INTEGER (PRIMARY KEY) 호수 (예: 101, 202)
tenant_name TEXT 입주사/임차인 이름
deposit INTEGER 보증금 (원)
monthly_rent INTEGER 월세 (원)
is_occupied INTEGER (0 또는 1) 입주 여부 (0: 공실, 1: 입주)

 

💻 Step 2. SQLite 연동 및 CRUD 코드 작성

파이썬의 sqlite3 모듈을 활용하여 데이터베이스 생성, 입주사 등록, 조회, 수정, 삭제 기능을 클래스 형태로 구현해 봅시다.

 

import sqlite3
from typing import Optional, List, Dict

class BuildingDB:
    def __init__(self, db_name: str = "building_manager.db"):
        self.db_name = db_name
        self.init_db()

    def get_connection(self):
        """데이터베이스 연결 객체 반환"""
        return sqlite3.connect(self.db_name)

    def init_db(self):
        """테이블이 없으면 자동으로 생성"""
        with self.get_connection() as conn:
            cursor = conn.cursor()
            cursor.execute("""
                CREATE TABLE IF NOT EXISTS tenants (
                    room_number INTEGER PRIMARY KEY,
                    tenant_name TEXT,
                    deposit INTEGER NOT NULL,
                    monthly_rent INTEGER NOT NULL,
                    is_occupied INTEGER DEFAULT 0
                )
            """)
            conn.commit()
        print("📁 DB 및 테이블 초기화 완료!")

    # 1. CREATE: 입주사 및 호실 정보 등록
    def add_room(self, room_number: int, deposit: int, monthly_rent: int, 
                 tenant_name: Optional[str] = None, is_occupied: bool = False):
        with self.get_connection() as conn:
            cursor = conn.cursor()
            cursor.execute("""
                INSERT OR REPLACE INTO tenants (room_number, tenant_name, deposit, monthly_rent, is_occupied)
                VALUES (?, ?, ?, ?, ?)
            """, (room_number, tenant_name, deposit, monthly_rent, 1 if is_occupied else 0))
            conn.commit()
        print(f"✅ {room_number}호 정보 저장 완료!")

    # 2. READ: 전체 호실/입주사 목록 조회
    def get_all_rooms(self) -> List[Dict]:
        with self.get_connection() as conn:
            conn.row_factory = sqlite3.Row  # 컬럼명으로 접근 가능하도록 설정
            cursor = conn.cursor()
            cursor.execute("SELECT * FROM tenants ORDER BY room_number ASC")
            rows = cursor.fetchall()
            return [dict(row) for row in rows]

    # 3. UPDATE: 입주 상태 및 계약 변경
    def update_tenant(self, room_number: int, tenant_name: str, is_occupied: bool = True):
        with self.get_connection() as conn:
            cursor = conn.cursor()
            cursor.execute("""
                UPDATE tenants 
                SET tenant_name = ?, is_occupied = ?
                WHERE room_number = ?
            """, (tenant_name, 1 if is_occupied else 0, room_number))
            conn.commit()
        print(f"🔄 {room_number}호 입주 정보가 수정되었습니다.")

    # 4. DELETE: 퇴거 처리 (데이터 삭제 또는 공실 전환)
    def vacate_room(self, room_number: int):
        with self.get_connection() as conn:
            cursor = conn.cursor()
            cursor.execute("""
                UPDATE tenants 
                SET tenant_name = NULL, is_occupied = 0
                WHERE room_number = ?
            """, (room_number,))
            conn.commit()
        print(f"🚪 {room_number}호 퇴거 처리가 완료되었습니다 (공실 전환).")

# 🧪 실행 및 테스트 예시
if __name__ == "__main__":
    db = BuildingDB()

    # 1. 샘플 호실 데이터 등록
    db.add_room(101, deposit=10000000, monthly_rent=850000, tenant_name="망고 소프트", is_occupied=True)
    db.add_room(102, deposit=15000000, monthly_rent=1000000, is_occupied=False)
    db.add_room(201, deposit=20000000, monthly_rent=1500000, tenant_name="코드 카페", is_occupied=True)

    # 2. 조회 및 출력
    print("\n--- 🏢 현재 건물 입주 현황 ---")
    rooms = db.get_all_rooms()
    for r in rooms:
        status = f"입주중 ({r['tenant_name']})" if r['is_occupied'] else "빈 방 (공실)"
        print(f"• {r['room_number']}호 | 보증금: {r['deposit']:,}원 | 월세: {r['monthly_rent']:,}원 | 상태: {status}")

    # 3. 102호 입주 계약 진행 (UPDATE)
    print("\n--- 102호 신규 입주 계약 ---")
    db.update_tenant(102, tenant_name="파이썬 스튜디오")

    # 4. 101호 퇴거 처리 (VACATE)
    print("\n--- 101호 퇴거 처리 ---")
    db.vacate_room(101)

 

🔍 실행 결과 확인하기

위 코드를 실행해 보면 프로젝트 폴더에 building_manager.db 파일이 새로 생성되는 것을 확인할 수 있습니다!

이제 프로그램을 몇 번을 다시 실행하거나 컴퓨터를 껐다 켜도, 우리가 입력한 호실 정보와 입주사 데이터가 데이터베이스 안에 안전하게 보관됩니다.

🚀 다음 편 예고

데이터베이스 구축까지 완료했으니, 다음 3편에서는 Pandas 라이브러리를 연동하여:

  • 이번 달 총 예상 임대 수입 및 공실률 자동 분석
  • 입주 기간별 관리비/공과금 합산 계산기

를 구현해 보겠습니다!

질문이나 개선 아이디어가 있으시다면 댓글로 자유롭게 남겨주세요! 💬

'Programming > Python' 카테고리의 다른 글

[파이썬/프로젝트] "내 꿈은 건물주!" 4편: Streamlit으로 10분 만에 웹 대시보드 완성하기 (완결)  (0) 2026.08.14
[파이썬/프로젝트] "내 꿈은 건물주!" 3편: Pandas로 관리비·공과금 자동 계산 및 임대 수익 분석하기  (0) 2026.08.14
[파이썬/프로젝트] "내 꿈은 건물주!" Python으로 내 손으로 만드는 빌딩 관리 시스템 구축 가이드  (0) 2026.08.14
[Python] 기초 소스  (0) 2026.05.14
Python Tkinter - GUI 라이브러리  (0) 2025.11.22
'Programming/Python' 카테고리의 다른 글
  • [파이썬/프로젝트] "내 꿈은 건물주!" 4편: Streamlit으로 10분 만에 웹 대시보드 완성하기 (완결)
  • [파이썬/프로젝트] "내 꿈은 건물주!" 3편: Pandas로 관리비·공과금 자동 계산 및 임대 수익 분석하기
  • [파이썬/프로젝트] "내 꿈은 건물주!" Python으로 내 손으로 만드는 빌딩 관리 시스템 구축 가이드
  • [Python] 기초 소스
레이조(RayCho)
레이조(RayCho)
개발자 레이조(RayCho)의 블로그입니다. 똑똑하게 배우고 기록하는 공간
  • 레이조(RayCho)
    레이(Ray)의 개발이야기
    레이조(RayCho)
  • 전체
    오늘
    어제
    • 분류 전체보기 (101) N
      • Programming (101) N
        • Python (9)
        • Flutter (4)
        • Delphi (25)
        • Java,Spring Boot (2) N
        • Lazarus (2)
        • C#.NET (20)
        • ASP.NET (5)
        • Database (8)
        • Game Dev (6)
        • Rust (3)
        • PHP (3)
        • Web (6)
        • ETC (8)
  • 블로그 메뉴

    • 홈
    • Introduce
    • 태그
  • 링크

    • Naver Blog
    • Diary Blog
  • 공지사항

  • 인기 글

  • 태그

    ASP.NET
    델파이
    문법
    소스코드
    Flutter
    iis
    Web
    Python
    C#
    delphi
    objectpascal
    기초
    csharp
    mssql
    프로젝트
    개발환경
    PSP
    VCL
    프로그래밍
    WPF
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
레이조(RayCho)
[파이썬/프로젝트] "내 꿈은 건물주!" 2편: SQLite DB 연동 및 입주사 정보 CRUD 구현하기
상단으로

티스토리툴바