Python을 이용한 데이터베이스 CRUD 애플리케이션

YeHee·2024년 12월 26일

⏰ 2024.12.24 (D+54)

1. config.ini 파일 (설정 파일)

  • configparser 모듈을 사용하여 oracle.ini 파일을 관리
  • 데이터베이스 연결 정보를 설정 파일에 저장하여, 이 파일을 읽어 데이터베이스와 연결
[ORACLE]
user=PYTHON
password=PYTHON
url=localhost:1521/XEPDB1

2. configparser 사용 예시

  • ConfigParser 객체를 사용하여 INI 파일을 읽고, 섹션과 키 값들을 관리
  • ConfigParser 객체를 통해 INI 파일을 읽고, 섹션에 포함된 키-값 쌍을 읽을 수 있다

3. 데이터베이스 연결 및 CRUD 작업 (모델 파일)

  • cx_Oracle을 사용하여 Oracle 데이터베이스에 연결하고, CRUD 작업을 수행하는 로직

connectDatabase() 함수

  • configparser를 사용하여 oracle.ini 파일에서 데이터베이스 연결 정보를 읽어 cx_Oracle.connect()로 데이터베이스 연결을 설정

insert() 함수

  • 사용자로부터 입력받은 데이터를 INSERT 쿼리로 데이터베이스에 삽입

findById() 함수

  • 특정 id로 데이터를 조회

update() 함수

  • 주어진 id에 해당하는 데이터를 수정

delete() 함수

  • 주어진 id에 해당하는 데이터를 삭제

findAll() 함수

  • 모든 데이터를 조회하여 반환

4. 사용자 인터페이스 (뷰 파일)

💡 사용자가 프로그램과 상호작용할 수 있도록 메뉴와 입력을 처리하는 UI를 담당

showMenu() 함수

  • CRUD 작업을 위한 메뉴를 표시하고, 사용자가 선택한 메뉴 번호를 반환

inputData() 함수

  • 사용자가 입력한 여러 값을 리스트로 받아온다

showMessage() 함수

  • 사용자에게 메시지를 표시하고, 입력을 받는다. (예: 수정, 삭제할 ID 입력)

showRecords() 함수

  • 데이터베이스에서 가져온 레코드를 출력, 각 항목을 보기 좋게 포맷하여 출력

5. 전체 흐름

☑️ 메뉴 선택

  • 사용자가 프로그램을 실행하면, 메뉴가 표시되고, 번호를 입력하여 CRUD 작업을 선택

☑️ 입력

  • 사용자가 입력값을 입력하여 insert() 함수를 통해 데이터를 추가

☑️ 수정

  • 사용자가 수정할 id를 입력하고, update() 함수를 통해 해당 데이터를 수정

☑️ 삭제

  • 사용자가 삭제할 id를 입력하고, delete() 함수를 통해 데이터를 삭제

☑️ 조회

  • 사용자가 선택한 메뉴에 따라 findAll() 함수를 통해 모든 데이터를 조회하고 출력

☑️ 종료

  • 9번 메뉴를 선택하면 프로그램이 종료

6. 코드 연결 및 실행 흐름

  • view.py: 사용자의 입력을 받아 화면에 출력합니다.
    (showMenu, inputData, showRecords, showMessage 등)
  • model.py: 실제 데이터베이스와 상호작용하는 로직을 담당합니다.
    (insert, update, delete, findAll, connectDatabase, close 등)
  • constants.py: 상수 데이터를 저장하는 파일로, 테이블의 필드명(MEMBERS_TABLE_DESC)을 관리합니다.

7. 전체적인 동작

☑️ 프로그램이 실행되면 view.py에서 메뉴를 보여주고, 사용자가 메뉴를 선택
☑️ 사용자가 선택한 메뉴에 따라 model.py에 정의된 함수들이 호출되어 데이터베이스 작업이 처리
☑️ 데이터베이스 작업 후, 결과가 화면에 출력
☑️ configparser를 사용하여 데이터베이스 연결 정보를 외부 설정 파일에서 읽어기

# config.ini 파일
[ORACLE]
user=PYTHON
password=PYTHON
url=localhost:1521/XEPDB1
# model.py 파일
from configparser import ConfigParser
from cx_Oracle import connect

def connectDatabase():
    config = ConfigParser()
    config.read('oracle.ini', encoding='utf8')
    return connect(user=config.get('ORACLE', 'user'),
                   password=config.get('ORACLE', 'password'),
                   dsn=config.get('ORACLE', 'url'),
                   encoding='utf8')

def close(conn):
    if conn: conn.close()

def insert(conn, dict_):
    with conn.cursor() as cursor:
        try:
            cursor.executemany('INSERT INTO member(id,name,age) VALUES(SEQ_MEMBER.NEXTVAL,:name,:age)', [dict_])
            conn.commit()
            return cursor.rowcount
        except Exception as e:
            print('입력시 오류:', e, sep='')
            return 0

def findById(conn, id):
    with conn.cursor() as cursor:
        try:
            cursor.execute('SELECT * FROM member WHERE id=:id', [id])
            return cursor.fetchone()
        except Exception as e:
            print('하나 조회시 에러:', e, sep='')
            return None

def update(conn, dict_):
    with conn.cursor() as cursor:
        try:
            cursor.execute('UPDATE member SET name=:name,age=:age WHERE id=:id', dict_)
            conn.commit()
            return cursor.rowcount
        except Exception as e:
            print('수정시 오류:', e, sep='')
            return 0

def delete(conn, id):
    with conn.cursor() as cursor:
        try:
            cursor.execute('DELETE member WHERE id=:id', id)
            conn.commit()
            return cursor.rowcount
        except Exception as e:
            print('삭제시 오류:', e, sep='')
            return 0

def findAll(conn):
    with conn.cursor() as cursor:
        try:
            cursor.execute('SELECT * FROM member ORDER BY id DESC')
            return cursor.fetchall()
        except Exception as e:
            print('모든 목록 조회시 에러:', e, sep='')
            return None
# view.py 파일
def showMenu():
    print('=' * 70)
    print('1.입력(CREATE) 2.수정(UPDATE) 3.삭제(DELETE) 4.조회(READ) 9.종료')
    print('=' * 70)
    return int(input('메뉴 번호 입력?'))

def inputData(*args):
    list_ = []
    for arg in args:
        list_.append(input(f'{arg}를(을) 입력하세요?'))
    return list_

def showMessage(titleMessage):
    return input(f'{titleMessage}하려는 번호를 입력하세요?')

def showRecords(records):
    print('%-10s%-10s%-10s%s' % ('번호', '이름', '나이', '가입일'))
    print('=' * 70)
    for id, name, age, joindate in records:
        print('%-10s%-10s%-10s%s' % (id, name, age, str(joindate)[:10]))
    print('=' * 70)
  • 이 구조는 설정 파일에서 데이터베이스 정보를 읽어오고, 사용자 인터페이스를 통해 데이터를 처리하는 시스템을 구성
  • model.py는 실제 데이터베이스 작업을 처리
  • view.py는 사용자와의 상호작용을 담당

0개의 댓글