본문 바로가기
Python/Basic

[파이썬, Python] DB를 이용하여 영어 단어장 프로그램 만들기! - DTO, DAO

by coding-choonsik 2023. 3. 22.
728x90
반응형
SMALL

📌 DataBase를 이용하여 영어 단어장을 만드는 프로그램을 작성해보자.

(단, 영어 단어장은 MySQL 데이터베이스 테이블과 연동되어야 함)

 


1. MySQL에서 테이블 만들기

#단어장 테이블 생성
create table words(
	eng varchar(50) primary key,
    kor varchar(50) not null,
    lev varchar(10)

words 테이블 생성


2. DTO 클래스

  • 순수한 데이터 객체
  • getter/setter 메소드만 가짐
class Words:
    def __init__(self, eng, kor, lev):
        self.eng = eng
        self.kor = kor
        self.lev = lev
        
    def setEng(self, eng): 
    	self.eng = eng      
        
    def getEng(self):
    	return self.eng
        
    def setKor(self, kor): 
    	self.kor = kor      
        
    def getKor(self):
    	return self.kor
    
    def setLev(self, lev):
        self.lev = lev

    def getLev(self):
        return self.lev

3. DAO 클래스

  • 객체로 직접 DataBase에 접근하여 데이터를 삽입, 조회, 변경, 삭제(CRUD) 등을 조작할 수 있는 작업코드 구현
  • DataBase에 접근하기 위해 MySQLdb 사용
  • SQL에서 데이터를 다루는 기능을 구현함
import MySQLdb

class WordsDao:
	def __init__(self):
    	self.conn = None    # connect한 객체를 담을 변수
    
    # DataBase에 접속
    def connect(self):
    	self.db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
    
    # DataBase 커넥션 끊기
    def disconnect(self):
    	self.db.close()
    
    # 데이터 추가하는 기능
    def insert(self, word):
        self.connect()    # db연결
        cur = self.db.cursor()   # 커서 생성
        sql = "insert into words values (%s, %s, %s)"    # 데이터 추가하는 sql 구문
        data = (word.getEng(), word.getKor(), word.getLev())   # 메소드를 이용하여 프로퍼티 저장
        cur.execute(sql, data)    # data를 넣은 sql구문 실행
        self.db.commit()     # 반영
        self.db.disconnect()   # 커넥션 닫기
        
    # 전체 데이터를 조회하는 기능
    def selectAll(self):
    	self.connect()    # db연결
        cur = self.db.cursor()   # 커서 생성
        sql = "select eng, kor, lev from words"    # 데이터를 조회하는 sql구문
        cur.execute(sql)
        row = fetchall()   # sql 결과 전체 조회
        self.disconnect()  # 커넥션 닫기
        return row     # 전체 조회된 결과 값 반환
        
    # 특정 데이터를 조회하는 기능
    def search(self, eng):   # 영어 단어를 입력받음
    	self.connect()    # db연결
        cur = self.db.cursor()   # 커서 생성
        sql = "select eng, kor, lev from words where eng=%s"   # 특정 조건에 만족하는 데이터만 출력하는 sql구문
        data = (eng, )   # 튜플에 하나의 값 입력시 , 같이 입력해야함!
        cur.execute(sql, data)
        row = cur.fetchone()  # 하나의 데이터만 튜플로 출력
        self.disconnect()
        return row
        
    # 데이터를 수정하는 기능
    def update(self, word):   # word객체를 매개변수로 입력받음
    	self.connect()    # db연결
        cur = self.db.cursor()   # 커서 생성
        sql = "update words set kor=%s, lev=%s where eng=%s"   # 데이터를 수정하는 sql구문 작성
        data = (word.getKor(), word.getLev(), word.getEng())  
        result = cur.execute(sql, data)   # 수정 실행이 성공하면 수정된 데이터의 갯수 반환
        self.db.commit()   # 반영
        if result > 0:  # 정상적으로 수정이 되면
        	print('수정되었습니다.')
        else:
        	print('해당 단어가 없습니다.')
        self.db.disconnect()   # 커넥션 닫기
        
    # 데이터를 삭제하는 기능   
    def delete(self, eng):   # 영어 단어를 매개변수로 받음
        self.connect()    # db연결
        cur = self.db.cursor()   # 커서 생성
        sql = "delete from words where eng=%s"   # 데이터를 삭제하는 sql구문 작성
        data = (eng,)
        result = cur.execute(sql, data)
        self.db.commit()
        if result > 0:   # 정상적으로 삭제된 데이터의 갯수 반환 
            print('삭제되었습니다')
        else:
            print('해당 단어가 없습니다')
        self.disconnect()  # 커넥션 닫기

4. Service 클래스

  • 실제로 단어장 테이블에 데이터를 삽입, 조회, 변경, 삭제(CRUD) 등을 하는 메소드를 구현
class WordsService:
    def __init__(self):
        self.dao = WordsDao()   # 클래스 호출시 자동으로 WordsDao 클래스 객체 생성됨
        
    # 단어장에 단어를 추가
    def insertWord(self):
        eng = input('단어를 입력하세요')
        kor = input('뜻을 입력하세요')
        lev = input('레벨을 입력하세요')
        word = Words(eng, kor, lev)   # Words 클래스로 객체 생성
        self.dao.insert(word)         # WordsDao 클래스의 insert 메소드로 구현
        
    # 전체 단어를 출력
    def printAll(self):
        datas = self.dao.selectAll()   # WordsDao 클래스의 selectAll 메소드로 구현
        print(datas)   
    
    # 영어 단어를 통해 단어의 뜻과 레벨을 출력
    def searchWord(self):
        eng = input('검색할 단어를 입력하세요')
        word = self.dao.search(eng)    # WordsDao 클래스의 search 메소드로 구현
        if word:   # 입력받은 단어의 객체가 있으면
            print(word)   # word 객체를 출력
        else:
            print('찾는 단어가 없습니다')
            
    # 영어 단어를 입력받아 뜻과 레벨을 수정        
    def editWord(self):
        eng = input('수정할 단어를 입력하세요')
        word = self.dao.search(eng)    # WordsDao 클래스의 search 메소드로 구현
        if word == None:
            print('수정할 단어를 찾지 못했습니다')
        else:   # word 객체가 있으면
            kor = input('새로운 뜻을 입력하세요')
            lev = input('새로운 레벨을 입력하세요')
            word = Words(eng, kor, lev)  # 새로 입력받은 뜻과 레벨로 객체 생성
            self.dao.update(word)        # WordsDao 클래스의 update 메소드로 구현
            
    # 단어를 삭제
    def delWord(self):
        eng = input('삭제할 단어를 입력하세요')
        self.dao.delete(eng)     # WordsDao 클래스의 delete 메소드로 구현

5. 프로그램 실행 클래스

class Menu:
    def __init__(self):   # 클래스 객체 생성시
        self.service = WordsService()   # 자동으로 WordsService 클래스 객체로 생성
    
    def run(self):
        while True:
            try:
                menu = int(input('1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기'))
                if menu == 1:
                    self.service.insertWord()   # WordsService 클래스의 insertWord() 메소드 실행
                elif menu == 2:
                    self.service.printAll()		# WordsService 클래스의 printAll() 메소드 실행
                elif menu == 3:
                    self.service.searchWord()	# WordsService 클래스의 searchWord() 메소드 실행
                elif menu == 4:
                    self.service.editWord()		# WordsService 클래스의 editWord() 메소드 실행
                elif menu == 5:
                    self.service.delWord()		# WordsService 클래스의 delWord() 메소드 실행
                elif menu == 6:
                    break
            except Exception as e:
                print(e)
                print('다시 입력하세요')

 

 

start = Menu()   # Menu클래스 객체 생성
start.run()      # Menu클래스의 run()메소드 실행

 


📄 주피터 노트북으로 작성한 파일

28_DB를 이용한 단어장 만들기.ipynb
0.01MB / 0.01MB

728x90
반응형
LIST