[코딩몰라여] steem-python으로 포스트와 댓글 실시간으로 읽어오기 기초 ~예외처리~ 편
어느 날 갑자기 포스트가 끊기고 댓글도 가끔 다는게 관찰되면 '아, 현대판 노예대학원생 의 책임을 다 하고 있구나.' 라고 생각해주시면 됩니다. 마감이 다가오면 죽을 소리를 내기 마련인데, 스팀잇에 살려달라고 댓글을 달아봤지만 없는 사람 취급 당했습니다.
무시당한 저의 슬픔과 이전 편에서 죽어버린 프로그램의 슬픔을 딛고 다음 단계로 나아가봅시다. 실시간으로 읽어오기 기초 편과 이어지는 내용입니다.
▲ 여러분의 마음. 초식악어(@chosigageo)님이 그려주셨습니다.
물론 저도 다른 사람의 개발 포스트보면 저렇게 됨.
# 오래된 Steem-python을 업데이트
코딩몰라여 시리즈를 시작할 때 steem-python은 0.18 버전이었는데, 최근 1.0 버전으로 업그레이드 되었습니다. 아나콘다에서 가상환경을 활성화해주시고 아래의 명령어를 입력하시면 업데이트 됩니다.
conda upgrade steem -c conda-forge
# 노답 3형제가 아니라 오류 3형제
전편에서 말씀드렸듯이 프로그램을 실행하면 얼마 못가서 오류를 띄우면서 죽어버립니다. 이는 스팀 블록체인의 문제가 아니라, 블록체인의 기록을 우리가 살펴보기 편하도록 제공하는 노드의 문제입니다.
공식 노드인 api.steemit.com이 한 달 새에 계속 불안한 모습을 보여주고 있습니다. 노드가 불안한 이유는 아마 개발자들이 아무것도 안해서가 아니라, 뭔가 하고 있어서 그럴 가능성이 높기 때문에 노드가 다시 안정화 될 때쯤엔 새로운 기능이 나오지 않을까 하는 개인적인 소견을 갖고 있습니다. 엊저녁에 잠깐 스팀잇이 12일 전의 상황으로 돌아간 것도 공식 노드의 문제였습니다. 무슨 일이 있었던걸까요.
이런 어려운 이야기는 한 켠으로 밀어놓고, 우리의 프로그램에 심폐소생술을 진행합시다. 프로그램이 뿜어내는 오류를 관찰하면 크게 세 가지가 있습니다.
# 첫째, 블록을 읽는 간격 설정의 문제
블록체인의 블록을 빨리 읽고 처리하는 것은 물론 중요한 일이겠지만 실시간 프로그램을 지향한다고 하더라도, 블록이 생성되는 주기보다 프로그램을 빨리 실행해봐야 더 이상 읽을 내용이 없으므로 프로그램은 종료되거나 다음 블록이 생성될 때까지 기다려야합니다. 우리의 프로그램은 계속 실행되고 있어야하니, 다음 블록을 기다리는 것이 현명하겠죠.
위 오류메시지에서 블록이 생성되는 속도에 맞춰 프로그램을 잠들게 해주는 코드가 time.sleep(block_interval)
입니다. 그게 Type: an integer is required (got type NoneType)
이라는 오류 메시지를 내면서 프로그램이 중단되었습니다. 본래 block_interval
은 블록이 생성되는 주기(시간)이기 때문에 숫자 값(integer)이어야하는데 그 값을 못찾아서 존재하지 않음(none)이 되어버린 현상입니다.
이는 몇 주전에 보고된 사항이며, 블록 생성 주기를 나타내는 STEEMIT_BLOCK_INTERVAL
이라는 상수가 설정파일(config)에 정의되어있는데, 이것의 이름이STEEM_BLOCK_INTERVAL
로 바뀌었습니다. 그런데blockchain.py
에서는 이전 이름인 STEEMIT_BLOCK_INTERVAL
을 하염없이 찾고 있어서 생성 주기 값을 찾지 못해 발생하는 오류입니다.
해결법은
오류 메시지에 나타난 "경로\blockchain.py"를 PyCharm으로 열어서 STEEMIT_BLOCK_INTERVAL
라고 되어있는 부분을 전부 STEEM_BLOCK_INTERVAL
로 바꾸어주면 됩니다. 오류 메시지에서 클릭하면 바로 열 수 있고, 바꿔야하는 부분은 2개 밖에 없습니다. Ctrl + F를 눌러 찾아바꾸도록 합시다.
직접 바꾸지 않아도 새로 설치하는 사람에게는 반영된다고 하는데... 0.18에서 1.0으로 업데이트를 해봐도 이 문제는 그대로네요.
# 둘째, 포스트를 찾지 못하는 문제(PostDoesNotExist)
프로그램을 실행하면 실행한 순간부터 올라오는 체인 정보를 읽어오는 것이 아니라 약 1 ~ 2분 전의 내용부터 읽어오기 시작합니다. 그러므로 프로그램을 실행한 직후에는 프로그램이 글을 읽는 시점과 현재 시간의 차이가 발생합니다.
잡다한 기능을 추가하는 것으로 인해, 그것들을 처리하느라 현재 시간과의 차이가 벌어지는 경우도 있습니다. 예를 들어 마아냐봇 같은 경우에 장문의 댓글이 쏟아지면 그 글들을 죄다 읽어서 스캠 링크가 있는지 없는지 검증하는 과정으로 인해 시간이 밀리기도 합니다. 대표적인 장문 댓글이 가이드독. 읍읍.
여하튼, 프로그램이 노드에서 포스트를 읽은 시점에서 글 작성자가 글을 삭제한 상태라면 프로그램은 글 내용을 찾지 못하고 오류를 일으킵니다. steem-python에서 이 오류의 이름은 PostDoesNotExist
입니다. 아래에서 예외 처리 코드를 작성하는 것으로 해결하도록 할게요.
# 셋째, 통신 오류(RPCError)
게임 캐릭터에 힘, 민첩, 지능 등 스테이터스가 다양하듯이 프로그래머에도 분야가 다양합니다. 제 네트워크 분야에 대한 스테이터스는 세 번째 정도로 약한 분야라서 자세히 알려드리긴 어렵습니다. 단순히 프로그램과 스팀 노드가 제대로 통신을 못해서 발생하는 오류라고 생각하시면 되겠습니다. 이것도 예외 처리 코드에서 함께 처리해주도록 하겠습니다.
# 둘째와 셋째의 해결 방법
프로그램에서 발생하는 어떠한 오류가 발생했을 때, 오류의 원인을 제거하는 것이 아니라 오류가 발생했을 때 취할 행동을 정의하는 것을 예외 처리(exception handling)라고 칭합니다. 당연히 오류의 원인을 제거할 수 있으면 제거하는게 제일 좋습니다. 첫째의 해결 방법은 오류의 원인을 제거한 경우입니다.
프로그램은 기본적으로 예외 처리가 정의되지 않은 오류를 만나면 종료됩니다. 또한 둘째와 셋째의 경우는 저희가 오류의 원인을 제거할 수 없기 때문에 예외 처리를 정의해줘야합니다. 오류가 발생하면 죽지말고 그냥 못본 척 넘어가... 라고 개발자가 알려줘야하는 것입니다. 그러면 프로그램이 개복치마냥 급사하는 경우를 막을 수 있습니다.
이 코드는 이전 편에서 알려드린 kr 태그가 붙은 댓글과 포스트를 출력하는 코드였습니다. 여기서 둘째, 셋째 오류를 뿜어대는 곳이 딱 한 줄입니다.
for post in stream
comment로 필터링된 stream에서 포스트/댓글을 가져올 때 오류가 발생합니다. 그래서 예외 처리를 받을 부분을 설정해야하는데 for문의 주절에서 오류가 발생하기 때문에 종속되는 부분까지 전부 예외 처리 영역으로 설정해줘야합니다. 그럼 파이썬의 코딩 규칙상 모든 코드가 한 간격(탭)씩 오른쪽으로 밀리게 됩니다. 그럼 코드가 못생겨집니다. (개인 취향의 영역. 코드는 꾸며도 현실의 자신은 안꾸밈.)
저는 제너레이터 라는 것을 만들어서 예외 처리 기능까지 포함한 반복자를 만들어서 처리했습니다.
평소엔 접어놓고 있는듯 없는듯 사용하시면 됩니다.
# 망했다.
이번 포스트는 아예 난이도 조절을 실패했군요. 그렇다고 안할 수는 없고 (...) 그냥 기본 틀로 갖다쓰실 때 이런 생각으로 만들었구나 하는 생각으로 봐주시면 될 것 같습니다. 사실 통신 오류니, 포스트 오류니 다 신경 쓰지 말고 오류가 나면 그냥 무시하고 진행하게끔 간단하게 만드시는 것도 좋습니다.
언급한 오류 삼형제 이외의 오류도 발생할 수 있습니다. 대신 공식 노드, 사설 노드를 포함한 모든 노드에서 삼형제 이외에 다른 오류가 하루정도 지속되면 스팀을 팔고 도망가는게 현명할지도 모릅니다. 그래서 따로 설정해둔 것입니다. (...)
어제 일어났던 12일 회귀 사건은 사설 노드는 문제가 없기도 했고, 둘째 에러만 폭풍처럼 쏟아져서 금방 회복될 것을 예상할 수 있었습니다.
이것으로 실시간으로 포스트와 댓글을 읽어오는 코드의 틀이 완성되었습니다. 예외처리 같은건 전공학과에서 언어를 가르칠 때도 제일 마지막에 가르치는 내용입니다. 음... 말을 붙이면 붙일 수록 더 어려워질 것 같으니 이번 편은 머릿 속에서 지우시고 다음 편을 진행할 때 아래의 코드를 챙겨오시면 되겠습니다. 미안합니다. /큰절
마침 크립토일병(@hellocrypto)님과 포스트 내용이 겹쳐서 좋네요. 오류 종류에 상관없이 전부 무시하는 방법은 크립토님의 포스트를 참고하시면 도움이 됩니다.
https://steemit.com/kr-dev/@hellocrypto/5
이번 편에서 작성된 코드는 아래의 링크에서 다운로드 가능합니다.
https://github.com/maaanya/codingmolayo-steempy
코딩몰라여 시리즈는 아래의 사이트에서 모아볼 수 있습니다.
https://codingmola.herokuapp.com/
아 진짜 오류 삼형제 극혐ㅠㅠ 스팀API 처음 접했을 때 한참 헤맸었죠 이것들 땜에... 제 포스트 소개해주셔서 감사합니다 ☞☜
벼라별 오류가 다 있는 것에 놀라지 않을 수가 없습니다.
글 작성 하시느라 정말 오랜 시간을 사용하셨을 것 같아요.
일반인들이 쉽게 접근할 수 없는 정보를 자세히 설명해주셔서 감사합니다.
구경하러 와주신 것과 응원 너무 감사드립니다 :D
애써 아이디를 블러처리 하셨지만 노란색 플필이 너무나 눈에 띄는군요.
그리고 어제 잠시 스팀잇이 약간 정신이 나가서 놀랐던 것에 대한 확인, 그외 다른 것은 갑자기
잘 안보인다고 우기면서보고 갑니다 :D 좋은 밤 되세요!!팅키씽키요정님도 좋은 밤 되세요 :D
요... 요정이라고 했다;;;; 나중에 뭔가 후회하셔도 전 몰라욧 ㅠㅠ
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아이디 블러 된걸 @thinky님 답글을 보고 알게되었어요. 블러하면 뭐 하나..
ㅋㅋㅋㅋㅋㅋ
프로그래밍에 대해 이렇게 재밌는 구성으로 설명해주시는 분 처음 뵈었어요. ㅎㅎ 정말 감탄하고 갑니다. @maanya님 응원드려요 ^^
와와! 칭찬 감사합니다 +_+ 고맙습니다아아아앟
어제 트위터 번역글을 다 썼는데 RPC 에러가 6연타 걸리더니 메인으로 튕겨져나가서 과거가 보이기 시작하는데 충격적으로 어이가 없었습니다. 내용도 처음부터 몇분간 다 다시 옮겨야 했습니다. 아~ 코인충이라서 참는다~ 아~~~
후후.. 전 손가락 물고 구경하고 있었습니다. 포스트를 작성할 땐 외부 프로그램을 사용합시다... ㅋㅋㅋ
재미있게 잘 읽었습니다! ^^
감사합니다 +_+//
마야나님 포스팅보면서 파이썬 연습하고 있어요 ㅋㅋ
어제 아나콘다랑 파이참 깔고 이것저것 테스트 조금 해봤어요.
감사합니다!
오오.. 뿌듯뿌듯하게 만들어주시는군요. 감사합니다~
아, 그래서 제가 실시간 체크를 할때마다 오류가 떳군요. 정말 감사합니다^^
+_+ 도움이 되어 기쁩니다. 공식 노드가 안정적이면 좋을텐데요 ㅠ
좋은 정보 감사합니다
12일 회귀오류로 정말 깜놀했었는데
팔로 꾸욱~❤즐거운 하루되세요🍀
팔로 감사합니다~ 공식 노드 관리자가 왜 문제 생겼는지 이야기해줬으면 하는 소망이 있습니다 ;ㅅ;
코딩 좀 알고 싶다능 ㅎㅎㅎ . 좋은 포스팅 감사합니다.
하면 할 수록 모르는 것이 코딩... ㅠㅜ
그런 정도면 오히려 좋은데요. ㅎㅎ 쪼금이라도 확실한 부분이 많아지면 좋겠음요. ㅎㅎㅎ