본문 바로가기
개발/파이썬

23.03.21파이썬 DAO,DTO,VO

by 상달군 2023. 3. 21.
728x90

목차

1. 파이썬의 DAO

2. 파이썬의 DTO

3. 파이썬의 VO

4. 파이썬의 DAO,DTO,VO를 이용한 단어장만들기

5. 파이썬의 MVC 패턴


26.DAO,DTO,VO.ipynb

 

1.DAO(Data Access Object)

  • DataBase의 data에 접근하기 위해 객체로 직접 데이터베이스에 접근하여 데이터를 삽입, 조회, 변경, 삭제등을 조작할 수 있는기능
  • 데이터베이스 접근을 하기 위한 로직과 비즈니스로직을 분리하기 위해 사용

비즈니스 로직

  • 업무에 필요한 데이터처리를 수행하는 응용프로그램의 일부
  • 데이터의 입력, 수정, 조회, 삭제 및 처리 등을 수행하는 각종 처리를 의미한다.
  • 유저의 눈에는 보이지 않지만, 유저가 원하는 행위를 잘 전달하기 위해 짜여진 코드 로직

2.DTO(Date Transfer Object)

  • 데이터 전송(이동) 객체라는 의미
  • 로직을 가지지 않고 순순한 데이터 객체이며, getter/setter 메소드만 가진 클래스를 의미한다.

3.VO(Value Object)

  • Read-Only 속성을 가진 오브젝트
  • DTO와 유사하지만 VO는 setter를 가지고 있지 않아 값을 변경할 수 없음
  • DTO는 인스턴스 개념이라면 VO는 Layer 개념
  • DTO는 Layer간의 통신 용도로 사용하는 객체이며, VO는 특정한 비즈니스 로직의 값을 담는 객체

 

4. 파이썬의 DAO,DTO,VO를 이용한 단어장만들기

  • DTO역할의 클래스 (입력받은 값을 받고 밖으로 내주는 클래스)
# DTO 역의 클래스 (입력받고 내어줄수 있기 때문에)
class Words:
  def __init__(self, eng, kor, lev = 1): # eng, kor, lev를 생성자로 처음 객체 생성시 입력 받는다 lev는 디폴트값 1이다.
    self.eng = eng
    self.kor = kor
    self.lev = lev

  def setEng(self, eng):  # eng값을 입력 받음
    self.eng = eng
  def getEng(self):   # 입력받은 eng를 밖으로 내어줌
    return self.eng

  def setKor(self, kor):  # kor값을 입력 받음
    self.kor = kor
  def getKor(self): # 입력받은 kor를 밖으로 내어줌
    return self.kor

  def setLev(self, lev):  # lev값을 입력 받음
    self.lev = lev
  def getLev(self): # 입력받은 lev를 밖으로 내어줌
    return self.lev

  def printWord(self):  # 입력 받은 단어의 정보를 프린트 해줍니다. 
    print(f'단어: {self.eng}, 뜻: {self.kor}, 레벨: {self.lev}')
  • DAO역할을 하는 클래스 (실질적으로 뭔가 연산(동작)이 일어나는 클래스 
  • DAO와 Service 
#DAO역할을 하는 클래스 생성
class WordsDao:

  def __init__(self):
    self.datas = [] #이 클래스에서 사용할 리스트

  def insert(self, word):   #단어를 추가해주는 함수
    self.datas.append(word)


  def update(self, word):   #단어의 내용을 수정 해주는 함수
    for i in self.datas:
      if i.getEng() == word.getEng():#기존의 저장된 단어와 수정할 단어가 같다면 
        i.setKor(word.getKor()) #기존의 저장된 뜻에 수정할 단어의 뜻을 설정 하게됩니다. 
        i.setLev(word.getLev())

  def search(self, eng): #특정 단어를 입력받은 단어의 내용을 출력 해주는 함수
    for i in self.datas:
      if i.getEng() == eng:
        return i 

  def selectAll(self):    # 현재 저장되어있는 모든 단어를 출력 해주는 함수
    return self.datas

  def delete(self, word):   # 입력 받은 객체를 삭제 해주는 함수
    self.datas.remove(word)
  • service 클래스 
from ast import Delete
#실제 동작을 해주는 서비스단 
#Service를 담당하는 클래스
class WordService:

  def __init__(self):
    self.dao = WordsDao()  # 위의 DAO를 불러온다.(위에 생성해놓은 기능을 사용하기 위해서) 

  def insertWord(self):               #1. 단어를 입력 받는것을 클라이언트에게 실질적으로 보여주는 함수
    eng = input('단어를 입력하세요.')
    kor = input('뜻를 입력하세요.')
    lev = input('레벨를 입력하세요.')

    word = Words(eng, kor, lev) # 입력받은 eng,kor,lev 값을 DTO범위로 보내주고 리턴 받은 값을 word변수에 저장한다. 
    self.dao.insert(word)       # DTO에서 받은 값(word변수의값)을 동작해줄 DAO로 보냄 연산 또는 동작은 DAO클래스에 진행한다.  

  def printAll(self):           # 2. 출력 해주는 함수 
    datas = self.dao.selectAll() # DAO에서 datas의 내용을 return 받아 datas의 변수에 담는다. 
    for i in datas:             # 입력 받은 datas의 리스트를 이용하여 for문을 사용
      i.printWord()             # DTO의 생성해둔 형태에 맞게 출력 해줍니다. 


  def searchWord(self):       # 3. 단어를 찾는 함수
    eng = input('검색할 단어를 입력하세요.')
    word = self.dao.search(eng)  # 입력 받은 eng단어를 DAO의 search로 보내 값을 비교하고 return 받아 word에 저장한다. 

    if word == None:            # 단어가 없으면 내용출력
      print('찾는 단어가 없습니다. ')
    else:                       # 단어가 있다면,
      word.printWord()          # DAO의 search로 보낸값을 DTO의 생성해둔 형태에 맞게 출력 

  def editWord(self):       # 4. 단어를 수정할 함수
    eng = input('수정할 단어를 입력하세요.')
    word = self.dao.search(eng)   # 입력받은 eng단어를 DAO가 동작해 찾아주고 word에 반환값을 저장한다. 

    if word == None:         # 단어가 없으면 내용출력
      print('수정할 단어를 찾지 못했습니다. ')
    else:
      kor = input('새로운 뜻을 입력하세요.')
      lev = input('새로운 레벨을 입력하세요.')
      word = Words(eng,kor,lev)         # 수정할 단어가 존재할 경우 다시 DTO의 객체 생성 해주고 그값을 word에 저장합니다. 
      self.dao.update(word)             # DTO에서 반환 받은 값을 DAO의 update로 보내 내용 수정을 동작해줍니다. 

  def delWord(self):        # 5. 단어를 삭제할 함수
    eng = input('삭제할 단어를 입력하세요.')
    word = self.dao.search(eng) # 입력받은 eng단어를 DAO가 동작해 찾아주고 word에 반환값을 저장한다. 

    if word == None:    # 단어가 없으면 내용출력
      print('찾는 단어가 없습니다. ')
    else:
      self.dao.delete(word) # DTO에서 반환 받은 값을 DAO의 Delete로 보내 내용 삭제를 동작해줍니다.

 

  • View 역할을 하는 클래스( 메뉴를 선택하여 메뉴에 맞는 service를 실행해준다.)
# view 역할을 하는 클래스 

class Menu:
  def __init__(self):
    self.service = WordService()

  def run(self):
    while True:
      try:
        menu = int(input('1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기'))

        if menu == 1:
          self.service.insertWord()
        elif menu == 2:
          self.service.printAll()
        elif menu == 3:
          self.service.searchWord()
        elif menu == 4:
          self.service.editWord()
        elif menu == 5:
          self.service.delWord()
        elif menu == 6:
          break

      except:
        print('다시 입력하세요. ')
  • 실행코드
start = Menu()
start.run()

5.MVC 패턴

  • 디자인 패턴 중 하나
  • M(Model), V(View), C(Controller)의 약자
  • 사용자가 view를 통해 Controller를 조작하면 Controller는 Model을 통해 데이터를 가져오고, 그 정보를 통해 시각적인 담당하는 view를 다시 제어하여 사용자에게 전달하는것
  • 모델 (Model)
    • 애플리케이션의 정보, 데이터를 나타낸다,
    • 사용자가 편집하길 원하는 모든 데이터를 가지고 있음.
    • 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말하야 함
    • 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야 한다.
  • 뷰 (View)
    • 텍스트, 체크박스, 등과 같은 사용자 인터페이스 요소를 나타낸다.
    • 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
    • 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 한다. (계산이 되면 안된다)
  • 컨트롤러 (Controller)
    • 데이터와 사용자 인터페이스 요소들을 연결하는 다리 역할을 합니다.
    • 모델이나 뷰에 대해 알고 있어야 한다.
    • 전체인 계산을 해야 하기때문에 모델과 뷰를 알고 있어야한다.
    • 모델이나 뷰의 변경을 모니터링 해야 한다.
    • 애플리케이션의 메인 로직은 컨트롤러가 담당하게 됩니다.

✔디자인 패턴

  • 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용하여 쓸 수 있는 것을 정리한 "규약"을 통해 형태로 만든것

 

 


 

728x90

댓글