본문 바로가기
Dev DBAN/개발 일기

개발일기 - 서비스 오류 발생 / 나의 대응은?

by 디반 2021. 10. 30. 18:20
반응형

첫 프로젝트를 완성 시키고 들뜬 마음으로 지낸지 벌써 며칠이 지났고 저는 이제 이 프로젝트를 가지고 서비스화를 어떤 식으로 시켜야될까 고민을 하던 찰나에 데이터가 잘 뽑히는지 확인차 한 번 확인을 해보았습니다. 

있었는데...  없었습니다...?

분명 실행 시킨 초반에는 잘 돌아가던데 시간이 지나서 다시 돌려보면 왜 오류가 날까? 라는 생각에 한 번 로그 파일을 뜯어 보기로 했습니다.

로그 파일을 찾아보니 이런 에러를 발생 시키고 있었습니다. 

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가 얼마나 중요한지 다시 한 번 깨닫게 되었고 제 코드를 다시 한 번 리팩토링 할 수 있는 계기가 되었습니다. 

이제 매일 코드를 다시 돌아보면서 추가할 부분, 수정할 부분을 찾아내어서 이렇게 한 번 블로그에 적어 올려보도록 하겠습니다.

반응형

댓글


"); wcs_do();