첫 프로젝트를 완성 시키고 들뜬 마음으로 지낸지 벌써 며칠이 지났고 저는 이제 이 프로젝트를 가지고 서비스화를 어떤 식으로 시켜야될까 고민을 하던 찰나에 데이터가 잘 뽑히는지 확인차 한 번 확인을 해보았습니다.
분명 실행 시킨 초반에는 잘 돌아가던데 시간이 지나서 다시 돌려보면 왜 오류가 날까? 라는 생각에 한 번 로그 파일을 뜯어 보기로 했습니다.
로그 파일을 찾아보니 이런 에러를 발생 시키고 있었습니다.
BrokenPipeError: [Errno 32] Broken pipe
한 번 검색을 해보니 MySQL 서버는 일정 시간 동안 작업이 없거나 요청이 없으면 서버를 닫는다는 답을 찾아 낼 수 있었고 일정 시간동안 작동이 없을 때 세션이 아예 죽어버리는 현상을 해결하기 위해 저는 2가지 해결책을 생각해 내었습니다.
1. API를 요청 했을 때 서버가 닫혀있다면 다시 재 연결을 하는 방법
2. MySQL서버를 계속 새로고침하는 방법
1번 해결책을 곰곰히 생각을 해보면 mysql 서버가 아예 닫혀 있다가 API 호출이 될 때마다 껐다 켰다 하는 건데 그렇다면 호출하는 모든 API 메소드에다가 재 연결코드를 작성하는 불편함이 생길 것 같다는 생각이 강하게 들어 이러한 방법은 보류해 놓았다.
2번 해결책을 찾아보니 pymysql에서 제공하는 ping이라는 함수가 서버가 살아있나 죽었나 확인 하는 함수로 만약 서버가 죽어 있다면 에러를 뿜는 친구인데 여기에 reconnect=true 를 추가해주면 서버를 지속적으로 새로 고침해준다고 해 이러한 방법을 적용 시켜 현재 수정 하였습니다.
저는 수정을 이렇게 진행 했습니다.
제가 만든 dbconn이라는 클래스 속 conn_cursor함수에 self.connect.ping(reconnect=True)으로 타이핑을 해 서버가 죽지 않도록 만들었습니다.
정말 작은 한 줄이었지만 이 한 줄 때문에 서버가 죽느냐 사느냐가 정말 재밌는 것 같습니다.
사실 이번 오류를 고치면서 데이터베이스의 commit 과 close가 얼마나 중요한지 다시 한 번 깨닫게 되었고 제 코드를 다시 한 번 리팩토링 할 수 있는 계기가 되었습니다.
이제 매일 코드를 다시 돌아보면서 추가할 부분, 수정할 부분을 찾아내어서 이렇게 한 번 블로그에 적어 올려보도록 하겠습니다.
'Dev DBAN > 개발 일기' 카테고리의 다른 글
개발 일기 - 커밋 규칙 (0) | 2021.11.05 |
---|---|
개발 일기 - 새로운 기능을 추가하자 (메일링) (0) | 2021.11.04 |
개발 일기 - Port Check (0) | 2021.11.01 |
개발일기 - 첫 프로젝트 완성 / Review (0) | 2021.10.28 |
개발 일기 - 현재 진행 프로젝트 / 앞으로의 계획 (1) | 2021.10.23 |
댓글