문제 해결능력을 기르기 위해 쓰기 시작한 글이었으나 가장 큰 문제는 나에게 있었다
나는 이 주소록 Project를 구현하는데, 왜 Class를 사용하여 프로젝트를 작성하고 있는지도 모르는 상태이다.
빠르게 기능을 구현하고 익힐 수 있는 능력이 있었다면 좋았겠지만,
나는 어쩌다 우연치 않게 '초심자의 행운'이라도 얻은 마냥 10연속 야바위 성공을 한 느낌이다.
그래서 나는 다시 전화번호부 프로젝트를 해보려 한다. 느려도 확실하게 가야한다.
빠른 척은 언젠가 들키기 마련이다.
전화번호부 프로젝트의 개요
전화번호부 프로젝트를 통해 구현하고자 하는 기능은 CRUD (Create, Read, Update, Delete)이다.
- 전화번호 추가하기(Create)
- 전화번호 조회하기(Read)
- 전화번호 수정하기(Update)
- 전화번호 삭제하기(Delete)
- 계속해서 일정한 규칙(이름, 전화번호, 이메일)이 있는 객체를 만들어내야 하기에
개개인의 정보는 Person class를 통해 관리하고, 전체 전화번호부는 phoneBook class를 통해 관리하고자 한다. - 입력된 정보의 연속성을 위해, MariaDB를 연동시켜 데이터베이스에 자료를 저장하고자 한다.
1. mariaDB 유저 생성 및 권한주기, 데이터베이스 생성
데이터 베이스를 연결하기 위해선 host, user 등의 정보가 필요하다.
이때 root로 접근하면 보안상의 문제가 발생할 수 있으니 권한을 준 유저를 생성하고, 그 유저를 통해 접속하는 것이 좋다.
유저 생성 및 권한 주기
//root 계정으로 접속한다.
mariadb -u root -p
//계정 생성
CREATE USER 'user_name'@'%' IDENTIFIED BY 'password';
//권한 부여
GRANT ALL PRIVILEGES ON database_name.허용할테이블(전체는 *) TO 'user_name'@'%';
//권한 밀어주기
FLUSH PRIVILEGES;
//생성된 계정 확인
SELECT host, user from mysql.user;
- user 정보는 모두 'mysql' 이라는 database에 저장된다고 한다.
데이터 베이스 생성
create database phoneBook
use phoneBook
create table phoneBookDB(
id int NOT NULL AUTO_INCREMENT,
name varchar(50),
phone varchar(50),
email varchar(50),
CONSTRAINT phonebook_pk PRIMARY KEY (id)
);
desc phoneBookDB
- 데이터 베이스를 생성하고, 해당 값들이 들어갈 테이블을 만들어 줬다.
전화번호부 코드 기초단계 작성
import sys
import MySQLdb
conn = MySQLdb.connect(
host = '127.0.0.1', user ='유저이름' , password ='비밀번호', database='phoneBook',
port = 3306, charset='UTF-8', use_unicode=True)
cursor = conn.cursor()
- 데이터 베이스와 연결시켜주기 위해 연결 코드를 작성하였다.
- sys 모듈은 exit 기능을 구현하기 위해 불러주었다.
- MySQLdb 라는 모듈을 import시켜 이 모듈의 connect() 메소드를 이용해 연결시켜주었다.
- 상호작용하기 위한 cursor 객체를 만들어주었고 SQL 과 해당 코드 사이에서 전달자 역할을 할 녀석이다.
Person Class 코드 작성
class Person:
def __init__(self, name, phone, email):
self.name = name
self.phone = phone
self.email = email
def insert(self):
insert_name = self.name
insert_phone = self.phone
insert_email = self.email
cursor.execute(f"insert into phoneBookDB(name, phone, email) values('{insert_name}','{insert_phone}','{insert_email}')")
conn.commit()
- 이름, 전화번호, 이메일을 받아 객체를 생성하고 그 정보들은 각각 그 객체의 정보로 저장된다.
- insert 내부 메소드를 실행하면 연결된 DB로 해당 자료들을 보내 저장시킨다.
- conn.commit()을 통해 보내진 자료를 저장시킨다.
phoneBook Class 코드 작성
class phoneBook:
def __init__(self):
self.menu()
def menu(self):
print('전화번호부 입니다. 원하시는 기능의 숫자를 입력해주세요')
print('[1] 전화번호 등록하기')
print('[2] 전화번호 검색하기')
print('[3] 전화번호 수정하기')
print('[4] 전화번호 삭제하기')
print('[5] 종료하기')
choice = int(input('원하시는 기능의 숫자를 입력해 주세요 >>'))
self.run(choice)
def run(self,choice):
while True:
if choice == 5 : self.exit()
elif choice == 1 : self.insert()
elif choice == 2 : self.search()
elif choice == 3 : self.update()
elif choice == 4 : self.delete()
else : print('잘못된 입력입니다. 다시 입력해주세요')
def insert(self):
print('===신규 주소록 생성===')
name = input('등록할 이름을 입력해주세요')
phone = input('등록할 전화번호를 입력해주세요')
email = input('등록할 이메일을 입력해주세요.')
if name and phone and email :
Person(name,phone,email).insert()
print(f'{name}님의 전화번호가 추가되었습니다')
return
else:
print('모든 정보가 입력되지 않아 추가되지 않았습니다.')
name = "" ; phone = "" ; email = ""
return self.menu()
def exit(self):
print('프로그램을 종료합니다')
sys.exit()
phonebook1 = phoneBook()
- 전화번호부 객체를 생성하고, 실행시키면 생성자 함수가 menu() 메소드를 소환한다.
- menu() 메소드에서 choice 값을 담아 run() 메소드를 실행시키고 이는 각 기능으로 연결된다.
- insert() 메소드에서 정보를 받아 정보가 유효하면 Person객체에 각 정보를 담아 보낸 뒤, Person.insert() 메소드를 실행한다.
- exit는 sys 모듈을 통해 구현되었다.
- 마지막으로 객체를 만들어 실행한다.
실행 및 DB 결과


참고한 사이트
'Back-end > Python - project' 카테고리의 다른 글
| [Python] 전화번호부 Project - PySide6(PyQt6) (1) | 2022.08.09 |
|---|---|
| [Python] 전화번호부 Project - Delete 구현 (1) | 2022.08.09 |
| [Python] 전화번호부 Project - Update구현 (0) | 2022.08.09 |
| [Python] 전화번호부 Project - Read구현 (0) | 2022.08.09 |
| [Python] Project Prologue........ (1) | 2022.08.05 |
댓글