728x90
반응형
SMALL

1. DAO(Data Access Object)

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

✔ 비즈니스 로직

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

2. DTO(Data Transfer Object)

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

3. VO(Value Object)

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

4. DAO, DTO를 활용한 단어장 만들기

 

 

# DTO 역할의 클래스

class Words:
    def __init__(self, eng, kor, lev=1): # 매개변수 객체로 받아주기 lev 기본값은 1로 설정됌
        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

    def printWord(self): # 전체 출력해주는 부분
        print(f'단어:{self.eng}, 뜻:{self.kor}, level{self.lev}')
 
 

 

word = Words('apple', '사과', 1)
 
 

 

word.printWord()
 
단어:apple, 뜻:사과, level1
 

 

# word.lev = 2
word.setLev(2)
 
 

 

word.printWord()
 
단어:apple, 뜻:사과, level2
 

 

# 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를 담당하는 클래스
class WordsService:
    def __init__(self):
        self.dao = WordsDao()
    
    def insertWord(self):
        eng = input('단어를 입력하세요: ')
        kor = input('뜻을 입력하세요: ')
        lev = input('Level을 입력하세요: ') # 입력받고
        word = Words(eng, kor, lev) # 객체를 생성해서
        self.dao.insert(word) # insert메소드의 word 부분에 매개변수로 입력

    def printALL(self):
        datas = self.dao.selectAll() # 모든 데이터 리턴 메소드
        for i in datas:
            i.printWord() # 모든데이터를 i 에 대입해가며 프린트 해주는 메소드 사용

    def searchWord(self):
        eng = input('검색할 단어를 입력하세요: ') 
        word = self.dao.search(eng) # self.dao가 WordsDao() 클래스를 받아주게 설정해놓아서 그안의 서치 메소드를 사용
        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()
 
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기1
단어를 입력하세요: ㅁ
뜻을 입력하세요: ㅁ
Level을 입력하세요: 
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기2
단어:ㅁ, 뜻:ㅁ, level
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기3
검색할 단어를 입력하세요: ㅁ
단어:ㅁ, 뜻:ㅁ, level
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기6

5. MVC패턴

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

✔ 디자인 패턴

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

'파이썬' 카테고리의 다른 글

MySQL client 라이브러리  (0) 2023.03.22
폴더 관리(이동, 복사, 정렬)  (0) 2023.03.14
파일 입출력 라이브러리  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13

+ Recent posts