-
생애 첫 배포 프로그램 - 재택근무 도우미프로그래밍/Python 2021. 7. 25. 22:15
프로그래밍에 처음 흥미를 느껴본 것이 학부시절 자동화 프로그램을 경험한 후였다.
파이썬 자체가 편리한 라이브러리로 빠르고 간단한 자동화 프로그램을 만들기에 참 좋은 것 같다.
약간의 계기가 생겨서 간단하면서 재밌는 프로그램을 만들고 싶어서 "재택근무 도우미"라는 프로그램을 만들어봤다.
▶ 무슨 프로그램일까?
사실 거창한 이름에 비해서 상당히 허저..ㅂ? 간단한 프로그램이다.
특별한 기능은 없고 프로그램을 실행하면 마우스를 자동으로 움직여서 화면 꺼짐을 방지해준다.
▶ 왜 만들었을까?
별로 쓸모없어 보이는 이 프로그램을 만든 계기가 있는데 코로나로 인해서 친누나가 재택근무를 하는 시간이 상대적으로 많아졌다.
사내의 원격 프로그램을 이용하는데 이 프로그램이 일정 시간 동안 사용자 입력(키보드, 마우스 사용)이 없으면 자동으로 프로그램을 종료해버린다고 한다. 이 시간 간격이 매우 짧다고 한다.
업무 특성상 클라이언트와의 통화나 서적을 찾아봐야 하는 일이 많은데 자꾸만 마우스를 한 번씩 흔들어줘야 해서 불편하다는 것이다. 주변 동료들도 불편해 한다고..
얘기를 듣고 "그냥 마우스가 자동으로 움직이면 되는 거네? 만들 수 있겠는데"라는 생각으로 바로 작업에 들어갔다.
구글에 치면 필요한 라이브러리는 다나와..
믿고 있으라규!! ▶ 어떻게 만들었을까?
일단 간략히 사용자 입장에서 요구사항을 만들어보고 나름대로 설계 로직을 짜 봤다..
- 요구사항
1. 실행파일로 실행한다.
2. 키보드나 마우스로 간단히 실행한다.
3. 언제든지 종료가 가능해야 한다.
- 설계
1. 사용성을 위해 ktinter 라이브러리를 이용한 UI를 만든다.
2. 매크로 기능으로 pyautogui 라이브리를 이용한다.
3. 최대한 심플하게 만든다.
- 상단에 실행 방법 text
- 하단에 종료 방법 text
- 중간에 "실행 버튼" / "종료 버튼 "생성, 키보드로 실행과 종료 가능한 trigger를 만든다.
짠 완성!
실행화면 보이는 것처럼 기능은 실행 버튼을 클릭하거나 키보드 F9번을 누르면 작동된다.
종료 버튼도 마찬가지로 종료 버튼을 누르거나 키보드 ESC를 누르면 종료한다. 사실 종료 버튼은 마우스가 계속 움직여서 ESC 키로만 끄게 된다...
▶ 제작 과정에서의 문제점
워낙 간단한 프로그램이다 보니 큰 문제는 없었는데 여기서도 문제가 생기긴 했다.
마우스 움직임 자체가 상대적인 위치에서 계속 움직이는데 이를 while문으로 짜 놨다.
중간에 종료 키보드 입력 값 'ESC'가 들어오면 멈추게 해 놨는데 이게 잘 먹히질 않았다.
정확히는 종료 기능 자체가 불가능하다기보다는 반응하기까지 시간이 걸렸다.
마우스가 움직이는 동작을 하는 동안 종료 버튼을 3초 이상 꾸욱 누르고 있어야 반응을 했다.
처음 로직은 이러했다. 마우스는 처음 위치에 마지막 위치까지 움직이라는 명령을 받은 후 그 사이에 종료 버튼이 들어오면 루프를 탈출하게 해 놨다.
종료 버튼은 작동은 하지만, 꾹 누르고 있어야지만 작동하는 것으로 봐서는 마우스가 움직이는 동작이 너무 빨라서 trigger가 반응하지 못하는 이유라고 생각했다.
▶ 문제 해결 과정
어떻게 해결할까 생각을 했는데 예전에 html을 이용해서 벽돌깨기 게임을 만들었던 게 생각이 났다.
MDN 사이트에 예제로 있던 프로그램이었는데 하단 패드를 방향키로 조정해 공을 튕겨 벽돌을 깨는 게임이다.
벽돌깨기 게임 웹 화면을 계속해서 업데이트해주는데 이때, 하단 패들이 속도를 가지고 키보드 방향의 입력이 들어오는 동안 x 방향의 속도만큼 움직이는 소스이다. (방향키 입력이 꺼지는 순간 속도 0)
이와 같은 방법으로 마우스의 움직임을 실행(F9) 이벤트가 들어오면 x방향 속도만큼 이동하고 종료(ESC)가 들어오면 속도가 0이 되게 했다.
정확히는
백돌깨기의 방향키 입력(누름) -> 제작 프로그램의 실행(F9) 버튼
벽돌깨기의 방향키 입력 종료(뗌) -> 루프 탈출
로 구성했다.
속도 개념을 가져와서 중간중간 계속해서 종료 입력을 확인해 언제든지 종료할 수 있게 한 것이다.
리팩토링 후 수정 후에는 처음 계획했던 대로 정상적으로 기능을 수행하기 시작했다.
▶ 생각해봐야 할 것
1. CPU 점유율
작은 프로그램이지만 리팩터링 후에 마우스가 짧은 거리를 연속해서 이동하고 그 사이사이 사용자에게 "종료"를 확인하게 되는데 이게 컴퓨터 과부하를 일으키지 않을까 확인해봐야 했다.
실행 전 실행 후 프로그램이 워낙 작아서 그런지 다행히 CPU 사용률이나 메모리 점유율에 차이는 없었다. 오히려 더 작아보이는 것은 실시간으로 점유율이 바뀌기 때문인다.
확인할 수는 없지만, 나중에 확장된 프로그램을 제작할 때는 전혀 다른 결과가 나올 수 있으니 조금 더 효율적인 코드를 생각해봐야겠다.
2. while문
사실 꼭 while문을 사용해야 했을까 의문이 들긴 한다. 하지만, 아직 내 지식으로는 while문 없이 반복적인 루프를 만들 수 있는 방법이 떠오르지는 않는다.
계속 기억해놨다가 새로운 지식을 계속 적용해봐야 할 것 같다.
▶ 배포 및 후기
간편한 사용을 위해서 단일 exe 파일로 빌드했다. 처음에는 좀 더 작고 빠르게 만들고자 분할 파일로 빌드했는데 다른 컴퓨터로 실행하면 잘 작동하지 않는 오류가 있었다.
파일이 나눠져 제대로 받지 못했거나 잘못 빌드해서 파이썬이 깔려있지 않으면 실행되지 않는 이유일 텐데 후자일 가능성이 높다고 생각했다.
원 파일로 빌드해서 배포하니 윈도즈를 사용하는 컴퓨에서는 모두 정상 작동한다. 맥에서는 확인하지 않았는데 이론상으로는 빌드 방식만 바꾸면 되는 일이니 기회가 되면 시도해봐야겠다.
일단 누나는 잘 사용하고 있고 회사 동료 몇 분들에게도 공유해서 너무 잘 사용하고 있다는 후기를 남겨주셨다...
이렇게 농땡2가 아닌 재택근무의 효율성을 높이는 프로그램을 만들어봤었다.
거창하지 않아도 이런 작은 프로젝트를 진행하는 게 상당히 재미있다. 의외로 은근히 생각할게 많이 생긴다...
아주 많이 부족한 프로그램이지만 삶의 질을 1g이라도 향상 시킬 수 있는 프로그램을 내가 직접 만들 수 있다는게 프로그래밍의 가장 큰 매력이 아닐까싶다. 개발자가 되기로 마음먹은 이후 가장 뿌듯했던 경험이 되지 않을까 싶다.
또 주변에 재밌는 문젯거리 없나 찾으러 다녀야겠다.
슝~