Skip to content
This repository has been archived by the owner on Dec 3, 2022. It is now read-only.

[알림] 아키텍처 요약 #35

Closed
binchoo opened this issue Aug 6, 2021 · 0 comments
Closed

[알림] 아키텍처 요약 #35

binchoo opened this issue Aug 6, 2021 · 0 comments
Assignees
Labels
documentation Improvements or additions to documentation 알림 알림 사항

Comments

@binchoo
Copy link
Owner

binchoo commented Aug 6, 2021

GUI 앱 아키텍처 요약

본인은 코드를 5가지 기능 집합으로 구분하고 있습니다.

  • UI를 담당하는:
  • 요구사항을 구현하는 서비스와 일부 객체를 추상화하는 DTO
  • 서비스와 UI가 사용해야 할 값들을 전역적으로 유지하는 컨테이너: 모델
  • UI, 서비스, 모델 사이의 의존성을 전부 연결하는: 컨트롤러 혹은 메인
  • 각 컴포넌트가 요구하는 의존성을 외부에서 작성토록 하는: 설정 파일

/view/main.py

PyQt5 라이브러리를 사용하여 UI를 그리는 MainView 클래스가 있습니다.
뷰는 모델 레이어에 의존하고 모델 레이어는 초기값을 설정 파일에 의존합니다.

MainView --> JsonConfigModel --> settings.py/initial_context

/view/qtwidget_wrap.py

PyQt로 GUI를 작성할 때, 자손 위젯을 추가하는 과정이 직관적이지 않다고 느꼈기 때문에 2가지 메서드를 추가하여 사용하고 있습니다. 관련 내용은 #10 에 끄적여 두었습니다.
뷰는 모델을 주입받고 몇 가지 값들을 구독합니다. 구독한 값이 변경되면 등록한 콜백이 수행됩니다.

서비스

서비스는 요구사항을 구현하여 유저에게 제공합니다. 총 3가지: 로그인 쿠키 획득, 지역 좌표 획득, 매크로 수행 서비스가 있습니다. 이 서비스들은 시작 - 수행 - 끝이라는 명확한 주기가 있습니다. 각 시기에 수행할 적당한 코드를 외부에서 설정할 수 있도록 LifeCycleMixin 클래스를 상속하고 있습니다.

/service/lifecycle.py

LifeCyclerMixin이 있습니다. 이 클래스를 상속하는 하위 클래스는 이곳에 정의된 생명주기를 지키며 서비스를 제공하겠다는 것을 의미합니다.

/service/selenium.py

SeleniumAware가 있습니다. 이 클래스를 상속하는 하위 클래스는 셀레늄 드라이버를 사용하는 서비스들입니다.
셀레늄은 크롬 말고도 다른 브라우저들을 이용할 수도 있습니다. driver_dependency_map 매핑을 사용하여 각 브라우저에 필요한 셀레늄 드라이버와 바이너리 파일을 획득해 사용하면 됩니다.

IoC를 적용하여 /bootstrap/settings.pydriver_dependency_map 매핑을 주입하도록 합니다. 서비스 코드의 변경 없이 의존성을 외부에서 설정 가능하다는 의미입니다.

/bootstrap/settings.py --> Hooker, Capture

/service/login.py

로그인 서비스 KakaoLoginHooker를 갖고 있습니다. 상위 클래스 LoginHooker는 템플릿 메서드 패턴을 사용하고 있습니다. 네이버 플랫폼도 고려 대상이었기 때문입니다. 패턴에 관심있는 분은 검색하여 살펴 보십시오.

/service/region.py

RegionCapture를 갖고 있습니다. Capture 기능은 웹의 실시간 요청을 훔쳐 보아야 하기 때문에 selenium-wire 라는 개량된 셀레늄 드라이버를 사용합니다. 해당 의존성은 마찬가지로 /bootstrap/settings.py에서 주입되고 있습니다.

/service/reservation.py

예약 서비스 LegacyVaccineReservaion을 갖고 있습니다. 원본 코드는 readme.md에 열거한 레포지토리를 따라가시면 됩니다.

모델

UI와 서비스가 자주 참조하는 값들을 전역적으로 관리합니다. qtmain.py의 첫 줄이 바로 모델을 view_model이라는 이름으로 전역 컨텍스트에 등록하는 코드입니다.

view_model = JsonConfigModel(json=settings.initial_context)

/bootstrap/model.py

ModelJsonConfigModel을 갖고 있습니다. 딕셔너리 혹은 Json 형태로 값들을 관리한다는 의미이며, Json 파일을 읽어 값을 로드하거나, Json으로 내보내도록 간단한 기능이 구현되어 있습니다.

메인

qtmain.py

메인은 UI, 서비스, 모델을 상호 연결하는 장소입니다. 이곳의 컨셉 만큼은 절차지향 및 함수형 콜백 패러다임 입니다.

  • UI의 이벤트 핸들러를 설정합니다.
  • UI에게 뷰 모델을 주입합니다.
  • 서비스의 생명 주기 메서드를 설정합니다.
  • 생명 주기 메서드 역시 뷰 모델과 상호작용 하며 값을 읽거나 갱신합니다.
  • 설정 파일들(settings.py, context.json)로부터 Model을 초기화합니다.

설정 파일

/bootstrap/settings.py

객체들의 초기 설정을 담당합니다.

constant.py

상수 값 설정을 담당합니다.

context.json

이 파일은 앱에서 매크로 '시작' 버튼을 눌렀을 때 갱신됩니다.
일전에 사용한 로그인 정보, 지역 좌표, 매크로 수행 인터벌을 보관합니다. .gitignore 처리 되어있으며 쿠키가 노출되지 않도록 주의하십시오.

@binchoo binchoo added documentation Improvements or additions to documentation 알림 알림 사항 labels Aug 6, 2021
@binchoo binchoo self-assigned this Aug 6, 2021
@binchoo binchoo pinned this issue Aug 6, 2021
@binchoo binchoo closed this as completed Aug 6, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
documentation Improvements or additions to documentation 알림 알림 사항
Projects
None yet
Development

No branches or pull requests

1 participant