저번 글의 피드백을 다시 한 번 살펴보겠습니다.
우선 "특정 시간"에 돌릴 수 있도록 개선해야 합니다. 이는 스케줄러를 이용해서 작업할 수도 있지만 개별 쿼리마다 결과를 받고 싶은 시간이 다를 수 있다고 생각하고 진행할 예정입니다. 그리고 쿼리를 수행하는 것은 문제가 없지만 DB가 다른 곳에서 조회를 하고 싶거나 동적으로 변하는 쿼리를 수행하고 싶을 것 같아서 이 부분도 개선을 해야겠습니다. 마지막으로 메일로 결과를 받는 것은 여전히 좋은 방법이지만 정말 심플한 결과 메세지는 메신저를 이용하여 받는 것이 더 좋을 것 같아서 텔레그램을 이용할 수 있도록 개선하겠습니다.
2022.09.29 - [기능과 기술] - 특정 시간에 조회 쿼리 수행하고 결과를 공유하는 프로그램
특정 시간에 조회 쿼리 수행하고 결과를 공유하는 프로그램
목표 프로그램이 잘 수행됐는지 확인하기 위해 "특정 시간"에 "조회 쿼리"를 수행하고 "결과를 공유"하는 프로그램을 만들려고 합니다. 우선은 원하는 프로그램이 가능할 지 검토하기 위해 생
kyeyangdak.tistory.com
검토
우선 "특정 시간"을 작업마다 설정하기 위해서 고민을 했는데 yaml 파일 형태로 작업을 정의해보면 어떨까 생각했습니다.
YAML - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
YAML - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. YAML은 XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식이다. 2001년에 클라크 에반스가
ko.wikipedia.org
정의하기 나름이겠지만 "특정 시간"은 when.time으로 정의하고 시:분 으로 정의했습니다. 프로그램은 이 정보로 언제 수행되어야 하는지 판단 할 수 있게되고 그러면 해당 작업을 "특정 시간"에 동작 시킬 수 있습니다. "23:00"으로 정의하면 23시에 수행되는 겁니다. 심플하기에 하루 중에 딱 원하는 시간에 한 번만 수행되므로 추후 확장 여지가 있지만 현재는 괜찮다고 생각했습니다.
when:
time: '23:30'
다음으로는 쿼리 수행 관련 작업인데 여러 DB를 사용할 수 있으므로 DB 설정 정보를 참고 할 수 있도록 만들고 실제 수행할 때 그 정보를 활용해서 수행하면 어떨까 싶습니다. 그래서 아래와 같이 action의 하위에 type, target, file 등의 값을 설정할 수 있도록 만들었습니다.
action:
type: 'query'
target: 'main.yaml'
file: 'main.sql'
make: False
마지막으로 리포트 방법에 대한 정의도 action과 유사하게 어떤 리포트 방법을 사용할 지 정하고 해당 방법의 상세 설정을 참고하도록 만들었습니다.
report:
type: 'mail'
target: 'mail.yaml'
개발
이 설정 파일을 jobs 폴더에 만들고 반복적으로 읽으면서 처리하도록 만듭니다. 하루에 한 번 수행되는데 이를 시키기 위해서 초 단위로 파일을 읽고 내용을 비교 분석하는 것이 갑자기 마음에 들지 않아도 지금 바로 개선하지 않으려고 노력했습니다. 지금은 yaml 설정 파일을 읽는 기능, actions을 처리하는 기능, reports을 처리하는 기능을 조정하는데 주의를 기울입니다. 반복적으로 yaml 설정 파일들을 읽어서 실행되어야 하는 시간을 체크하고, 실행되어야 하는 job은 actions에서 실행하여 dataframe을 가져옵니다. (현재는 query 조회 기능만 구현되어 있습니다.) 조회한 데이터를 테이블 이미지로 저장하여 reports에서 처리합니다. (현재는 메일 발송 기능만 구현되어 있습니다.) 전체적인 기능은 변경되지 않았으므로 전 버전과 같은 결과가 메일로 발송됩니다. 사실 여기까지는 설정과 리팩토링 정도의 작업인데 익숙치 않다보니 꽤 많은 시간이 소요되었습니다. 그리고 결정적으로 계획에 없던 딴 짓을 해버리는 바람에 더 늦어졌습니다.
딴짓
조회한 데이터를 가공해서 리포트하는 메일 본문에 표현하는 작업을 했습니다. 어제 결과와 오늘 결과를 조회하는데 대상이 17건 입니다. 그런데 이를 전체 합계 내고 단위 변환 등을 해서 최종 결과를 딱 보여주고 싶다는 생각에 사로잡혔습니다. 물론 해당 작업은 간단하지만 job에 의존성으로 갖게되므로 필요시 다른 job을 정의할 때마다 이 부분을 개발해줘야 합니다. 그래서 결과적으로 완전하진 않지만 action.make 설정을 통해 원하는 메일 본문 내용을 만들지를 결정하게 하고, getattr 메소드를 통해 동적으로 메소드를 호출하여 job 별로 원하는 결과를 얻을 수 있도록 작업했습니다. 이 과정에서 많은 검색과 삽질이 발생하여 더 많은 시간을 소요하게 되버렸습니다. 반성합니다.
피드백
아직 actions에서 여러 DB를 알맞게 처리하지 못합니다. 최초 정의한 스펙인 MSSQL만 조회 가능합니다. mysql, oracle 등의 RDBMS 3대장을 목표로 할 수도 있겠지만 딱히 만들어도 쓸 곳이 없으므로 만들지 않겠습니다. 그럼 현재 상태에서 쿼리 관련된 개인적인 피드백은 좀 더 파라미터를 동적으로 만드는 것인데 이 피드백도 그렇게 돌려볼 쿼리가 있는 건 아니므로 actions는 넘어가겠습니다. (지금은 데일리로 수행하므로 대부분의 where 절에 오늘 데이터를 추출하게 만들 것 같습니다.)
다음으로는 when에 대해서 좀 더 디테일하게 정의하고 싶을 수 있으나 앞서 괜찮다고 생각했기에 지금 수준을 유지하겠습니다. 다만 작업이 너무 빨리 끝나서 1분이 채 걸리지 않을 경우 해당 작업이 여러번 수행될 수 있습니다. 그래서 이와 관련된 안전장치 마련이 필요합니다. 현재는 reports 후 55초를 기다리도록 설정했습니다. 정말 단순하고 무식한 방법이지만 그래서 직관적이고 안전한 방법이라고 자신을 다독이면서 다음 작업을 할 수 있었습니다.
마지막으로 reports도 현재는 메일 발송 기능만 구현되어 있습니다. 앞서 텔레그램 등의 메신저로 정보를 전달하는 것을 검토했으나 거기까지 가지 못했습니다. 최대한 집중해서 만드는 것을 서브미션처럼 했는데도 아직 다른 것들에 눈이 많이 갑니다. 그래서 다음 피드백 중 가장 중요한 것은 "해야 할 것들을 잘 정의"하고 순위를 잘 정한다음 "지금 할 것만 가져와서 최대한 빨리 그 것만 수행"하는 절차를 적용해보는 것입니다.
'기능과 기술' 카테고리의 다른 글
특정 시간에 조회 쿼리 수행하고 결과를 공유하는 프로그램 (4) (2) | 2022.10.03 |
---|---|
특정 시간에 조회 쿼리 수행하고 결과를 공유하는 프로그램 (3) (0) | 2022.10.01 |
특정 시간에 조회 쿼리 수행하고 결과를 공유하는 프로그램 (0) | 2022.09.29 |
가격조회 로직 상세설명 (3) - 마지막 (0) | 2022.07.05 |
가격조회 로직 (2) (0) | 2022.07.01 |