Python

DAO,DTO,VO

hyunsik_park 2023. 3. 21. 17:21
# 1. DAO(Data Access Object)
DataBase의 data에 접근하기 위한 객체로 직접 DataBase에 접근하여 데이터를 삽입, 조회, 변경, 삭제등을 조작할 수 있는 기능
DataBase 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용
✔ 비즈니스 로직
업무에 필요한 데이터처리를 수행하는 응용프로그램의 일부
데이터의 입력, 수정, 조회, 삭제 및 처리 등을 수행하는 각종 처리를 의미
유저의 눈에는 보이지 않지만, 유저가 원하는 행위를 잘 ㄷ전달하기 위해 짜여진 코드 로직
# 2. DTO(Data Transfer Object)
데이터 전송(이동) 객체라는 의미
로직을 가지지 않는 순수한 데이터 객체이며 getter/setter 메소드만 가진 클래스를 의미
# 3. VO(Value Object)
Read-Only 속성을 가진 오브젝트
DTO와 유사하지만 VO는 setter를 가지고 있지 않아 값을 변경할 수 없음
DTO는 인스턴스 개념이라면 VO는 리터럴 개념
DTO는 Layer간의 통신 용도로 사용하는 객체이며, VO는 특정한 비즈니스로직의 값을 담는 객체
# 4. DAO, DTO를 활용한 단어장 만들기
class Words:
    def __init__(selfengkorlev=1):
        self.eng = eng
        self.kor = kor
        self.lev = lev
    def setEng(selfeng):
        self.eng = eng
    def getEng(self):
        return self.eng
    def setKor(selfkor):
        self.kor = kor
    def getKor(self):
        return self.kor
    def setLev(selflev):
        self.lev = lev
    def getLev(self):
        return self.lev
    def printWord(self):
        print(f'단어: {self.eng}, 뜻: {self.kor}, 레벨: {self.lev}')

    def setEng(selfeng):
      self.eng = eng
    def getEng(self):
      return self.eng

    def setKor(selfkor):
      self.kor = kor
    def getKor(self):
      return self.kor

    def setLev(selflev):
      self.lev = lev
    def getLev(self):
      return self.lev


    def printWord(self):
      print(f'단어:{self.eng}, 뜻: {self.kor}, 레벨: {self.lev}')
class WordsDao:
    def __init__(self):
        self.datas = []
    def insert(selfword):
        self.datas.append(word)
    def update(selfword):
        for i in self.datas:
            if i.getEng() == word.getEng(): # 기존의 저장된 단어와 수정할 단어가 같다면
                i.setKor(word.getKor()) # 기존의 저장된 뜻에 수정할 단어의 뜻을 설정
                i.setLev(word.getLev())
    def search(selfeng):
         for i in self.datas:
             if i.getEng() == eng:
                 return i
    def selectAll(self):
        return self.datas
    def delete(selfword):
        self.datas.remove(word)
 
# Service를 담당하는 클래스
class WordsService:
  def __init__(self):
    self.dao = WordsDao()

  def insertWord(self):
    eng = input('단어를 입력하세요 : ')
    kor = input('뜻을 입력하세요 :')
    lev = input('레벨을 입력하세요 : ')
    word = Words(eng, kor, lev)
    self.dao.insert(word)
  
  def printAll(self):
    datas = self.dao.selectAll()
    for i in datas:
      i.printWord()
  
  def searchWord(self):
    eng = input('검색할 단어를 입력하세요 : ')
    word = self.dao.search(eng)
    if word ==  None:
      print('찾는 단어가 없습니다.')
    else:
      word.printWord()

  def editWord(self):
    eng = input('수정할 단어를 입력하세요 : ')
    word = self.dao.search(eng)
    if word == None:
      print('수정할 단어를 찾지 못했습니다')
    else:
      kor = input('새로운 뜻을 입력하세요')
      lev = input('새로운 레벨을 입력하세요')
      word = Words(eng, kor, lev)
      self.dao.update(word)

  def delWord(self):
    eng = input('삭제할 단어를 입력하세요')
    word = self.dao.search(eng)
    if word == None:
      print('삭제할 단어를 찾지 못했습니다.')
    else:
      self.dao.delete(word)

# view 역할을 하는 클래스
class Menu:
  def __init__(self):
    self.service = WordsService()
  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
데이터와 사용자 인터페이스 요소들을 연결하는 다리 역할을 함
모델이나 뷰에 대해 알고 있어야 함
모델이나 뷰의 변경을 모니터링 해야 함
애플리케이션의 메인 로직은 컨트롤러가 담당
 
✔ 디자인 패턴
프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용하여 쓸 수 있는 것을 정리한 " 규약"을 통해 형태로 만든 것

'Python' 카테고리의 다른 글

압축 파일 정리하기  (0) 2023.03.14
파일 읽기 및 저장하기  (0) 2023.03.14
변수 타입 어노테이션  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13
파일 입출력  (0) 2023.03.13